hackshop-mcp 0.0.3 → 0.0.5

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 (74) hide show
  1. package/README.md +88 -34
  2. package/catalog.json +1584 -25
  3. package/dist/build-plan/index.d.ts +10 -0
  4. package/dist/build-plan/index.js +550 -0
  5. package/dist/build-plan/index.js.map +1 -0
  6. package/dist/build-plan/types.d.ts +153 -0
  7. package/dist/build-plan/types.js +2 -0
  8. package/dist/build-plan/types.js.map +1 -0
  9. package/dist/catalog/schema.d.ts +523 -7
  10. package/dist/catalog/schema.js +49 -0
  11. package/dist/catalog/schema.js.map +1 -1
  12. package/dist/core/assess.d.ts +36 -0
  13. package/dist/core/assess.js +100 -0
  14. package/dist/core/assess.js.map +1 -0
  15. package/dist/core/errors.d.ts +2 -0
  16. package/dist/core/errors.js +70 -0
  17. package/dist/core/errors.js.map +1 -0
  18. package/dist/core/links.d.ts +3 -0
  19. package/dist/core/links.js +19 -0
  20. package/dist/core/links.js.map +1 -0
  21. package/dist/core/plan-gadget.d.ts +85 -0
  22. package/dist/core/plan-gadget.js +619 -0
  23. package/dist/core/plan-gadget.js.map +1 -0
  24. package/dist/core/resources.d.ts +37 -0
  25. package/dist/core/resources.js +143 -0
  26. package/dist/core/resources.js.map +1 -0
  27. package/dist/core/safety.d.ts +7 -0
  28. package/dist/core/safety.js +28 -0
  29. package/dist/core/safety.js.map +1 -0
  30. package/dist/core/tools.d.ts +247 -0
  31. package/dist/core/tools.js +164 -0
  32. package/dist/core/tools.js.map +1 -0
  33. package/dist/core/types.d.ts +163 -0
  34. package/dist/core/types.js +17 -0
  35. package/dist/core/types.js.map +1 -0
  36. package/dist/platforms/index.d.ts +26 -0
  37. package/dist/platforms/index.js +52 -0
  38. package/dist/platforms/index.js.map +1 -0
  39. package/dist/platforms/load.d.ts +4 -0
  40. package/dist/platforms/load.js +78 -0
  41. package/dist/platforms/load.js.map +1 -0
  42. package/dist/platforms/schema.d.ts +587 -0
  43. package/dist/platforms/schema.js +64 -0
  44. package/dist/platforms/schema.js.map +1 -0
  45. package/dist/sampling.d.ts +5 -0
  46. package/dist/sampling.js +44 -21
  47. package/dist/sampling.js.map +1 -1
  48. package/dist/server.d.ts +14 -1
  49. package/dist/server.js +164 -40
  50. package/dist/server.js.map +1 -1
  51. package/dist/site-url.d.ts +1 -0
  52. package/dist/site-url.js +4 -0
  53. package/dist/site-url.js.map +1 -0
  54. package/dist/telemetry.d.ts +29 -0
  55. package/dist/telemetry.js +100 -0
  56. package/dist/telemetry.js.map +1 -0
  57. package/dist/tools/assess_hackability.d.ts +2 -29
  58. package/dist/tools/assess_hackability.js +11 -43
  59. package/dist/tools/assess_hackability.js.map +1 -1
  60. package/dist/tools/get_build_plan.d.ts +6 -0
  61. package/dist/tools/get_build_plan.js +16 -0
  62. package/dist/tools/get_build_plan.js.map +1 -0
  63. package/dist/tools/plan_gadget.d.ts +4 -0
  64. package/dist/tools/plan_gadget.js +14 -0
  65. package/dist/tools/plan_gadget.js.map +1 -0
  66. package/dist/tools/propose_hardware.d.ts +5 -0
  67. package/dist/tools/propose_hardware.js +57 -8
  68. package/dist/tools/propose_hardware.js.map +1 -1
  69. package/dist/tools/simulate_assembly.d.ts +315 -0
  70. package/dist/tools/simulate_assembly.js +145 -0
  71. package/dist/tools/simulate_assembly.js.map +1 -0
  72. package/package.json +4 -1
  73. package/platforms.json +779 -0
  74. package/tags.md +1 -0
