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
@@ -0,0 +1,145 @@
1
+ import { z } from "zod";
2
+ // ─────────────────────────────────────────────────────────────────────────
3
+ // simulate_assembly — hand an Assembly IR to the physics worker and get back a
4
+ // bounded, synchronous verdict: did the robot reach its goal, and the honest
5
+ // failure theatre (stuck / tipped / collisions) if it didn't.
6
+ //
7
+ // Compact mirror of site/lib/assembly.ts `Assembly` (kept loose on purpose; the
8
+ // Python worker re-validates with Pydantic). Bounded mode caps duration + render
9
+ // so this stays usable inside a single tool call.
10
+ // ─────────────────────────────────────────────────────────────────────────
11
+ const Transport = z.enum([
12
+ "usb", "i2c", "spi", "gpio", "uart", "wifi", "ble", "ros2", "hdmi", "aux", "power",
13
+ ]);
14
+ const SimHandle = z.object({
15
+ asset_id: z.string().min(1).optional(),
16
+ asset_version: z.string().min(1).optional(),
17
+ model_uri: z.string().optional(),
18
+ format: z.enum(["mjcf", "urdf", "proxy"]).optional(),
19
+ dof: z.number().int().nonnegative().optional(),
20
+ mass_kg: z.number().positive().optional(),
21
+ dimensions_m: z.tuple([
22
+ z.number().positive(),
23
+ z.number().positive(),
24
+ z.number().positive(),
25
+ ]).optional(),
26
+ fidelity: z.enum([
27
+ "device-model",
28
+ "dimensioned-proxy",
29
+ "generic-placeholder",
30
+ ]).optional(),
31
+ });
32
+ const AssemblyComponent = z.object({
33
+ ref: z.string().min(1),
34
+ device_id: z.string().min(1),
35
+ name: z.string().min(1),
36
+ role: z.enum([
37
+ "compute", "actuator", "sensor", "display", "power", "chassis", "peripheral",
38
+ ]),
39
+ sim: SimHandle.optional(),
40
+ });
41
+ const ProtocolEdge = z.object({
42
+ from: z.string().min(1),
43
+ to: z.string().min(1),
44
+ transport: Transport,
45
+ payload: z.string().optional(),
46
+ });
47
+ const Assembly = z.object({
48
+ idea: z.string().min(1),
49
+ components: z.array(AssemblyComponent).min(1),
50
+ edges: z.array(ProtocolEdge).default([]),
51
+ goal: z.object({
52
+ kind: z.enum(["navigate", "locomote", "manipulate", "sense-act", "display-loop"]),
53
+ spec: z.string().min(1),
54
+ success_metric: z.string().min(1),
55
+ criteria: z.object({
56
+ position_tolerance_m: z.number().positive().max(1),
57
+ dwell_s: z.number().nonnegative(),
58
+ max_collision_events: z.number().int().nonnegative(),
59
+ require_upright: z.boolean(),
60
+ }).optional(),
61
+ }),
62
+ world: z.object({
63
+ // Canonical WorldTemplate enum — keep in sync with site/lib/assembly.ts
64
+ // WorldSpec and the Python worker.
65
+ template: z.enum([
66
+ "empty-room", "obstacle-course", "ramp", "tabletop", "stairs", "outdoor-flat",
67
+ ]),
68
+ goal_xy: z.tuple([z.number(), z.number()]).optional(),
69
+ }),
70
+ });
71
+ export const simulateAssemblyInput = z.object({
72
+ assembly: Assembly,
73
+ duration_s: z.number().positive().max(10).optional(),
74
+ });
75
+ function workerBase() {
76
+ return (process.env.SIM_WORKER_URL || "http://127.0.0.1:8000").replace(/\/$/, "");
77
+ }
78
+ // Bounded sync simulation can take a while (cold MuJoCo + render) but must not
79
+ // hang a tool call indefinitely. Cap the client-side wait well under any host
80
+ // tool-call ceiling.
81
+ const SYNC_TIMEOUT_MS = 90_000;
82
+ export async function simulateAssembly(input) {
83
+ const body = {
84
+ assembly: input.assembly,
85
+ options: {
86
+ mode: "sync",
87
+ bounded: true,
88
+ render: true,
89
+ agent: false,
90
+ duration_s: input.duration_s ?? 8.0,
91
+ },
92
+ };
93
+ let job;
94
+ try {
95
+ const res = await fetch(`${workerBase()}/simulate`, {
96
+ method: "POST",
97
+ headers: { "Content-Type": "application/json" },
98
+ body: JSON.stringify(body),
99
+ signal: AbortSignal.timeout(SYNC_TIMEOUT_MS),
100
+ });
101
+ if (!res.ok) {
102
+ return {
103
+ status: "error",
104
+ message: `Simulation worker returned ${res.status}: ${(await res.text()).slice(0, 200)}`,
105
+ };
106
+ }
107
+ job = (await res.json());
108
+ }
109
+ catch (err) {
110
+ const aborted = err instanceof Error &&
111
+ (err.name === "AbortError" || err.name === "TimeoutError");
112
+ return {
113
+ status: "unavailable",
114
+ message: aborted
115
+ ? `Simulation worker did not respond within ${SYNC_TIMEOUT_MS / 1000}s; treating it as unavailable. ` +
116
+ "Set SIM_WORKER_URL and ensure the sim-worker is running and reachable."
117
+ : "Could not reach the simulation worker. Set SIM_WORKER_URL and ensure the " +
118
+ `sim-worker is running. (${err instanceof Error ? err.message : "fetch failed"})`,
119
+ };
120
+ }
121
+ if (job.status === "error" || !job.result) {
122
+ return { status: "error", message: job.error ?? "Simulation failed with no result." };
123
+ }
124
+ const r = job.result;
125
+ if (!r.supported) {
126
+ return {
127
+ status: "unsupported",
128
+ message: r.reason ?? "This assembly/goal isn't simulatable yet.",
129
+ world_desc: r.world_desc,
130
+ };
131
+ }
132
+ return {
133
+ status: "ok",
134
+ success: r.success,
135
+ summary: r.summary,
136
+ post_mortem: r.post_mortem,
137
+ authored_by: r.authored_by,
138
+ metric_value: r.metric_value,
139
+ telemetry: r.telemetry,
140
+ world_desc: r.world_desc,
141
+ artifacts: r.artifacts,
142
+ robot: r.robot,
143
+ };
144
+ }
145
+ //# sourceMappingURL=simulate_assembly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate_assembly.js","sourceRoot":"","sources":["../../src/tools/simulate_assembly.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hackshop-mcp",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Hardware-literate AI scout for tinkerers. Idea-to-hardware mapping via MCP.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,6 +10,7 @@
10
10
  "files": [
11
11
  "dist",
12
12
  "catalog.json",
13
+ "platforms.json",
13
14
  "tags.md",
14
15
  "examples",
15
16
  "README.md",
@@ -51,7 +52,9 @@
51
52
  "zod": "^3.23.0"
52
53
  },
53
54
  "devDependencies": {
55
+ "@ai-sdk/anthropic": "^2.0.85",
54
56
  "@types/node": "^22.0.0",
57
+ "ai": "^6.0.223",
55
58
  "tsx": "^4.19.0",
56
59
  "typescript": "^5.6.0",
57
60
  "vitest": "^2.1.0"