hackshop-mcp 0.0.3 → 0.0.4

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.
@@ -0,0 +1,406 @@
1
+ import { z } from "zod";
2
+ import { getLoadedPlatforms, printablesFor } from "../platforms/index.js";
3
+ export const NEED_VALUES = [
4
+ "voice",
5
+ "screen",
6
+ "images",
7
+ "touch",
8
+ "camera",
9
+ "air-sensors",
10
+ "e-ink",
11
+ "battery",
12
+ "round",
13
+ "home-tunnel",
14
+ "big-screen",
15
+ "compute",
16
+ "linux",
17
+ ];
18
+ const Need = z.enum(NEED_VALUES);
19
+ export const planGadgetInput = z.object({
20
+ idea: z.string().min(3).max(2000),
21
+ platform: z.enum(["muse-esp32", "muse-linux", "any"]).default("any"),
22
+ budget_usd: z.number().positive().max(100000).optional(),
23
+ owned_device_ids: z.array(z.string().min(1)).max(50).optional(),
24
+ needs: z.array(Need).optional(),
25
+ limit: z.number().int().min(1).max(5).default(3),
26
+ });
27
+ const NEED_ORDER = [...NEED_VALUES];
28
+ const HARD_NEEDS = new Set(["voice", "camera", "air-sensors", "e-ink", "linux"]);
29
+ const NEED_KEYWORDS = {
30
+ voice: [
31
+ "talk",
32
+ "talks",
33
+ "speak",
34
+ "speaks",
35
+ "voice",
36
+ "push-to-talk",
37
+ "ptt",
38
+ "ask",
39
+ "conversation",
40
+ "chat",
41
+ "mic",
42
+ "microphone",
43
+ "listen",
44
+ "companion",
45
+ ],
46
+ screen: ["screen", "display", "show", "shows", "showing", "face", "avatar", "dashboard", "status"],
47
+ images: ["image", "images", "photo", "photos", "picture", "pictures", "art", "album"],
48
+ touch: ["touch", "touchscreen", "tap", "swipe"],
49
+ camera: ["camera", "see", "look", "looks", "watch", "watches", "vision"],
50
+ "air-sensors": ["air", "co2", "air quality", "tvoc", "humidity", "temperature"],
51
+ "e-ink": ["e-ink", "eink", "e-paper", "epaper"],
52
+ battery: ["battery", "portable", "pocket", "carry", "wearable", "keychain"],
53
+ round: ["round", "circle", "circular", "orb", "puck"],
54
+ "home-tunnel": ["home network", "lan", "smart home", "lights", "sonos", "hue", "tv"],
55
+ "big-screen": ["calendar", "wall", "fridge", "kitchen", "frame", "poster", "big screen", "large screen"],
56
+ compute: ["server", "home assistant", "homelab", "nas", "docker", "media server", "plex"],
57
+ linux: [
58
+ "shell",
59
+ "server",
60
+ "sysadmin",
61
+ "home assistant",
62
+ "homelab",
63
+ "raspberry pi",
64
+ "thin client",
65
+ "mini pc",
66
+ "nas",
67
+ "linux",
68
+ ],
69
+ };
70
+ const CHEAP_KEYWORDS = ["cheap", "cheapest", "inexpensive", "budget", "low-cost", "affordable"];
71
+ export function planGadget(input, catalog) {
72
+ const platforms = getLoadedPlatforms();
73
+ const catalogById = new Map(catalog.map((device) => [device.id, device]));
74
+ const needs = input.needs ? orderNeeds(input.needs) : inferNeeds(input.idea);
75
+ const inferredPreferences = inferPreferences(input.idea);
76
+ const owned = new Set(input.owned_device_ids ?? []);
77
+ const candidates = [];
78
+ for (const platform of platforms) {
79
+ if (input.platform !== "any" && platform.id !== input.platform)
80
+ continue;
81
+ const tierLabels = new Map(platform.tiers.map((tier) => [tier.id, tier.label]));
82
+ for (const board of platform.boards) {
83
+ const device = catalogById.get(board.device_id);
84
+ if (!device)
85
+ continue;
86
+ candidates.push(scoreBoard({
87
+ device,
88
+ platform,
89
+ board,
90
+ tierLabel: tierLabels.get(board.tier) ?? board.tier,
91
+ needs,
92
+ budgetUsd: input.budget_usd,
93
+ owned: owned.has(device.id),
94
+ cheapPreference: inferredPreferences.includes("cheap"),
95
+ }));
96
+ }
97
+ }
98
+ candidates.sort((a, b) => {
99
+ if (b.score !== a.score)
100
+ return b.score - a.score;
101
+ const priceA = a.device.est_used_price_usd_min ?? Number.POSITIVE_INFINITY;
102
+ const priceB = b.device.est_used_price_usd_min ?? Number.POSITIVE_INFINITY;
103
+ if (priceA !== priceB)
104
+ return priceA - priceB;
105
+ return a.device.id.localeCompare(b.device.id);
106
+ });
107
+ const picks = candidates.slice(0, input.limit).map((candidate) => ({
108
+ device_id: candidate.device.id,
109
+ name: candidate.device.name,
110
+ platform_id: candidate.platform.id,
111
+ platform_name: candidate.platform.name,
112
+ support: candidate.board.support,
113
+ tier: candidate.board.tier,
114
+ tier_label: candidate.tierLabel,
115
+ score: candidate.score,
116
+ why: buildWhy(candidate),
117
+ gaps: candidate.gaps,
118
+ price_label: priceLabel(candidate.device),
119
+ links: candidate.device.firmware_links,
120
+ build_command: candidate.board.build,
121
+ setup_steps: candidate.platform.setup_steps,
122
+ caveats: caveatsFor(candidate.platform, candidate.board),
123
+ fabrication: {
124
+ printables: printablesFor(candidate.device),
125
+ note: fabricationNote(candidate.device),
126
+ },
127
+ }));
128
+ const pickedPlatforms = new Map();
129
+ for (const pick of picks) {
130
+ const platform = platforms.find((candidate) => candidate.id === pick.platform_id);
131
+ if (platform)
132
+ pickedPlatforms.set(platform.id, platform);
133
+ }
134
+ return {
135
+ inferred_needs: needs,
136
+ inferred_preferences: inferredPreferences,
137
+ picks,
138
+ terms: [...pickedPlatforms.values()].map((platform) => ({
139
+ platform_id: platform.id,
140
+ summary: platform.terms.summary,
141
+ url: platform.terms.url,
142
+ max_devices_per_token: platform.terms.max_devices_per_token,
143
+ selling_allowed: platform.terms.selling_allowed,
144
+ })),
145
+ next_steps: nextSteps(picks),
146
+ };
147
+ }
148
+ export function inferNeeds(idea) {
149
+ const found = new Set();
150
+ for (const need of NEED_ORDER) {
151
+ if (NEED_KEYWORDS[need].some((keyword) => wordBoundaryMatch(idea, keyword))) {
152
+ found.add(need);
153
+ }
154
+ }
155
+ return [...found];
156
+ }
157
+ function inferPreferences(idea) {
158
+ return CHEAP_KEYWORDS.some((keyword) => wordBoundaryMatch(idea, keyword)) ? ["cheap"] : [];
159
+ }
160
+ function orderNeeds(needs) {
161
+ const given = new Set(needs);
162
+ return NEED_ORDER.filter((need) => given.has(need));
163
+ }
164
+ function wordBoundaryMatch(text, keyword) {
165
+ const escaped = keyword
166
+ .toLowerCase()
167
+ .replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
168
+ .replace(/\s+/g, "\\s+");
169
+ return new RegExp(`(^|[^a-z0-9])${escaped}([^a-z0-9]|$)`, "i").test(text);
170
+ }
171
+ function scoreBoard(args) {
172
+ let score = 0;
173
+ const satisfied = [];
174
+ const gaps = [];
175
+ for (const need of args.needs) {
176
+ const result = satisfiesNeed(need, args.board, args.platform);
177
+ if (result.satisfied) {
178
+ score += 3;
179
+ satisfied.push(need);
180
+ }
181
+ else {
182
+ score += HARD_NEEDS.has(need) ? -4 : -1;
183
+ gaps.push(result.gap);
184
+ }
185
+ }
186
+ if (args.board.tier === "full-ui")
187
+ score += 1;
188
+ if (args.board.support === "official")
189
+ score += 1;
190
+ if (args.board.eol) {
191
+ score -= 2;
192
+ gaps.push("End of life at the vendor");
193
+ }
194
+ if (args.owned)
195
+ score += 5;
196
+ if (args.cheapPreference) {
197
+ const minPrice = args.device.est_used_price_usd_min;
198
+ score -= minPrice === undefined ? 3 : Math.floor(minPrice / 20);
199
+ }
200
+ if (args.budgetUsd !== undefined &&
201
+ args.device.est_used_price_usd_min !== undefined &&
202
+ args.device.est_used_price_usd_min > args.budgetUsd) {
203
+ score -= 3;
204
+ gaps.push("over budget");
205
+ }
206
+ const needsLinux = args.needs.includes("linux");
207
+ if (args.platform.sdk_path === "linux") {
208
+ if (!needsLinux && !args.owned)
209
+ score -= 3;
210
+ if (args.board.features.ble_builtin === false)
211
+ score -= 1;
212
+ if (args.board.features.ble_builtin === true)
213
+ score += 1;
214
+ }
215
+ return {
216
+ device: args.device,
217
+ platform: args.platform,
218
+ board: args.board,
219
+ tierLabel: args.tierLabel,
220
+ score,
221
+ satisfied,
222
+ gaps,
223
+ };
224
+ }
225
+ function satisfiesNeed(need, board, platform) {
226
+ switch (need) {
227
+ case "voice": {
228
+ const pushToTalk = board.features.push_to_talk;
229
+ const audio = board.features.audio;
230
+ if (pushToTalk === "voice" && audio === "speaker-mic")
231
+ return { satisfied: true };
232
+ if (pushToTalk === "text")
233
+ return { satisfied: false, gap: "voice: text replies only" };
234
+ if (audio === "buzzer-mic") {
235
+ return { satisfied: false, gap: "voice: no speaker (buzzer only)" };
236
+ }
237
+ return { satisfied: false, gap: "voice: no push-to-talk with spoken replies" };
238
+ }
239
+ case "screen":
240
+ return board.tier === "full-ui" || ["status-screen", "e-paper"].includes(board.kind)
241
+ ? { satisfied: true }
242
+ : { satisfied: false, gap: "screen: no display UI" };
243
+ case "images":
244
+ return typeof board.features.images === "string" && board.features.images !== "none"
245
+ ? { satisfied: true }
246
+ : { satisfied: false, gap: "images: no image display" };
247
+ case "touch":
248
+ return board.features.touch === true
249
+ ? { satisfied: true }
250
+ : { satisfied: false, gap: "touch: no touch input" };
251
+ case "camera":
252
+ return board.features.camera === true
253
+ ? { satisfied: true }
254
+ : { satisfied: false, gap: "camera: no camera" };
255
+ case "air-sensors":
256
+ return board.features.air_sensors === true
257
+ ? { satisfied: true }
258
+ : { satisfied: false, gap: "air sensors: no air-quality sensors" };
259
+ case "e-ink":
260
+ return board.kind === "e-paper"
261
+ ? { satisfied: true }
262
+ : { satisfied: false, gap: "e-ink: not an e-paper board" };
263
+ case "battery":
264
+ return board.features.battery === "yes" || board.features.battery === "optional"
265
+ ? { satisfied: true }
266
+ : { satisfied: false, gap: "battery: no portable power option" };
267
+ case "round":
268
+ return board.features.round_display === true
269
+ ? { satisfied: true }
270
+ : { satisfied: false, gap: "round: not a round display" };
271
+ case "home-tunnel":
272
+ return board.features.home_tunnel === true
273
+ ? { satisfied: true }
274
+ : { satisfied: false, gap: "home network: no Muse home-network tunnel" };
275
+ case "big-screen":
276
+ return featureNumber(board, "display_in") >= 3.5
277
+ ? { satisfied: true }
278
+ : { satisfied: false, gap: "big screen: display under 3.5 inches" };
279
+ case "compute":
280
+ return ["standard", "desktop"].includes(featureString(board, "compute") ?? "")
281
+ ? { satisfied: true }
282
+ : { satisfied: false, gap: "compute: too light for server workloads" };
283
+ case "linux":
284
+ return platform.sdk_path === "linux"
285
+ ? { satisfied: true }
286
+ : { satisfied: false, gap: "linux: not a Linux gadget" };
287
+ }
288
+ }
289
+ function featureNumber(board, key) {
290
+ const value = board.features[key];
291
+ return typeof value === "number" ? value : Number.NEGATIVE_INFINITY;
292
+ }
293
+ function featureString(board, key) {
294
+ const value = board.features[key];
295
+ return typeof value === "string" ? value : null;
296
+ }
297
+ function buildWhy(candidate) {
298
+ const fragments = candidate.satisfied.map((need) => satisfiedPhrase(need, candidate.board));
299
+ const prefix = fragments.length > 0
300
+ ? sentenceList(fragments)
301
+ : "Best available Muse gadget match";
302
+ return `${capitalize(prefix)}. ${candidate.board.note}`;
303
+ }
304
+ function satisfiedPhrase(need, board) {
305
+ switch (need) {
306
+ case "voice":
307
+ return "push-to-talk with spoken replies";
308
+ case "screen":
309
+ return board.tier === "full-ui" ? "full UI display" : "status display";
310
+ case "images":
311
+ return "images from Muse";
312
+ case "touch":
313
+ return "touch input";
314
+ case "camera":
315
+ return "camera capture";
316
+ case "air-sensors":
317
+ return "air-sensor readings";
318
+ case "e-ink":
319
+ return "e-paper status display";
320
+ case "battery":
321
+ return "battery-capable hardware";
322
+ case "round":
323
+ return "round display";
324
+ case "home-tunnel":
325
+ return "home-network tunnel";
326
+ case "big-screen":
327
+ return "a large display";
328
+ case "compute":
329
+ return "enough compute for server workloads";
330
+ case "linux":
331
+ return "Linux shell and file commands";
332
+ }
333
+ }
334
+ function sentenceList(parts) {
335
+ if (parts.length <= 1)
336
+ return parts[0] ?? "";
337
+ if (parts.length === 2)
338
+ return `${parts[0]} and ${parts[1]}`;
339
+ return `${parts.slice(0, -1).join(", ")} and ${parts[parts.length - 1]}`;
340
+ }
341
+ function capitalize(text) {
342
+ return text.length === 0 ? text : `${text[0]?.toUpperCase()}${text.slice(1)}`;
343
+ }
344
+ function priceLabel(device) {
345
+ const min = device.est_used_price_usd_min;
346
+ const max = device.est_used_price_usd_max;
347
+ if (min === undefined && max === undefined)
348
+ return null;
349
+ if (min !== undefined && max !== undefined && min !== max)
350
+ return `$${min}-${max}`;
351
+ return `~$${min ?? max}`;
352
+ }
353
+ function caveatsFor(platform, board) {
354
+ const homeTunnel = board.features.home_tunnel;
355
+ const caveats = platform.caveats.filter((caveat) => {
356
+ const lower = caveat.toLowerCase();
357
+ const psramNoTunnel = lower.includes("without psram") || lower.includes("without the home-network tunnel");
358
+ const tunnelFoothold = lower.includes("home-network tunnel lets") || lower.includes("foothold on your network");
359
+ if (psramNoTunnel)
360
+ return homeTunnel === false;
361
+ if (tunnelFoothold)
362
+ return homeTunnel === true;
363
+ return true;
364
+ });
365
+ if (board.eol)
366
+ caveats.push("End of life at the vendor");
367
+ if (board.support === "possible")
368
+ caveats.push(board.note);
369
+ return caveats;
370
+ }
371
+ function fabricationNote(device) {
372
+ const physical = device.physical;
373
+ const printables = printablesFor(device);
374
+ if (printables.length > 0 && physical) {
375
+ return `Print the stand: STL/STEP links above. Dimensions are from a ${physical.size_confidence} source; print once and check the fit.`;
376
+ }
377
+ if (!physical)
378
+ return "Use the vendor case.";
379
+ const needsMeasure = physical.size_mm.t === null ||
380
+ ["approximate", "conflicting"].includes(physical.size_confidence);
381
+ if (needsMeasure) {
382
+ const note = physical.size_note ?? "dimensions are incomplete or uncertain";
383
+ return `No printable part yet: ${note}. Measure the device, then run \`python -m hackshop_sim.cad.generate --device ${device.id} --part desk-stand --t <mm>\` from sim-worker/.`;
384
+ }
385
+ const mount = physical.mounting ?? "it ships in a finished case";
386
+ return `No printed part needed: it ships with its own stand or mount (${mount}).`;
387
+ }
388
+ function nextSteps(picks) {
389
+ const first = picks[0];
390
+ const steps = ["Get a Muse SDK token from gadgets.muse.ai (keep it private)."];
391
+ if (first?.platform_id === "muse-linux") {
392
+ steps.push("On the machine: download install.sh, read it, then run `bash install.sh --sdk-token mgst_...` (use --run-as with a dedicated low-privilege user).", "Pair from the Muse app within 10 minutes.");
393
+ }
394
+ else if (first) {
395
+ steps.push(`Build: \`${first.build_command}\`, then flash with idf.py -p PORT flash monitor.`, "Pair it in the Muse app (Settings > Devices > Developer mode > Add Device).");
396
+ }
397
+ else {
398
+ steps.push("Pick a supported board, then build and pair it from the Muse app.");
399
+ }
400
+ if (first && first.fabrication.printables.length > 0) {
401
+ steps.push("Print the desk stand (STL/STEP linked above) and check the fit.");
402
+ }
403
+ steps.push("Keep it personal and non-commercial: at most 50 devices per token, no selling.");
404
+ return steps;
405
+ }
406
+ //# sourceMappingURL=plan_gadget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan_gadget.js","sourceRoot":"","sources":["../../src/tools/plan_gadget.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
3
  import type { DeviceEntry } from "../catalog/schema.js";