@@ -1,46 +1,14 @@
1
- import { z } from "zod";
2
- import { applyBrickRiskSafety } from "../safety.js";
3
- import { buildLinks } from "../links.js";
4
- export const assessHackabilityInput = z.object({
5
- device_name: z.string().min(1).max(200),
6
- });
7
- // Simple normalization for fuzzy lookup: lowercase, strip non-alnum.
8
- function norm(s) {
9
- return s.toLowerCase().replace(/[^a-z0-9]+/g, "");
10
- }
1
+ import { getLoadedPlatforms, printablesFor } from "../platforms/index.js";
2
+ import { siteUrlFromEnv } from "../site-url.js";
3
+ import { assessHackability as assessHackabilityCore, assessHackabilityInput, } from "../core/assess.js";
4
+ export { assessHackabilityInput };
11
5
  export function assessHackability(input, catalog) {
12
- const target = norm(input.device_name);
13
- // Exact match by id, then by normalized name, then substring.
14
- let match = catalog.find((d) => d.id === input.device_name);
15
- if (!match)
16
- match = catalog.find((d) => norm(d.name) === target);
17
- if (!match)
18
- match = catalog.find((d) => norm(d.name).includes(target) || target.includes(norm(d.name)));
19
- if (!match) {
20
- return {
21
- found: false,
22
- message: `"${input.device_name}" is not in the catalog. Cannot assess hackability without verification. Try a more specific name, or check the firmware links section of similar devices.`,
23
- };
24
- }
25
- const safety = applyBrickRiskSafety(match);
26
- const links = buildLinks(match);
27
- return {
28
- found: true,
29
- device: {
30
- id: match.id,
31
- name: match.name,
32
- category: match.category,
33
- hackable: true, // presence in catalog implies hackable
34
- hack_difficulty: match.hack_difficulty,
35
- brick_risk: safety.brick_risk,
36
- brick_risk_label: safety.brick_risk_label,
37
- brick_risk_disclaimer: safety.brick_risk_disclaimer,
38
- firmware_links: match.firmware_links,
39
- community_size: match.community_size_bucket,
40
- last_verified: match.last_verified,
41
- notes: match.notes,
42
- links,
43
- },
44
- };
6
+ const siteUrl = siteUrlFromEnv();
7
+ return assessHackabilityCore(input, {
8
+ catalog,
9
+ platforms: getLoadedPlatforms(),
10
+ printablesFor: (device, baseUrl) => printablesFor(device, baseUrl),
11
+ siteUrl,
12
+ });
45
13
  }
46
14
  //# sourceMappingURL=assess_hackability.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assess_hackability.js","sourceRoot":"","sources":["../../src/tools/assess_hackability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAE3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACxC,CAAC,CAAC;AAwBH,qEAAqE;AACrE,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAkB,EAClB,OAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEvC,8DAA8D;IAC9D,IAAI,KAAK,GAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC;IACrF,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK;QAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAExG,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,IAAI,KAAK,CAAC,WAAW,4JAA4J;SAC3L,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE;YACN,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,IAAI,EAAE,uCAAuC;YACvD,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;YACnD,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,cAAc,EAAE,KAAK,CAAC,qBAAqB;YAC3C,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK;SACN;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"assess_hackability.js","sourceRoot":"","sources":["../../src/tools/assess_hackability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,iBAAiB,IAAI,qBAAqB,EAC1C,sBAAsB,GAGvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAuC,CAAC;AAEvE,MAAM,UAAU,iBAAiB,CAC/B,KAAkB,EAClB,OAAsB;IAEtB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,OAAO,qBAAqB,CAAC,KAAK,EAAE;QAClC,OAAO;QACP,SAAS,EAAE,kBAAkB,EAAE;QAC/B,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,MAAqB,EAAE,OAAO,CAAC;QACjF,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BuildPlan } from "../build-plan/types.js";
