@wrongstack/tools 0.313.0 → 0.316.1

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 (182) hide show
  1. package/dist/_edit-match.d.ts +3 -2
  2. package/dist/_output-spool.d.ts +4 -3
  3. package/dist/_shell-pick.d.ts +2 -1
  4. package/dist/_spawn-stream.d.ts +2 -1
  5. package/dist/_syntax-check.d.ts +2 -1
  6. package/dist/audit.js +10 -4055
  7. package/dist/bash-kill-guard.d.ts +3 -6
  8. package/dist/bash.js +9 -2308
  9. package/dist/batch-tool-use.js +2 -187
  10. package/dist/browser/index.js +25 -1339
  11. package/dist/browser/network-guard-proxy.d.ts +2 -1
  12. package/dist/builtin.js +69 -33949
  13. package/dist/chunk-22B7GE5T.js +260 -0
  14. package/dist/chunk-2VSZC6QM.js +113 -0
  15. package/dist/chunk-3PVYQFRQ.js +472 -0
  16. package/dist/chunk-42BHI7TN.js +337 -0
  17. package/dist/chunk-4BHUSMNL.js +104 -0
  18. package/dist/chunk-4I4LWFOO.js +431 -0
  19. package/dist/chunk-4UESMQDP.js +122 -0
  20. package/dist/chunk-553IQUMO.js +478 -0
  21. package/dist/chunk-5H4GSJAI.js +223 -0
  22. package/dist/chunk-6RNIFLG4.js +305 -0
  23. package/dist/chunk-7EY5DCRO.js +434 -0
  24. package/dist/chunk-A6BRWIXN.js +317 -0
  25. package/dist/chunk-AHHDWNXC.js +200 -0
  26. package/dist/chunk-BSLVR56S.js +199 -0
  27. package/dist/chunk-BTSFTGIL.js +7 -0
  28. package/dist/chunk-D33S4RQG.js +222 -0
  29. package/dist/chunk-DA4KNE2H.js +4412 -0
  30. package/dist/chunk-DR7JOQTC.js +520 -0
  31. package/dist/chunk-EEOFQDT6.js +898 -0
  32. package/dist/chunk-EJWSCQ6D.js +137 -0
  33. package/dist/chunk-EMRGN4KM.js +170 -0
  34. package/dist/chunk-FQZOHLG3.js +89 -0
  35. package/dist/chunk-GOIZNNOA.js +221 -0
  36. package/dist/chunk-HFXSNKCV.js +196 -0
  37. package/dist/chunk-HYX2TZ7O.js +1272 -0
  38. package/dist/chunk-I64BS3VC.js +15 -0
  39. package/dist/chunk-IVWV2UM6.js +955 -0
  40. package/dist/chunk-IXMNTNW5.js +238 -0
  41. package/dist/chunk-IYK7XGDZ.js +892 -0
  42. package/dist/chunk-J5SKD6LN.js +235 -0
  43. package/dist/chunk-JNNVRHMV.js +2111 -0
  44. package/dist/chunk-JOHXDF3D.js +295 -0
  45. package/dist/chunk-JRJJX3L5.js +424 -0
  46. package/dist/chunk-K3WNSHUF.js +1371 -0
  47. package/dist/chunk-L25CVUVR.js +2830 -0
  48. package/dist/chunk-LIJQMYYX.js +59 -0
  49. package/dist/chunk-LWKUTMD5.js +197 -0
  50. package/dist/chunk-MQX2KXVW.js +54 -0
  51. package/dist/chunk-MZZN7VCD.js +359 -0
  52. package/dist/chunk-NBDZMMG2.js +169 -0
  53. package/dist/chunk-NKJW5GFO.js +366 -0
  54. package/dist/chunk-NKNOBUBU.js +522 -0
  55. package/dist/chunk-O4MBV4AX.js +134 -0
  56. package/dist/chunk-OUBDL3WH.js +3515 -0
  57. package/dist/chunk-PQKK5JH7.js +101 -0
  58. package/dist/chunk-PY2IOS7C.js +1000 -0
  59. package/dist/chunk-Q5JPPCZC.js +12 -0
  60. package/dist/chunk-QBV725YG.js +128 -0
  61. package/dist/chunk-QZQSPUBF.js +315 -0
  62. package/dist/chunk-RGISBZBD.js +231 -0
  63. package/dist/chunk-RJZQWEMS.js +84 -0
  64. package/dist/chunk-RXISBFR5.js +315 -0
  65. package/dist/chunk-S5CCLZL3.js +99 -0
  66. package/dist/chunk-SDLVH5RZ.js +178 -0
  67. package/dist/chunk-T2F4S7U4.js +1723 -0
  68. package/dist/chunk-TEBQ4VPZ.js +163 -0
  69. package/dist/chunk-U4D5S3VQ.js +21 -0
  70. package/dist/chunk-U4VAATKP.js +193 -0
  71. package/dist/chunk-UCYQTZ7F.js +113 -0
  72. package/dist/chunk-UKU2ZX4C.js +203 -0
  73. package/dist/chunk-UNSKG6DC.js +159 -0
  74. package/dist/chunk-V43EQ6VR.js +68 -0
  75. package/dist/chunk-VB3MJGCV.js +610 -0
  76. package/dist/chunk-VFKPWSOX.js +154 -0
  77. package/dist/chunk-VJNHFZ7J.js +190 -0
  78. package/dist/chunk-VXECAJJ7.js +1091 -0
  79. package/dist/chunk-WHIIIREL.js +223 -0
  80. package/dist/chunk-Z6DAKQ3U.js +1 -0
  81. package/dist/chunk-ZJQ4IGXK.js +474 -0
  82. package/dist/chunk-ZLTFLC25.js +385 -0
  83. package/dist/circuit-breaker.js +3 -191
  84. package/dist/codebase-index/ast-invariant-engine.d.ts +5 -4
  85. package/dist/codebase-index/binary-frame.d.ts +0 -2
  86. package/dist/codebase-index/bm25.d.ts +1 -1
  87. package/dist/codebase-index/circuit-breaker.d.ts +2 -1
  88. package/dist/codebase-index/codebase-ast-replace-tool.d.ts +3 -2
  89. package/dist/codebase-index/codebase-impact-analysis-tool.d.ts +4 -3
  90. package/dist/codebase-index/codebase-invariant-check-tool.d.ts +3 -2
  91. package/dist/codebase-index/codebase-repo-map-tool.d.ts +3 -2
  92. package/dist/codebase-index/codebase-skeleton-tool.d.ts +3 -2
  93. package/dist/codebase-index/codebase-targeted-test-tool.d.ts +3 -2
  94. package/dist/codebase-index/content-hash.d.ts +0 -2
  95. package/dist/codebase-index/import-extractor.d.ts +0 -13
  96. package/dist/codebase-index/index-service.d.ts +1 -1
  97. package/dist/codebase-index/index.js +84 -13688
  98. package/dist/codebase-index/languages.d.ts +2 -1
  99. package/dist/codebase-index/module-roots.d.ts +3 -2
  100. package/dist/codebase-index/parser-batch.d.ts +0 -5
  101. package/dist/codebase-index/parser-dispatch.d.ts +2 -1
  102. package/dist/codebase-index/parser-output.d.ts +4 -3
  103. package/dist/codebase-index/parser-worker-pool.d.ts +0 -2
  104. package/dist/codebase-index/parser-worker-script.d.ts +1 -16
  105. package/dist/codebase-index/parser-worker-script.js +8 -3995
  106. package/dist/codebase-index/project-server-client-state.d.ts +2 -2
  107. package/dist/codebase-index/project-server-endpoint.d.ts +0 -15
  108. package/dist/codebase-index/project-server.js +60 -8548
  109. package/dist/codebase-index/tree-sitter/visitor.d.ts +2 -1
  110. package/dist/codebase-index/tree-sitter-parser.d.ts +0 -2
  111. package/dist/codebase-index/ts-parser.d.ts +1 -1
  112. package/dist/codebase-index/vector-search.d.ts +2 -1
  113. package/dist/codebase-index/wal-maintenance.d.ts +3 -2
  114. package/dist/codebase-index/worker.js +20 -8416
  115. package/dist/codebase-index/writer-admin.d.ts +0 -1
  116. package/dist/codebase-index/writer-search.d.ts +0 -9
  117. package/dist/design.js +2 -299
  118. package/dist/diff.js +4 -256
  119. package/dist/document.js +4 -222
  120. package/dist/e2e.js +5 -476
  121. package/dist/edit.js +14 -10200
  122. package/dist/exec.js +16 -3131
  123. package/dist/fetch.js +8 -398
  124. package/dist/format.js +10 -3750
  125. package/dist/generic-parser-VUXDIAOZ.js +13 -0
  126. package/dist/git.js +4 -380
  127. package/dist/glob.js +6 -280
  128. package/dist/go-parser-JXYKJHRC.js +469 -0
  129. package/dist/grep.js +7 -604
  130. package/dist/index.js +318 -35387
  131. package/dist/install.js +10 -4091
  132. package/dist/json-parser-IBHZ4BZC.js +213 -0
  133. package/dist/json.js +4 -665
  134. package/dist/kanban-contract-actions.d.ts +1 -1
  135. package/dist/kanban-detail-actions.d.ts +2 -1
  136. package/dist/kanban-presence.d.ts +2 -1
  137. package/dist/kanban-serializer.d.ts +0 -8
  138. package/dist/kanban-split-task-handler.d.ts +2 -2
  139. package/dist/kanban-tool-types.d.ts +2 -1
  140. package/dist/kanban.js +3 -2096
  141. package/dist/languages/diagnostics.d.ts +2 -1
  142. package/dist/languages/index.js +23 -4664
  143. package/dist/languages/legacy-bridge.d.ts +3 -2
  144. package/dist/languages/types.d.ts +2 -1
  145. package/dist/legacy-bridge-7M6QLUQN.js +18 -0
  146. package/dist/lint.js +10 -3706
  147. package/dist/logs.js +4 -287
  148. package/dist/memory.js +6 -215
  149. package/dist/mode.js +3 -99
  150. package/dist/outdated.js +4 -5170
  151. package/dist/pack.js +65 -33897
  152. package/dist/parser-dispatch-QH4XPGG6.js +14 -0
  153. package/dist/patch.js +13 -9935
  154. package/dist/plan.js +5 -3286
  155. package/dist/process-registry.js +8 -651
  156. package/dist/ps-slash.js +12 -1439
  157. package/dist/pwsh.d.ts +0 -1
  158. package/dist/py-parser-IS4HKYMF.js +16 -0
  159. package/dist/read.js +13 -9816
  160. package/dist/replace.js +15 -10014
  161. package/dist/rs-parser-XHUUO2KZ.js +81 -0
  162. package/dist/scaffold.js +4 -253
  163. package/dist/search.js +5 -585
  164. package/dist/session-kanban-sync.d.ts +0 -6
  165. package/dist/session-kanban.js +30 -972
  166. package/dist/skill.js +2 -215
  167. package/dist/spawn-background.d.ts +1 -1
  168. package/dist/task.js +5 -3410
  169. package/dist/test.js +10 -3773
  170. package/dist/todo.js +4 -2891
  171. package/dist/tool-help.js +3 -123
  172. package/dist/tool-search.js +3 -79
  173. package/dist/tool-tier.js +68 -33984
  174. package/dist/tool-use.js +2 -93
  175. package/dist/tree-sitter-parser-AIERW3YI.js +15 -0
  176. package/dist/tree.js +4 -288
  177. package/dist/ts-parser-RCTYKSVI.js +232 -0
  178. package/dist/typecheck.js +10 -3753
  179. package/dist/win32.js +6 -60
  180. package/dist/write.js +14 -9882
  181. package/dist/yaml-parser-4SAXV3PL.js +157 -0
  182. package/package.json +5 -5