4
4
  import { type DeviceLinks } from "../links.js";
5
+ import { type AgentPlatform } from "../platforms/index.js";
5
6
  export declare const proposeHardwareInput: z.ZodObject<{
6
7
  idea: z.ZodString;
7
8
  budget_usd: z.ZodOptional<z.ZodNumber>;
@@ -30,6 +31,7 @@ export interface Proposal {
30
31
  notes: string;
31
32
  links: DeviceLinks;
32
33
  ebay_query_suggestion: string;
34
+ agent_platforms: AgentPlatform[];
33
35
  }
34
36
  export interface ProposeOutput {
35
37
  proposals: Proposal[];
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  import { applyBrickRiskSafety } from "../safety.js";
3
3
  import { sampleJson } from "../sampling.js";
4
4
  import { buildLinks } from "../links.js";
5
+ import { agentPlatformsFor } from "../platforms/index.js";
5
6
  export const proposeHardwareInput = z.object({
6
7
  idea: z.string().min(3, "idea is too short").max(2000, "idea is too long"),
7
8
  budget_usd: z.number().positive().max(100000).optional(),
@@ -22,6 +23,7 @@ Rules:
22
23
  - Only pick from the candidate list provided. Do not invent devices.
23
24
  - "why_this_fits" must mention the user's idea explicitly. No generic praise.
24
25
  - Respect explicit constraints in the idea: if the user says "e-paper preferred", prioritize devices with the "e-ink" tag. If the user says "low power", prioritize "low-power" tagged devices.
26
+ - If the idea mentions Muse, Meta's agent, or giving an AI agent a physical body, prefer devices marked \`agent:\` and say which tier (full UI vs status) and that Muse SDK tokens are personal/non-commercial.
25
27
  - If candidates are weak for the idea, say so in the rationale rather than padding with bad picks.
26
28
  - Display HATs (Waveshare, Pimoroni Inky) require a host SBC; if you propose one, also propose a Pi Zero W (raspberry-pi-zero-2w) as the driver.`;
27
29
  // Token-aliasing: user-text terms → catalog tag terms.
@@ -43,6 +45,10 @@ const TAG_ALIASES = {
43
45
  "music": ["audio-out"],
44
46
  "mic": ["voice"],
45
47
  "microphone": ["voice"],
48
+ "muse": ["agent-gadget"],
49
+ "ai agent": ["agent-gadget"],
50
+ "agent body": ["agent-gadget"],
51
+ "assistant": ["agent-gadget"],
46
52
  };
47
53
  function expandIdeaTerms(idea) {
48
54
  const lower = idea.toLowerCase();
@@ -57,7 +63,17 @@ function expandIdeaTerms(idea) {
57
63
  }
58
64
  function candidateContext(catalog) {
59
65
  return catalog
60
- .map((d) => `- id: ${d.id} | name: ${d.name} | category: ${d.category} | tags: ${d.idea_fit_tags.join(", ")} | notes: ${d.notes}`)
66
+ .map((d) => {
67
+ const agentSuffix = safeAgentPlatformsFor(d.id)
68
+ .map((platform) => {
69
+ const label = platform.support === "possible"
70
+ ? "possible"
71
+ : platform.tier;
72
+ return ` | agent: ${platform.platform_id} ${label}`;
73
+ })
74
+ .join("");
75
+ return `- id: ${d.id} | name: ${d.name} | category: ${d.category} | tags: ${d.idea_fit_tags.join(", ")} | notes: ${d.notes}${agentSuffix}`;
76
+ })
61
77
  .join("\n");
62
78
  }
63
79
  // Always pass the full catalog when small (<100 devices). The LLM is the
@@ -94,11 +110,13 @@ export async function proposeHardware(input, catalog, server) {
94
110
  ]
95
111
  .filter(Boolean)
96
112
  .join("\n");
113
+ const diagnostics = {};
97
114
  const sampled = await sampleJson({
98
115
  server,
99
116
  systemPrompt: SYSTEM_PROMPT,
100
117
  userPrompt,
101
118
  maxTokens: 1500,
119
+ diagnostics,
102
120
  });
103
121
  // Degraded path: every reasoning attempt failed (host sampling + retry +
104
122
  // optional Anthropic API fallback). Use the alias-aware shortlist as the
@@ -106,10 +124,19 @@ export async function proposeHardware(input, catalog, server) {
106
124
  if (!sampled || !Array.isArray(sampled.picks)) {
107
125
  const shortlisted = shortlistCandidates(catalog, input.idea);
108
126
  const fallback = shortlisted.slice(0, 5).map((d) => buildProposal(d, "Reasoning unavailable; matched against catalog tags only."));
127
+ // If a key WAS present but the API fallback threw (e.g. retired model id),
128
+ // surface that specific reason instead of the misleading "no fallback was
129
+ // configured" message — otherwise the failure is invisible (stderr only).
130
+ const reasoning = diagnostics.apiFallbackError
131
+ ? `Reasoning unavailable. ${diagnostics.apiFallbackError} Returning catalog matches by tag overlap.`
132
+ : "Reasoning unavailable. The host LLM failed and no Anthropic API fallback was configured. Returning catalog matches by tag overlap. Set ANTHROPIC_API_KEY in the MCP server's env config to enable reasoning even on hosts without sampling/createMessage support.";
109
133
  return {
110
134
  proposals: fallback,
111
- reasoning: "Reasoning unavailable. The host LLM failed and no Anthropic API fallback was configured. Returning catalog matches by tag overlap. Set ANTHROPIC_API_KEY in the MCP server's env config to enable reasoning even on hosts without sampling/createMessage support.",
135
+ reasoning,
112
136
  degraded: true,
137
+ ...(diagnostics.apiFallbackError
138
+ ? { message: diagnostics.apiFallbackError }
139
+ : {}),
113
140
  };
114
141
  }
115
142
  const proposals = [];
@@ -152,6 +179,15 @@ function buildProposal(device, whyThisFits) {
152
179
  ebay_query_suggestion: links.ebay_search_url.includes("_nkw=")
153
180
  ? decodeURIComponent(links.ebay_search_url.split("_nkw=")[1]?.split("&")[0] ?? "")
154
181
  : device.name,
182
+ agent_platforms: safeAgentPlatformsFor(device.id),
155
183
  };
156
184
  }
185
+ function safeAgentPlatformsFor(deviceId) {
186
+ try {
187
+ return agentPlatformsFor(deviceId);
188
+ }
189
+ catch {
190
+ return [];
191
+ }
192
+ }
157
193
  //# sourceMappingURL=propose_hardware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"propose_hardware.js","sourceRoot":"","sources":["../../src/tools/propose_hardware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"propose_hardware.js","sourceRoot":"","sources":["../../src/tools/propose_hardware.ts"],"names":[],"mappings":"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"}