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.
- package/dist/agentbox/gateway-client.d.ts +4 -0
- package/dist/agentbox/gateway-client.js +9 -1
- package/dist/agentbox/gateway-client.js.map +1 -1
- package/dist/agentbox/http-server.js +25 -1
- package/dist/agentbox/http-server.js.map +1 -1
- package/dist/agentbox/session.d.ts +2 -0
- package/dist/agentbox/session.js +11 -7
- package/dist/agentbox/session.js.map +1 -1
- package/dist/agentbox-main.js +10 -0
- package/dist/agentbox-main.js.map +1 -1
- package/dist/cli-main.js +19 -3
- package/dist/cli-main.js.map +1 -1
- package/dist/core/agent-factory.d.ts +2 -0
- package/dist/core/agent-factory.js +87 -21
- package/dist/core/agent-factory.js.map +1 -1
- package/dist/core/compaction.d.ts +80 -0
- package/dist/core/compaction.js +442 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.js +27 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/extensions/compaction-safeguard.d.ts +2 -0
- package/dist/core/extensions/compaction-safeguard.js +681 -0
- package/dist/core/extensions/compaction-safeguard.js.map +1 -0
- package/dist/core/extensions/deep-investigation.js +47 -73
- package/dist/core/extensions/deep-investigation.js.map +1 -1
- package/dist/core/extensions/memory-flush.d.ts +2 -10
- package/dist/core/extensions/memory-flush.js +4 -86
- package/dist/core/extensions/memory-flush.js.map +1 -1
- package/dist/core/llm-proxy.js +25 -6
- package/dist/core/llm-proxy.js.map +1 -1
- package/dist/core/message-utils.d.ts +18 -0
- package/dist/core/message-utils.js +28 -0
- package/dist/core/message-utils.js.map +1 -0
- package/dist/core/prompt.js +4 -5
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/session-tool-result-guard.d.ts +2 -0
- package/dist/core/session-tool-result-guard.js +159 -0
- package/dist/core/session-tool-result-guard.js.map +1 -0
- package/dist/core/stream-wrappers.d.ts +41 -0
- package/dist/core/stream-wrappers.js +369 -0
- package/dist/core/stream-wrappers.js.map +1 -0
- package/dist/core/thinking-blocks.d.ts +20 -0
- package/dist/core/thinking-blocks.js +45 -0
- package/dist/core/thinking-blocks.js.map +1 -0
- package/dist/core/tool-call-id.d.ts +22 -0
- package/dist/core/tool-call-id.js +226 -0
- package/dist/core/tool-call-id.js.map +1 -0
- package/dist/core/tool-call-repair.d.ts +18 -0
- package/dist/core/tool-call-repair.js +73 -0
- package/dist/core/tool-call-repair.js.map +1 -0
- package/dist/core/tool-result-context-guard.d.ts +36 -0
- package/dist/core/tool-result-context-guard.js +272 -0
- package/dist/core/tool-result-context-guard.js.map +1 -0
- package/dist/cron/cron-limits.d.ts +16 -0
- package/dist/cron/cron-limits.js +17 -0
- package/dist/cron/cron-limits.js.map +1 -0
- package/dist/cron/cron-matcher.d.ts +14 -0
- package/dist/cron/cron-matcher.js +29 -0
- package/dist/cron/cron-matcher.js.map +1 -1
- package/dist/gateway/agentbox/client.d.ts +0 -2
- package/dist/gateway/agentbox/client.js.map +1 -1
- package/dist/gateway/agentbox/k8s-spawner.d.ts +10 -10
- package/dist/gateway/agentbox/k8s-spawner.js +27 -55
- package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
- package/dist/gateway/agentbox/local-spawner.d.ts +5 -0
- package/dist/gateway/agentbox/local-spawner.js +10 -0
- package/dist/gateway/agentbox/local-spawner.js.map +1 -1
- package/dist/gateway/cron/cron-service.js +7 -0
- package/dist/gateway/cron/cron-service.js.map +1 -1
- package/dist/gateway/db/index.js +9 -1
- package/dist/gateway/db/index.js.map +1 -1
- package/dist/gateway/db/init-schema.js +65 -16
- package/dist/gateway/db/init-schema.js.map +1 -1
- package/dist/gateway/db/migrate-sqlite.js +73 -20
- package/dist/gateway/db/migrate-sqlite.js.map +1 -1
- package/dist/gateway/db/repositories/cluster-repo.d.ts +59 -0
- package/dist/gateway/db/repositories/cluster-repo.js +107 -0
- package/dist/gateway/db/repositories/cluster-repo.js.map +1 -0
- package/dist/gateway/db/repositories/config-repo.d.ts +4 -5
- package/dist/gateway/db/repositories/config-repo.js +17 -0
- package/dist/gateway/db/repositories/config-repo.js.map +1 -1
- package/dist/gateway/db/repositories/feedback-repo.d.ts +71 -0
- package/dist/gateway/db/repositories/feedback-repo.js +52 -0
- package/dist/gateway/db/repositories/feedback-repo.js.map +1 -0
- package/dist/gateway/db/repositories/knowledge-doc-repo.d.ts +37 -0
- package/dist/gateway/db/repositories/knowledge-doc-repo.js +48 -0
- package/dist/gateway/db/repositories/knowledge-doc-repo.js.map +1 -0
- package/dist/gateway/db/repositories/user-cluster-config-repo.d.ts +45 -0
- package/dist/gateway/db/repositories/user-cluster-config-repo.js +90 -0
- package/dist/gateway/db/repositories/user-cluster-config-repo.js.map +1 -0
- package/dist/gateway/db/repositories/workspace-repo.d.ts +2 -2
- package/dist/gateway/db/repositories/workspace-repo.js +12 -12
- package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
- package/dist/gateway/db/schema-mysql.d.ts +437 -44
- package/dist/gateway/db/schema-mysql.js +36 -9
- package/dist/gateway/db/schema-mysql.js.map +1 -1
- package/dist/gateway/db/schema-sqlite.d.ts +459 -46
- package/dist/gateway/db/schema-sqlite.js +36 -9
- package/dist/gateway/db/schema-sqlite.js.map +1 -1
- package/dist/gateway/db/schema.d.ts +435 -44
- package/dist/gateway/db/schema.js +1 -1
- package/dist/gateway/db/schema.js.map +1 -1
- package/dist/gateway/plugins/channel-bridge.js +1 -1
- package/dist/gateway/plugins/channel-bridge.js.map +1 -1
- package/dist/gateway/rpc-methods.d.ts +2 -1
- package/dist/gateway/rpc-methods.js +507 -172
- package/dist/gateway/rpc-methods.js.map +1 -1
- package/dist/gateway/server.js +191 -51
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/web/dist/assets/index-DTD0P9j8.css +1 -0
- package/dist/gateway/web/dist/assets/index-DhqsS2E0.js +756 -0
- package/dist/gateway/web/dist/assets/index-DhqsS2E0.js.map +1 -0
- package/dist/gateway/web/dist/index.html +2 -2
- package/dist/gateway-main.js +1 -3
- package/dist/gateway-main.js.map +1 -1
- package/dist/memory/indexer.d.ts +13 -0
- package/dist/memory/indexer.js +91 -1
- package/dist/memory/indexer.js.map +1 -1
- package/dist/memory/knowledge-extractor.d.ts +47 -0
- package/dist/memory/knowledge-extractor.js +165 -0
- package/dist/memory/knowledge-extractor.js.map +1 -0
- package/dist/memory/overview-generator.d.ts +16 -0
- package/dist/memory/overview-generator.js +233 -0
- package/dist/memory/overview-generator.js.map +1 -0
- package/dist/memory/session-summarizer.d.ts +28 -0
- package/dist/memory/session-summarizer.js +20 -2
- package/dist/memory/session-summarizer.js.map +1 -1
- package/dist/memory/temporal-decay.js +2 -2
- package/dist/memory/temporal-decay.js.map +1 -1
- package/dist/memory/topic-consolidator.d.ts +52 -0
- package/dist/memory/topic-consolidator.js +197 -0
- package/dist/memory/topic-consolidator.js.map +1 -0
- package/dist/tools/cluster-info.d.ts +9 -0
- package/dist/tools/cluster-info.js +74 -0
- package/dist/tools/cluster-info.js.map +1 -0
- package/dist/tools/command-sets.js +15 -5
- package/dist/tools/command-sets.js.map +1 -1
- package/dist/tools/create-skill.js +1 -1
- package/dist/tools/create-skill.js.map +1 -1
- package/dist/tools/debug-pod.d.ts +217 -0
- package/dist/tools/debug-pod.js +603 -0
- package/dist/tools/debug-pod.js.map +1 -0
- package/dist/tools/deep-search/engine.d.ts +0 -5
- package/dist/tools/deep-search/engine.js +68 -28
- package/dist/tools/deep-search/engine.js.map +1 -1
- package/dist/tools/deep-search/format.d.ts +1 -1
- package/dist/tools/deep-search/format.js +1 -2
- package/dist/tools/deep-search/format.js.map +1 -1
- package/dist/tools/deep-search/prompts.d.ts +4 -1
- package/dist/tools/deep-search/prompts.js +47 -29
- package/dist/tools/deep-search/prompts.js.map +1 -1
- package/dist/tools/deep-search/quality-gate.d.ts +25 -0
- package/dist/tools/deep-search/quality-gate.js +81 -0
- package/dist/tools/deep-search/quality-gate.js.map +1 -0
- package/dist/tools/deep-search/schemas.d.ts +25 -0
- package/dist/tools/deep-search/schemas.js +26 -1
- package/dist/tools/deep-search/schemas.js.map +1 -1
- package/dist/tools/deep-search/sre-knowledge.d.ts +6 -10
- package/dist/tools/deep-search/sre-knowledge.js +21 -52
- package/dist/tools/deep-search/sre-knowledge.js.map +1 -1
- package/dist/tools/deep-search/sub-agent.js +24 -8
- package/dist/tools/deep-search/sub-agent.js.map +1 -1
- package/dist/tools/deep-search/tool.js +3 -6
- package/dist/tools/deep-search/tool.js.map +1 -1
- package/dist/tools/deep-search/types.d.ts +13 -0
- package/dist/tools/deep-search/types.js +4 -4
- package/dist/tools/deep-search/types.js.map +1 -1
- package/dist/tools/dp-tools.d.ts +9 -6
- package/dist/tools/dp-tools.js +26 -55
- package/dist/tools/dp-tools.js.map +1 -1
- package/dist/tools/exec-utils.d.ts +8 -21
- package/dist/tools/exec-utils.js +11 -95
- package/dist/tools/exec-utils.js.map +1 -1
- package/dist/tools/fork-skill.js +1 -1
- package/dist/tools/fork-skill.js.map +1 -1
- package/dist/tools/k8s-checks.d.ts +11 -5
- package/dist/tools/k8s-checks.js +28 -9
- package/dist/tools/k8s-checks.js.map +1 -1
- package/dist/tools/knowledge-search.d.ts +3 -0
- package/dist/tools/knowledge-search.js +115 -0
- package/dist/tools/knowledge-search.js.map +1 -0
- package/dist/tools/kubeconfig-resolver.d.ts +22 -0
- package/dist/tools/kubeconfig-resolver.js +98 -18
- package/dist/tools/kubeconfig-resolver.js.map +1 -1
- package/dist/tools/manage-schedule.js +23 -1
- package/dist/tools/manage-schedule.js.map +1 -1
- package/dist/tools/netns-script.d.ts +1 -1
- package/dist/tools/netns-script.js +19 -7
- package/dist/tools/netns-script.js.map +1 -1
- package/dist/tools/node-exec.d.ts +1 -1
- package/dist/tools/node-exec.js +19 -7
- package/dist/tools/node-exec.js.map +1 -1
- package/dist/tools/node-script.d.ts +1 -1
- package/dist/tools/node-script.js +19 -7
- package/dist/tools/node-script.js.map +1 -1
- package/dist/tools/pod-exec.js +12 -1
- package/dist/tools/pod-exec.js.map +1 -1
- package/dist/tools/pod-nsenter-exec.d.ts +1 -1
- package/dist/tools/pod-nsenter-exec.js +19 -7
- package/dist/tools/pod-nsenter-exec.js.map +1 -1
- package/dist/tools/pod-script.js +12 -1
- package/dist/tools/pod-script.js.map +1 -1
- package/dist/tools/restricted-bash.js +10 -3
- package/dist/tools/restricted-bash.js.map +1 -1
- package/dist/tools/run-skill.js +14 -2
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/save-feedback.d.ts +7 -0
- package/dist/tools/save-feedback.js +125 -0
- package/dist/tools/save-feedback.js.map +1 -0
- package/dist/tools/update-skill.js +1 -1
- package/dist/tools/update-skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/core/deep-investigation/SKILL.md +11 -14
- 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.
|