siclaw 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/README.md +75 -114
  2. package/dist/agentbox/gateway-client.d.ts +2 -1
  3. package/dist/agentbox/gateway-client.js +6 -2
  4. package/dist/agentbox/gateway-client.js.map +1 -1
  5. package/dist/agentbox/http-server.js +184 -19
  6. package/dist/agentbox/http-server.js.map +1 -1
  7. package/dist/agentbox/resource-handlers.d.ts +1 -0
  8. package/dist/agentbox/resource-handlers.js +23 -23
  9. package/dist/agentbox/resource-handlers.js.map +1 -1
  10. package/dist/agentbox/session.js +85 -5
  11. package/dist/agentbox/session.js.map +1 -1
  12. package/dist/agentbox-main.d.ts +2 -1
  13. package/dist/agentbox-main.js +65 -18
  14. package/dist/agentbox-main.js.map +1 -1
  15. package/dist/cli-credentials.d.ts +1 -0
  16. package/dist/cli-credentials.js +109 -0
  17. package/dist/cli-credentials.js.map +1 -0
  18. package/dist/cli-first-run.d.ts +11 -0
  19. package/dist/cli-first-run.js +99 -0
  20. package/dist/cli-first-run.js.map +1 -0
  21. package/dist/cli-main.js +33 -11
  22. package/dist/cli-main.js.map +1 -1
  23. package/dist/cli-setup.d.ts +5 -11
  24. package/dist/cli-setup.js +12 -225
  25. package/dist/cli-setup.js.map +1 -1
  26. package/dist/core/agent-factory.d.ts +4 -0
  27. package/dist/core/agent-factory.js +102 -151
  28. package/dist/core/agent-factory.js.map +1 -1
  29. package/dist/core/config.d.ts +10 -3
  30. package/dist/core/config.js +11 -95
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/extensions/deep-investigation.d.ts +2 -1
  33. package/dist/core/extensions/deep-investigation.js +144 -24
  34. package/dist/core/extensions/deep-investigation.js.map +1 -1
  35. package/dist/core/extensions/setup.d.ts +8 -0
  36. package/dist/core/extensions/setup.js +669 -0
  37. package/dist/core/extensions/setup.js.map +1 -0
  38. package/dist/core/llm-proxy.js +7 -3
  39. package/dist/core/llm-proxy.js.map +1 -1
  40. package/dist/core/mcp-client.d.ts +0 -10
  41. package/dist/core/mcp-client.js +0 -65
  42. package/dist/core/mcp-client.js.map +1 -1
  43. package/dist/core/prompt.d.ts +1 -1
  44. package/dist/core/prompt.js +42 -5
  45. package/dist/core/prompt.js.map +1 -1
  46. package/dist/core/provider-presets.d.ts +14 -0
  47. package/dist/core/provider-presets.js +81 -0
  48. package/dist/core/provider-presets.js.map +1 -0
  49. package/dist/cron/cron-coordinator.d.ts +2 -0
  50. package/dist/cron/cron-coordinator.js +46 -14
  51. package/dist/cron/cron-coordinator.js.map +1 -1
  52. package/dist/cron/cron-executor.js +33 -8
  53. package/dist/cron/cron-executor.js.map +1 -1
  54. package/dist/cron/cron-scheduler.d.ts +1 -1
  55. package/dist/cron/gateway-client.d.ts +5 -0
  56. package/dist/cron/gateway-client.js +43 -8
  57. package/dist/cron/gateway-client.js.map +1 -1
  58. package/dist/cron-main.js +39 -9
  59. package/dist/cron-main.js.map +1 -1
  60. package/dist/gateway/agentbox/client.d.ts +11 -0
  61. package/dist/gateway/agentbox/client.js +18 -0
  62. package/dist/gateway/agentbox/client.js.map +1 -1
  63. package/dist/gateway/agentbox/k8s-spawner.d.ts +11 -2
  64. package/dist/gateway/agentbox/k8s-spawner.js +95 -52
  65. package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
  66. package/dist/gateway/agentbox/local-spawner.d.ts +1 -1
  67. package/dist/gateway/agentbox/local-spawner.js +4 -2
  68. package/dist/gateway/agentbox/local-spawner.js.map +1 -1
  69. package/dist/gateway/agentbox/manager.d.ts +0 -10
  70. package/dist/gateway/agentbox/manager.js +11 -30
  71. package/dist/gateway/agentbox/manager.js.map +1 -1
  72. package/dist/gateway/agentbox/types.d.ts +6 -4
  73. package/dist/gateway/cron/cron-service.d.ts +49 -0
  74. package/dist/gateway/cron/cron-service.js +259 -0
  75. package/dist/gateway/cron/cron-service.js.map +1 -0
  76. package/dist/gateway/db/init-schema.js +44 -0
  77. package/dist/gateway/db/init-schema.js.map +1 -1
  78. package/dist/gateway/db/migrate-sqlite.js +73 -4
  79. package/dist/gateway/db/migrate-sqlite.js.map +1 -1
  80. package/dist/gateway/db/repositories/chat-repo.d.ts +56 -2
  81. package/dist/gateway/db/repositories/chat-repo.js +132 -2
  82. package/dist/gateway/db/repositories/chat-repo.js.map +1 -1
  83. package/dist/gateway/db/repositories/config-repo.d.ts +31 -2
  84. package/dist/gateway/db/repositories/config-repo.js +57 -7
  85. package/dist/gateway/db/repositories/config-repo.js.map +1 -1
  86. package/dist/gateway/db/repositories/env-repo.d.ts +14 -0
  87. package/dist/gateway/db/repositories/env-repo.js +15 -2
  88. package/dist/gateway/db/repositories/env-repo.js.map +1 -1
  89. package/dist/gateway/db/repositories/model-config-repo.d.ts +1 -1
  90. package/dist/gateway/db/repositories/model-config-repo.js +26 -12
  91. package/dist/gateway/db/repositories/model-config-repo.js.map +1 -1
  92. package/dist/gateway/db/repositories/skill-repo.d.ts +0 -5
  93. package/dist/gateway/db/repositories/skill-review-repo.d.ts +1 -0
  94. package/dist/gateway/db/repositories/skill-review-repo.js +4 -1
  95. package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -1
  96. package/dist/gateway/db/repositories/skill-version-repo.js +0 -1
  97. package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -1
  98. package/dist/gateway/db/repositories/system-config-repo.d.ts +1 -1
  99. package/dist/gateway/db/repositories/system-config-repo.js +2 -1
  100. package/dist/gateway/db/repositories/system-config-repo.js.map +1 -1
  101. package/dist/gateway/db/repositories/user-env-config-repo.d.ts +13 -0
  102. package/dist/gateway/db/repositories/user-env-config-repo.js +11 -0
  103. package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -1
  104. package/dist/gateway/db/repositories/workspace-repo.d.ts +3 -2
  105. package/dist/gateway/db/repositories/workspace-repo.js +6 -2
  106. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
  107. package/dist/gateway/db/schema-mysql.d.ts +473 -51
  108. package/dist/gateway/db/schema-mysql.js +35 -4
  109. package/dist/gateway/db/schema-mysql.js.map +1 -1
  110. package/dist/gateway/db/schema-sqlite.d.ts +522 -57
  111. package/dist/gateway/db/schema-sqlite.js +38 -6
  112. package/dist/gateway/db/schema-sqlite.js.map +1 -1
  113. package/dist/gateway/db/schema.d.ts +471 -51
  114. package/dist/gateway/db/schema.js +1 -1
  115. package/dist/gateway/db/schema.js.map +1 -1
  116. package/dist/gateway/metrics-aggregator.d.ts +65 -0
  117. package/dist/gateway/metrics-aggregator.js +244 -0
  118. package/dist/gateway/metrics-aggregator.js.map +1 -0
  119. package/dist/gateway/plugins/channel-bridge.d.ts +4 -1
  120. package/dist/gateway/plugins/channel-bridge.js +78 -86
  121. package/dist/gateway/plugins/channel-bridge.js.map +1 -1
  122. package/dist/gateway/rpc-methods.d.ts +4 -2
  123. package/dist/gateway/rpc-methods.js +962 -163
  124. package/dist/gateway/rpc-methods.js.map +1 -1
  125. package/dist/gateway/security/cert-manager.d.ts +2 -2
  126. package/dist/gateway/security/cert-manager.js +4 -2
  127. package/dist/gateway/security/cert-manager.js.map +1 -1
  128. package/dist/gateway/server.d.ts +4 -8
  129. package/dist/gateway/server.js +297 -261
  130. package/dist/gateway/server.js.map +1 -1
  131. package/dist/gateway/skills/file-writer.js +17 -11
  132. package/dist/gateway/skills/file-writer.js.map +1 -1
  133. package/dist/gateway/skills/script-evaluator.js +12 -9
  134. package/dist/gateway/skills/script-evaluator.js.map +1 -1
  135. package/dist/gateway/web/dist/assets/index-0p17ZeTP.js +740 -0
  136. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js +741 -0
  137. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js.map +1 -0
  138. package/dist/gateway/web/dist/assets/index-CAmSY91d.js +675 -0
  139. package/dist/gateway/web/dist/assets/index-DMFEh8Pp.css +1 -0
  140. package/dist/gateway/web/dist/assets/index-DyowBCEj.css +1 -0
  141. package/dist/gateway/web/dist/assets/index-PDK5JJDO.css +1 -0
  142. package/dist/gateway/web/dist/index.html +2 -2
  143. package/dist/gateway-main.js +27 -10
  144. package/dist/gateway-main.js.map +1 -1
  145. package/dist/memory/embeddings.js +5 -4
  146. package/dist/memory/embeddings.js.map +1 -1
  147. package/dist/memory/indexer.d.ts +23 -3
  148. package/dist/memory/indexer.js +235 -23
  149. package/dist/memory/indexer.js.map +1 -1
  150. package/dist/memory/schema.js +15 -1
  151. package/dist/memory/schema.js.map +1 -1
  152. package/dist/memory/types.d.ts +18 -0
  153. package/dist/memory/types.js +6 -1
  154. package/dist/memory/types.js.map +1 -1
  155. package/dist/shared/detect-language.d.ts +12 -0
  156. package/dist/shared/detect-language.js +78 -0
  157. package/dist/shared/detect-language.js.map +1 -0
  158. package/dist/shared/diagnostic-events.d.ts +70 -0
  159. package/dist/shared/diagnostic-events.js +38 -0
  160. package/dist/shared/diagnostic-events.js.map +1 -0
  161. package/dist/shared/local-collector.d.ts +56 -0
  162. package/dist/shared/local-collector.js +284 -0
  163. package/dist/shared/local-collector.js.map +1 -0
  164. package/dist/shared/metrics-types.d.ts +64 -0
  165. package/dist/shared/metrics-types.js +25 -0
  166. package/dist/shared/metrics-types.js.map +1 -0
  167. package/dist/shared/metrics.d.ts +19 -0
  168. package/dist/shared/metrics.js +185 -0
  169. package/dist/shared/metrics.js.map +1 -0
  170. package/dist/shared/path-utils.d.ts +15 -0
  171. package/dist/shared/path-utils.js +23 -0
  172. package/dist/shared/path-utils.js.map +1 -0
  173. package/dist/shared/retry.d.ts +35 -0
  174. package/dist/shared/retry.js +61 -0
  175. package/dist/shared/retry.js.map +1 -0
  176. package/dist/tools/command-sets.d.ts +18 -2
  177. package/dist/tools/command-sets.js +207 -32
  178. package/dist/tools/command-sets.js.map +1 -1
  179. package/dist/tools/command-validator.d.ts +56 -0
  180. package/dist/tools/command-validator.js +357 -0
  181. package/dist/tools/command-validator.js.map +1 -0
  182. package/dist/tools/create-skill.js +26 -1
  183. package/dist/tools/create-skill.js.map +1 -1
  184. package/dist/tools/credential-list.js +1 -23
  185. package/dist/tools/credential-list.js.map +1 -1
  186. package/dist/tools/credential-manager.d.ts +98 -0
  187. package/dist/tools/credential-manager.js +313 -0
  188. package/dist/tools/credential-manager.js.map +1 -0
  189. package/dist/tools/deep-search/engine.js +184 -127
  190. package/dist/tools/deep-search/engine.js.map +1 -1
  191. package/dist/tools/deep-search/prompts.d.ts +10 -2
  192. package/dist/tools/deep-search/prompts.js +37 -36
  193. package/dist/tools/deep-search/prompts.js.map +1 -1
  194. package/dist/tools/deep-search/schemas.d.ts +87 -0
  195. package/dist/tools/deep-search/schemas.js +85 -0
  196. package/dist/tools/deep-search/schemas.js.map +1 -0
  197. package/dist/tools/deep-search/sub-agent.d.ts +21 -0
  198. package/dist/tools/deep-search/sub-agent.js +153 -4
  199. package/dist/tools/deep-search/sub-agent.js.map +1 -1
  200. package/dist/tools/deep-search/tool.js +1 -0
  201. package/dist/tools/deep-search/tool.js.map +1 -1
  202. package/dist/tools/deep-search/types.d.ts +2 -0
  203. package/dist/tools/deep-search/types.js.map +1 -1
  204. package/dist/tools/dp-tools.js +29 -5
  205. package/dist/tools/dp-tools.js.map +1 -1
  206. package/dist/tools/exec-utils.d.ts +85 -0
  207. package/dist/tools/exec-utils.js +294 -0
  208. package/dist/tools/exec-utils.js.map +1 -0
  209. package/dist/tools/fork-skill.js +14 -2
  210. package/dist/tools/fork-skill.js.map +1 -1
  211. package/dist/tools/investigation-feedback.d.ts +3 -0
  212. package/dist/tools/investigation-feedback.js +71 -0
  213. package/dist/tools/investigation-feedback.js.map +1 -0
  214. package/dist/tools/manage-schedule.js +16 -6
  215. package/dist/tools/manage-schedule.js.map +1 -1
  216. package/dist/tools/netns-script.js +27 -281
  217. package/dist/tools/netns-script.js.map +1 -1
  218. package/dist/tools/node-exec.d.ts +2 -14
  219. package/dist/tools/node-exec.js +18 -225
  220. package/dist/tools/node-exec.js.map +1 -1
  221. package/dist/tools/node-script.js +14 -168
  222. package/dist/tools/node-script.js.map +1 -1
  223. package/dist/tools/pod-exec.d.ts +1 -1
  224. package/dist/tools/pod-exec.js +10 -26
  225. package/dist/tools/pod-exec.js.map +1 -1
  226. package/dist/tools/pod-nsenter-exec.js +21 -225
  227. package/dist/tools/pod-nsenter-exec.js.map +1 -1
  228. package/dist/tools/pod-script.js +10 -19
  229. package/dist/tools/pod-script.js.map +1 -1
  230. package/dist/tools/restricted-bash.d.ts +1 -17
  231. package/dist/tools/restricted-bash.js +38 -252
  232. package/dist/tools/restricted-bash.js.map +1 -1
  233. package/dist/tools/run-skill.d.ts +3 -1
  234. package/dist/tools/run-skill.js +21 -1
  235. package/dist/tools/run-skill.js.map +1 -1
  236. package/dist/tools/script-resolver.d.ts +3 -1
  237. package/dist/tools/script-resolver.js +74 -30
  238. package/dist/tools/script-resolver.js.map +1 -1
  239. package/dist/tools/update-skill.js +17 -6
  240. package/dist/tools/update-skill.js.map +1 -1
  241. package/package.json +8 -6
  242. package/siclaw.mjs +10 -1
  243. package/skills/core/cluster-events/SKILL.md +1 -1
  244. package/skills/core/deep-investigation/SKILL.md +11 -0
  245. package/skills/core/deployment-rollout-debug/SKILL.md +1 -1
  246. package/skills/core/dns-debug/SKILL.md +1 -0
  247. package/skills/core/meta.json +12 -1
  248. package/skills/core/networkpolicy-debug/SKILL.md +332 -0
  249. package/skills/core/node-logs/scripts/get-node-logs.sh +19 -9
  250. package/skills/core/pod-pending-debug/SKILL.md +1 -0
  251. package/skills/core/quota-debug/SKILL.md +203 -0
  252. package/skills/core/service-debug/SKILL.md +1 -0
  253. package/skills/core/statefulset-debug/SKILL.md +280 -0
  254. package/skills/core/volcano-diagnose-pod/SKILL.md +196 -0
  255. package/skills/core/volcano-diagnose-pod/scripts/diagnose-pod.sh +175 -0
  256. package/skills/core/volcano-gang-scheduling/SKILL.md +299 -0
  257. package/skills/core/volcano-job-diagnose/SKILL.md +319 -0
  258. package/skills/core/volcano-job-diagnose/scripts/diagnose-job.sh +253 -0
  259. package/skills/core/volcano-node-resources/SKILL.md +334 -0
  260. package/skills/core/volcano-node-resources/scripts/get-node-resources.sh +281 -0
  261. package/skills/core/volcano-queue-diagnose/SKILL.md +294 -0
  262. package/skills/core/volcano-queue-diagnose/scripts/diagnose-queue.sh +283 -0
  263. package/skills/core/volcano-resource-insufficient/SKILL.md +315 -0
  264. package/skills/core/volcano-scheduler-config/SKILL.md +371 -0
  265. package/skills/core/volcano-scheduler-config/scripts/get-scheduler-config.sh +297 -0
  266. package/skills/core/volcano-scheduler-logs/SKILL.md +241 -0
  267. package/skills/core/volcano-scheduler-logs/scripts/get-scheduler-logs.sh +159 -0
  268. package/skills/platform/create-skill/SKILL.md +35 -3
  269. package/skills/platform/manage-skill/SKILL.md +9 -2
  270. package/skills/platform/update-skill/SKILL.md +17 -6
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Prometheus metrics subscriber — the ONLY file that depends on prom-client.
3
+ *
4
+ * Subscribes to the diagnostic event bus and maps events to Prometheus metrics.
5
+ * Business code never imports this module directly — it only calls emitDiagnostic().
6
+ *
7
+ * Importing this module (side-effect import) registers the subscriber automatically.
8
+ */
9
+ import { Counter, Gauge, Histogram, Registry } from "prom-client";
10
+ import { onDiagnostic } from "./diagnostic-events.js";
11
+ /**
12
+ * Check bearer token authentication for /metrics endpoints.
13
+ * Returns true if the request is authorized (or no token is configured).
14
+ * Returns false and sends 401 response if unauthorized.
15
+ */
16
+ export function checkMetricsAuth(req, res, configuredToken) {
17
+ const token = configuredToken || process.env.SICLAW_METRICS_TOKEN;
18
+ if (token && req.headers.authorization !== `Bearer ${token}`) {
19
+ res.writeHead(401, { "Content-Type": "application/json" });
20
+ res.end(JSON.stringify({ error: "Unauthorized" }));
21
+ return false;
22
+ }
23
+ return true;
24
+ }
25
+ export const metricsRegistry = new Registry();
26
+ /** Whether to include user_id label on token/cost metrics (dynamic, refreshable) */
27
+ let includeUserId = process.env.SICLAW_METRICS_USER_ID !== "false";
28
+ /** Update the includeUserId flag at runtime (called by Gateway when DB config changes) */
29
+ export function setIncludeUserId(value) {
30
+ includeUserId = value;
31
+ }
32
+ // ── Phase 1: Core metrics (7) ──
33
+ const tokensTotal = new Counter({
34
+ name: "siclaw_tokens_total",
35
+ help: "Cumulative token consumption",
36
+ labelNames: ["type", "provider", "model", "user_id"],
37
+ registers: [metricsRegistry],
38
+ });
39
+ const costUsdTotal = new Counter({
40
+ name: "siclaw_cost_usd_total",
41
+ help: "Cumulative LLM cost in USD",
42
+ labelNames: ["provider", "model", "user_id"],
43
+ registers: [metricsRegistry],
44
+ });
45
+ const promptDurationMs = new Histogram({
46
+ name: "siclaw_prompt_duration_ms",
47
+ help: "Prompt end-to-end processing latency in milliseconds",
48
+ labelNames: ["provider", "model", "outcome"],
49
+ buckets: [500, 1_000, 2_500, 5_000, 10_000, 30_000, 60_000, 120_000, 300_000],
50
+ registers: [metricsRegistry],
51
+ });
52
+ const promptsTotal = new Counter({
53
+ name: "siclaw_prompts_total",
54
+ help: "Total prompts processed",
55
+ labelNames: ["provider", "model", "outcome"],
56
+ registers: [metricsRegistry],
57
+ });
58
+ const sessionsActive = new Gauge({
59
+ name: "siclaw_sessions_active",
60
+ help: "Current number of active sessions",
61
+ registers: [metricsRegistry],
62
+ });
63
+ const toolCallsTotal = new Counter({
64
+ name: "siclaw_tool_calls_total",
65
+ help: "Total tool invocations",
66
+ labelNames: ["tool_name", "outcome"],
67
+ registers: [metricsRegistry],
68
+ });
69
+ const wsConnections = new Gauge({
70
+ name: "siclaw_ws_connections",
71
+ help: "Current number of WebSocket connections",
72
+ registers: [metricsRegistry],
73
+ });
74
+ // ── Skill metrics ──
75
+ // NOTE: siclaw_skill_calls_total uses skill_name label which is unbounded.
76
+ // If personal skill count grows large, consider dropping this counter and
77
+ // relying solely on the low-cardinality siclaw_skill_calls_by_scope_total.
78
+ const skillCallsTotal = new Counter({
79
+ name: "siclaw_skill_calls_total",
80
+ help: "Total skill invocations",
81
+ labelNames: ["skill_name", "scope", "outcome"],
82
+ registers: [metricsRegistry],
83
+ });
84
+ const skillCallsByScopeTotal = new Counter({
85
+ name: "siclaw_skill_calls_by_scope_total",
86
+ help: "Total skill invocations aggregated by scope (low-cardinality fallback)",
87
+ labelNames: ["scope", "outcome"],
88
+ registers: [metricsRegistry],
89
+ });
90
+ // ── Phase 2: Session health metrics (4) ──
91
+ const contextTokensUsed = new Gauge({
92
+ name: "siclaw_context_tokens_used",
93
+ help: "Current context window tokens used (sampled per turn)",
94
+ labelNames: ["provider", "model"],
95
+ registers: [metricsRegistry],
96
+ });
97
+ const contextTokensLimit = new Gauge({
98
+ name: "siclaw_context_tokens_limit",
99
+ help: "Context window token limit (sampled per turn)",
100
+ labelNames: ["provider", "model"],
101
+ registers: [metricsRegistry],
102
+ });
103
+ const sessionStuckTotal = new Counter({
104
+ name: "siclaw_session_stuck_total",
105
+ help: "Number of stuck sessions detected",
106
+ registers: [metricsRegistry],
107
+ });
108
+ const sessionStuckAgeMs = new Histogram({
109
+ name: "siclaw_session_stuck_age_ms",
110
+ help: "Duration of stuck sessions in milliseconds",
111
+ buckets: [30_000, 60_000, 120_000, 300_000],
112
+ registers: [metricsRegistry],
113
+ });
114
+ // ── Event → metric mapping ──
115
+ function handleDiagnostic(event) {
116
+ switch (event.type) {
117
+ case "prompt_complete": {
118
+ const { prev, curr, model, durationMs, outcome, userId } = event;
119
+ const provider = model?.provider ?? "unknown";
120
+ const modelId = model?.id ?? "unknown";
121
+ // Token deltas (session stats are cumulative — subtract pre-prompt snapshot)
122
+ const dInput = curr.tokens.input - prev.tokens.input;
123
+ const dOutput = curr.tokens.output - prev.tokens.output;
124
+ const dCacheRead = curr.tokens.cacheRead - prev.tokens.cacheRead;
125
+ const dCacheWrite = curr.tokens.cacheWrite - prev.tokens.cacheWrite;
126
+ const baseLabels = includeUserId && userId
127
+ ? { provider, model: modelId, user_id: userId }
128
+ : { provider, model: modelId };
129
+ if (dInput > 0)
130
+ tokensTotal.inc({ ...baseLabels, type: "input" }, dInput);
131
+ if (dOutput > 0)
132
+ tokensTotal.inc({ ...baseLabels, type: "output" }, dOutput);
133
+ if (dCacheRead > 0)
134
+ tokensTotal.inc({ ...baseLabels, type: "cache_read" }, dCacheRead);
135
+ if (dCacheWrite > 0)
136
+ tokensTotal.inc({ ...baseLabels, type: "cache_write" }, dCacheWrite);
137
+ // Cost delta
138
+ const dCost = curr.cost - prev.cost;
139
+ if (dCost > 0)
140
+ costUsdTotal.inc(baseLabels, dCost);
141
+ // Prompt duration + count
142
+ const outcomeLabels = { provider, model: modelId, outcome };
143
+ promptDurationMs.observe(outcomeLabels, durationMs);
144
+ promptsTotal.inc(outcomeLabels);
145
+ break;
146
+ }
147
+ case "session_created":
148
+ sessionsActive.inc();
149
+ break;
150
+ case "session_released":
151
+ sessionsActive.dec();
152
+ break;
153
+ case "tool_call":
154
+ toolCallsTotal.inc({ tool_name: event.toolName, outcome: event.outcome });
155
+ break;
156
+ case "skill_call":
157
+ skillCallsTotal.inc({
158
+ skill_name: event.skillName,
159
+ scope: event.scope,
160
+ outcome: event.outcome,
161
+ });
162
+ skillCallsByScopeTotal.inc({
163
+ scope: event.scope,
164
+ outcome: event.outcome,
165
+ });
166
+ break;
167
+ case "ws_connected":
168
+ wsConnections.inc();
169
+ break;
170
+ case "ws_disconnected":
171
+ wsConnections.dec();
172
+ break;
173
+ case "context_usage":
174
+ contextTokensUsed.set({ provider: event.provider, model: event.model }, event.tokensUsed);
175
+ contextTokensLimit.set({ provider: event.provider, model: event.model }, event.tokensLimit);
176
+ break;
177
+ case "session_stuck":
178
+ sessionStuckTotal.inc();
179
+ sessionStuckAgeMs.observe(event.idleMs);
180
+ break;
181
+ }
182
+ }
183
+ // Auto-register subscriber when this module is imported
184
+ onDiagnostic(handleDiagnostic);
185
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/shared/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,YAAY,EAAwB,MAAM,wBAAwB,CAAC;AAE5E;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAyB,EAAE,GAAwB,EAAE,eAAwB;IAC5G,MAAM,KAAK,GAAG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAClE,IAAI,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,UAAU,KAAK,EAAE,EAAE,CAAC;QAC7D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,QAAQ,EAAE,CAAC;AAE9C,oFAAoF;AACpF,IAAI,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,OAAO,CAAC;AAEnE,0FAA0F;AAC1F,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,aAAa,GAAG,KAAK,CAAC;AACxB,CAAC;AAED,kCAAkC;AAElC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC;IAC9B,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE,8BAA8B;IACpC,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAU;IAC7D,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC;IAC/B,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE,4BAA4B;IAClC,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAU;IACrD,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,SAAS,CAAC;IACrC,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE,sDAAsD;IAC5D,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAU;IACrD,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IAC7E,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC;IAC/B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,yBAAyB;IAC/B,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAU;IACrD,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC;IAC/B,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE,mCAAmC;IACzC,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC;IACjC,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE,wBAAwB;IAC9B,UAAU,EAAE,CAAC,WAAW,EAAE,SAAS,CAAU;IAC7C,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC;IAC9B,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE,yCAAyC;IAC/C,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,sBAAsB;AACtB,2EAA2E;AAC3E,0EAA0E;AAC1E,2EAA2E;AAE3E,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC;IAClC,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE,yBAAyB;IAC/B,UAAU,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAU;IACvD,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,IAAI,OAAO,CAAC;IACzC,IAAI,EAAE,mCAAmC;IACzC,IAAI,EAAE,wEAAwE;IAC9E,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAU;IACzC,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,4CAA4C;AAE5C,MAAM,iBAAiB,GAAG,IAAI,KAAK,CAAC;IAClC,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE,uDAAuD;IAC7D,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,CAAU;IAC1C,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,IAAI,KAAK,CAAC;IACnC,IAAI,EAAE,6BAA6B;IACnC,IAAI,EAAE,+CAA+C;IACrD,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,CAAU;IAC1C,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC;IACpC,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE,mCAAmC;IACzC,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC;IACtC,IAAI,EAAE,6BAA6B;IACnC,IAAI,EAAE,4CAA4C;IAClD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;IAC3C,SAAS,EAAE,CAAC,eAAe,CAAC;CAC7B,CAAC,CAAC;AAEH,+BAA+B;AAE/B,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YACjE,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,SAAS,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,EAAE,EAAE,IAAI,SAAS,CAAC;YAEvC,6EAA6E;YAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACxD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YAEpE,MAAM,UAAU,GAAG,aAAa,IAAI,MAAM;gBACxC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;gBAC/C,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAEjC,IAAI,MAAM,GAAG,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;YAC1E,IAAI,OAAO,GAAG,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7E,IAAI,UAAU,GAAG,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;YACvF,IAAI,WAAW,GAAG,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;YAE1F,aAAa;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACpC,IAAI,KAAK,GAAG,CAAC;gBAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAEnD,0BAA0B;YAC1B,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAC5D,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACpD,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QAED,KAAK,iBAAiB;YACpB,cAAc,CAAC,GAAG,EAAE,CAAC;YACrB,MAAM;QAER,KAAK,kBAAkB;YACrB,cAAc,CAAC,GAAG,EAAE,CAAC;YACrB,MAAM;QAER,KAAK,WAAW;YACd,cAAc,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1E,MAAM;QAER,KAAK,YAAY;YACf,eAAe,CAAC,GAAG,CAAC;gBAClB,UAAU,EAAE,KAAK,CAAC,SAAS;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,sBAAsB,CAAC,GAAG,CAAC;gBACzB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,MAAM;QAER,KAAK,cAAc;YACjB,aAAa,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM;QAER,KAAK,iBAAiB;YACpB,aAAa,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM;QAER,KAAK,eAAe;YAClB,iBAAiB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1F,kBAAkB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5F,MAAM;QAER,KAAK,eAAe;YAClB,iBAAiB,CAAC,GAAG,EAAE,CAAC;YACxB,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM;IACV,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,YAAY,CAAC,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shared path traversal validation utility.
3
+ *
4
+ * Used by resource handlers, credential manager, and http-server to ensure
5
+ * resolved paths stay within a designated base directory.
6
+ */
7
+ /**
8
+ * Resolve a path under a base directory, throwing if it escapes.
9
+ *
10
+ * @param base - The trusted base directory (must be an absolute, resolved path)
11
+ * @param segments - Untrusted path segments to join under base
12
+ * @returns The resolved absolute path guaranteed to be under base
13
+ * @throws Error if the resolved path escapes the base directory
14
+ */
15
+ export declare function resolveUnderDir(base: string, ...segments: string[]): string;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared path traversal validation utility.
3
+ *
4
+ * Used by resource handlers, credential manager, and http-server to ensure
5
+ * resolved paths stay within a designated base directory.
6
+ */
7
+ import path from "node:path";
8
+ /**
9
+ * Resolve a path under a base directory, throwing if it escapes.
10
+ *
11
+ * @param base - The trusted base directory (must be an absolute, resolved path)
12
+ * @param segments - Untrusted path segments to join under base
13
+ * @returns The resolved absolute path guaranteed to be under base
14
+ * @throws Error if the resolved path escapes the base directory
15
+ */
16
+ export function resolveUnderDir(base, ...segments) {
17
+ const resolved = path.resolve(base, ...segments);
18
+ if (resolved !== base && !resolved.startsWith(base + path.sep)) {
19
+ throw new Error(`Path escapes base directory: ${resolved}`);
20
+ }
21
+ return resolved;
22
+ }
23
+ //# sourceMappingURL=path-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/shared/path-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,GAAG,QAAkB;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Retry with exponential backoff — generic utility for HTTP calls.
3
+ *
4
+ * Pattern borrowed from src/memory/embeddings.ts.
5
+ */
6
+ export interface RetryOptions {
7
+ /** Maximum number of attempts (including the first). Default: 3 */
8
+ maxAttempts?: number;
9
+ /** Base delay in ms before first retry. Default: 1000 */
10
+ baseDelayMs?: number;
11
+ /** Maximum delay cap in ms. Default: 10000 */
12
+ maxDelayMs?: number;
13
+ /** Optional predicate — return false to skip retries for certain errors */
14
+ shouldRetry?: (err: unknown) => boolean;
15
+ /** Label for log messages */
16
+ label?: string;
17
+ }
18
+ /**
19
+ * Execute `fn` with retry + exponential backoff.
20
+ *
21
+ * Delay formula: min(maxDelayMs, baseDelayMs * 2^attempt * (1 + random()*0.2))
22
+ */
23
+ export declare function withRetry<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
24
+ /**
25
+ * Typed HTTP error with status code — avoids fragile regex on message strings.
26
+ */
27
+ export declare class HttpError extends Error {
28
+ readonly status: number;
29
+ constructor(status: number, message: string);
30
+ }
31
+ /**
32
+ * Default shouldRetry predicate for HTTP calls:
33
+ * retry on network errors and 5xx / 429, skip on other 4xx.
34
+ */
35
+ export declare function shouldRetryHttp(err: unknown): boolean;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Retry with exponential backoff — generic utility for HTTP calls.
3
+ *
4
+ * Pattern borrowed from src/memory/embeddings.ts.
5
+ */
6
+ /**
7
+ * Execute `fn` with retry + exponential backoff.
8
+ *
9
+ * Delay formula: min(maxDelayMs, baseDelayMs * 2^attempt * (1 + random()*0.2))
10
+ */
11
+ export async function withRetry(fn, opts = {}) {
12
+ const { maxAttempts = 3, baseDelayMs = 1000, maxDelayMs = 10_000, shouldRetry, label, } = opts;
13
+ let lastError;
14
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
15
+ try {
16
+ return await fn();
17
+ }
18
+ catch (err) {
19
+ lastError = err;
20
+ // Check if we should retry this error
21
+ if (shouldRetry && !shouldRetry(err)) {
22
+ throw err;
23
+ }
24
+ if (attempt + 1 >= maxAttempts) {
25
+ break; // No more attempts
26
+ }
27
+ const delay = Math.min(maxDelayMs, baseDelayMs * 2 ** attempt * (1 + Math.random() * 0.2));
28
+ const tag = label ? `[retry:${label}]` : "[retry]";
29
+ console.warn(`${tag} Attempt ${attempt + 1}/${maxAttempts} failed, retrying in ${Math.round(delay)}ms:`, err instanceof Error ? err.message : err);
30
+ await new Promise((resolve) => setTimeout(resolve, delay));
31
+ }
32
+ }
33
+ throw lastError;
34
+ }
35
+ /**
36
+ * Typed HTTP error with status code — avoids fragile regex on message strings.
37
+ */
38
+ export class HttpError extends Error {
39
+ status;
40
+ constructor(status, message) {
41
+ super(message);
42
+ this.status = status;
43
+ this.name = "HttpError";
44
+ }
45
+ }
46
+ /**
47
+ * Default shouldRetry predicate for HTTP calls:
48
+ * retry on network errors and 5xx / 429, skip on other 4xx.
49
+ */
50
+ export function shouldRetryHttp(err) {
51
+ if (err instanceof HttpError) {
52
+ if (err.status === 429)
53
+ return true; // Rate limited — retry
54
+ if (err.status >= 400 && err.status < 500)
55
+ return false; // Client error — don't retry
56
+ return true; // 5xx — retry
57
+ }
58
+ // Network error or non-HTTP — retry
59
+ return true;
60
+ }
61
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/shared/retry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,OAAqB,EAAE;IAEvB,MAAM,EACJ,WAAW,GAAG,CAAC,EACf,WAAW,GAAG,IAAI,EAClB,UAAU,GAAG,MAAM,EACnB,WAAW,EACX,KAAK,GACN,GAAG,IAAI,CAAC;IAET,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAEhB,sCAAsC;YACtC,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,mBAAmB;YAC5B,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,UAAU,EACV,WAAW,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CACvD,CAAC;YACF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YACnD,OAAO,CAAC,IAAI,CACV,GAAG,GAAG,YAAY,OAAO,GAAG,CAAC,IAAI,WAAW,wBAAwB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAC1F,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YAEF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEhB;IADlB,YACkB,MAAc,EAC9B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QAI9B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC,uBAAuB;QAC5D,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC,CAAC,6BAA6B;QACtF,OAAO,IAAI,CAAC,CAAC,cAAc;IAC7B,CAAC;IACD,oCAAoC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -29,6 +29,9 @@ export declare function getCommandBinary(cmd: string): string;
29
29
  * whitelisted. Use grep + cut/tr/head/tail/jq for text processing instead.
