@aimarket/warden 0.8.2 → 0.13.0

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 (117) hide show
  1. package/CHANGELOG.md +55 -1
  2. package/README-es.md +45 -10
  3. package/README-fr.md +45 -10
  4. package/README-ru.md +47 -10
  5. package/README-zh.md +45 -10
  6. package/README.md +47 -10
  7. package/dist/classifier.d.ts +79 -0
  8. package/dist/classifier.d.ts.map +1 -0
  9. package/dist/classifier.js +360 -0
  10. package/dist/classifier.js.map +1 -0
  11. package/dist/claude-hook.d.ts +53 -0
  12. package/dist/claude-hook.d.ts.map +1 -0
  13. package/dist/claude-hook.js +192 -0
  14. package/dist/claude-hook.js.map +1 -0
  15. package/dist/encoded-text.d.ts +7 -0
  16. package/dist/encoded-text.d.ts.map +1 -0
  17. package/dist/encoded-text.js +63 -0
  18. package/dist/encoded-text.js.map +1 -0
  19. package/dist/fold.d.ts +1 -2
  20. package/dist/fold.d.ts.map +1 -1
  21. package/dist/fold.js +3 -2
  22. package/dist/fold.js.map +1 -1
  23. package/dist/histor.d.ts +104 -0
  24. package/dist/histor.d.ts.map +1 -0
  25. package/dist/histor.js +86 -0
  26. package/dist/histor.js.map +1 -0
  27. package/dist/index.d.ts +6 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -4
  30. package/dist/index.js.map +1 -1
  31. package/dist/mcp-client.d.ts +58 -0
  32. package/dist/mcp-client.d.ts.map +1 -0
  33. package/dist/mcp-client.js +451 -0
  34. package/dist/mcp-client.js.map +1 -0
  35. package/dist/mcp-rpc.js +1 -1
  36. package/dist/mcp-server.js +8 -0
  37. package/dist/mcp-server.js.map +1 -1
  38. package/dist/mcp-tools.d.ts.map +1 -1
  39. package/dist/mcp-tools.js +29 -4
  40. package/dist/mcp-tools.js.map +1 -1
  41. package/dist/mtl.d.ts +28 -0
  42. package/dist/mtl.d.ts.map +1 -0
  43. package/dist/mtl.js +77 -0
  44. package/dist/mtl.js.map +1 -0
  45. package/dist/pin-store.d.ts.map +1 -1
  46. package/dist/pin-store.js +1 -0
  47. package/dist/pin-store.js.map +1 -1
  48. package/dist/pinning.d.ts +1 -1
  49. package/dist/pinning.d.ts.map +1 -1
  50. package/dist/pinning.js +12 -4
  51. package/dist/pinning.js.map +1 -1
  52. package/dist/result-screen.d.ts +19 -0
  53. package/dist/result-screen.d.ts.map +1 -0
  54. package/dist/result-screen.js +86 -0
  55. package/dist/result-screen.js.map +1 -0
  56. package/dist/scan-cli.d.ts +3 -0
  57. package/dist/scan-cli.d.ts.map +1 -0
  58. package/dist/scan-cli.js +36 -0
  59. package/dist/scan-cli.js.map +1 -0
  60. package/dist/scan-config.d.ts +72 -0
  61. package/dist/scan-config.d.ts.map +1 -0
  62. package/dist/scan-config.js +239 -0
  63. package/dist/scan-config.js.map +1 -0
  64. package/dist/scan-lock.d.ts +46 -0
  65. package/dist/scan-lock.d.ts.map +1 -0
  66. package/dist/scan-lock.js +113 -0
  67. package/dist/scan-lock.js.map +1 -0
  68. package/dist/scan-report.d.ts +21 -0
  69. package/dist/scan-report.d.ts.map +1 -0
  70. package/dist/scan-report.js +288 -0
  71. package/dist/scan-report.js.map +1 -0
  72. package/dist/scan.d.ts +177 -0
  73. package/dist/scan.d.ts.map +1 -0
  74. package/dist/scan.js +754 -0
  75. package/dist/scan.js.map +1 -0
  76. package/dist/static-scan.d.ts +4 -3
  77. package/dist/static-scan.d.ts.map +1 -1
  78. package/dist/static-scan.js +227 -11
  79. package/dist/static-scan.js.map +1 -1
  80. package/dist/tool-list.d.ts +34 -0
  81. package/dist/tool-list.d.ts.map +1 -0
  82. package/dist/tool-list.js +57 -0
  83. package/dist/tool-list.js.map +1 -0
  84. package/dist/toxic-flow.d.ts +33 -0
  85. package/dist/toxic-flow.d.ts.map +1 -0
  86. package/dist/toxic-flow.js +117 -0
  87. package/dist/toxic-flow.js.map +1 -0
  88. package/dist/types.d.ts +12 -0
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/wrap-cli.d.ts +3 -0
  91. package/dist/wrap-cli.d.ts.map +1 -1
  92. package/dist/wrap-cli.js +17 -6
  93. package/dist/wrap-cli.js.map +1 -1
  94. package/dist/wrap-state.js +2 -2
  95. package/dist/wrap-state.js.map +1 -1
  96. package/dist/wrap.d.ts.map +1 -1
  97. package/dist/wrap.js +22 -35
  98. package/dist/wrap.js.map +1 -1
  99. package/docs/gates.es.md +40 -7
  100. package/docs/gates.fr.md +39 -6
  101. package/docs/gates.md +38 -7
  102. package/docs/gates.ru.md +40 -7
  103. package/docs/gates.zh.md +10 -5
  104. package/docs/scan.es.md +199 -0
  105. package/docs/scan.fr.md +199 -0
  106. package/docs/scan.md +199 -0
  107. package/docs/scan.ru.md +199 -0
  108. package/docs/scan.zh.md +199 -0
  109. package/docs/scanner-comparison.es.md +209 -0
  110. package/docs/scanner-comparison.fr.md +213 -0
  111. package/docs/scanner-comparison.md +200 -0
  112. package/docs/scanner-comparison.ru.md +205 -0
  113. package/docs/scanner-comparison.zh.md +131 -0
  114. package/docs/security-hardening-language-boundary.md +306 -0
  115. package/package.json +10 -5
  116. package/scripts/check-quality-gate.mjs +64 -0
  117. package/scripts/quality-public-key.pem +3 -0