@@ -0,0 +1,154 @@
1
+ import {
2
+ checkSyntax
3
+ } from "./chunk-FQZOHLG3.js";
4
+ import {
5
+ enqueueReindex
6
+ } from "./chunk-HYX2TZ7O.js";
7
+ import {
8
+ safeResolveReal,
9
+ sha256hex,
10
+ truncateDiffPayload
11
+ } from "./chunk-D33S4RQG.js";
12
+
13
+ // src/write.ts
14
+ import * as fs from "node:fs/promises";
15
+ import { ToolValidationError } from "@wrongstack/core/types";
16
+ import {
17
+ atomicWrite,
18
+ detectNewlineStyle,
19
+ normalizeToLf,
20
+ toStyle,
21
+ unifiedDiff
22
+ } from "@wrongstack/core/utils";
23
+ var MAX_DIFF_BYTES = 262144;
24
+ var writeTool = {
25
+ name: "write",
26
+ category: "Filesystem",
27
+ description: "Write or completely overwrite a file on disk. This is a high-privilege operation. For modifying existing files, you should almost always prefer the `edit` tool instead, because `edit` is safer and works on the last-read version of the file.",
28
+ usageHint: "RULES FOR CORRECT USAGE:\n- Use `write` primarily for **new files** or when you want to replace the entire content.\n- For any existing file, strongly prefer `edit` (it requires a prior `read` in the same session and is more precise).\n- When overwriting an existing file, the tool reads the current content itself to compute the diff \u2014 but still `read` the file first before large rewrites so you know what you are replacing.\n- When overwriting an existing file, the content is normalized to the dominant line-ending style (CRLF/LF) of the existing file; new files are written verbatim.\n- The path is resolved relative to the project root and protected against escaping the workspace.",
29
+ selection: {
30
+ doNotUseWhen: "making a precise change to part of an existing file.",
31
+ useInstead: ["edit"]
32
+ },
33
+ permission: "confirm",
34
+ // WS-046: gives permission decisions something to key on — the file being
35
+ // written, so trust rules can scope by path.
36
+ subjectKey: "path",
37
+ mutating: true,
38
+ timeoutMs: 5e3,
39
+ maxOutputBytes: 262144,
40
+ capabilities: ["fs.write"],
41
+ icon: "file",
42
+ inputSchema: {
43
+ type: "object",
44
+ properties: {
45
+ path: {
46
+ type: "string",
47
+ description: "Relative path from project root. Must not escape the project."
48
+ },
49
+ content: {
50
+ type: "string",
51
+ description: "The complete new content of the file."
52
+ }
53
+ },
54
+ required: ["path", "content"]
55
+ },
56
+ async execute(input, ctx, opts) {
57
+ return writeFile(input, ctx, opts?.signal);
58
+ },
59
+ async *executeStream(input, ctx, opts) {
60
+ const prepared = await prepareWrite(input, ctx);
61
+ if (!prepared.existed) {
62
+ for (const line of input.content.split("\n")) {
63
+ yield { type: "partial_output", text: `${line}
64
+ `, data: { livePreview: true } };
65
+ }
66
+ }
67
+ yield { type: "final", output: await finishWrite(input, ctx, prepared, opts?.signal) };
68
+ }
69
+ };
70
+ async function writeFile(input, ctx, signal) {
71
+ return finishWrite(input, ctx, await prepareWrite(input, ctx), signal);
72
+ }
73
+ async function prepareWrite(input, ctx) {
74
+ if (!input?.path) {
75
+ throw new ToolValidationError({
76
+ message: "write: path is required",
77
+ field: "path"
78
+ });
79
+ }
80
+ if (input.content === void 0) {
81
+ throw new ToolValidationError({
82
+ message: "write: content is required",
83
+ field: "content"
84
+ });
85
+ }
86
+ const absPath = await safeResolveReal(input.path, ctx);
87
+ let existed = false;
88
+ let prev = "";
89
+ try {
90
+ const stat2 = await fs.stat(absPath);
91
+ existed = stat2.isFile();
92
+ if (existed) {
93
+ if (!ctx.hasRead(absPath)) {
94
+ prev = await fs.readFile(absPath, "utf8");
95
+ ctx.recordRead(absPath, stat2.mtimeMs, "write", sha256hex(prev));
96
+ } else {
97
+ prev = await fs.readFile(absPath, "utf8");
98
+ }
99
+ }
100
+ } catch (err) {
101
+ if (err.code !== "ENOENT") {
102
+ throw err;
103
+ }
104
+ }
105
+ return { absPath, existed, prev };
106
+ }
107
+ async function finishWrite(input, ctx, prepared, signal) {
108
+ const content = prepared.existed ? toStyle(normalizeToLf(input.content), detectNewlineStyle(prepared.prev)) : input.content;
109
+ signal?.throwIfAborted();
110
+ await atomicWrite(prepared.absPath, content);
111
+ try {
112
+ enqueueReindex({ projectRoot: ctx.projectRoot, files: [prepared.absPath] });
113
+ } catch {
114
+ }
115
+ const rawDiff = prepared.existed ? unifiedDiff(prepared.prev, content, { fromFile: input.path, toFile: input.path }) : `+++ ${input.path}
116
+ + (new file, ${content.split("\n").length} lines)`;
117
+ const { text: diff, truncated: diffTruncated } = truncateDiffPayload(rawDiff, MAX_DIFF_BYTES);
118
+ const stat2 = await fs.stat(prepared.absPath);
119
+ ctx.recordRead(prepared.absPath, stat2.mtimeMs, "write", sha256hex(content));
120
+ ctx.session?.recordFileChange?.({
121
+ path: prepared.absPath,
122
+ action: prepared.existed ? "modified" : "created",
123
+ before: prepared.existed ? prepared.prev : null,
124
+ after: content
125
+ });
126
+ const syntax = await checkSyntax(
127
+ prepared.absPath,
128
+ content,
129
+ prepared.existed ? prepared.prev : void 0
130
+ ).catch(() => void 0);
131
+ const hasSyntaxErrors = syntax !== void 0 && syntax.errors.length > 0;
132
+ const notes = [];
133
+ if (diffTruncated) {
134
+ notes.push("Diff truncated to the 256 KiB output budget \u2014 the full write is on disk.");
135
+ }
136
+ if (hasSyntaxErrors) {
137
+ notes.push(
138
+ syntax.preExisting ? "Syntax check: the file still has parse errors (they pre-date this write) \u2014 see syntax_errors." : `Syntax check: the written content has ${syntax.errors.length} parse error(s) \u2014 fix them now, see syntax_errors.`
139
+ );
140
+ }
141
+ return {
142
+ path: prepared.absPath,
143
+ bytes_written: Buffer.byteLength(content, "utf8"),
144
+ created: !prepared.existed,
145
+ diff,
146
+ syntax_errors: hasSyntaxErrors ? syntax.errors : void 0,
147
+ note: notes.length > 0 ? notes.join("\n") : void 0
148
+ };
149
+ }
150
+
151
+ export {
152
+ writeTool
153
+ };
154
+ //# sourceMappingURL=chunk-VFKPWSOX.js.map
@@ -0,0 +1,190 @@
1
+ import {
2
+ tryLegacyPackageOperation
3
+ } from "./chunk-PQKK5JH7.js";
4
+ import {
5
+ spawnStream
6
+ } from "./chunk-22B7GE5T.js";
7
+ import {
8
+ COMMAND_OUTPUT_MAX_BYTES,
9
+ detectPackageManager,
10
+ normalizeCommandOutput,
11
+ safeResolveReal
12
+ } from "./chunk-D33S4RQG.js";
13
+
14
+ // src/audit.ts
15
+ var SEVERITY_RANK = {
16
+ info: 0,
17
+ low: 1,
18
+ moderate: 2,
19
+ high: 3,
20
+ critical: 4
21
+ };
22
+ var auditTool = {
23
+ name: "audit",
24
+ category: "Package Management",
25
+ description: "Run a security audit against project dependencies (using pnpm/npm audit). Reports known vulnerabilities with severity.",
26
+ usageHint: "CRITICAL SECURITY TOOL:\n\n- Run regularly and especially before any release.\n- Use `level` to focus on high/critical issues.\n- This tool is read-only: to remediate, use `install` (or `language_package`) to upgrade the affected packages.\nThis is one of the most important tools for supply chain security.",
27
+ permission: "confirm",
28
+ mutating: false,
29
+ capabilities: ["shell.restricted"],
30
+ icon: "package",
31
+ timeoutMs: 6e4,
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ cwd: { type: "string", description: "Working directory (default: cwd)" },
36
+ level: {
37
+ type: "string",
38
+ enum: ["low", "moderate", "high", "critical"],
39
+ description: "Minimum severity level to report"
40
+ },
41
+ fix: {
42
+ type: "boolean",
43
+ description: "Deprecated and rejected \u2014 this tool is read-only and never modifies dependencies. Use `install` (or `language_package`) to remediate vulnerabilities."
44
+ }
45
+ }
46
+ },
47
+ async execute(input, ctx, opts) {
48
+ let final;
49
+ const executeStream = auditTool.executeStream;
50
+ if (!executeStream) throw new Error("auditTool: stream execution unavailable");
51
+ for await (const ev of executeStream(input, ctx, opts)) {
52
+ if (ev.type === "final") final = ev.output;
53
+ }
54
+ if (!final) throw new Error("audit: stream ended without final event");
55
+ return final;
56
+ },
57
+ async *executeStream(input, ctx, opts) {
58
+ if (input.fix === true) {
59
+ throw new Error(
60
+ "audit: `fix: true` is not supported \u2014 this tool is read-only (mutating: false). To remediate vulnerabilities, upgrade the affected packages with the `install` tool (or `language_package` for non-JS ecosystems)."
61
+ );
62
+ }
63
+ const cwd = input.cwd ? await safeResolveReal(input.cwd, ctx) : ctx.cwd;
64
+ const bridge = await tryLegacyPackageOperation("package-audit", {
65
+ cwd,
66
+ projectRoot: ctx.projectRoot,
67
+ signal: opts.signal
68
+ });
69
+ if (bridge?.outcome) {
70
+ const outcome = bridge.outcome;
71
+ const vulns = outcome.vulnerabilities.map((v) => ({
72
+ severity: v.severity,
73
+ package: v.package,
74
+ title: v.advisory ?? "Unknown vulnerability",
75
+ url: v.url ?? ""
76
+ }));
77
+ const total = vulns.length;
78
+ const summary = total === 0 ? "No vulnerabilities found" : `Found ${total} vulnerabilities: ${vulns.filter((a) => a.severity === "critical").length} critical, ${vulns.filter((a) => a.severity === "high").length} high`;
79
+ yield {
80
+ type: "final",
81
+ output: {
82
+ exit_code: outcome.run?.exitCode ?? 0,
83
+ vulnerabilities: vulns,
84
+ total,
85
+ summary,
86
+ output: outcome.run?.output ?? "",
87
+ truncated: outcome.run?.truncated ?? false
88
+ }
89
+ };
90
+ return;
91
+ }
92
+ const manager = await detectPackageManager(cwd, ctx.projectRoot);
93
+ yield { type: "log", text: `Auditing with ${manager}\u2026`, data: { manager } };
94
+ const args = ["audit", "--json"];
95
+ if (input.level && (manager === "npm" || manager === "pnpm")) {
96
+ args.push(`--audit-level=${input.level}`);
97
+ }
98
+ const result = yield* spawnStream({
99
+ cmd: manager,
100
+ args,
101
+ cwd,
102
+ signal: opts.signal,
103
+ maxBytes: 1e5
104
+ });
105
+ yield {
106
+ type: "final",
107
+ output: parseAuditOutput(result.stdout, result.exitCode, {
108
+ level: input.level,
109
+ spawnTruncated: result.truncated
110
+ })
111
+ };
112
+ }
113
+ };
114
+ function parseAuditOutput(json, exitCode, opts = {}) {
115
+ if (!json) {
116
+ return {
117
+ exit_code: exitCode,
118
+ vulnerabilities: [],
119
+ total: 0,
120
+ summary: exitCode === 0 ? "No vulnerabilities found" : "Audit failed",
121
+ output: "",
122
+ truncated: false
123
+ };
124
+ }
125
+ const cappedOutput = normalizeCommandOutput(json);
126
+ const truncated = opts.spawnTruncated === true || Buffer.byteLength(json, "utf8") > COMMAND_OUTPUT_MAX_BYTES;
127
+ try {
128
+ const data = JSON.parse(json);
129
+ let advisories = extractAdvisories(data);
130
+ const minRank = opts.level ? SEVERITY_RANK[opts.level] ?? 0 : 0;
131
+ if (minRank > 0) {
132
+ advisories = advisories.filter((a) => (SEVERITY_RANK[a.severity] ?? 0) >= minRank);
133
+ }
134
+ const total = advisories.length;
135
+ const summary = total === 0 ? "No vulnerabilities found" : `Found ${total} vulnerabilities: ${advisories.filter((a) => a.severity === "critical").length} critical, ${advisories.filter((a) => a.severity === "high").length} high`;
136
+ return {
137
+ exit_code: exitCode,
138
+ vulnerabilities: advisories,
139
+ total,
140
+ summary,
141
+ output: cappedOutput,
142
+ truncated
143
+ };
144
+ } catch {
145
+ return {
146
+ exit_code: exitCode,
147
+ vulnerabilities: [],
148
+ total: 0,
149
+ summary: "Could not parse audit output",
150
+ output: cappedOutput,
151
+ truncated
152
+ };
153
+ }
154
+ }
155
+ function extractAdvisories(data) {
156
+ const advisories = [];
157
+ const ads = data["advisories"];
158
+ if (ads && typeof ads === "object") {
159
+ for (const [id, value] of Object.entries(ads)) {
160
+ const adv = value ?? {};
161
+ advisories.push({
162
+ severity: typeof adv["severity"] === "string" ? adv["severity"] : "unknown",
163
+ package: typeof adv["module_name"] === "string" ? adv["module_name"] : id,
164
+ title: typeof adv["title"] === "string" ? adv["title"] : "Unknown vulnerability",
165
+ url: typeof adv["url"] === "string" ? adv["url"] : ""
166
+ });
167
+ }
168
+ return advisories;
169
+ }
170
+ const vulns = data["vulnerabilities"];
171
+ if (vulns && typeof vulns === "object") {
172
+ for (const [pkg, value] of Object.entries(vulns)) {
173
+ const vuln = value ?? {};
174
+ const via = Array.isArray(vuln["via"]) ? vuln["via"] : [];
175
+ const detail = via.find((v) => !!v && typeof v === "object");
176
+ advisories.push({
177
+ severity: typeof vuln["severity"] === "string" ? vuln["severity"] : "unknown",
178
+ package: pkg,
179
+ title: detail && typeof detail["title"] === "string" ? detail["title"] : "Unknown vulnerability",
180
+ url: detail && typeof detail["url"] === "string" ? detail["url"] : ""
181
+ });
182
+ }
183
+ }
184
+ return advisories;
185
+ }
186
+
187
+ export {
188
+ auditTool
189
+ };
190
+ //# sourceMappingURL=chunk-VJNHFZ7J.js.map