siclaw 0.1.2 → 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 (215) hide show
  1. package/dist/agentbox/gateway-client.d.ts +4 -0
  2. package/dist/agentbox/gateway-client.js +9 -1
  3. package/dist/agentbox/gateway-client.js.map +1 -1
  4. package/dist/agentbox/http-server.js +25 -1
  5. package/dist/agentbox/http-server.js.map +1 -1
  6. package/dist/agentbox/session.d.ts +2 -0
  7. package/dist/agentbox/session.js +11 -7
  8. package/dist/agentbox/session.js.map +1 -1
  9. package/dist/agentbox-main.js +10 -0
  10. package/dist/agentbox-main.js.map +1 -1
  11. package/dist/cli-main.js +19 -3
  12. package/dist/cli-main.js.map +1 -1
  13. package/dist/core/agent-factory.d.ts +2 -0
  14. package/dist/core/agent-factory.js +87 -21
  15. package/dist/core/agent-factory.js.map +1 -1
  16. package/dist/core/compaction.d.ts +80 -0
  17. package/dist/core/compaction.js +442 -0
  18. package/dist/core/compaction.js.map +1 -0
  19. package/dist/core/config.d.ts +7 -0
  20. package/dist/core/config.js +27 -1
  21. package/dist/core/config.js.map +1 -1
  22. package/dist/core/extensions/compaction-safeguard.d.ts +2 -0
  23. package/dist/core/extensions/compaction-safeguard.js +681 -0
  24. package/dist/core/extensions/compaction-safeguard.js.map +1 -0
  25. package/dist/core/extensions/deep-investigation.js +47 -73
  26. package/dist/core/extensions/deep-investigation.js.map +1 -1
  27. package/dist/core/extensions/memory-flush.d.ts +2 -10
  28. package/dist/core/extensions/memory-flush.js +4 -86
  29. package/dist/core/extensions/memory-flush.js.map +1 -1
  30. package/dist/core/llm-proxy.js +25 -6
  31. package/dist/core/llm-proxy.js.map +1 -1
  32. package/dist/core/message-utils.d.ts +18 -0
  33. package/dist/core/message-utils.js +28 -0
  34. package/dist/core/message-utils.js.map +1 -0
  35. package/dist/core/prompt.js +4 -5
  36. package/dist/core/prompt.js.map +1 -1
  37. package/dist/core/session-tool-result-guard.d.ts +2 -0
  38. package/dist/core/session-tool-result-guard.js +159 -0
  39. package/dist/core/session-tool-result-guard.js.map +1 -0
  40. package/dist/core/stream-wrappers.d.ts +41 -0
  41. package/dist/core/stream-wrappers.js +369 -0
  42. package/dist/core/stream-wrappers.js.map +1 -0
  43. package/dist/core/thinking-blocks.d.ts +20 -0
  44. package/dist/core/thinking-blocks.js +45 -0
  45. package/dist/core/thinking-blocks.js.map +1 -0
  46. package/dist/core/tool-call-id.d.ts +22 -0
  47. package/dist/core/tool-call-id.js +226 -0
  48. package/dist/core/tool-call-id.js.map +1 -0
  49. package/dist/core/tool-call-repair.d.ts +18 -0
  50. package/dist/core/tool-call-repair.js +73 -0
  51. package/dist/core/tool-call-repair.js.map +1 -0
  52. package/dist/core/tool-result-context-guard.d.ts +36 -0
  53. package/dist/core/tool-result-context-guard.js +272 -0
  54. package/dist/core/tool-result-context-guard.js.map +1 -0
  55. package/dist/cron/cron-limits.d.ts +16 -0
  56. package/dist/cron/cron-limits.js +17 -0
  57. package/dist/cron/cron-limits.js.map +1 -0
  58. package/dist/cron/cron-matcher.d.ts +14 -0
  59. package/dist/cron/cron-matcher.js +29 -0
  60. package/dist/cron/cron-matcher.js.map +1 -1
  61. package/dist/gateway/agentbox/client.d.ts +0 -2
  62. package/dist/gateway/agentbox/client.js.map +1 -1
  63. package/dist/gateway/agentbox/k8s-spawner.d.ts +10 -10
  64. package/dist/gateway/agentbox/k8s-spawner.js +27 -55
  65. package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
  66. package/dist/gateway/agentbox/local-spawner.d.ts +5 -0
  67. package/dist/gateway/agentbox/local-spawner.js +10 -0
  68. package/dist/gateway/agentbox/local-spawner.js.map +1 -1
  69. package/dist/gateway/cron/cron-service.js +7 -0
  70. package/dist/gateway/cron/cron-service.js.map +1 -1
  71. package/dist/gateway/db/index.js +9 -1
  72. package/dist/gateway/db/index.js.map +1 -1
  73. package/dist/gateway/db/init-schema.js +65 -16
  74. package/dist/gateway/db/init-schema.js.map +1 -1
  75. package/dist/gateway/db/migrate-sqlite.js +73 -20
  76. package/dist/gateway/db/migrate-sqlite.js.map +1 -1
  77. package/dist/gateway/db/repositories/cluster-repo.d.ts +59 -0
  78. package/dist/gateway/db/repositories/cluster-repo.js +107 -0
  79. package/dist/gateway/db/repositories/cluster-repo.js.map +1 -0
  80. package/dist/gateway/db/repositories/config-repo.d.ts +4 -5
  81. package/dist/gateway/db/repositories/config-repo.js +17 -0
  82. package/dist/gateway/db/repositories/config-repo.js.map +1 -1
  83. package/dist/gateway/db/repositories/feedback-repo.d.ts +71 -0
  84. package/dist/gateway/db/repositories/feedback-repo.js +52 -0
  85. package/dist/gateway/db/repositories/feedback-repo.js.map +1 -0
  86. package/dist/gateway/db/repositories/knowledge-doc-repo.d.ts +37 -0
  87. package/dist/gateway/db/repositories/knowledge-doc-repo.js +48 -0
  88. package/dist/gateway/db/repositories/knowledge-doc-repo.js.map +1 -0
  89. package/dist/gateway/db/repositories/user-cluster-config-repo.d.ts +45 -0
  90. package/dist/gateway/db/repositories/user-cluster-config-repo.js +90 -0
  91. package/dist/gateway/db/repositories/user-cluster-config-repo.js.map +1 -0
  92. package/dist/gateway/db/repositories/workspace-repo.d.ts +2 -2
  93. package/dist/gateway/db/repositories/workspace-repo.js +12 -12
  94. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
  95. package/dist/gateway/db/schema-mysql.d.ts +437 -44
  96. package/dist/gateway/db/schema-mysql.js +36 -9
  97. package/dist/gateway/db/schema-mysql.js.map +1 -1
  98. package/dist/gateway/db/schema-sqlite.d.ts +459 -46
  99. package/dist/gateway/db/schema-sqlite.js +36 -9
  100. package/dist/gateway/db/schema-sqlite.js.map +1 -1
  101. package/dist/gateway/db/schema.d.ts +435 -44
  102. package/dist/gateway/db/schema.js +1 -1
  103. package/dist/gateway/db/schema.js.map +1 -1
  104. package/dist/gateway/plugins/channel-bridge.js +1 -1
  105. package/dist/gateway/plugins/channel-bridge.js.map +1 -1
  106. package/dist/gateway/rpc-methods.d.ts +2 -1
  107. package/dist/gateway/rpc-methods.js +507 -172
  108. package/dist/gateway/rpc-methods.js.map +1 -1
  109. package/dist/gateway/server.js +191 -51
  110. package/dist/gateway/server.js.map +1 -1
  111. package/dist/gateway/web/dist/assets/index-DTD0P9j8.css +1 -0
  112. package/dist/gateway/web/dist/assets/index-DhqsS2E0.js +756 -0
  113. package/dist/gateway/web/dist/assets/index-DhqsS2E0.js.map +1 -0
  114. package/dist/gateway/web/dist/index.html +2 -2
  115. package/dist/gateway-main.js +1 -3
  116. package/dist/gateway-main.js.map +1 -1
  117. package/dist/memory/indexer.d.ts +13 -0
  118. package/dist/memory/indexer.js +91 -1
  119. package/dist/memory/indexer.js.map +1 -1
  120. package/dist/memory/knowledge-extractor.d.ts +47 -0
  121. package/dist/memory/knowledge-extractor.js +165 -0
  122. package/dist/memory/knowledge-extractor.js.map +1 -0
  123. package/dist/memory/overview-generator.d.ts +16 -0
  124. package/dist/memory/overview-generator.js +233 -0
  125. package/dist/memory/overview-generator.js.map +1 -0
  126. package/dist/memory/session-summarizer.d.ts +28 -0
  127. package/dist/memory/session-summarizer.js +20 -2
  128. package/dist/memory/session-summarizer.js.map +1 -1
  129. package/dist/memory/temporal-decay.js +2 -2
  130. package/dist/memory/temporal-decay.js.map +1 -1
  131. package/dist/memory/topic-consolidator.d.ts +52 -0
  132. package/dist/memory/topic-consolidator.js +197 -0
  133. package/dist/memory/topic-consolidator.js.map +1 -0
  134. package/dist/tools/cluster-info.d.ts +9 -0
  135. package/dist/tools/cluster-info.js +74 -0
  136. package/dist/tools/cluster-info.js.map +1 -0
  137. package/dist/tools/command-sets.js +15 -5
  138. package/dist/tools/command-sets.js.map +1 -1
  139. package/dist/tools/create-skill.js +1 -1
  140. package/dist/tools/create-skill.js.map +1 -1
  141. package/dist/tools/debug-pod.d.ts +217 -0
  142. package/dist/tools/debug-pod.js +603 -0
  143. package/dist/tools/debug-pod.js.map +1 -0
  144. package/dist/tools/deep-search/engine.d.ts +0 -5
  145. package/dist/tools/deep-search/engine.js +68 -28
  146. package/dist/tools/deep-search/engine.js.map +1 -1
  147. package/dist/tools/deep-search/format.d.ts +1 -1
  148. package/dist/tools/deep-search/format.js +1 -2
  149. package/dist/tools/deep-search/format.js.map +1 -1
  150. package/dist/tools/deep-search/prompts.d.ts +4 -1
  151. package/dist/tools/deep-search/prompts.js +47 -29
  152. package/dist/tools/deep-search/prompts.js.map +1 -1
  153. package/dist/tools/deep-search/quality-gate.d.ts +25 -0
  154. package/dist/tools/deep-search/quality-gate.js +81 -0
  155. package/dist/tools/deep-search/quality-gate.js.map +1 -0
  156. package/dist/tools/deep-search/schemas.d.ts +25 -0
  157. package/dist/tools/deep-search/schemas.js +26 -1
  158. package/dist/tools/deep-search/schemas.js.map +1 -1
  159. package/dist/tools/deep-search/sre-knowledge.d.ts +6 -10
  160. package/dist/tools/deep-search/sre-knowledge.js +21 -52
  161. package/dist/tools/deep-search/sre-knowledge.js.map +1 -1
  162. package/dist/tools/deep-search/sub-agent.js +24 -8
  163. package/dist/tools/deep-search/sub-agent.js.map +1 -1
  164. package/dist/tools/deep-search/tool.js +3 -6
  165. package/dist/tools/deep-search/tool.js.map +1 -1
  166. package/dist/tools/deep-search/types.d.ts +13 -0
  167. package/dist/tools/deep-search/types.js +4 -4
  168. package/dist/tools/deep-search/types.js.map +1 -1
  169. package/dist/tools/dp-tools.d.ts +9 -6
  170. package/dist/tools/dp-tools.js +26 -55
  171. package/dist/tools/dp-tools.js.map +1 -1
  172. package/dist/tools/exec-utils.d.ts +8 -21
  173. package/dist/tools/exec-utils.js +11 -95
  174. package/dist/tools/exec-utils.js.map +1 -1
  175. package/dist/tools/fork-skill.js +1 -1
  176. package/dist/tools/fork-skill.js.map +1 -1
  177. package/dist/tools/k8s-checks.d.ts +11 -5
  178. package/dist/tools/k8s-checks.js +28 -9
  179. package/dist/tools/k8s-checks.js.map +1 -1
  180. package/dist/tools/knowledge-search.d.ts +3 -0
  181. package/dist/tools/knowledge-search.js +115 -0
  182. package/dist/tools/knowledge-search.js.map +1 -0
  183. package/dist/tools/kubeconfig-resolver.d.ts +22 -0
  184. package/dist/tools/kubeconfig-resolver.js +98 -18
  185. package/dist/tools/kubeconfig-resolver.js.map +1 -1
  186. package/dist/tools/manage-schedule.js +23 -1
  187. package/dist/tools/manage-schedule.js.map +1 -1
  188. package/dist/tools/netns-script.d.ts +1 -1
  189. package/dist/tools/netns-script.js +19 -7
  190. package/dist/tools/netns-script.js.map +1 -1
  191. package/dist/tools/node-exec.d.ts +1 -1
  192. package/dist/tools/node-exec.js +19 -7
  193. package/dist/tools/node-exec.js.map +1 -1
  194. package/dist/tools/node-script.d.ts +1 -1
  195. package/dist/tools/node-script.js +19 -7
  196. package/dist/tools/node-script.js.map +1 -1
  197. package/dist/tools/pod-exec.js +12 -1
  198. package/dist/tools/pod-exec.js.map +1 -1
  199. package/dist/tools/pod-nsenter-exec.d.ts +1 -1
  200. package/dist/tools/pod-nsenter-exec.js +19 -7
  201. package/dist/tools/pod-nsenter-exec.js.map +1 -1
  202. package/dist/tools/pod-script.js +12 -1
  203. package/dist/tools/pod-script.js.map +1 -1
  204. package/dist/tools/restricted-bash.js +10 -3
  205. package/dist/tools/restricted-bash.js.map +1 -1
  206. package/dist/tools/run-skill.js +14 -2
  207. package/dist/tools/run-skill.js.map +1 -1
  208. package/dist/tools/save-feedback.d.ts +7 -0
  209. package/dist/tools/save-feedback.js +125 -0
  210. package/dist/tools/save-feedback.js.map +1 -0
  211. package/dist/tools/update-skill.js +1 -1
  212. package/dist/tools/update-skill.js.map +1 -1
  213. package/package.json +1 -1
  214. package/skills/core/deep-investigation/SKILL.md +11 -14
  215. package/skills/core/session-feedback/SKILL.md +146 -0