package/dist/scan.d.ts ADDED
@@ -0,0 +1,177 @@
1
+ import { type ClientKind, type ConfiguredServer, type DiscoveryEnv } from './scan-config.js';
2
+ import { type FetchedServer } from './mcp-client.js';
3
+ import { type HistorCheck } from './histor.js';
4
+ import { type ToxicFlow } from './toxic-flow.js';
5
+ import { type ClassifierOptions } from './classifier.js';
6
+ import { type ToolChange } from './scan-lock.js';
7
+ import type { Severity, ToolDef, WardenFinding, WardenPolicy, RulesetRef } from './types.js';
8
+ export declare const SEVERITIES: Severity[];
9
+ export interface ScanOptions {
10
+ configs: string[];
11
+ project: boolean;
12
+ clients?: ClientKind[];
13
+ cwd: string;
14
+ launch: boolean;
15
+ publicOnly: boolean;
16
+ timeoutMs: number;
17
+ concurrency: number;
18
+ policy: WardenPolicy;
19
+ lock?: string;
20
+ updateLock: boolean;
21
+ stateDir: string;
22
+ feed?: string;
23
+ feedKey?: string;
24
+ histor: boolean;
25
+ historUrl: string;
26
+ /** Opt-in meaning-based check; absent unless both --classifier-url and --classifier-model are given. */
27
+ classifier?: ClassifierOptions & {
28
+ blocks: boolean;
29
+ };
30
+ format: 'table' | 'json';
31
+ sarif?: string;
32
+ markdown?: string;
33
+ jsonFile?: string;
34
+ failOnError: boolean;
35
+ color: boolean;
36
+ }
37
+ export type ServerStatus = 'scanned' | 'launch-only' | 'blocked-at-launch' | 'error' | 'skipped';
38
+ export interface HistorSummary {
39
+ /** What was asked about: an endpoint, or a stdio server's `npm:`/`pypi:` package. */
40
+ package?: string;
41
+ /** The package version HISTOR last observed in its sandbox. */
42
+ packageVersion?: string;
43
+ /** HISTOR's id for the server: what its feed takes in `watch=`. */
44
+ targetId?: string;
45
+ match?: string;
46
+ note?: string;
47
+ page?: string;
48
+ unchangedSince?: string;
49
+ changes?: number;
50
+ error?: string;
51
+ notSent?: string;
52
+ }
53
+ export interface ScanServerResult {
54
+ id: string;
55
+ key: string;
56
+ client: ClientKind;
57
+ source: string;
58
+ scope: 'user' | 'project';
59
+ transport: 'stdio' | 'sse' | 'http';
60
+ wrapped: boolean;
61
+ /** Display form of the launch: secrets in args and URLs are redacted. */
62
+ launch: string;
63
+ status: ServerStatus;
64
+ allow: boolean | null;
65
+ score?: number;
66
+ decidedBy?: string;
67
+ findings: WardenFinding[];
68
+ allowedTools: string[];
69
+ blockedTools: string[];
70
+ toolCount?: number;
71
+ serverInfo?: {
72
+ name?: string;
73
+ version?: string;
74
+ };
75
+ error?: string;
76
+ skipped?: string;
77
+ mtlDigest?: string;
78
+ mtlError?: string;
79
+ histor?: HistorSummary;
80
+ classifier?: {
81
+ model: string;
82
+ flagged: number;
83
+ error?: string;
84
+ incompleteTools?: string[];
85
+ retried?: number;
86
+ };
87
+ lock?: {
88
+ state: 'match' | 'drift' | 'missing' | 'updated' | 'unchanged' | 'refused';
89
+ changes?: ToolChange[];
90
+ };
91
+ /** The fetched definitions; kept for the Markdown diff and --update-lock, not printed in JSON. */
92
+ tools?: ToolDef[];
93
+ }
94
+ export interface ScanReport {
95
+ tool: 'warden-scan';
96
+ version: string;
97
+ scannedAt: string;
98
+ ruleset: RulesetRef;
99
+ policy: WardenPolicy;
100
+ launch: boolean;
101
+ sources: Array<{
102
+ path: string;
103
+ client: ClientKind;
104
+ scope: 'user' | 'project';
105
+ servers: number;
106
+ error?: string;
107
+ }>;
108
+ servers: ScanServerResult[];
109
+ lock?: {
110
+ path: string;
111
+ stale: string[];
112
+ written: boolean;
113
+ };
114
+ /**
115
+ * Per client: private data, outside text and an outbound channel among the servers it starts
116
+ * (toxic-flow.ts). Advisory: a flow never blocks and never changes the exit code.
117
+ */
118
+ flows: ToxicFlow[];
119
+ /** With --histor: a feed of changes to the servers HISTOR knows among these, for any feed reader. */
120
+ historWatch?: string;
121
+ summary: {
122
+ servers: number;
123
+ scanned: number;
124
+ allowed: number;
125
+ blocked: number;
126
+ errors: number;
127
+ skipped: number;
128
+ launchOnly: number;
129
+ };
130
+ }
131
+ export declare const SCAN_USAGE: string;
132
+ export declare function parseScanArgs(argv: string[], env?: NodeJS.ProcessEnv): Promise<ScanOptions>;
133
+ export declare class UsageRequested extends Error {
134
+ constructor();
135
+ }
136
+ /** A path segment or argument that looks like it carries a credential. */
137
+ export declare function looksSecret(text: string): boolean;
138
+ /** The launch line with credentials replaced, for terminals, reports and SARIF. */
139
+ export declare function redactLaunch(server: ConfiguredServer): string;
140
+ export declare function redactUrl(raw: string): string;
141
+ /** The endpoint HISTOR may be asked about, or why it is not sent. */
142
+ export declare function historEndpoint(raw: string): {
143
+ endpoint?: string;
144
+ reason?: string;
145
+ };
146
+ /**
147
+ * The npm or PyPI package a stdio launch runs, as HISTOR names it (`npm:<name>`,
148
+ * `pypi:<normalised name>`), or why it is not sent. Only a package from the public
149
+ * registry is named: a local path, a git or tarball URL, or a private registry
150
+ * (`--registry`, `--index-url`) stays on this machine. The version is not sent —
151
+ * the digest already tells HISTOR which of the versions it observed you run.
152
+ */
153
+ export declare function historPackage(command: string, args: readonly string[]): {
154
+ package?: string;
155
+ reason?: string;
156
+ };
157
+ /**
158
+ * What HISTOR knows about a package beyond its tools: a name made to be taken for a popular one,
159
+ * and the marks of a stolen publishing token on the version it observed. All advisory.
160
+ */
161
+ export declare function packageFindings(answer: HistorCheck): WardenFinding[];
162
+ /**
163
+ * What the package did in HISTOR's sandbox (gVisor's own trace, decoy credentials, canary tool
164
+ * calls). Reading a decoy or writing where it would persist is the loud part; contacting its own
165
+ * API during a call is what API servers do and is not a finding, nor is loading .env from the
166
+ * working directory, which dotenv does for half the ecosystem.
167
+ */
168
+ export declare function behaviourFindings(behaviour: Record<string, unknown> | undefined, version: string): WardenFinding[];
169
+ export interface ScanDeps {
170
+ fetch?: (server: ConfiguredServer, opts: ScanOptions) => Promise<FetchedServer>;
171
+ historFetch?: typeof fetch;
172
+ now?: () => Date;
173
+ discovery?: Partial<DiscoveryEnv>;
174
+ }
175
+ export declare function runScan(opts: ScanOptions, deps?: ScanDeps): Promise<ScanReport>;
176
+ export declare function exitCode(report: ScanReport, opts: Pick<ScanOptions, 'failOnError'>): number;
177
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}