2
+ import type { DeviceEntry } from "../catalog/schema.js";
3
+ import { getBuildPlanInput, type GetBuildPlanInput } from "../core/tools.js";
4
+ import type { Platform } from "../platforms/schema.js";
5
+ export { getBuildPlanInput, type GetBuildPlanInput };
6
+ export declare function getBuildPlan(input: GetBuildPlanInput, catalog: DeviceEntry[], platforms: Platform[], siteUrl: string): BuildPlan;
@@ -0,0 +1,16 @@
1
+ import { getBuildPlan as getBuildPlanCore, getBuildPlanInput } from "../core/tools.js";
2
+ import { printablesFor } from "../platforms/index.js";
3
+ export { getBuildPlanInput };
4
+ export function getBuildPlan(input, catalog, platforms, siteUrl) {
5
+ const result = getBuildPlanCore(input, {
6
+ catalog,
7
+ platforms,
8
+ printablesFor: (device, baseUrl) => printablesFor(device, baseUrl),
9
+ siteUrl,
10
+ });
11
+ if ("isError" in result) {
12
+ throw new Error(result.text);
13
+ }
14
+ return result;
15
+ }
16
+ //# sourceMappingURL=get_build_plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_build_plan.js","sourceRoot":"","sources":["../../src/tools/get_build_plan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,iBAAiB,EAA0B,MAAM,kBAAkB,CAAC;AAC/G,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAA0B,CAAC;AAErD,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,OAAsB,EACtB,SAAqB,EACrB,OAAe;IAEf,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE;QACrC,OAAO;QACP,SAAS;QACT,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,MAAqB,EAAE,OAAO,CAAC;QACjF,OAAO;KACR,CAAC,CAAC;IACH,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DeviceEntry } from "../catalog/schema.js";
2
+ import { NEED_VALUES, planGadgetInput, type Need, type PlanGadgetInput, type PlanGadgetOutput, type Size } from "../core/plan-gadget.js";
3
+ export { NEED_VALUES, planGadgetInput, type Need, type PlanGadgetInput, type PlanGadgetOutput, type Size };
4
+ export declare function planGadget(input: PlanGadgetInput, catalog: DeviceEntry[]): PlanGadgetOutput;
@@ -0,0 +1,14 @@
1
+ import { getLoadedPlatforms, printablesFor } from "../platforms/index.js";
2
+ import { siteUrlFromEnv } from "../site-url.js";
3
+ import { NEED_VALUES, planGadget as planGadgetCore, planGadgetInput, } from "../core/plan-gadget.js";
4
+ export { NEED_VALUES, planGadgetInput };
5
+ export function planGadget(input, catalog) {
6
+ const siteUrl = siteUrlFromEnv();
7
+ return planGadgetCore(input, {
8
+ catalog,
9
+ platforms: getLoadedPlatforms(),
10
+ printablesFor: (device, baseUrl) => printablesFor(device, baseUrl),
11
+ siteUrl,
12
+ });
13
+ }
14
+ //# sourceMappingURL=plan_gadget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan_gadget.js","sourceRoot":"","sources":["../../src/tools/plan_gadget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,WAAW,EACX,UAAU,IAAI,cAAc,EAC5B,eAAe,GAKhB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAqE,CAAC;AAK3G,MAAM,UAAU,UAAU,CACxB,KAAsB,EACtB,OAAsB;IAEtB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,OAAO,cAAc,CAAC,KAAK,EAAE;QAC3B,OAAO;QACP,SAAS,EAAE,kBAAkB,EAAE;QAC/B,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,MAAqB,EAAE,OAAO,CAAC;QACjF,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -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,12 +31,16 @@ 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[];
36
38
  reasoning: string;
37
39
  degraded: boolean;
38
40
  message?: string;
41
+ note?: string;
42
+ reasoning_unavailable?: boolean;
43
+ try_instead?: "plan_gadget";
39
44
  }
40
45
  export declare function shortlistCandidates(catalog: DeviceEntry[], idea: string): DeviceEntry[];
41
46
  export declare function proposeHardware(input: ProposeInput, catalog: DeviceEntry[], server: Server): Promise<ProposeOutput>;
@@ -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
@@ -81,6 +97,11 @@ export async function proposeHardware(input, catalog, server) {
81
97
  degraded: true,
82
98
  };
83
99
  }
100
+ const hostAdvertisesSampling = Boolean(server.getClientCapabilities?.()?.sampling);
101
+ const hasApiKey = Boolean(process.env.ANTHROPIC_API_KEY);
102
+ if (!hostAdvertisesSampling && !hasApiKey) {
103
+ return degradedCatalogMatches(input, catalog, "Your MCP host doesn't support sampling and no ANTHROPIC_API_KEY is set, so these are catalog matches without AI reasoning. For Muse gadgets, call plan_gadget (instant, no key needed).");
104
+ }
84
105
  // Pass the FULL catalog to sampling when small; lets the LLM weigh all