@@ -0,0 +1,603 @@
1
+ /**
2
+ * Debug pod label constants, label builder, and kubectl execution helper.
3
+ *
4
+ * Provides the foundation for structured debug pod lifecycle management:
5
+ * - Standard label keys for all debug pods
6
+ * - Label value sanitization (K8s constraints: ≤63 chars, alphanumeric boundaries)
7
+ * - Thin kubectl wrapper with kubeconfig propagation
8
+ */
9
+ import { randomBytes } from "node:crypto";
10
+ import { spawnAsync, prepareExecEnv } from "./exec-utils.js";
11
+ import { waitForPodDone } from "./k8s-checks.js";
12
+ import { loadConfig } from "../core/config.js";
13
+ // ── Label key constants ──────────────────────────────────────────────
14
+ export const LABEL_COMPONENT = "siclaw.io/component";
15
+ export const LABEL_USER_ID = "siclaw.io/user-id";
16
+ export const LABEL_TARGET_NODE = "siclaw.io/target-node";
17
+ export const LABEL_MANAGED_BY = "app.kubernetes.io/managed-by";
18
+ // ── Label value constants ────────────────────────────────────────────
19
+ export const COMPONENT_DEBUG_POD = "debug-pod";
20
+ export const MANAGED_BY_SICLAW = "siclaw";
21
+ // ── Resource limit constants ────────────────────────────────────────
22
+ export const DEBUG_POD_RESOURCE_REQUESTS = { cpu: "1m", memory: "1Mi" };
23
+ export const DEBUG_POD_RESOURCE_LIMITS = { cpu: "500m", memory: "256Mi" };
24
+ // ── Label helpers ────────────────────────────────────────────────────
25
+ /**
26
+ * Sanitize a raw string into a valid K8s label value.
27
+ * Rules: ≤63 chars, alphanumeric + `-_.`, must start/end with alphanumeric.
28
+ */
29
+ function sanitizeLabelValue(raw) {
30
+ const cleaned = raw.replace(/[^a-zA-Z0-9._-]/g, "-").slice(0, 63);
31
+ return cleaned.replace(/^[^a-zA-Z0-9]+/, "").replace(/[^a-zA-Z0-9]+$/, "") || "unknown";
32
+ }
33
+ /**
34
+ * Build the standard label set for a debug pod.
35
+ */
36
+ export function buildDebugPodLabels(userId, nodeName) {
37
+ return {
38
+ [LABEL_COMPONENT]: COMPONENT_DEBUG_POD,
39
+ [LABEL_USER_ID]: sanitizeLabelValue(userId),
40
+ [LABEL_TARGET_NODE]: sanitizeLabelValue(nodeName),
41
+ [LABEL_MANAGED_BY]: MANAGED_BY_SICLAW,
42
+ };
43
+ }
44
+ // ── kubectl wrapper ──────────────────────────────────────────────────
45
+ /**
46
+ * Run kubectl with kubeconfig args prepended.
47
+ * Thin wrapper around spawnAsync — centralises kubeconfig propagation
48
+ * so that no caller needs to manually splice kubeconfigArgs.
49
+ *
50
+ * @internal This is an internal infrastructure helper that bypasses the
51
+ * 6-pass command validation pipeline intentionally. All arguments are
52
+ * programmatically constructed — never pass agent-controlled input.
53
+ */
54
+ export function kubectlExec(args, env, timeoutMs, signal, namespace) {
55
+ const nsArgs = namespace ? ["-n", namespace] : [];
56
+ return spawnAsync("kubectl", [...env.kubeconfigArgs, ...nsArgs, ...args], timeoutMs, env.childEnv, signal);
57
+ }
58
+ // ── Namespace helpers ────────────────────────────────────────────────
59
+ /**
60
+ * Ensure the debug namespace exists. Idempotent — safe to call on every invocation.
61
+ * Creates the namespace if it doesn't exist, or no-ops if it does.
62
+ */
63
+ export async function ensureDebugNamespace(namespace, env, timeoutMs = 10_000) {
64
+ try {
65
+ await spawnAsync("kubectl", [...env.kubeconfigArgs, "create", "namespace", namespace], timeoutMs, env.childEnv);
66
+ }
67
+ catch (err) {
68
+ // "AlreadyExists" is expected and safe to ignore
69
+ if (err.stderr && err.stderr.includes("already exists"))
70
+ return;
71
+ throw err;
72
+ }
73
+ }
74
+ // ── Creation lock (internal) ─────────────────────────────────────────
75
+ //
76
+ // The creating Map tracks in-flight pod creations. Concurrent callers
77
+ // wait for the creation to complete, then re-check the cache.
78
+ // Once a pod is cached (Running), any number of kubectl exec calls
79
+ // can run concurrently against it.
80
+ // ── Cleanup constants ───────────────────────────────────────────────
81
+ const CLEANUP_MAX_RETRIES = 3;
82
+ const CLEANUP_RETRY_INTERVAL_MS = 2_000;
83
+ // ── Cleanup helpers ─────────────────────────────────────────────────
84
+ /**
85
+ * Delete a debug pod with retry. On each failure, logs structured error data.
86
+ * After exhausting retries, logs a final warning but does NOT throw —
87
+ * activeDeadlineSeconds is the safety net.
88
+ *
89
+ * Note: does not support AbortSignal. Worst-case retry loop is 6s (3 × 2s).
90
+ * Callers on shutdown paths (evictAll) use Promise.allSettled; awaits may be
91
+ * truncated by process exit, which is acceptable since activeDeadlineSeconds
92
+ * guarantees eventual pod termination.
93
+ */
94
+ export async function deleteDebugPod(podName, env, opts) {
95
+ const deleteArgs = [
96
+ "delete", "pod", podName,
97
+ ...(opts.force ? ["--force", "--grace-period=0"] : []),
98
+ ...(opts.gracePeriod !== undefined && !opts.force ? [`--grace-period=${opts.gracePeriod}`] : []),
99
+ ];
100
+ for (let attempt = 1; attempt <= CLEANUP_MAX_RETRIES; attempt++) {
101
+ try {
102
+ await kubectlExec(deleteArgs, env, 10_000, undefined, opts.namespace);
103
+ return true;
104
+ }
105
+ catch (err) {
106
+ const errMsg = err.stderr?.trim() || err.message || String(err);
107
+ // Pod already gone — treat as success
108
+ if (errMsg.includes("not found"))
109
+ return true;
110
+ console.error("[debug-pod] cleanup failed", {
111
+ podName,
112
+ nodeName: opts.nodeName,
113
+ namespace: opts.namespace,
114
+ attempt,
115
+ maxRetries: CLEANUP_MAX_RETRIES,
116
+ error: errMsg,
117
+ });
118
+ if (attempt < CLEANUP_MAX_RETRIES) {
119
+ await new Promise((resolve) => setTimeout(resolve, CLEANUP_RETRY_INTERVAL_MS));
120
+ }
121
+ }
122
+ }
123
+ console.warn("[debug-pod] cleanup exhausted retries, relying on activeDeadlineSeconds", {
124
+ podName,
125
+ nodeName: opts.nodeName,
126
+ namespace: opts.namespace,
127
+ });
128
+ return false;
129
+ }
130
+ // ── Pod reuse cache (with creation-only lock) ───────────────────────
131
+ /**
132
+ * In-memory cache for reusable debug pods, keyed by "userId:clusterKey:nodeName".
133
+ *
134
+ * The creation lock ensures only one caller creates a pod for a given
135
+ * (userId, clusterKey, nodeName) triple. Concurrent callers wait for creation to
136
+ * complete, then reuse the cached pod. Once a pod is cached, any number
137
+ * of kubectl exec calls can run concurrently against it.
138
+ *
139
+ * - getOrCreate(): returns a cached pod or creates one (with lock)
140
+ * - touch(): resets idle timer after successful exec
141
+ * - remove(): clears cache entry (caller handles pod deletion)
142
+ * - evict(): remove + delete the pod via kubectl
143
+ *
144
+ * Process crash loses all state — activeDeadlineSeconds is the safety net.
145
+ */
146
+ export class DebugPodCache {
147
+ pods = new Map();
148
+ creating = new Map();
149
+ key(userId, clusterKey, nodeName) {
150
+ return `${userId}:${clusterKey}:${nodeName}`;
151
+ }
152
+ /**
153
+ * Get a cached pod, or create one using the provided factory.
154
+ *
155
+ * - If a pod is already cached, returns it immediately.
156
+ * - If another caller is creating a pod for this key, waits for
157
+ * creation to complete, then returns the cached result.
158
+ * - Otherwise, calls createFn() to create a new pod. createFn is
159
+ * responsible for calling set() on success.
160
+ *
161
+ * Returns { pod, created }:
162
+ * - pod: the cached pod entry (undefined if creation failed)
163
+ * - created: true if this call was the one that ran createFn
164
+ */
165
+ async getOrCreate(userId, clusterKey, nodeName, createFn) {
166
+ const k = this.key(userId, clusterKey, nodeName);
167
+ // eslint-disable-next-line no-constant-condition
168
+ while (true) {
169
+ // Check cache first
170
+ const cached = this.pods.get(k);
171
+ if (cached)
172
+ return { pod: cached, created: false };
173
+ // Another caller is creating — wait and re-check
174
+ const inflight = this.creating.get(k);
175
+ if (inflight) {
176
+ await inflight;
177
+ continue;
178
+ }
179
+ // We are the creator
180
+ let resolve;
181
+ const promise = new Promise((r) => { resolve = r; });
182
+ this.creating.set(k, promise);
183
+ try {
184
+ await createFn();
185
+ // createFn should have called set() on success
186
+ return { pod: this.pods.get(k), created: true };
187
+ }
188
+ finally {
189
+ this.creating.delete(k);
190
+ resolve(); // wake up waiters
191
+ }
192
+ }
193
+ }
194
+ /**
195
+ * Store a newly created pod in the cache and start its idle timer.
196
+ * Called by the createFn passed to getOrCreate().
197
+ */
198
+ set(userId, clusterKey, nodeName, podName, namespace, env, idleTimeoutMs) {
199
+ const k = this.key(userId, clusterKey, nodeName);
200
+ const existing = this.pods.get(k);
201
+ if (existing)
202
+ clearTimeout(existing.idleTimer);
203
+ const entry = {
204
+ podName,
205
+ namespace,
206
+ nodeName,
207
+ userId,
208
+ env,
209
+ idleTimer: setTimeout(() => this.evict(k), idleTimeoutMs),
210
+ };
211
+ if (entry.idleTimer && typeof entry.idleTimer === "object" && "unref" in entry.idleTimer) {
212
+ entry.idleTimer.unref();
213
+ }
214
+ this.pods.set(k, entry);
215
+ }
216
+ /**
217
+ * Look up a cached pod. Returns undefined if no entry exists.
218
+ * Does NOT reset the idle timer — call touch() after successful exec.
219
+ */
220
+ get(userId, clusterKey, nodeName) {
221
+ return this.pods.get(this.key(userId, clusterKey, nodeName));
222
+ }
223
+ /**
224
+ * Reset the idle timer for an existing cache entry.
225
+ * Called after each successful kubectl exec to keep the pod alive.
226
+ */
227
+ touch(userId, clusterKey, nodeName, idleTimeoutMs) {
228
+ const k = this.key(userId, clusterKey, nodeName);
229
+ const entry = this.pods.get(k);
230
+ if (!entry)
231
+ return;
232
+ clearTimeout(entry.idleTimer);
233
+ entry.idleTimer = setTimeout(() => this.evict(k), idleTimeoutMs);
234
+ if (entry.idleTimer && typeof entry.idleTimer === "object" && "unref" in entry.idleTimer) {
235
+ entry.idleTimer.unref();
236
+ }
237
+ }
238
+ /**
239
+ * Remove a cache entry and clear its timer.
240
+ * Does NOT delete the pod — used when the caller handles deletion externally.
241
+ */
242
+ remove(userId, clusterKey, nodeName) {
243
+ const k = this.key(userId, clusterKey, nodeName);
244
+ const entry = this.pods.get(k);
245
+ if (entry) {
246
+ clearTimeout(entry.idleTimer);
247
+ this.pods.delete(k);
248
+ }
249
+ }
250
+ /**
251
+ * Evict a cache entry by key: delete the pod, remove from cache.
252
+ * Called by the idle timer. Errors are logged but not thrown.
253
+ *
254
+ * Note: the cache entry is removed BEFORE deleteDebugPod completes.
255
+ * During the deletion window (up to 6s), a concurrent getOrCreate may
256
+ * create a second pod on the same node. This is harmless — the old pod
257
+ * is being deleted and has activeDeadlineSeconds as a hard safety net.
258
+ * Moving pods.delete after deleteDebugPod would risk returning a stale
259
+ * (being-deleted) entry to concurrent get() callers, which is worse.
260
+ */
261
+ async evict(key) {
262
+ const entry = this.pods.get(key);
263
+ if (!entry)
264
+ return;
265
+ clearTimeout(entry.idleTimer);
266
+ this.pods.delete(key);
267
+ console.info("[debug-pod] idle eviction", {
268
+ podName: entry.podName,
269
+ nodeName: entry.nodeName,
270
+ namespace: entry.namespace,
271
+ userId: entry.userId,
272
+ });
273
+ await deleteDebugPod(entry.podName, entry.env, {
274
+ namespace: entry.namespace,
275
+ nodeName: entry.nodeName,
276
+ });
277
+ }
278
+ /** Check if a pod is being created for this key (for testing/diagnostics). */
279
+ isCreating(userId, clusterKey, nodeName) {
280
+ return this.creating.has(this.key(userId, clusterKey, nodeName));
281
+ }
282
+ /** Number of cached pods (for testing/diagnostics). */
283
+ get size() {
284
+ return this.pods.size;
285
+ }
286
+ /**
287
+ * Evict all cached pods immediately. Used for graceful shutdown.
288
+ */
289
+ async evictAll() {
290
+ const keys = [...this.pods.keys()];
291
+ await Promise.allSettled(keys.map((k) => this.evict(k)));
292
+ }
293
+ }
294
+ /** Singleton pod cache — shared across all callers in the same process. */
295
+ export const debugPodCache = new DebugPodCache();
296
+ /**
297
+ * Run a command inside a privileged debug pod on a specific node.
298
+ *
299
+ * Uses an always-reuse model with creation-only locking:
300
+ * - First call for a (userId, clusterKey, nodeName) triple creates a long-lived pod
301
+ * with `sleep infinity` and caches it.
302
+ * - Concurrent callers wait for creation to complete, then reuse the pod.
303
+ * - Multiple kubectl exec calls can run concurrently on a cached pod.
304
+ * - Idle pods are auto-deleted by DebugPodCache after the configured timeout.
305
+ * - activeDeadlineSeconds (config.debugPodTTL) is the hard safety net.
306
+ */
307
+ export async function runInDebugPod(spec, env, opts) {
308
+ const config = loadConfig();
309
+ const image = spec.image || config.debugImage;
310
+ const clusterKey = spec.clusterKey || "default";
311
+ const debugNamespace = config.debugNamespace;
312
+ const idleTimeoutMs = config.debugPodIdleTimeout * 1000;
313
+ // ── Phase 0: Get or create a reusable pod ─────────────────────────
314
+ let cachedPod;
315
+ try {
316
+ const result = await debugPodCache.getOrCreate(spec.userId, clusterKey, spec.nodeName, async () => {
317
+ const podId = randomBytes(4).toString("hex");
318
+ const podName = `node-debug-${podId}`;
319
+ const labels = buildDebugPodLabels(spec.userId, spec.nodeName);
320
+ const activeDeadlineSeconds = config.debugPodTTL;
321
+ const overrides = JSON.stringify({
322
+ metadata: { labels },
323
+ spec: {
324
+ activeDeadlineSeconds,
325
+ nodeName: spec.nodeName,
326
+ hostPID: true,
327
+ hostNetwork: true,
328
+ containers: [{
329
+ name: podName,
330
+ image,
331
+ securityContext: { privileged: true },
332
+ command: ["sleep", "infinity"],
333
+ resources: {
334
+ requests: DEBUG_POD_RESOURCE_REQUESTS,
335
+ limits: DEBUG_POD_RESOURCE_LIMITS,
336
+ },
337
+ }],
338
+ restartPolicy: "Never",
339
+ },
340
+ });
341
+ try {
342
+ await ensureDebugNamespace(debugNamespace, env);
343
+ await spawnAsync("kubectl", [
344
+ ...env.kubeconfigArgs,
345
+ "-n", debugNamespace,
346
+ "run", podName,
347
+ "--restart=Never",
348
+ `--image=${image}`,
349
+ `--overrides=${overrides}`,
350
+ ], 30_000, env.childEnv, opts.signal);
351
+ const phase = await waitForPodDone(podName, opts.timeoutMs, env.childEnv, opts.signal, env.kubeconfigPath ?? undefined, debugNamespace, "Running");
352
+ if (phase !== "Running") {
353
+ await deleteDebugPod(podName, env, {
354
+ namespace: debugNamespace,
355
+ nodeName: spec.nodeName,
356
+ force: true,
357
+ });
358
+ // Don't call set() — pod failed to start
359
+ return;
360
+ }
361
+ // Store in cache — idle timer starts now
362
+ debugPodCache.set(spec.userId, clusterKey, spec.nodeName, podName, debugNamespace, env, idleTimeoutMs);
363
+ }
364
+ catch (err) {
365
+ // Creation failed — best-effort cleanup
366
+ await deleteDebugPod(podName, env, {
367
+ namespace: debugNamespace,
368
+ nodeName: spec.nodeName,
369
+ force: true,
370
+ }).catch(() => { });
371
+ throw err; // re-throw so getOrCreate reports failure; waiters will retry
372
+ }
373
+ });
374
+ cachedPod = result.pod;
375
+ }
376
+ catch (err) {
377
+ return {
378
+ stdout: err.stdout?.trim() ?? "",
379
+ stderr: err.stderr?.trim() ?? err.message ?? String(err),
380
+ exitCode: typeof err.code === "number" ? err.code : null,
381
+ };
382
+ }
383
+ // Creation failed (pod didn't reach Running) or waiter got no cached pod
384
+ if (!cachedPod) {
385
+ return {
386
+ stdout: "",
387
+ stderr: `Debug pod failed to start on node "${spec.nodeName}".`,
388
+ exitCode: null,
389
+ };
390
+ }
391
+ const podName = cachedPod.podName;
392
+ // ── Phase 1: Execute command via kubectl exec ─────────────────────
393
+ if (opts.signal?.aborted) {
394
+ return { stdout: "", stderr: "Aborted.", exitCode: null };
395
+ }
396
+ let stdout = "";
397
+ let stderr = "";
398
+ let exitCode = 0;
399
+ let timedOut = false;
400
+ try {
401
+ const result = await kubectlExec(["exec", podName, "--", ...spec.command], env, opts.timeoutMs, opts.signal, debugNamespace);
402
+ stdout = result.stdout;
403
+ stderr = result.stderr;
404
+ exitCode = 0;
405
+ }
406
+ catch (err) {
407
+ stdout = err.stdout?.trim() ?? "";
408
+ stderr = err.stderr?.trim() ?? err.message;
409
+ if (typeof err.code === "number") {
410
+ exitCode = err.code;
411
+ }
412
+ else {
413
+ exitCode = null;
414
+ if (err.code === null && !stderr && !opts.signal?.aborted) {
415
+ timedOut = true;
416
+ }
417
+ }
418
+ // Check if pod is still alive — if gone or in terminal phase, evict stale cache entry.
419
+ // Trigger on: (a) non-numeric exit code (kubectl killed), or
420
+ // (b) numeric exit code with "not found" in stderr (GC deleted the pod).
421
+ const maybeStale = exitCode === null || (exitCode !== 0 && stderr.includes("not found"));
422
+ if (maybeStale) {
423
+ let podPhase = "";
424
+ try {
425
+ const phaseResult = await kubectlExec(["get", "pod", podName, "-o", "jsonpath={.status.phase}"], env, 5_000, undefined, debugNamespace);
426
+ podPhase = phaseResult.stdout.trim();
427
+ }
428
+ catch {
429
+ // Probe failed (network error, pod gone) — don't evict on transient failure,
430
+ // let GC and idle timer handle cleanup instead.
431
+ podPhase = "Unknown";
432
+ }
433
+ if (podPhase === "Succeeded" || podPhase === "Failed" || podPhase === "") {
434
+ debugPodCache.remove(spec.userId, clusterKey, spec.nodeName);
435
+ return { stdout, stderr, exitCode };
436
+ }
437
+ }
438
+ }
439
+ // ── Phase 2: Reset idle timer ─────────────────────────────────────
440
+ debugPodCache.touch(spec.userId, clusterKey, spec.nodeName, idleTimeoutMs);
441
+ return { stdout, stderr, exitCode, ...(timedOut ? { timedOut: true } : {}) };
442
+ }
443
+ // ── Garbage Collection ──────────────────────────────────────────────
444
+ const GC_INTERVAL_MS = 60_000;
445
+ const GC_PROBE_TIMEOUT_MS = 5_000;
446
+ const GC_LIST_TIMEOUT_MS = 15_000;
447
+ /**
448
+ * Background garbage collector for orphaned debug pods.
449
+ *
450
+ * Wired in agentbox-main.ts and cli-main.ts only. Local mode
451
+ * (Gateway + LocalSpawner) does not start GC — activeDeadlineSeconds
452
+ * is the sole cleanup mechanism in that configuration.
453
+ *
454
+ * Runs a sweep every 60 seconds. Targets pods matching:
455
+ * siclaw.io/component=debug-pod
456
+ * and deletes:
457
+ * (1) Pods in Succeeded or Failed phase (terminal — delete immediately)
458
+ * (2) Running/Unknown pods whose creationTimestamp age > config.debugPodTTL seconds
459
+ *
460
+ * GC does NOT consult DebugPodCache — it operates purely on kubectl label queries.
461
+ * This means GC may delete a pod that is still in the cache. When this happens,
462
+ * the next kubectl exec against that pod will fail; the stale-pod detection in
463
+ * runInDebugPod evicts the cache entry, and the following call creates a fresh pod.
464
+ * One request fails before auto-recovery — an acceptable trade-off to keep GC
465
+ * decoupled from in-process cache state.
466
+ * activeDeadlineSeconds is the ultimate safety net; GC is best-effort acceleration.
467
+ *
468
+ * Process lifecycle:
469
+ * - start(): verifies cluster access, then schedules sweep immediately + every 60s
470
+ * - stop(): clears interval; does NOT attempt a final sweep (process is exiting)
471
+ * - Timer uses .unref() so it does not prevent process exit
472
+ */
473
+ export class DebugPodGC {
474
+ intervalHandle = null;
475
+ credentialsDir;
476
+ /**
477
+ * Start the GC loop.
478
+ *
479
+ * Accepts credentialsDir instead of a fixed ExecEnv — kubeconfig is resolved
480
+ * dynamically on each sweep because credentials may not exist at startup
481
+ * (gateway pushes them when a session is created).
482
+ *
483
+ * The startup probe uses `kubectl version --client` which doesn't need
484
+ * cluster access, only verifies kubectl binary is available.
485
+ */
486
+ async start(credentialsDir) {
487
+ if (this.intervalHandle !== null)
488
+ return;
489
+ this.credentialsDir = credentialsDir;
490
+ // Verify kubectl binary is available (--client doesn't need cluster access)
491
+ const probeEnv = prepareExecEnv();
492
+ try {
493
+ await kubectlExec(["version", "--client"], probeEnv, GC_PROBE_TIMEOUT_MS);
494
+ }
495
+ catch {
496
+ return;
497
+ }
498
+ // Run first sweep immediately to catch orphans from a previous crash
499
+ void this.sweep().catch((err) => {
500
+ console.warn("[debug-pod-gc] initial sweep error", { error: String(err) });
501
+ });
502
+ this.intervalHandle = setInterval(() => {
503
+ void this.sweep().catch((err) => {
504
+ console.warn("[debug-pod-gc] sweep error", { error: String(err) });
505
+ });
506
+ }, GC_INTERVAL_MS);
507
+ if (this.intervalHandle &&
508
+ typeof this.intervalHandle === "object" &&
509
+ "unref" in this.intervalHandle) {
510
+ this.intervalHandle.unref();
511
+ }
512
+ }
513
+ /** Stop the GC loop. Clears the interval; any in-progress sweep runs to completion. */
514
+ stop() {
515
+ if (this.intervalHandle !== null) {
516
+ clearInterval(this.intervalHandle);
517
+ this.intervalHandle = null;
518
+ }
519
+ }
520
+ /**
521
+ * Perform a single GC sweep.
522
+ *
523
+ * Resolves kubeconfig dynamically on each call — credentials may arrive
524
+ * after agentbox startup (gateway pushes them on session creation).
525
+ * If kubeconfig is not yet available, the sweep silently skips.
526
+ */
527
+ async sweep() {
528
+ const env = prepareExecEnv(this.credentialsDir ? { credentialsDir: this.credentialsDir } : undefined);
529
+ // No kubeconfig available yet — credentials not pushed, skip silently
530
+ if (!env.kubeconfigPath)
531
+ return;
532
+ const config = loadConfig();
533
+ const { debugNamespace, debugPodTTL } = config;
534
+ // Use component + managed-by labels — each agentbox serves a single user,
535
+ // and userId label may not match config (e.g., "unknown" vs "default").
536
+ const labelSelector = `${LABEL_COMPONENT}=${COMPONENT_DEBUG_POD},${LABEL_MANAGED_BY}=${MANAGED_BY_SICLAW}`;
537
+ let listOutput;
538
+ try {
539
+ const result = await kubectlExec(["get", "pods", "-l", labelSelector, "-o", "json"], env, GC_LIST_TIMEOUT_MS, undefined, debugNamespace);
540
+ listOutput = result.stdout;
541
+ }
542
+ catch (err) {
543
+ const msg = err.stderr?.trim() || err.message || String(err);
544
+ if (msg.includes("not found") || msg.includes("No resources found"))
545
+ return;
546
+ console.warn("[debug-pod-gc] list failed", { error: msg });
547
+ return;
548
+ }
549
+ let pods;
550
+ try {
551
+ pods = JSON.parse(listOutput).items ?? [];
552
+ }
553
+ catch {
554
+ console.warn("[debug-pod-gc] failed to parse pod list JSON");
555
+ return;
556
+ }
557
+ const nowMs = Date.now();
558
+ const hardTtlMs = debugPodTTL * 1000;
559
+ const toDelete = pods.filter((pod) => {
560
+ const phase = pod.status?.phase ?? "";
561
+ if (phase === "Succeeded" || phase === "Failed")
562
+ return true;
563
+ const createdAt = pod.metadata?.creationTimestamp;
564
+ if (!createdAt)
565
+ return false;
566
+ const ageMs = nowMs - new Date(createdAt).getTime();
567
+ return ageMs > hardTtlMs;
568
+ });
569
+ if (toDelete.length === 0)
570
+ return;
571
+ console.info("[debug-pod-gc] sweep deleting pods", {
572
+ count: toDelete.length,
573
+ namespace: debugNamespace,
574
+ });
575
+ await Promise.allSettled(toDelete.map(async (pod) => {
576
+ const podName = pod.metadata?.name ?? "";
577
+ const nodeName = pod.spec?.nodeName ?? "unknown";
578
+ if (!podName)
579
+ return;
580
+ const ok = await deleteDebugPod(podName, env, {
581
+ namespace: debugNamespace,
582
+ nodeName,
583
+ });
584
+ if (!ok) {
585
+ console.warn("[debug-pod-gc] delete failed, will retry next cycle", {
586
+ podName,
587
+ nodeName,
588
+ namespace: debugNamespace,
589
+ });
590
+ }
591
+ else {
592
+ console.info("[debug-pod-gc] deleted orphaned pod", {
593
+ podName,
594
+ nodeName,
595
+ namespace: debugNamespace,
596
+ });
597
+ }
598
+ }));
599
+ }
600
+ }
601
+ /** Singleton GC instance — shared across all callers in the same process. */
602
+ export const debugPodGC = new DebugPodGC();
603
+ //# sourceMappingURL=debug-pod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-pod.js","sourceRoot":"","sources":["../../src/tools/debug-pod.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,6 @@
1
1
  import { type SubAgentOptions, type ProgressCallback } from "./sub-agent.js";
2
2
  import type { MemoryIndexer } from "../../memory/indexer.js";
3
3
  import type { DeepSearchBudget, InvestigationResult } from "./types.js";
4
- /**
5
- * Write the full investigation report to ~/.siclaw/reports/deep-search-{timestamp}.md
6
- * Returns the file path for inclusion in the summary.
7
- */
8
- export declare function writeReport(report: string): Promise<string>;
9
4
  /**
10
5
  * Pre-gathered hypothesis from PL agent triage.
11
6
  * When provided, Phase 2 (hypothesis generation) is skipped.