@xagents_in/unmask 0.1.1 → 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.
@@ -9,7 +9,6 @@ const MODELS = new Set([
9
9
  "gemini-3-flash-preview",
10
10
  ]);
11
11
  export const DEFAULT_MODEL_ROUTE = Object.freeze([
12
- Object.freeze({ modelId: "gemini-3.5-flash", thinkingLevel: "high" }),
13
12
  Object.freeze({
14
13
  modelId: "gemini-3-flash-preview",
15
14
  thinkingLevel: "minimal",
@@ -661,28 +660,46 @@ const delay = (ms, signal) =>
661
660
  function quotaScope(body, modelId) {
662
661
  const details = body?.error?.details;
663
662
  if (!Array.isArray(details) || details.length > 32) return "unknown";
663
+ const windows = [];
664
+ const normalize = (value) => value.toLowerCase().replace(/[^a-z0-9]/g, "");
665
+ function bindingWindow(binding, identity) {
666
+ if (/hour|week|month|year|second/.test(identity)) return null;
667
+ if (binding.includes("perminute") && !/day|daily/.test(identity))
668
+ return "minute";
669
+ if (binding.includes("perday") && !identity.includes("perminute"))
670
+ return "daily";
671
+ return null;
672
+ }
664
673
  for (const info of details.filter(
665
674
  (item) => item?.["@type"] === "type.googleapis.com/google.rpc.ErrorInfo",
666
675
  )) {
667
676
  const metadata = info.metadata;
668
- const identity =
669
- `${info.reason ?? ""} ${metadata?.quota_limit ?? ""} ${metadata?.quota_metric ?? ""}`
670
- .toLowerCase()
671
- .replace(/[^a-z0-9]/g, "");
672
- if (identity.includes("day")) return "daily";
677
+ const binding = normalize(
678
+ `${metadata?.quota_limit ?? ""} ${metadata?.quota_metric ?? ""}`,
679
+ );
680
+ const reason = normalize(String(info.reason ?? ""));
673
681
  if (
674
682
  ["global", "project"].includes(metadata?.scope) ||
675
- (identity.includes("perproject") && !identity.includes("permodel"))
683
+ reason.includes("global") ||
684
+ (reason.includes("project") && !reason.includes("model")) ||
685
+ (binding.includes("perproject") && !binding.includes("permodel"))
676
686
  )
677
687
  return "global";
688
+ const window = bindingWindow(binding, binding + reason);
678
689
  if (
679
690
  !metadata ||
691
+ !["", "ratelimitexceeded", "quotaexceeded", "resourceexhausted"].includes(
692
+ reason,
693
+ ) ||
680
694
  ![modelId, `models/${modelId}`].includes(metadata.model) ||
681
- !identity.includes("permodel") ||
682
- !identity.includes("perminute") ||
683
- /hour|week|month|year|second/.test(identity)
695
+ !binding.includes("permodel") ||
696
+ !window ||
697
+ (metadata.scope !== undefined &&
698
+ metadata.scope !== "model" &&
699
+ !(metadata.scope === "daily" && window === "daily"))
684
700
  )
685
701
  return "unknown";
702
+ windows.push(window);
686
703
  }
687
704
  const violations = [];
688
705
  for (const detail of details) {
@@ -697,40 +714,34 @@ function quotaScope(body, modelId) {
697
714
  violations.push(...detail.violations);
698
715
  }
699
716
  if (!violations.length) return "unknown";
700
- if (
701
- violations.some((item) =>
702
- `${item?.quotaId ?? ""} ${item?.quotaMetric ?? ""}`
703
- .toLowerCase()
704
- .replace(/[^a-z0-9]/g, "")
705
- .includes("day"),
706
- )
707
- )
708
- return "daily";
709
717
  for (const item of violations) {
710
718
  const dimensions = item?.quotaDimensions;
711
719
  if (
712
720
  !dimensions ||
713
721
  typeof dimensions !== "object" ||
714
722
  Array.isArray(dimensions) ||
715
- !Object.hasOwn(dimensions, "model")
723
+ !Object.hasOwn(dimensions, "model") ||
724
+ ["global", "project"].includes(dimensions.scope)
716
725
  )
717
726
  return "global";
718
- if (["global", "project", "daily"].includes(dimensions.scope))
719
- return dimensions.scope === "daily" ? "daily" : "global";
720
727
  if (![modelId, `models/${modelId}`].includes(dimensions.model))
721
728
  return "unknown";
722
- const binding = `${item.quotaId ?? ""} ${item.quotaMetric ?? ""}`
723
- .toLowerCase()
724
- .replace(/[^a-z0-9]/g, "");
729
+ const binding = normalize(
730
+ `${item.quotaId ?? ""} ${item.quotaMetric ?? ""}`,
731
+ );
725
732
  if (!binding.includes("permodel"))
726
733
  return binding.includes("perproject") ? "global" : "unknown";
734
+ const window = bindingWindow(binding, binding);
727
735
  if (
728
- !binding.includes("perminute") ||
729
- /hour|week|month|year|second/.test(binding)
736
+ !window ||
737
+ (dimensions.scope !== undefined &&
738
+ dimensions.scope !== "model" &&
739
+ !(dimensions.scope === "daily" && window === "daily"))
730
740
  )
731
741
  return "unknown";
742
+ windows.push(window);
732
743
  }
733
- return "model";
744
+ return windows.includes("daily") ? "model-daily" : "model";
734
745
  }
735
746
 
736
747
  export function createGemmaClient(options = {}) {
@@ -753,6 +764,11 @@ export function createGemmaClient(options = {}) {
753
764
  )
754
765
  )
755
766
  throw new TypeError("Invalid model route");
767
+ if (
768
+ new Set(requestedRoute.map((item) => item.modelId)).size !==
769
+ requestedRoute.length
770
+ )
771
+ throw new TypeError("Invalid model route: duplicate model");
756
772
  if (
757
773
  options.route !== undefined &&
758
774
  options.modelId !== undefined &&
@@ -795,10 +811,16 @@ export function createGemmaClient(options = {}) {
795
811
  }));
796
812
  const generationConfig = route[0].generationConfig;
797
813
  const routingPolicy = {
798
- version: "ordered-fallback-1",
814
+ version: "ordered-fallback-2",
799
815
  maxGenerationAttempts: Math.max(2, route.length),
800
- fallthrough: ["model-scoped-429", "transient-5xx", "timeout"],
816
+ fallthrough: [
817
+ "model-scoped-minute-429",
818
+ "model-scoped-daily-429",
819
+ "transient-5xx",
820
+ "timeout",
821
+ ],
801
822
  invalidOutputRetry: "same-tier",
823
+ modelDailyFallback: "next-tier-no-wait",
802
824
  };
803
825
  const fetchImpl = options.fetchImpl ?? globalThis.fetch;
804
826
  const now = options.now ?? (() => performance.now());
@@ -1108,12 +1130,17 @@ export function createGemmaClient(options = {}) {
1108
1130
  body = await jsonResponse(response, controller.signal);
1109
1131
  } catch {}
1110
1132
  failureScope = quotaScope(body, tier.modelId);
1111
- const retry = failureScope === "model";
1133
+ const retry =
1134
+ failureScope === "model" ||
1135
+ (failureScope === "model-daily" &&
1136
+ tierIndex + 1 < route.length);
1112
1137
  throw Object.assign(
1113
1138
  new Failure(
1114
1139
  "quota",
1115
1140
  retry,
1116
- retryDelay(response, wallNow()),
1141
+ failureScope === "model-daily"
1142
+ ? 0
1143
+ : retryDelay(response, wallNow()),
1117
1144
  retry,
1118
1145
  ),
1119
1146
  { scope: failureScope },
@@ -1,4 +1,6 @@
1
1
  import { createServer } from "node:http";
2
+ import { buildPackageDetails } from "../core/package-details.mjs";
3
+ import { attachVulnerabilityCheck } from "./enrichment.mjs";
2
4
  import { createQueue, resolveLimits, systemClock } from "./queue.mjs";
3
5
  import { createReportStore } from "./store.mjs";
4
6
  import { renderReport } from "../viewer/render.mjs";
@@ -99,6 +101,7 @@ export function createCacheKeyPrefix(versionInfo, limits) {
99
101
 
100
102
  export function createApp({
101
103
  runAnalysis,
104
+ enrichJob,
102
105
  versionInfo,
103
106
  limits: overrides,
104
107
  clock = systemClock,
@@ -114,6 +117,8 @@ export function createApp({
114
117
  throw new TypeError(
115
118
  "versionInfo requires version, commit and tarballSha256 strings",
116
119
  );
120
+ if (enrichJob !== undefined && typeof enrichJob !== "function")
121
+ throw new TypeError("enrichJob must be a function");
117
122
  const limits = resolveLimits(overrides);
118
123
  const version = Object.fromEntries(
119
124
  ["version", "commit", "tarballSha256"].map((key) => [
@@ -128,7 +133,14 @@ export function createApp({
128
133
  clock,
129
134
  });
130
135
  const keyPrefix = createCacheKeyPrefix(versionInfo, limits);
131
- const queue = createQueue({ runAnalysis, store, limits, clock, keyPrefix });
136
+ const queue = createQueue({
137
+ runAnalysis,
138
+ enrichJob,
139
+ store,
140
+ limits,
141
+ clock,
142
+ keyPrefix,
143
+ });
132
144
  const server = createServer(
133
145
  { maxHeaderSize: 8192, headersTimeout: 10000, requestTimeout: 15000 },
134
146
  (req, res) => {
@@ -248,7 +260,9 @@ export function createApp({
248
260
  if (path === "/") return send(200, renderHome());
249
261
  if (path === "/healthz") return json(200, { status: "ok" });
250
262
  if (path === "/version") return json(200, version);
251
- const match = /^\/r\/([a-f0-9]{32})(\.json)?$/.exec(path);
263
+ const match = /^\/r\/([a-f0-9]{32})(\.details\.json|\.json)?$/.exec(
264
+ path,
265
+ );
252
266
  if (!match)
253
267
  return error(
254
268
  404,
@@ -265,10 +279,21 @@ export function createApp({
265
279
  const pending = ["queued", "running"].includes(job.status);
266
280
  if (match[2]) {
267
281
  if (job.report)
268
- return json(200, job.report, {
269
- "content-disposition":
270
- 'attachment; filename="unmask-report.json"',
271
- });
282
+ return json(
283
+ 200,
284
+ match[2] === ".details.json"
285
+ ? attachVulnerabilityCheck(
286
+ buildPackageDetails(job.report),
287
+ job.vulnerabilityCheck,
288
+ )
289
+ : job.report,
290
+ {
291
+ "content-disposition":
292
+ match[2] === ".details.json"
293
+ ? 'attachment; filename="unmask-package-details.json"'
294
+ : 'attachment; filename="unmask-report.json"',
295
+ },
296
+ );
272
297
  const { key, ...publicJob } = job;
273
298
  return json(
274
299
  pending ? 202 : 200,
@@ -0,0 +1,116 @@
1
+ export const DETAILS_RESPONSE_LIMITS = Object.freeze({
2
+ packageDetailsBytes: 2097152,
3
+ vulnerabilityCheckBytes: 2096128,
4
+ combinedBytes: 4194304,
5
+ });
6
+
7
+ export function unavailableVulnerabilityCheck(spec, clock, reason) {
8
+ const separator = typeof spec === "string" ? spec.lastIndexOf("@") : -1;
9
+ return {
10
+ schemaVersion: "1",
11
+ source: "OSV",
12
+ package:
13
+ separator > 0
14
+ ? {
15
+ ecosystem: "npm",
16
+ name: spec.slice(0, separator),
17
+ version: spec.slice(separator + 1),
18
+ }
19
+ : null,
20
+ queriedAt: new Date(clock.now()).toISOString(),
21
+ status: "unavailable",
22
+ complete: false,
23
+ reasons: [reason],
24
+ advisories: [],
25
+ pagesFetched: 0,
26
+ limits: { resultBytes: DETAILS_RESPONSE_LIMITS.vulnerabilityCheckBytes },
27
+ };
28
+ }
29
+
30
+ export function boundedVulnerabilityCheck(value, spec, clock) {
31
+ try {
32
+ const json = JSON.stringify(value);
33
+ if (
34
+ Buffer.byteLength(json) > DETAILS_RESPONSE_LIMITS.vulnerabilityCheckBytes
35
+ )
36
+ return unavailableVulnerabilityCheck(spec, clock, "result-byte-cap");
37
+ const snapshot = JSON.parse(json);
38
+ if (
39
+ snapshot.schemaVersion !== "1" ||
40
+ snapshot.source !== "OSV" ||
41
+ !["found", "none-reported", "incomplete", "unavailable"].includes(
42
+ snapshot.status,
43
+ ) ||
44
+ snapshot.complete !==
45
+ ["found", "none-reported"].includes(snapshot.status) ||
46
+ !Array.isArray(snapshot.reasons) ||
47
+ !snapshot.reasons.every((reason) => typeof reason === "string") ||
48
+ !Array.isArray(snapshot.advisories) ||
49
+ snapshot.advisories.some(
50
+ (item) => !item || typeof item !== "object" || Array.isArray(item),
51
+ ) ||
52
+ (snapshot.status === "found" && snapshot.advisories.length === 0) ||
53
+ (snapshot.status === "none-reported" &&
54
+ snapshot.advisories.length !== 0) ||
55
+ !Number.isSafeInteger(snapshot.pagesFetched) ||
56
+ snapshot.pagesFetched < 0 ||
57
+ (snapshot.complete &&
58
+ (snapshot.pagesFetched === 0 || snapshot.reasons.length !== 0)) ||
59
+ typeof snapshot.queriedAt !== "string" ||
60
+ !Number.isFinite(Date.parse(snapshot.queriedAt)) ||
61
+ !snapshot.limits ||
62
+ typeof snapshot.limits !== "object"
63
+ )
64
+ throw new TypeError("Invalid vulnerability enrichment");
65
+ const expected = unavailableVulnerabilityCheck(
66
+ spec,
67
+ clock,
68
+ "unused",
69
+ ).package;
70
+ if (
71
+ snapshot.package !== null &&
72
+ (snapshot.package.ecosystem !== "npm" ||
73
+ snapshot.package.name !== expected?.name ||
74
+ snapshot.package.version !== expected?.version)
75
+ )
76
+ throw new TypeError("Vulnerability enrichment identity mismatch");
77
+ if (snapshot.complete && snapshot.package === null)
78
+ throw new TypeError("Vulnerability enrichment identity missing");
79
+ return snapshot;
80
+ } catch {
81
+ return unavailableVulnerabilityCheck(spec, clock, "invalid-result");
82
+ }
83
+ }
84
+
85
+ export function attachVulnerabilityCheck(details, value) {
86
+ const vulnerabilityCheck = value ?? {
87
+ source: "OSV",
88
+ status: "not-assessed",
89
+ complete: false,
90
+ reasons: ["hosted-enrichment-disabled"],
91
+ advisories: [],
92
+ };
93
+ const complete =
94
+ vulnerabilityCheck.complete === true &&
95
+ ["found", "none-reported"].includes(vulnerabilityCheck.status);
96
+ const result = {
97
+ ...details,
98
+ scope: {
99
+ ...details.scope,
100
+ vulnerabilityScan: complete
101
+ ? "OSV-exact-package-query-complete"
102
+ : "not-assessed",
103
+ knownVulnerabilities: complete
104
+ ? "queried-exact-package-only"
105
+ : "not-assessed",
106
+ },
107
+ vulnerabilityCheck,
108
+ responseLimits: DETAILS_RESPONSE_LIMITS,
109
+ };
110
+ if (
111
+ Buffer.byteLength(JSON.stringify(result)) >
112
+ DETAILS_RESPONSE_LIMITS.combinedBytes
113
+ )
114
+ throw new TypeError("Combined details response exceeds cap");
115
+ return result;
116
+ }
@@ -47,6 +47,7 @@ export async function startServer({
47
47
  runnerOptions = {},
48
48
  versionInfo,
49
49
  modelClient,
50
+ enrichJob,
50
51
  } = {}) {
51
52
  if (
52
53
  typeof host !== "string" ||
@@ -62,6 +63,14 @@ export async function startServer({
62
63
  : modelClient === undefined
63
64
  ? await modelClientFromEnv()
64
65
  : modelClient;
66
+ const enrichment =
67
+ enrichJob === null
68
+ ? undefined
69
+ : enrichJob === undefined
70
+ ? (await import("../core/advisories.mjs")).lookupNpmAdvisories
71
+ : enrichJob;
72
+ if (enrichment !== undefined && typeof enrichment !== "function")
73
+ throw new TypeError("enrichJob must be a function or null");
65
74
  const run = await createRunner({
66
75
  ...runnerOptions,
67
76
  tempRoot,
@@ -81,6 +90,13 @@ export async function startServer({
81
90
  };
82
91
  const server = createApp({
83
92
  runAnalysis,
93
+ enrichJob:
94
+ enrichment === undefined
95
+ ? undefined
96
+ : (spec, { signal }) =>
97
+ enrichment(spec, {
98
+ signal: AbortSignal.any([signal, shutdown.signal]),
99
+ }),
84
100
  versionInfo: {
85
101
  ...(versionInfo || (await loadVersionInfo())),
86
102
  modelConfigDigest:
@@ -1,4 +1,8 @@
1
1
  import { randomBytes } from "node:crypto";
2
+ import {
3
+ boundedVulnerabilityCheck,
4
+ unavailableVulnerabilityCheck,
5
+ } from "./enrichment.mjs";
2
6
 
3
7
  export const DEFAULT_LIMITS = Object.freeze({
4
8
  maxBodyBytes: 4096,
@@ -28,6 +32,7 @@ export function resolveLimits(overrides = {}) {
28
32
 
29
33
  export function createQueue({
30
34
  runAnalysis,
35
+ enrichJob,
31
36
  store,
32
37
  limits,
33
38
  clock = systemClock,
@@ -39,7 +44,20 @@ export function createQueue({
39
44
  let admissions = [];
40
45
  function persist(job) {
41
46
  if (!store.put(job)) {
42
- const { report, ...small } = job;
47
+ if (
48
+ job.report &&
49
+ job.vulnerabilityCheck &&
50
+ store.put({
51
+ ...job,
52
+ vulnerabilityCheck: unavailableVulnerabilityCheck(
53
+ job.nameAtExactVersion,
54
+ clock,
55
+ "storage-byte-cap",
56
+ ),
57
+ })
58
+ )
59
+ return;
60
+ const { report, vulnerabilityCheck, ...small } = job;
43
61
  store.put({ ...small, status: "incomplete", reason: "report-too-large" });
44
62
  }
45
63
  }
@@ -61,12 +79,26 @@ export function createQueue({
61
79
  job.status = "running";
62
80
  job.startedAt = clock.now();
63
81
  const controller = new AbortController();
82
+ let coreReport;
64
83
  const timer = clock.setTimeout(() => {
65
- job.status = "incomplete";
66
- job.reason = "execution-timeout";
67
84
  job.finishedAt = clock.now();
85
+ if (coreReport) {
86
+ job.status = coreReport.policy.exitCode === 2 ? "incomplete" : "done";
87
+ persist({
88
+ ...publicJob(job),
89
+ report: coreReport,
90
+ vulnerabilityCheck: unavailableVulnerabilityCheck(
91
+ job.nameAtExactVersion,
92
+ clock,
93
+ "aborted",
94
+ ),
95
+ });
96
+ } else {
97
+ job.status = "incomplete";
98
+ job.reason = "execution-timeout";
99
+ persist(job);
100
+ }
68
101
  controller.abort();
69
- persist(job);
70
102
  }, limits.executionMs);
71
103
  timer?.unref?.();
72
104
  job.cancel = () => {
@@ -77,7 +109,7 @@ export function createQueue({
77
109
  .then(() =>
78
110
  runAnalysis(job.nameAtExactVersion, { signal: controller.signal }),
79
111
  )
80
- .then((report) => {
112
+ .then(async (report) => {
81
113
  if (job.status !== "running" || closed) return;
82
114
  if (
83
115
  !report ||
@@ -86,9 +118,56 @@ export function createQueue({
86
118
  ![0, 2, 3].includes(report.policy?.exitCode)
87
119
  )
88
120
  throw new TypeError("Invalid report");
121
+ coreReport = report;
122
+ let vulnerabilityCheck;
123
+ if (enrichJob) {
124
+ let abort;
125
+ const interrupted = new Promise((resolve) => {
126
+ abort = () =>
127
+ resolve(
128
+ unavailableVulnerabilityCheck(
129
+ job.nameAtExactVersion,
130
+ clock,
131
+ "aborted",
132
+ ),
133
+ );
134
+ controller.signal.addEventListener("abort", abort, { once: true });
135
+ if (controller.signal.aborted) abort();
136
+ });
137
+ try {
138
+ const value = await Promise.race([
139
+ Promise.resolve().then(() =>
140
+ enrichJob(job.nameAtExactVersion, {
141
+ signal: controller.signal,
142
+ }),
143
+ ),
144
+ interrupted,
145
+ ]);
146
+ vulnerabilityCheck = boundedVulnerabilityCheck(
147
+ value,
148
+ job.nameAtExactVersion,
149
+ clock,
150
+ );
151
+ } catch {
152
+ vulnerabilityCheck = unavailableVulnerabilityCheck(
153
+ job.nameAtExactVersion,
154
+ clock,
155
+ "lookup-failed",
156
+ );
157
+ } finally {
158
+ controller.signal.removeEventListener("abort", abort);
159
+ }
160
+ }
161
+ if (job.status !== "running" || closed) return;
89
162
  const status = report.policy.exitCode === 2 ? "incomplete" : "done";
90
163
  const finishedAt = clock.now();
91
- persist({ ...publicJob(job), status, report, finishedAt });
164
+ persist({
165
+ ...publicJob(job),
166
+ status,
167
+ report,
168
+ finishedAt,
169
+ ...(vulnerabilityCheck ? { vulnerabilityCheck } : {}),
170
+ });
92
171
  job.status = status;
93
172
  job.finishedAt = finishedAt;
94
173
  })
package/dist/version.json CHANGED
@@ -1 +1 @@
1
- {"buildSchema":"1","version":"0.1.1","dirty":false,"commit":"a4feff4f745100dff319ce977d11eef23fb28f99","sourceSha256":"65f343ae9cf7954c25d4399d859ca4d7660fc2f30eca08ecbe2866f8ccf5df38","packageSha256":"7b95ad50264cfbbd206827541e2aba9822f44daee96ef36e90ff353496ca0dd7","lockfileSha256":"c0c5f8e46a66e9933a5d4dde017e24c62a541e9d16b94844d1f4d9b20b7cca2c","files":{"cli/hosted.mjs":{"sha256":"dea7b512a2e811102521565e9f218c77aab916fe05e838f55a9aeb7b43cd0852","size":7436},"cli/main.mjs":{"sha256":"3bff23e18025d73dbfd8eb3a9571a7797702f03ed14e8d2d1edd6a12304c579e","size":6597},"core/acquire.mjs":{"sha256":"aee5ed002292edf1b03385ceec8ebfb03de452dba36bbdced96f888eaafa1d67","size":9549},"core/archive.mjs":{"sha256":"80aa4373c0324458fe322a83af18a4cfd0ffec4b39ebdeffc9084639a8655410","size":16193},"core/compare.mjs":{"sha256":"540614266e06a2875010793d036d256ddfac72f978157cd3d147ffb99015d8e4","size":7579},"core/manifests.mjs":{"sha256":"29c40e01ff1e1dfaed444600d8c78380d23d4bc9be71960251e39ea3594de2f1","size":17891},"core/online.mjs":{"sha256":"368a3f2558e16db0701d2eaf068b48e2661e7e01ab7cf5605cdd22766aeb5cca","size":9741},"core/pipeline.mjs":{"sha256":"9c4ddc5c258a99455a1230c978fd132c135057ad7bb6c7baa201ae530ee136fd","size":11060},"core/policy.mjs":{"sha256":"4281c626c00a6424992f5e1eba26876e2b70f4b968450a8ca52fa42f5a121ba5","size":2954},"core/report.mjs":{"sha256":"aa167c94c257a5ff6d830630a37a51a9a9e47f82aa4a0a7b96ead91a5967294b","size":15844},"core/resolve.mjs":{"sha256":"d5575da49ff78e8fea8df1f2fc10a39540adea285eddfa347746e848f9fdf957","size":5202},"core/source.mjs":{"sha256":"798fe74e3fba836b82576cd46e1b91e6f6e0a4e3cf273c533b5e074247c81373","size":3238},"core/syntax.mjs":{"sha256":"2d50f2e73e17aedbcbccd92af280e171de4ef78b55acccd23d6b6ef11e891776","size":10450},"model/client.mjs":{"sha256":"040a1422aaa715d19b1c597e0fcb5008d94578ddade6a3c13ba64d0e9795f27e","size":41854},"model/config.mjs":{"sha256":"127605979a299616be15f4a47e94dcd82928b00ad2af71744ffaa6e359516486","size":3245},"server/app.mjs":{"sha256":"36c265269bdf3f063e98997f26efed077b2b3a3113e709b06a91af69d8376b3c","size":9392},"server/main.mjs":{"sha256":"bffc78cbb973d0dd9900bbdc307d86b15de91b1ea2b0f312a16c2b673a0801bc","size":4044},"server/queue.mjs":{"sha256":"37290655ef70c35383381ec5e76f10922b918f40224fca51a92abd714c095cf7","size":5094},"server/runner.mjs":{"sha256":"a6ca5bfbd7b239f7110639d854ca9a263f4cf3aaf06701ea54493b29f8244706","size":9071},"server/store.mjs":{"sha256":"efa2a35c7e9d0344c26e24ba360a457cdf80f4f48975f0186f81844b9fb7a097","size":2706},"server/worker.mjs":{"sha256":"1df839608cd1c691fc2801d89e698daeef3e48d7f4b8843ce1252a21fde9730a","size":1902},"viewer/render.mjs":{"sha256":"c77442c27041a5fe28269b8c80c9d24c72b73a226e8d4491e6d7285a9feb5309","size":19443},"viewer/shell.mjs":{"sha256":"5f800d0a97fe416d02cf9abef766d651b444b4745ad3a998926599469358ca79","size":9408}}}
1
+ {"buildSchema":"1","version":"0.1.2","dirty":false,"commit":"85bd6d9c0ce7bc31c16d3b1aef695826c0b52354","sourceSha256":"41b4925fd7f4c0d5e8a0018bce3244e138397b48b9663b68a08a9e0e4b32f898","packageSha256":"97af1181106db21be2cde05366ede4e8c018c367cf9bd6b21168dcb78baaff56","lockfileSha256":"84beb1a861f96a8cb788de5bfeeaddcaff04af8c766ec6489601ba42b89fc583","files":{"cli/hosted.mjs":{"sha256":"dea7b512a2e811102521565e9f218c77aab916fe05e838f55a9aeb7b43cd0852","size":7436},"cli/main.mjs":{"sha256":"3bff23e18025d73dbfd8eb3a9571a7797702f03ed14e8d2d1edd6a12304c579e","size":6597},"core/acquire.mjs":{"sha256":"aee5ed002292edf1b03385ceec8ebfb03de452dba36bbdced96f888eaafa1d67","size":9549},"core/advisories.mjs":{"sha256":"388088e44422ffeb3b60d930c84cec29fbc89b98d8dfd2879bc6ede50f4e7ea9","size":13004},"core/archive.mjs":{"sha256":"80aa4373c0324458fe322a83af18a4cfd0ffec4b39ebdeffc9084639a8655410","size":16193},"core/compare.mjs":{"sha256":"540614266e06a2875010793d036d256ddfac72f978157cd3d147ffb99015d8e4","size":7579},"core/manifests.mjs":{"sha256":"29c40e01ff1e1dfaed444600d8c78380d23d4bc9be71960251e39ea3594de2f1","size":17891},"core/online.mjs":{"sha256":"368a3f2558e16db0701d2eaf068b48e2661e7e01ab7cf5605cdd22766aeb5cca","size":9741},"core/package-details.mjs":{"sha256":"770551a6ab84e523dbc56ede6131b08eb22b8c21fc9c8b179fe0d1769fb2ec00","size":21538},"core/pipeline.mjs":{"sha256":"9c4ddc5c258a99455a1230c978fd132c135057ad7bb6c7baa201ae530ee136fd","size":11060},"core/policy.mjs":{"sha256":"4281c626c00a6424992f5e1eba26876e2b70f4b968450a8ca52fa42f5a121ba5","size":2954},"core/report.mjs":{"sha256":"aa167c94c257a5ff6d830630a37a51a9a9e47f82aa4a0a7b96ead91a5967294b","size":15844},"core/resolve.mjs":{"sha256":"d5575da49ff78e8fea8df1f2fc10a39540adea285eddfa347746e848f9fdf957","size":5202},"core/source.mjs":{"sha256":"798fe74e3fba836b82576cd46e1b91e6f6e0a4e3cf273c533b5e074247c81373","size":3238},"core/syntax.mjs":{"sha256":"2d50f2e73e17aedbcbccd92af280e171de4ef78b55acccd23d6b6ef11e891776","size":10450},"model/client.mjs":{"sha256":"efb68132710cbdff6b86b58cbac006c48e10f9317e852f00b120ef7c3c7ed9c1","size":42865},"model/config.mjs":{"sha256":"127605979a299616be15f4a47e94dcd82928b00ad2af71744ffaa6e359516486","size":3245},"server/app.mjs":{"sha256":"54cb435f6ab70739c16a2db9eb63eb91704a5e1515cbb2c25793f47baa4e0299","size":10128},"server/enrichment.mjs":{"sha256":"3c5cc57f2c8f019f79418457f366a9422e0a03a8ba86a41b0767aba636bde179","size":3825},"server/main.mjs":{"sha256":"e5bdcd02209c2ccc1ed8c73b85b9988d61aa3e1bcf7c8d119eed782a4bfcd224","size":4587},"server/queue.mjs":{"sha256":"23e30f3ff570771b77a244be9200ad510d2f19811eee566d68b364b7f741a9d7","size":7371},"server/runner.mjs":{"sha256":"a6ca5bfbd7b239f7110639d854ca9a263f4cf3aaf06701ea54493b29f8244706","size":9071},"server/store.mjs":{"sha256":"efa2a35c7e9d0344c26e24ba360a457cdf80f4f48975f0186f81844b9fb7a097","size":2706},"server/worker.mjs":{"sha256":"1df839608cd1c691fc2801d89e698daeef3e48d7f4b8843ce1252a21fde9730a","size":1902},"viewer/render.mjs":{"sha256":"c77442c27041a5fe28269b8c80c9d24c72b73a226e8d4491e6d7285a9feb5309","size":19443},"viewer/shell.mjs":{"sha256":"5f800d0a97fe416d02cf9abef766d651b444b4745ad3a998926599469358ca79","size":9408}}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xagents_in/unmask",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "description": "Evidence-based comparison of npm packages and their source archives",
6
6
  "license": "MIT",