85
106
  // options. Shortlist only as the degraded-mode fallback.
86
107
  const fullCatalog = catalog.length <= 100 ? catalog : shortlistCandidates(catalog, input.idea);
@@ -94,23 +115,26 @@ export async function proposeHardware(input, catalog, server) {
94
115
  ]
95
116
  .filter(Boolean)
96
117
  .join("\n");
118
+ const diagnostics = {};
97
119
  const sampled = await sampleJson({
98
120
  server,
99
121
  systemPrompt: SYSTEM_PROMPT,
100
122
  userPrompt,
101
123
  maxTokens: 1500,
124
+ diagnostics,
125
+ hostSamplingTimeoutMs: 45_000,
102
126
  });
103
127
  // Degraded path: every reasoning attempt failed (host sampling + retry +
104
128
  // optional Anthropic API fallback). Use the alias-aware shortlist as the
105
129
  // best available approximation. Honest about the degradation.
106
130
  if (!sampled || !Array.isArray(sampled.picks)) {
107
- const shortlisted = shortlistCandidates(catalog, input.idea);
108
- const fallback = shortlisted.slice(0, 5).map((d) => buildProposal(d, "Reasoning unavailable; matched against catalog tags only."));
109
- return {
110
- 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.",
112
- degraded: true,
113
- };
131
+ // If a key WAS present but the API fallback threw (e.g. retired model id),
132
+ // surface that specific reason instead of the misleading "no fallback was
133
+ // configured" message — otherwise the failure is invisible (stderr only).
134
+ const reasoning = diagnostics.apiFallbackError
135
+ ? `Reasoning unavailable. ${diagnostics.apiFallbackError} Returning catalog matches by tag overlap.`
136
+ : "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.";
137
+ return degradedCatalogMatches(input, catalog, reasoning, diagnostics.apiFallbackError);
114
138
  }
115
139
  const proposals = [];
116
140
  for (const pick of sampled.picks.slice(0, 5)) {
@@ -133,6 +157,22 @@ export async function proposeHardware(input, catalog, server) {
133
157
  degraded: false,
134
158
  };
135
159
  }
160
+ function degradedCatalogMatches(input, catalog, note, message) {
161
+ const shortlisted = shortlistCandidates(catalog, input.idea);
162
+ const fallback = shortlisted.slice(0, 5).map((d) => buildProposal(d, "Reasoning unavailable; matched against catalog tags only."));
163
+ return {
164
+ proposals: fallback,
165
+ reasoning: note,
166
+ degraded: true,
167
+ reasoning_unavailable: true,
168
+ note,
169
+ ...(message ? { message } : {}),
170
+ ...(mentionsMuseAgent(input.idea) ? { try_instead: "plan_gadget" } : {}),
171
+ };
172
+ }
173
+ function mentionsMuseAgent(idea) {
174
+ return /\b(muse|agent gadget|agent body|physical body|body for you|ai body)\b/i.test(idea);
175
+ }
136
176
  function buildProposal(device, whyThisFits) {
137
177
  const safety = applyBrickRiskSafety(device);
138
178
  const links = buildLinks(device);
@@ -152,6 +192,15 @@ function buildProposal(device, whyThisFits) {
152
192
  ebay_query_suggestion: links.ebay_search_url.includes("_nkw=")
153
193
  ? decodeURIComponent(links.ebay_search_url.split("_nkw=")[1]?.split("&")[0] ?? "")
154
194
  : device.name,
195
+ agent_platforms: safeAgentPlatformsFor(device.id),
155
196
  };
156
197
  }
198
+ function safeAgentPlatformsFor(deviceId) {
199
+ try {
200
+ return agentPlatformsFor(deviceId);
201
+ }
202
+ catch {
203
+ return [];
204
+ }
205
+ }
157
206
  //# 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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"}
