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.
- package/README.md +75 -114
- package/dist/agentbox/gateway-client.d.ts +2 -1
- package/dist/agentbox/gateway-client.js +6 -2
- package/dist/agentbox/gateway-client.js.map +1 -1
- package/dist/agentbox/http-server.js +184 -19
- package/dist/agentbox/http-server.js.map +1 -1
- package/dist/agentbox/resource-handlers.d.ts +1 -0
- package/dist/agentbox/resource-handlers.js +23 -23
- package/dist/agentbox/resource-handlers.js.map +1 -1
- package/dist/agentbox/session.js +85 -5
- package/dist/agentbox/session.js.map +1 -1
- package/dist/agentbox-main.d.ts +2 -1
- package/dist/agentbox-main.js +65 -18
- package/dist/agentbox-main.js.map +1 -1
- package/dist/cli-credentials.d.ts +1 -0
- package/dist/cli-credentials.js +109 -0
- package/dist/cli-credentials.js.map +1 -0
- package/dist/cli-first-run.d.ts +11 -0
- package/dist/cli-first-run.js +99 -0
- package/dist/cli-first-run.js.map +1 -0
- package/dist/cli-main.js +33 -11
- package/dist/cli-main.js.map +1 -1
- package/dist/cli-setup.d.ts +5 -11
- package/dist/cli-setup.js +12 -225
- package/dist/cli-setup.js.map +1 -1
- package/dist/core/agent-factory.d.ts +4 -0
- package/dist/core/agent-factory.js +102 -151
- package/dist/core/agent-factory.js.map +1 -1
- package/dist/core/config.d.ts +10 -3
- package/dist/core/config.js +11 -95
- package/dist/core/config.js.map +1 -1
- package/dist/core/extensions/deep-investigation.d.ts +2 -1
- package/dist/core/extensions/deep-investigation.js +144 -24
- package/dist/core/extensions/deep-investigation.js.map +1 -1
- package/dist/core/extensions/setup.d.ts +8 -0
- package/dist/core/extensions/setup.js +669 -0
- package/dist/core/extensions/setup.js.map +1 -0
- package/dist/core/llm-proxy.js +7 -3
- package/dist/core/llm-proxy.js.map +1 -1
- package/dist/core/mcp-client.d.ts +0 -10
- package/dist/core/mcp-client.js +0 -65
- package/dist/core/mcp-client.js.map +1 -1
- package/dist/core/prompt.d.ts +1 -1
- package/dist/core/prompt.js +42 -5
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/provider-presets.d.ts +14 -0
- package/dist/core/provider-presets.js +81 -0
- package/dist/core/provider-presets.js.map +1 -0
- package/dist/cron/cron-coordinator.d.ts +2 -0
- package/dist/cron/cron-coordinator.js +46 -14
- package/dist/cron/cron-coordinator.js.map +1 -1
- package/dist/cron/cron-executor.js +33 -8
- package/dist/cron/cron-executor.js.map +1 -1
- package/dist/cron/cron-scheduler.d.ts +1 -1
- package/dist/cron/gateway-client.d.ts +5 -0
- package/dist/cron/gateway-client.js +43 -8
- package/dist/cron/gateway-client.js.map +1 -1
- package/dist/cron-main.js +39 -9
- package/dist/cron-main.js.map +1 -1
- package/dist/gateway/agentbox/client.d.ts +11 -0
- package/dist/gateway/agentbox/client.js +18 -0
- package/dist/gateway/agentbox/client.js.map +1 -1
- package/dist/gateway/agentbox/k8s-spawner.d.ts +11 -2
- package/dist/gateway/agentbox/k8s-spawner.js +95 -52
- package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
- package/dist/gateway/agentbox/local-spawner.d.ts +1 -1
- package/dist/gateway/agentbox/local-spawner.js +4 -2
- package/dist/gateway/agentbox/local-spawner.js.map +1 -1
- package/dist/gateway/agentbox/manager.d.ts +0 -10
- package/dist/gateway/agentbox/manager.js +11 -30
- package/dist/gateway/agentbox/manager.js.map +1 -1
- package/dist/gateway/agentbox/types.d.ts +6 -4
- package/dist/gateway/cron/cron-service.d.ts +49 -0
- package/dist/gateway/cron/cron-service.js +259 -0
- package/dist/gateway/cron/cron-service.js.map +1 -0
- package/dist/gateway/db/init-schema.js +44 -0
- package/dist/gateway/db/init-schema.js.map +1 -1
- package/dist/gateway/db/migrate-sqlite.js +73 -4
- package/dist/gateway/db/migrate-sqlite.js.map +1 -1
- package/dist/gateway/db/repositories/chat-repo.d.ts +56 -2
- package/dist/gateway/db/repositories/chat-repo.js +132 -2
- package/dist/gateway/db/repositories/chat-repo.js.map +1 -1
- package/dist/gateway/db/repositories/config-repo.d.ts +31 -2
- package/dist/gateway/db/repositories/config-repo.js +57 -7
- package/dist/gateway/db/repositories/config-repo.js.map +1 -1
- package/dist/gateway/db/repositories/env-repo.d.ts +14 -0
- package/dist/gateway/db/repositories/env-repo.js +15 -2
- package/dist/gateway/db/repositories/env-repo.js.map +1 -1
- package/dist/gateway/db/repositories/model-config-repo.d.ts +1 -1
- package/dist/gateway/db/repositories/model-config-repo.js +26 -12
- package/dist/gateway/db/repositories/model-config-repo.js.map +1 -1
- package/dist/gateway/db/repositories/skill-repo.d.ts +0 -5
- package/dist/gateway/db/repositories/skill-review-repo.d.ts +1 -0
- package/dist/gateway/db/repositories/skill-review-repo.js +4 -1
- package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -1
- package/dist/gateway/db/repositories/skill-version-repo.js +0 -1
- package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -1
- package/dist/gateway/db/repositories/system-config-repo.d.ts +1 -1
- package/dist/gateway/db/repositories/system-config-repo.js +2 -1
- package/dist/gateway/db/repositories/system-config-repo.js.map +1 -1
- package/dist/gateway/db/repositories/user-env-config-repo.d.ts +13 -0
- package/dist/gateway/db/repositories/user-env-config-repo.js +11 -0
- package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -1
- package/dist/gateway/db/repositories/workspace-repo.d.ts +3 -2
- package/dist/gateway/db/repositories/workspace-repo.js +6 -2
- package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
- package/dist/gateway/db/schema-mysql.d.ts +473 -51
- package/dist/gateway/db/schema-mysql.js +35 -4
- package/dist/gateway/db/schema-mysql.js.map +1 -1
- package/dist/gateway/db/schema-sqlite.d.ts +522 -57
- package/dist/gateway/db/schema-sqlite.js +38 -6
- package/dist/gateway/db/schema-sqlite.js.map +1 -1
- package/dist/gateway/db/schema.d.ts +471 -51
- package/dist/gateway/db/schema.js +1 -1
- package/dist/gateway/db/schema.js.map +1 -1
- package/dist/gateway/metrics-aggregator.d.ts +65 -0
- package/dist/gateway/metrics-aggregator.js +244 -0
- package/dist/gateway/metrics-aggregator.js.map +1 -0
- package/dist/gateway/plugins/channel-bridge.d.ts +4 -1
- package/dist/gateway/plugins/channel-bridge.js +78 -86
- package/dist/gateway/plugins/channel-bridge.js.map +1 -1
- package/dist/gateway/rpc-methods.d.ts +4 -2
- package/dist/gateway/rpc-methods.js +962 -163
- package/dist/gateway/rpc-methods.js.map +1 -1
- package/dist/gateway/security/cert-manager.d.ts +2 -2
- package/dist/gateway/security/cert-manager.js +4 -2
- package/dist/gateway/security/cert-manager.js.map +1 -1
- package/dist/gateway/server.d.ts +4 -8
- package/dist/gateway/server.js +297 -261
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/skills/file-writer.js +17 -11
- package/dist/gateway/skills/file-writer.js.map +1 -1
- package/dist/gateway/skills/script-evaluator.js +12 -9
- package/dist/gateway/skills/script-evaluator.js.map +1 -1
- package/dist/gateway/web/dist/assets/index-0p17ZeTP.js +740 -0
- package/dist/gateway/web/dist/assets/index-9eP6nPUq.js +741 -0
- package/dist/gateway/web/dist/assets/index-9eP6nPUq.js.map +1 -0
- package/dist/gateway/web/dist/assets/index-CAmSY91d.js +675 -0
- package/dist/gateway/web/dist/assets/index-DMFEh8Pp.css +1 -0
- package/dist/gateway/web/dist/assets/index-DyowBCEj.css +1 -0
- package/dist/gateway/web/dist/assets/index-PDK5JJDO.css +1 -0
- package/dist/gateway/web/dist/index.html +2 -2
- package/dist/gateway-main.js +27 -10
- package/dist/gateway-main.js.map +1 -1
- package/dist/memory/embeddings.js +5 -4
- package/dist/memory/embeddings.js.map +1 -1
- package/dist/memory/indexer.d.ts +23 -3
- package/dist/memory/indexer.js +235 -23
- package/dist/memory/indexer.js.map +1 -1
- package/dist/memory/schema.js +15 -1
- package/dist/memory/schema.js.map +1 -1
- package/dist/memory/types.d.ts +18 -0
- package/dist/memory/types.js +6 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/shared/detect-language.d.ts +12 -0
- package/dist/shared/detect-language.js +78 -0
- package/dist/shared/detect-language.js.map +1 -0
- package/dist/shared/diagnostic-events.d.ts +70 -0
- package/dist/shared/diagnostic-events.js +38 -0
- package/dist/shared/diagnostic-events.js.map +1 -0
- package/dist/shared/local-collector.d.ts +56 -0
- package/dist/shared/local-collector.js +284 -0
- package/dist/shared/local-collector.js.map +1 -0
- package/dist/shared/metrics-types.d.ts +64 -0
- package/dist/shared/metrics-types.js +25 -0
- package/dist/shared/metrics-types.js.map +1 -0
- package/dist/shared/metrics.d.ts +19 -0
- package/dist/shared/metrics.js +185 -0
- package/dist/shared/metrics.js.map +1 -0
- package/dist/shared/path-utils.d.ts +15 -0
- package/dist/shared/path-utils.js +23 -0
- package/dist/shared/path-utils.js.map +1 -0
- package/dist/shared/retry.d.ts +35 -0
- package/dist/shared/retry.js +61 -0
- package/dist/shared/retry.js.map +1 -0
- package/dist/tools/command-sets.d.ts +18 -2
- package/dist/tools/command-sets.js +207 -32
- package/dist/tools/command-sets.js.map +1 -1
- package/dist/tools/command-validator.d.ts +56 -0
- package/dist/tools/command-validator.js +357 -0
- package/dist/tools/command-validator.js.map +1 -0
- package/dist/tools/create-skill.js +26 -1
- package/dist/tools/create-skill.js.map +1 -1
- package/dist/tools/credential-list.js +1 -23
- package/dist/tools/credential-list.js.map +1 -1
- package/dist/tools/credential-manager.d.ts +98 -0
- package/dist/tools/credential-manager.js +313 -0
- package/dist/tools/credential-manager.js.map +1 -0
- package/dist/tools/deep-search/engine.js +184 -127
- package/dist/tools/deep-search/engine.js.map +1 -1
- package/dist/tools/deep-search/prompts.d.ts +10 -2
- package/dist/tools/deep-search/prompts.js +37 -36
- package/dist/tools/deep-search/prompts.js.map +1 -1
- package/dist/tools/deep-search/schemas.d.ts +87 -0
- package/dist/tools/deep-search/schemas.js +85 -0
- package/dist/tools/deep-search/schemas.js.map +1 -0
- package/dist/tools/deep-search/sub-agent.d.ts +21 -0
- package/dist/tools/deep-search/sub-agent.js +153 -4
- package/dist/tools/deep-search/sub-agent.js.map +1 -1
- package/dist/tools/deep-search/tool.js +1 -0
- package/dist/tools/deep-search/tool.js.map +1 -1
- package/dist/tools/deep-search/types.d.ts +2 -0
- package/dist/tools/deep-search/types.js.map +1 -1
- package/dist/tools/dp-tools.js +29 -5
- package/dist/tools/dp-tools.js.map +1 -1
- package/dist/tools/exec-utils.d.ts +85 -0
- package/dist/tools/exec-utils.js +294 -0
- package/dist/tools/exec-utils.js.map +1 -0
- package/dist/tools/fork-skill.js +14 -2
- package/dist/tools/fork-skill.js.map +1 -1
- package/dist/tools/investigation-feedback.d.ts +3 -0
- package/dist/tools/investigation-feedback.js +71 -0
- package/dist/tools/investigation-feedback.js.map +1 -0
- package/dist/tools/manage-schedule.js +16 -6
- package/dist/tools/manage-schedule.js.map +1 -1
- package/dist/tools/netns-script.js +27 -281
- package/dist/tools/netns-script.js.map +1 -1
- package/dist/tools/node-exec.d.ts +2 -14
- package/dist/tools/node-exec.js +18 -225
- package/dist/tools/node-exec.js.map +1 -1
- package/dist/tools/node-script.js +14 -168
- package/dist/tools/node-script.js.map +1 -1
- package/dist/tools/pod-exec.d.ts +1 -1
- package/dist/tools/pod-exec.js +10 -26
- package/dist/tools/pod-exec.js.map +1 -1
- package/dist/tools/pod-nsenter-exec.js +21 -225
- package/dist/tools/pod-nsenter-exec.js.map +1 -1
- package/dist/tools/pod-script.js +10 -19
- package/dist/tools/pod-script.js.map +1 -1
- package/dist/tools/restricted-bash.d.ts +1 -17
- package/dist/tools/restricted-bash.js +38 -252
- package/dist/tools/restricted-bash.js.map +1 -1
- package/dist/tools/run-skill.d.ts +3 -1
- package/dist/tools/run-skill.js +21 -1
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/script-resolver.d.ts +3 -1
- package/dist/tools/script-resolver.js +74 -30
- package/dist/tools/script-resolver.js.map +1 -1
- package/dist/tools/update-skill.js +17 -6
- package/dist/tools/update-skill.js.map +1 -1
- package/package.json +8 -6
- package/siclaw.mjs +10 -1
- package/skills/core/cluster-events/SKILL.md +1 -1
- package/skills/core/deep-investigation/SKILL.md +11 -0
- package/skills/core/deployment-rollout-debug/SKILL.md +1 -1
- package/skills/core/dns-debug/SKILL.md +1 -0
- package/skills/core/meta.json +12 -1
- package/skills/core/networkpolicy-debug/SKILL.md +332 -0
- package/skills/core/node-logs/scripts/get-node-logs.sh +19 -9
- package/skills/core/pod-pending-debug/SKILL.md +1 -0
- package/skills/core/quota-debug/SKILL.md +203 -0
- package/skills/core/service-debug/SKILL.md +1 -0
- package/skills/core/statefulset-debug/SKILL.md +280 -0
- package/skills/core/volcano-diagnose-pod/SKILL.md +196 -0
- package/skills/core/volcano-diagnose-pod/scripts/diagnose-pod.sh +175 -0
- package/skills/core/volcano-gang-scheduling/SKILL.md +299 -0
- package/skills/core/volcano-job-diagnose/SKILL.md +319 -0
- package/skills/core/volcano-job-diagnose/scripts/diagnose-job.sh +253 -0
- package/skills/core/volcano-node-resources/SKILL.md +334 -0
- package/skills/core/volcano-node-resources/scripts/get-node-resources.sh +281 -0
- package/skills/core/volcano-queue-diagnose/SKILL.md +294 -0
- package/skills/core/volcano-queue-diagnose/scripts/diagnose-queue.sh +283 -0
- package/skills/core/volcano-resource-insufficient/SKILL.md +315 -0
- package/skills/core/volcano-scheduler-config/SKILL.md +371 -0
- package/skills/core/volcano-scheduler-config/scripts/get-scheduler-config.sh +297 -0
- package/skills/core/volcano-scheduler-logs/SKILL.md +241 -0
- package/skills/core/volcano-scheduler-logs/scripts/get-scheduler-logs.sh +159 -0
- package/skills/platform/create-skill/SKILL.md +35 -3
- package/skills/platform/manage-skill/SKILL.md +9 -2
- package/skills/platform/update-skill/SKILL.md +17 -6
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified command validation: shell parsing, context-based whitelist, and restrictions.
|
|
3
|
+
*
|
|
4
|
+
* Centralises logic previously duplicated across restricted-bash.ts and node-exec.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { ALLOWED_COMMANDS, COMMAND_CATEGORIES, CONTEXT_CATEGORIES, getCommandBinary, validateCommandRestrictions, } from "./command-sets.js";
|
|
7
|
+
// ── extractCommands (moved from restricted-bash.ts) ──────────────────
|
|
8
|
+
/**
|
|
9
|
+
* Extract individual commands from a shell pipeline.
|
|
10
|
+
* Splits on |, &&, ;, || while respecting quotes and subshells.
|
|
11
|
+
*/
|
|
12
|
+
export function extractCommands(input) {
|
|
13
|
+
const commands = [];
|
|
14
|
+
let current = "";
|
|
15
|
+
let inQuote = null;
|
|
16
|
+
let parenDepth = 0;
|
|
17
|
+
for (let i = 0; i < input.length; i++) {
|
|
18
|
+
const ch = input[i];
|
|
19
|
+
if (inQuote) {
|
|
20
|
+
current += ch;
|
|
21
|
+
if (ch === inQuote) {
|
|
22
|
+
// Count consecutive preceding backslashes — char is escaped only if count is odd
|
|
23
|
+
let backslashes = 0;
|
|
24
|
+
for (let j = i - 1; j >= 0 && input[j] === "\\"; j--)
|
|
25
|
+
backslashes++;
|
|
26
|
+
if (backslashes % 2 === 0) {
|
|
27
|
+
inQuote = null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
33
|
+
inQuote = ch;
|
|
34
|
+
current += ch;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (ch === "(") {
|
|
38
|
+
parenDepth++;
|
|
39
|
+
current += ch;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (ch === ")") {
|
|
43
|
+
parenDepth--;
|
|
44
|
+
current += ch;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Only split at top-level (not inside subshells)
|
|
48
|
+
if (parenDepth === 0) {
|
|
49
|
+
// Check for ||, &&
|
|
50
|
+
if ((ch === "&" && input[i + 1] === "&") ||
|
|
51
|
+
(ch === "|" && input[i + 1] === "|")) {
|
|
52
|
+
if (current.trim())
|
|
53
|
+
commands.push(current.trim());
|
|
54
|
+
current = "";
|
|
55
|
+
i++; // skip next char
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Check for single & (background), | and ;
|
|
59
|
+
// But skip & when preceded by > (fd redirection like >&2, 2>&1)
|
|
60
|
+
if (ch === "&" && current.length > 0 && current[current.length - 1] === ">") {
|
|
61
|
+
current += ch;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (ch === "&" || ch === "|" || ch === ";") {
|
|
65
|
+
if (current.trim())
|
|
66
|
+
commands.push(current.trim());
|
|
67
|
+
current = "";
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
current += ch;
|
|
72
|
+
}
|
|
73
|
+
if (current.trim())
|
|
74
|
+
commands.push(current.trim());
|
|
75
|
+
return commands;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract individual commands from a shell pipeline, tracking whether each
|
|
79
|
+
* command follows a pipe (|) operator vs other separators (&&, ||, ;, &).
|
|
80
|
+
* Used by validateCommand to pass pipe position to COMMAND_RULES (pipeOnly).
|
|
81
|
+
*/
|
|
82
|
+
export function extractPipeline(input) {
|
|
83
|
+
const segments = [];
|
|
84
|
+
let current = "";
|
|
85
|
+
let inQuote = null;
|
|
86
|
+
let parenDepth = 0;
|
|
87
|
+
let nextIsPiped = false;
|
|
88
|
+
for (let i = 0; i < input.length; i++) {
|
|
89
|
+
const ch = input[i];
|
|
90
|
+
if (inQuote) {
|
|
91
|
+
current += ch;
|
|
92
|
+
if (ch === inQuote) {
|
|
93
|
+
// Count consecutive preceding backslashes — char is escaped only if count is odd
|
|
94
|
+
let backslashes = 0;
|
|
95
|
+
for (let j = i - 1; j >= 0 && input[j] === "\\"; j--)
|
|
96
|
+
backslashes++;
|
|
97
|
+
if (backslashes % 2 === 0) {
|
|
98
|
+
inQuote = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
104
|
+
inQuote = ch;
|
|
105
|
+
current += ch;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (ch === "(") {
|
|
109
|
+
parenDepth++;
|
|
110
|
+
current += ch;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (ch === ")") {
|
|
114
|
+
parenDepth--;
|
|
115
|
+
current += ch;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (parenDepth === 0) {
|
|
119
|
+
// Check for || and &&
|
|
120
|
+
if ((ch === "&" && input[i + 1] === "&") ||
|
|
121
|
+
(ch === "|" && input[i + 1] === "|")) {
|
|
122
|
+
if (current.trim())
|
|
123
|
+
segments.push({ command: current.trim(), piped: nextIsPiped });
|
|
124
|
+
current = "";
|
|
125
|
+
nextIsPiped = false; // || and && are not pipes
|
|
126
|
+
i++; // skip next char
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
// Skip & when preceded by > (fd redirection like >&2, 2>&1)
|
|
130
|
+
if (ch === "&" && current.length > 0 && current[current.length - 1] === ">") {
|
|
131
|
+
current += ch;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
// Single | — next command receives piped input
|
|
135
|
+
if (ch === "|") {
|
|
136
|
+
if (current.trim())
|
|
137
|
+
segments.push({ command: current.trim(), piped: nextIsPiped });
|
|
138
|
+
current = "";
|
|
139
|
+
nextIsPiped = true;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
// & or ; — not pipes
|
|
143
|
+
if (ch === "&" || ch === ";") {
|
|
144
|
+
if (current.trim())
|
|
145
|
+
segments.push({ command: current.trim(), piped: nextIsPiped });
|
|
146
|
+
current = "";
|
|
147
|
+
nextIsPiped = false;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
current += ch;
|
|
152
|
+
}
|
|
153
|
+
if (current.trim())
|
|
154
|
+
segments.push({ command: current.trim(), piped: nextIsPiped });
|
|
155
|
+
return segments;
|
|
156
|
+
}
|
|
157
|
+
// ── validateShellOperators (moved from restricted-bash.ts) ───────────
|
|
158
|
+
/**
|
|
159
|
+
* Validate that a command does not use dangerous shell operators.
|
|
160
|
+
* Scans character-by-character respecting quotes.
|
|
161
|
+
* Blocks: > >> (output redirection, except >&N fd duplication and >/dev/null),
|
|
162
|
+
* $() and backticks (command substitution), <() >() (process substitution).
|
|
163
|
+
* Returns an error message if blocked, or null if safe.
|
|
164
|
+
*/
|
|
165
|
+
export function validateShellOperators(command) {
|
|
166
|
+
let inQuote = null;
|
|
167
|
+
for (let i = 0; i < command.length; i++) {
|
|
168
|
+
const ch = command[i];
|
|
169
|
+
// Block newline/carriage-return characters — bash interprets them as command
|
|
170
|
+
// separators, but extractCommands() does not split on them, so they can be
|
|
171
|
+
// used to smuggle commands past whitelist validation.
|
|
172
|
+
if (ch === "\n" || ch === "\r") {
|
|
173
|
+
return JSON.stringify({
|
|
174
|
+
error: "Newline characters are not allowed in commands.",
|
|
175
|
+
}, null, 2);
|
|
176
|
+
}
|
|
177
|
+
// Block backtick command substitution everywhere (including inside quotes)
|
|
178
|
+
if (ch === "`") {
|
|
179
|
+
return JSON.stringify({
|
|
180
|
+
error: "Backtick command substitution is not allowed.",
|
|
181
|
+
}, null, 2);
|
|
182
|
+
}
|
|
183
|
+
// Block $() command substitution everywhere (including inside quotes)
|
|
184
|
+
if (ch === "$" && command[i + 1] === "(") {
|
|
185
|
+
return JSON.stringify({
|
|
186
|
+
error: "$() command substitution is not allowed.",
|
|
187
|
+
}, null, 2);
|
|
188
|
+
}
|
|
189
|
+
// Track quote state for redirection checks only
|
|
190
|
+
if (inQuote) {
|
|
191
|
+
if (ch === inQuote && command[i - 1] !== "\\") {
|
|
192
|
+
inQuote = null;
|
|
193
|
+
}
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (ch === "'" || ch === '"') {
|
|
197
|
+
inQuote = ch;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// Block <() process substitution
|
|
201
|
+
if (ch === "<" && command[i + 1] === "(") {
|
|
202
|
+
return JSON.stringify({
|
|
203
|
+
error: "<() process substitution is not allowed.",
|
|
204
|
+
}, null, 2);
|
|
205
|
+
}
|
|
206
|
+
// Block bare < input redirection (but not <( which is already handled above)
|
|
207
|
+
if (ch === "<" && command[i + 1] !== "(") {
|
|
208
|
+
return JSON.stringify({
|
|
209
|
+
error: "Input redirection (<) is not allowed.",
|
|
210
|
+
}, null, 2);
|
|
211
|
+
}
|
|
212
|
+
// Check output redirection: > and >>
|
|
213
|
+
if (ch === ">") {
|
|
214
|
+
// Allow >() process substitution — already blocked above when preceded by nothing,
|
|
215
|
+
// but >( after a word is process substitution too
|
|
216
|
+
if (command[i + 1] === "(") {
|
|
217
|
+
return JSON.stringify({
|
|
218
|
+
error: ">() process substitution is not allowed.",
|
|
219
|
+
}, null, 2);
|
|
220
|
+
}
|
|
221
|
+
// Allow fd duplication: >&N (e.g. 2>&1, >&2)
|
|
222
|
+
if (command[i + 1] === "&")
|
|
223
|
+
continue;
|
|
224
|
+
// Determine the redirect target (skip optional second > for >>)
|
|
225
|
+
let j = i + 1;
|
|
226
|
+
if (command[j] === ">")
|
|
227
|
+
j++; // >>
|
|
228
|
+
// Skip whitespace
|
|
229
|
+
while (j < command.length && command[j] === " ")
|
|
230
|
+
j++;
|
|
231
|
+
// Allow redirect to /dev/null
|
|
232
|
+
const target = command.substring(j);
|
|
233
|
+
if (/^\/dev\/null\b/.test(target))
|
|
234
|
+
continue;
|
|
235
|
+
return JSON.stringify({
|
|
236
|
+
error: "Output redirection (> or >>) to files is not allowed.",
|
|
237
|
+
}, null, 2);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
// ── Context-based command whitelist ──────────────────────────────────
|
|
243
|
+
const contextCommandsCache = new Map();
|
|
244
|
+
/**
|
|
245
|
+
* Get the set of commands allowed for a given execution context.
|
|
246
|
+
* Results are cached for performance.
|
|
247
|
+
*/
|
|
248
|
+
export function getContextCommands(context) {
|
|
249
|
+
const cached = contextCommandsCache.get(context);
|
|
250
|
+
if (cached)
|
|
251
|
+
return cached;
|
|
252
|
+
const categories = CONTEXT_CATEGORIES[context];
|
|
253
|
+
if (!categories)
|
|
254
|
+
return ALLOWED_COMMANDS; // fallback
|
|
255
|
+
const categorySet = new Set(categories);
|
|
256
|
+
const cmds = new Set();
|
|
257
|
+
for (const [cmd, cat] of Object.entries(COMMAND_CATEGORIES)) {
|
|
258
|
+
if (categorySet.has(cat))
|
|
259
|
+
cmds.add(cmd);
|
|
260
|
+
}
|
|
261
|
+
contextCommandsCache.set(context, cmds);
|
|
262
|
+
return cmds;
|
|
263
|
+
}
|
|
264
|
+
// ── Sensitive path patterns (secondary defense) ──────────────────────
|
|
265
|
+
const FILE_READING_CMDS = new Set([
|
|
266
|
+
"cat", "head", "tail", "less", "more",
|
|
267
|
+
"grep", "egrep", "fgrep", "awk", "gawk",
|
|
268
|
+
"cut", "sort", "wc", "uniq", "column",
|
|
269
|
+
"jq", "yq", "strings", "diff",
|
|
270
|
+
]);
|
|
271
|
+
// ── Unified validation entry point ──────────────────────────────────
|
|
272
|
+
/**
|
|
273
|
+
* Validate a command string against context-based whitelist and restrictions.
|
|
274
|
+
* Pipeline:
|
|
275
|
+
* 1. validateShellOperators()
|
|
276
|
+
* 2. extractPipeline() (with pipe position tracking)
|
|
277
|
+
* 3. Per-command: context whitelist + extraAllowed + isAllowed
|
|
278
|
+
* 4. pipelineValidators (e.g. validateKubectlInPipeline)
|
|
279
|
+
* 5. validateCommandRestrictions() — includes pipeOnly, noFilePaths,
|
|
280
|
+
* blockedFlags via COMMAND_RULES (context + pipe-position-aware)
|
|
281
|
+
* 6. sensitivePathPatterns check
|
|
282
|
+
*
|
|
283
|
+
* Returns an error message string if blocked, or null if allowed.
|
|
284
|
+
*/
|
|
285
|
+
export function validateCommand(command, options) {
|
|
286
|
+
if (!command || !command.trim()) {
|
|
287
|
+
return "Command must not be empty.";
|
|
288
|
+
}
|
|
289
|
+
// 1. Shell operator validation
|
|
290
|
+
const shellOpErr = validateShellOperators(command);
|
|
291
|
+
if (shellOpErr)
|
|
292
|
+
return shellOpErr;
|
|
293
|
+
// 2. Split pipeline (with pipe position tracking)
|
|
294
|
+
const pipeline = extractPipeline(command);
|
|
295
|
+
const commands = pipeline.map(s => s.command);
|
|
296
|
+
if (commands.length === 0) {
|
|
297
|
+
return "Command must not be empty.";
|
|
298
|
+
}
|
|
299
|
+
// 3. Per-command whitelist check
|
|
300
|
+
const context = options?.context ?? "node";
|
|
301
|
+
const contextCmds = getContextCommands(context);
|
|
302
|
+
const violations = [];
|
|
303
|
+
for (const cmd of commands) {
|
|
304
|
+
const binary = getCommandBinary(cmd);
|
|
305
|
+
if (!binary)
|
|
306
|
+
continue;
|
|
307
|
+
// Check extraAllowed first (e.g., kubectl for local)
|
|
308
|
+
if (options?.extraAllowed?.has(binary))
|
|
309
|
+
continue;
|
|
310
|
+
// Check context whitelist
|
|
311
|
+
if (contextCmds.has(binary))
|
|
312
|
+
continue;
|
|
313
|
+
// Check custom isAllowed (e.g., skill scripts)
|
|
314
|
+
if (options?.isAllowed?.(cmd))
|
|
315
|
+
continue;
|
|
316
|
+
violations.push(binary);
|
|
317
|
+
}
|
|
318
|
+
if (violations.length > 0) {
|
|
319
|
+
return JSON.stringify({
|
|
320
|
+
error: `Blocked: disallowed command(s) — "${[...new Set(violations)].join(", ")}" is not in the allowed command list`,
|
|
321
|
+
allowed: [...contextCmds, ...(options?.extraAllowed ?? [])].sort(),
|
|
322
|
+
}, null, 2);
|
|
323
|
+
}
|
|
324
|
+
// 4. Pipeline validators (e.g., kubectl subcommand checks)
|
|
325
|
+
if (options?.pipelineValidators) {
|
|
326
|
+
for (const validator of options.pipelineValidators) {
|
|
327
|
+
const err = validator(commands);
|
|
328
|
+
if (err)
|
|
329
|
+
return err;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// 5. Per-command restrictions (pipeOnly, noFilePaths, blockedFlags,
|
|
333
|
+
// allowedFlags, positionals, etc. — all via COMMAND_RULES)
|
|
334
|
+
for (const seg of pipeline) {
|
|
335
|
+
const err = validateCommandRestrictions(seg.command, {
|
|
336
|
+
context,
|
|
337
|
+
piped: seg.piped,
|
|
338
|
+
});
|
|
339
|
+
if (err)
|
|
340
|
+
return err;
|
|
341
|
+
}
|
|
342
|
+
// 6. Sensitive path patterns (secondary defense layer)
|
|
343
|
+
if (options?.sensitivePathPatterns) {
|
|
344
|
+
for (const cmd of commands) {
|
|
345
|
+
const binary = getCommandBinary(cmd);
|
|
346
|
+
if (binary && FILE_READING_CMDS.has(binary)) {
|
|
347
|
+
if (options.sensitivePathPatterns.some((re) => re.test(cmd))) {
|
|
348
|
+
return JSON.stringify({
|
|
349
|
+
error: "Reading credential or config files is not allowed.",
|
|
350
|
+
}, null, 2);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=command-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-validator.js","sourceRoot":"","sources":["../../src/tools/command-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,32 @@ Important:
|
|
|
50
50
|
- If the user asks to "change", "modify", "update", or "replace" a skill (whether created earlier in this conversation or not), always use \`update_skill\`.
|
|
51
51
|
- Only use \`create_skill\` when the user explicitly wants a brand-new, separate skill.
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
## Duplicate / Overlap Check — CRITICAL
|
|
54
|
+
|
|
55
|
+
**Before calling \`create_skill\`, you MUST check whether an existing skill already covers the same functionality.** Check \`<available_skills>\` in your system prompt and compare the user's request against existing builtin, team, and personal skills.
|
|
56
|
+
|
|
57
|
+
- **Exact name match**: The tool will reject creation if a skill with the same name exists. But functional overlap with a DIFFERENT name is equally problematic.
|
|
58
|
+
- **Functional overlap found**: If an existing skill solves the same problem (even with a different name), DO NOT silently create a new one. Instead:
|
|
59
|
+
1. Tell the user which existing skill overlaps and what it does.
|
|
60
|
+
2. Ask if they want to: (a) use the existing skill as-is, (b) fork it with \`fork_skill\` to make a customized personal copy, or (c) still create a brand-new separate skill.
|
|
61
|
+
3. Only proceed with \`create_skill\` if the user explicitly chooses option (c).
|
|
62
|
+
- **Why this matters**: Duplicate skills with similar functionality confuse the model — it cannot reliably choose between two skills that do the same thing. One well-maintained skill is always better than two overlapping ones.
|
|
63
|
+
- To fork a builtin or team skill into a personal copy, use \`fork_skill\`.
|
|
64
|
+
|
|
65
|
+
## Environments and Approval Workflow
|
|
66
|
+
|
|
67
|
+
Skills go through a review workflow that behaves differently per environment:
|
|
68
|
+
|
|
69
|
+
| Environment | Behavior |
|
|
70
|
+
|-------------|----------|
|
|
71
|
+
| **Dev / Test** | Newly created skills (draft status) are immediately visible and usable. You can test them right away. |
|
|
72
|
+
| **Production** | Only **approved** skill versions are visible. Draft and pending skills do NOT appear in production. |
|
|
73
|
+
|
|
74
|
+
- After creating a skill, it starts in **draft** status.
|
|
75
|
+
- Skills with scripts must be **submitted for review** and **approved by an admin** before they become active in production.
|
|
76
|
+
- Skills without scripts (pure guidance) also start as draft but can be submitted and approved more quickly.
|
|
77
|
+
- **After creating a skill in production context**: inform the user that the skill is pending review and will not be available in production until approved. Suggest testing in the dev/test environment first.
|
|
78
|
+
- **Do NOT attempt to test or run a newly created skill in production** — it will not be found.
|
|
54
79
|
|
|
55
80
|
## Script Execution Modes
|
|
56
81
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-skill.js","sourceRoot":"","sources":["../../src/tools/create-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAWjF,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"create-skill.js","sourceRoot":"","sources":["../../src/tools/create-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +1,10 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
2
1
|
import fs from "node:fs";
|
|
3
2
|
import path from "node:path";
|
|
4
3
|
import { Type } from "@sinclair/typebox";
|
|
5
4
|
import { Text } from "@mariozechner/pi-tui";
|
|
6
5
|
import { renderTextResult } from "./tool-render.js";
|
|
7
6
|
import { loadConfig } from "../core/config.js";
|
|
8
|
-
|
|
9
|
-
function probeKubeconfig(kubeconfigPath) {
|
|
10
|
-
return new Promise((resolve) => {
|
|
11
|
-
execFile("kubectl", ["version", "--output=json", `--kubeconfig=${kubeconfigPath}`, "--request-timeout=3s"], { timeout: 5000 }, (err, stdout) => {
|
|
12
|
-
if (err) {
|
|
13
|
-
const msg = err.message?.includes("timed out")
|
|
14
|
-
? "connection timeout"
|
|
15
|
-
: err.message?.split("\n")[0] ?? "unknown error";
|
|
16
|
-
resolve({ reachable: false, error: msg });
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
const info = JSON.parse(stdout);
|
|
21
|
-
const ver = info.serverVersion?.gitVersion ?? "unknown";
|
|
22
|
-
resolve({ reachable: true, version: ver });
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
resolve({ reachable: true, version: "unknown" });
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
}
|
|
7
|
+
import { probeKubeconfig } from "./credential-manager.js";
|
|
30
8
|
/**
|
|
31
9
|
* Tool to list available credentials and their metadata.
|
|
32
10
|
* Reads manifest.json from the credentials directory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-list.js","sourceRoot":"","sources":["../../src/tools/credential-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"credential-list.js","sourceRoot":"","sources":["../../src/tools/credential-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
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
|
+
export interface CredentialManifestEntry {
|
|
8
|
+
name: string;
|
|
9
|
+
type: string;
|
|
10
|
+
description?: string | null;
|
|
11
|
+
files: string[];
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
export type CredentialType = "kubeconfig" | "ssh_key" | "ssh_password" | "api_token" | "api_basic_auth";
|
|
15
|
+
export interface RegisterKubeconfigOpts {
|
|
16
|
+
name: string;
|
|
17
|
+
/** Absolute path to the source kubeconfig file (provide this OR content) */
|
|
18
|
+
sourcePath?: string;
|
|
19
|
+
/** Raw kubeconfig YAML/JSON content (provide this OR sourcePath) */
|
|
20
|
+
content?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface RegisterSshPasswordOpts {
|
|
24
|
+
name: string;
|
|
25
|
+
host: string;
|
|
26
|
+
port?: number;
|
|
27
|
+
username: string;
|
|
28
|
+
password: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface RegisterSshKeyOpts {
|
|
32
|
+
name: string;
|
|
33
|
+
host: string;
|
|
34
|
+
port?: number;
|
|
35
|
+
username: string;
|
|
36
|
+
/** Absolute path to the private key file */
|
|
37
|
+
keyPath: string;
|
|
38
|
+
passphrase?: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface RegisterApiTokenOpts {
|
|
42
|
+
name: string;
|
|
43
|
+
url?: string;
|
|
44
|
+
token: string;
|
|
45
|
+
description?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface RegisterApiBasicAuthOpts {
|
|
48
|
+
name: string;
|
|
49
|
+
url?: string;
|
|
50
|
+
username: string;
|
|
51
|
+
password: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ProbeResult {
|
|
55
|
+
reachable: boolean;
|
|
56
|
+
version?: string;
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface CredentialListEntry extends CredentialManifestEntry {
|
|
60
|
+
reachable?: boolean;
|
|
61
|
+
server_version?: string;
|
|
62
|
+
probe_error?: string;
|
|
63
|
+
}
|
|
64
|
+
declare function safeName(name: string): string;
|
|
65
|
+
/** Reject values that could inject SSH config directives (newlines, leading whitespace). */
|
|
66
|
+
declare function sanitizeSshField(value: string, fieldName: string): string;
|
|
67
|
+
declare function readManifest(credentialsDir: string): CredentialManifestEntry[];
|
|
68
|
+
/** Probe a kubeconfig with `kubectl version` (3s timeout, parallel-safe). */
|
|
69
|
+
export declare function probeKubeconfig(kubeconfigPath: string): Promise<ProbeResult>;
|
|
70
|
+
type RegisterResult = {
|
|
71
|
+
entry: CredentialManifestEntry;
|
|
72
|
+
error?: undefined;
|
|
73
|
+
} | {
|
|
74
|
+
entry?: undefined;
|
|
75
|
+
error: string;
|
|
76
|
+
};
|
|
77
|
+
export declare function registerKubeconfig(credentialsDir: string, opts: RegisterKubeconfigOpts): RegisterResult;
|
|
78
|
+
export declare function registerSshPassword(credentialsDir: string, opts: RegisterSshPasswordOpts): {
|
|
79
|
+
entry: CredentialManifestEntry;
|
|
80
|
+
};
|
|
81
|
+
export declare function registerSshKey(credentialsDir: string, opts: RegisterSshKeyOpts): RegisterResult;
|
|
82
|
+
export declare function registerApiToken(credentialsDir: string, opts: RegisterApiTokenOpts): {
|
|
83
|
+
entry: CredentialManifestEntry;
|
|
84
|
+
};
|
|
85
|
+
export declare function registerApiBasicAuth(credentialsDir: string, opts: RegisterApiBasicAuthOpts): {
|
|
86
|
+
entry: CredentialManifestEntry;
|
|
87
|
+
};
|
|
88
|
+
export declare function removeCredential(credentialsDir: string, name: string): {
|
|
89
|
+
removed: boolean;
|
|
90
|
+
};
|
|
91
|
+
export declare function listCredentials(credentialsDir: string): Promise<CredentialListEntry[]>;
|
|
92
|
+
/** @internal Exposed for unit testing only. */
|
|
93
|
+
export declare const _testing: {
|
|
94
|
+
safeName: typeof safeName;
|
|
95
|
+
sanitizeSshField: typeof sanitizeSshField;
|
|
96
|
+
readManifest: typeof readManifest;
|
|
97
|
+
};
|
|
98
|
+
export {};
|