30
30
  */
31
31
  export declare const ALLOWED_COMMANDS: Set<string>;
32
+ /** Map each command to its functional category. */
33
+ export declare const COMMAND_CATEGORIES: Record<string, string>;
34
+ export declare const CONTEXT_CATEGORIES: Record<string, readonly string[]>;
32
35
  /**
33
36
  * Declarative command validation rule.
34
37
  * JSON-serializable: no Set, no function, no RegExp.
@@ -38,6 +41,14 @@ export interface CommandRule {
38
41
  command: string;
39
42
  category?: string;
40
43
  description?: string;
44
+ /** Execution contexts where this rule applies. Absent → all contexts. */
45
+ contexts?: string[];
46
+ /** If true, command must appear after a pipe | operator (stdin-only). */
47
+ pipeOnly?: boolean;
48
+ /** If true, block positional args that look like file paths (/, ./, ../, ~). */
49
+ noFilePaths?: boolean;
50
+ /** Flags that are explicitly blocked (checked per-character for short flags). */
51
+ blockedFlags?: string[];
41
52
  /** Flag whitelist. Present → check flags; absent → all flags allowed. */
42
53
  allowedFlags?: string[];
43
54
  /** Subcommand/action whitelist at a given positional position. */
@@ -52,10 +63,15 @@ export interface CommandRule {
52
63
  /** Delegate to a named custom validator function. */
53
64
  customValidator?: string;
54
65
  }
55
- export declare const COMMAND_RULES: Record<string, CommandRule>;
66
+ export declare const COMMAND_RULES: Record<string, CommandRule | CommandRule[]>;
56
67
  /**
57
68
  * Apply extra security restrictions to whitelisted commands.
58
69
  * Takes a raw command string, parses it internally.
70
+ * Optionally accepts context (for context-specific rules) and piped
71
+ * (for pipe-only enforcement).
59
72
  * Returns an error message string if blocked, or null if allowed.
60
73
  */
61
- export declare function validateCommandRestrictions(cmd: string): string | null;
74
+ export declare function validateCommandRestrictions(cmd: string, options?: {
75
+ context?: string;
76
+ piped?: boolean;
77
+ }): string | null;