@@ -0,0 +1,315 @@
1
+ import { z } from "zod";
2
+ export declare const simulateAssemblyInput: z.ZodObject<{
3
+ assembly: z.ZodObject<{
4
+ idea: z.ZodString;
5
+ components: z.ZodArray<z.ZodObject<{
6
+ ref: z.ZodString;
7
+ device_id: z.ZodString;
8
+ name: z.ZodString;
9
+ role: z.ZodEnum<["compute", "actuator", "sensor", "display", "power", "chassis", "peripheral"]>;
10
+ sim: z.ZodOptional<z.ZodObject<{
11
+ asset_id: z.ZodOptional<z.ZodString>;
12
+ asset_version: z.ZodOptional<z.ZodString>;
13
+ model_uri: z.ZodOptional<z.ZodString>;
14
+ format: z.ZodOptional<z.ZodEnum<["mjcf", "urdf", "proxy"]>>;
15
+ dof: z.ZodOptional<z.ZodNumber>;
16
+ mass_kg: z.ZodOptional<z.ZodNumber>;
17
+ dimensions_m: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
18
+ fidelity: z.ZodOptional<z.ZodEnum<["device-model", "dimensioned-proxy", "generic-placeholder"]>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ asset_id?: string | undefined;
21
+ asset_version?: string | undefined;
22
+ model_uri?: string | undefined;
23
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
24
+ dof?: number | undefined;
25
+ mass_kg?: number | undefined;
26
+ dimensions_m?: [number, number, number] | undefined;
27
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
28
+ }, {
29
+ asset_id?: string | undefined;
30
+ asset_version?: string | undefined;
31
+ model_uri?: string | undefined;
32
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
33
+ dof?: number | undefined;
34
+ mass_kg?: number | undefined;
35
+ dimensions_m?: [number, number, number] | undefined;
36
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
37
+ }>>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ name: string;
40
+ role: "display" | "sensor" | "power" | "compute" | "actuator" | "chassis" | "peripheral";
41
+ device_id: string;
42
+ ref: string;
43
+ sim?: {
44
+ asset_id?: string | undefined;
45
+ asset_version?: string | undefined;
46
+ model_uri?: string | undefined;
47
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
48
+ dof?: number | undefined;
49
+ mass_kg?: number | undefined;
50
+ dimensions_m?: [number, number, number] | undefined;
51
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
52
+ } | undefined;
53
+ }, {
54
+ name: string;
55
+ role: "display" | "sensor" | "power" | "compute" | "actuator" | "chassis" | "peripheral";
56
+ device_id: string;
57
+ ref: string;
58
+ sim?: {
59
+ asset_id?: string | undefined;
60
+ asset_version?: string | undefined;
61
+ model_uri?: string | undefined;
62
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
63
+ dof?: number | undefined;
64
+ mass_kg?: number | undefined;
65
+ dimensions_m?: [number, number, number] | undefined;
66
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
67
+ } | undefined;
68
+ }>, "many">;
69
+ edges: z.ZodDefault<z.ZodArray<z.ZodObject<{
70
+ from: z.ZodString;
71
+ to: z.ZodString;
72
+ transport: z.ZodEnum<["usb", "i2c", "spi", "gpio", "uart", "wifi", "ble", "ros2", "hdmi", "aux", "power"]>;
73
+ payload: z.ZodOptional<z.ZodString>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ from: string;
76
+ to: string;
77
+ transport: "usb" | "i2c" | "spi" | "gpio" | "uart" | "wifi" | "ble" | "ros2" | "hdmi" | "aux" | "power";
78
+ payload?: string | undefined;
79
+ }, {
80
+ from: string;
81
+ to: string;
82
+ transport: "usb" | "i2c" | "spi" | "gpio" | "uart" | "wifi" | "ble" | "ros2" | "hdmi" | "aux" | "power";
83
+ payload?: string | undefined;
84
+ }>, "many">>;
85
+ goal: z.ZodObject<{
86
+ kind: z.ZodEnum<["navigate", "locomote", "manipulate", "sense-act", "display-loop"]>;
87
+ spec: z.ZodString;
88
+ success_metric: z.ZodString;
89
+ criteria: z.ZodOptional<z.ZodObject<{
90
+ position_tolerance_m: z.ZodNumber;
91
+ dwell_s: z.ZodNumber;
92
+ max_collision_events: z.ZodNumber;
93
+ require_upright: z.ZodBoolean;
94
+ }, "strip", z.ZodTypeAny, {
95
+ position_tolerance_m: number;
96
+ dwell_s: number;
97
+ max_collision_events: number;
98
+ require_upright: boolean;
99
+ }, {
100
+ position_tolerance_m: number;
101
+ dwell_s: number;
102
+ max_collision_events: number;
103
+ require_upright: boolean;
104
+ }>>;
105
+ }, "strip", z.ZodTypeAny, {
106
+ kind: "navigate" | "locomote" | "manipulate" | "sense-act" | "display-loop";
107
+ spec: string;
108
+ success_metric: string;
109
+ criteria?: {
110
+ position_tolerance_m: number;
111
+ dwell_s: number;
112
+ max_collision_events: number;
113
+ require_upright: boolean;
114
+ } | undefined;
115
+ }, {
116
+ kind: "navigate" | "locomote" | "manipulate" | "sense-act" | "display-loop";
117
+ spec: string;
118
+ success_metric: string;
119
+ criteria?: {
120
+ position_tolerance_m: number;
121
+ dwell_s: number;
122
+ max_collision_events: number;
123
+ require_upright: boolean;
124
+ } | undefined;
125
+ }>;
126
+ world: z.ZodObject<{
127
+ template: z.ZodEnum<["empty-room", "obstacle-course", "ramp", "tabletop", "stairs", "outdoor-flat"]>;
128
+ goal_xy: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
129
+ }, "strip", z.ZodTypeAny, {
130
+ template: "empty-room" | "obstacle-course" | "ramp" | "tabletop" | "stairs" | "outdoor-flat";
131
+ goal_xy?: [number, number] | undefined;
132
+ }, {
133
+ template: "empty-room" | "obstacle-course" | "ramp" | "tabletop" | "stairs" | "outdoor-flat";
134
+ goal_xy?: [number, number] | undefined;
135
+ }>;
136
+ }, "strip", z.ZodTypeAny, {
137
+ idea: string;
138
+ components: {
139
+ name: string;
140
+ role: "display" | "sensor" | "power" | "compute" | "actuator" | "chassis" | "peripheral";
141
+ device_id: string;
142
+ ref: string;
143
+ sim?: {
144
+ asset_id?: string | undefined;
145
+ asset_version?: string | undefined;
146
+ model_uri?: string | undefined;
147
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
148
+ dof?: number | undefined;
149
+ mass_kg?: number | undefined;
150
+ dimensions_m?: [number, number, number] | undefined;
151
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
152
+ } | undefined;
153
+ }[];
154
+ edges: {
155
+ from: string;
156
+ to: string;
157
+ transport: "usb" | "i2c" | "spi" | "gpio" | "uart" | "wifi" | "ble" | "ros2" | "hdmi" | "aux" | "power";
158
+ payload?: string | undefined;
159
+ }[];
160
+ goal: {
161
+ kind: "navigate" | "locomote" | "manipulate" | "sense-act" | "display-loop";
162
+ spec: string;
163
+ success_metric: string;
164
+ criteria?: {
165
+ position_tolerance_m: number;
166
+ dwell_s: number;
167
+ max_collision_events: number;
168
+ require_upright: boolean;
169
+ } | undefined;
170
+ };
171
+ world: {
172
+ template: "empty-room" | "obstacle-course" | "ramp" | "tabletop" | "stairs" | "outdoor-flat";
173
+ goal_xy?: [number, number] | undefined;
174
+ };
175
+ }, {
176
+ idea: string;
177
+ components: {
178
+ name: string;
179
+ role: "display" | "sensor" | "power" | "compute" | "actuator" | "chassis" | "peripheral";
180
+ device_id: string;
181
+ ref: string;
182
+ sim?: {
183
+ asset_id?: string | undefined;
184
+ asset_version?: string | undefined;
185
+ model_uri?: string | undefined;
186
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
187
+ dof?: number | undefined;
188
+ mass_kg?: number | undefined;
189
+ dimensions_m?: [number, number, number] | undefined;
190
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
191
+ } | undefined;
192
+ }[];
193
+ goal: {
194
+ kind: "navigate" | "locomote" | "manipulate" | "sense-act" | "display-loop";
195
+ spec: string;
196
+ success_metric: string;
197
+ criteria?: {
198
+ position_tolerance_m: number;
199
+ dwell_s: number;
200
+ max_collision_events: number;
201
+ require_upright: boolean;
202
+ } | undefined;
203
+ };
204
+ world: {
205
+ template: "empty-room" | "obstacle-course" | "ramp" | "tabletop" | "stairs" | "outdoor-flat";
206
+ goal_xy?: [number, number] | undefined;
207
+ };
208
+ edges?: {
209
+ from: string;
210
+ to: string;
211
+ transport: "usb" | "i2c" | "spi" | "gpio" | "uart" | "wifi" | "ble" | "ros2" | "hdmi" | "aux" | "power";
212
+ payload?: string | undefined;
213
+ }[] | undefined;
214
+ }>;
215
+ duration_s: z.ZodOptional<z.ZodNumber>;
216
+ }, "strip", z.ZodTypeAny, {
217
+ assembly: {
218
+ idea: string;
219
+ components: {
220
+ name: string;
221
+ role: "display" | "sensor" | "power" | "compute" | "actuator" | "chassis" | "peripheral";
222
+ device_id: string;
223
+ ref: string;
224
+ sim?: {
225
+ asset_id?: string | undefined;
226
+ asset_version?: string | undefined;
227
+ model_uri?: string | undefined;
228
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
229
+ dof?: number | undefined;
230
+ mass_kg?: number | undefined;
231
+ dimensions_m?: [number, number, number] | undefined;
232
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
233
+ } | undefined;
234
+ }[];
235
+ edges: {
236
+ from: string;
237
+ to: string;
238
+ transport: "usb" | "i2c" | "spi" | "gpio" | "uart" | "wifi" | "ble" | "ros2" | "hdmi" | "aux" | "power";
239
+ payload?: string | undefined;
240
+ }[];
241
+ goal: {
242
+ kind: "navigate" | "locomote" | "manipulate" | "sense-act" | "display-loop";
243
+ spec: string;
244
+ success_metric: string;
245
+ criteria?: {
246
+ position_tolerance_m: number;
247
+ dwell_s: number;
248
+ max_collision_events: number;
249
+ require_upright: boolean;
250
+ } | undefined;
251
+ };
252
+ world: {
253
+ template: "empty-room" | "obstacle-course" | "ramp" | "tabletop" | "stairs" | "outdoor-flat";
254
+ goal_xy?: [number, number] | undefined;
255
+ };
256
+ };
257
+ duration_s?: number | undefined;
258
+ }, {
259
+ assembly: {
260
+ idea: string;
261
+ components: {
262
+ name: string;
263
+ role: "display" | "sensor" | "power" | "compute" | "actuator" | "chassis" | "peripheral";
264
+ device_id: string;
265
+ ref: string;
266
+ sim?: {
267
+ asset_id?: string | undefined;
268
+ asset_version?: string | undefined;
269
+ model_uri?: string | undefined;
270
+ format?: "mjcf" | "urdf" | "proxy" | undefined;
271
+ dof?: number | undefined;
272
+ mass_kg?: number | undefined;
273
+ dimensions_m?: [number, number, number] | undefined;
274
+ fidelity?: "device-model" | "dimensioned-proxy" | "generic-placeholder" | undefined;
275
+ } | undefined;
276
+ }[];
277
+ goal: {
278
+ kind: "navigate" | "locomote" | "manipulate" | "sense-act" | "display-loop";
279
+ spec: string;
280
+ success_metric: string;
281
+ criteria?: {
282
+ position_tolerance_m: number;
283
+ dwell_s: number;
284
+ max_collision_events: number;
285
+ require_upright: boolean;
286
+ } | undefined;
287
+ };
288
+ world: {
289
+ template: "empty-room" | "obstacle-course" | "ramp" | "tabletop" | "stairs" | "outdoor-flat";
290
+ goal_xy?: [number, number] | undefined;
291
+ };
292
+ edges?: {
293
+ from: string;
294
+ to: string;
295
+ transport: "usb" | "i2c" | "spi" | "gpio" | "uart" | "wifi" | "ble" | "ros2" | "hdmi" | "aux" | "power";
296
+ payload?: string | undefined;
297
+ }[] | undefined;
298
+ };
299
+ duration_s?: number | undefined;
300
+ }>;
301
+ export type SimulateAssemblyInput = z.infer<typeof simulateAssemblyInput>;
302
+ export interface SimulateAssemblyOutput {
303
+ status: "ok" | "unsupported" | "error" | "unavailable";
304
+ message?: string;
305
+ success?: boolean;
306
+ summary?: string;
307
+ post_mortem?: string;
308
+ authored_by?: string;
309
+ metric_value?: number;
310
+ telemetry?: Record<string, unknown>;
311
+ world_desc?: string;
312
+ artifacts?: Record<string, string>;
313
+ robot?: Record<string, unknown>;
314
+ }
315
+ export declare function simulateAssembly(input: SimulateAssemblyInput): Promise<SimulateAssemblyOutput>;