infinicode 2.8.1 → 2.8.3

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.
@@ -23,7 +23,11 @@ function pkgDir() {
23
23
  }
24
24
  function findScheduler() {
25
25
  const candidates = [
26
+ // When robopark serve is invoked via the robopark wrapper, the wrapper
27
+ // imports infinicode/robopark, so this code runs from inside the
28
+ // infinicode package. The scheduler Python files are shipped there.
26
29
  join(pkgDir(), 'packages', 'robopark', 'scheduler', 'main.py'),
30
+ // Fallbacks for local checkout / when robopark is installed standalone.
27
31
  join(pkgDir(), 'scheduler', 'main.py'),
28
32
  join(process.cwd(), 'packages', 'robopark', 'scheduler', 'main.py'),
29
33
  join(process.cwd(), 'scheduler', 'main.py'),
@@ -103,6 +107,7 @@ export async function roboparkServe(opts) {
103
107
  env,
104
108
  stdio: 'pipe',
105
109
  detached: !opts.foreground,
110
+ shell: process.platform === 'win32',
106
111
  });
107
112
  let ready = false;
108
113
  proc.stdout?.on('data', (d) => {
@@ -29,6 +29,7 @@ function runDetached(cmd, args, env) {
29
29
  stdio: 'ignore',
30
30
  detached: true,
31
31
  env: { ...process.env, ...env },
32
+ shell: process.platform === 'win32' && cmd === 'infinicode',
32
33
  });
33
34
  proc.on('error', (err) => {
34
35
  console.log(chalk.red(` ✗ failed to start ${cmd}: ${err.message}`));
@@ -40,7 +41,8 @@ async function infinicodeArgv(args) {
40
41
  const bin = await resolveInfinicodeBin();
41
42
  if (bin)
42
43
  return [bin.node, bin.script, ...args];
43
- // Fallback: assume `infinicode` is on PATH. Will fail clearly if not.
44
+ // Fallback: assume `infinicode` is on PATH. On Windows it is a .cmd shim,
45
+ // so spawn with shell: true in runDetached above.
44
46
  return ['infinicode', ...args];
45
47
  }
46
48
  /** Build a Windows-task-friendly command string from an argv array. */
@@ -17,7 +17,7 @@ const config = new Conf({
17
17
  });
18
18
  const program = new Command('robopark')
19
19
  .description('RoboPark fleet control CLI — set up, watch, and drive talking robots')
20
- .version('2.8.1');
20
+ .version('2.8.3');
21
21
  program
22
22
  .command('scan')
23
23
  .description('Auto-discover the fleet and print ready-to-run setup commands')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinicode",
3
- "version": "2.8.1",
3
+ "version": "2.8.3",
4
4
  "description": "OpenKernel — provider-agnostic AI execution kernel. Native coding agent + mission-driven execution runtime.",
5
5
  "type": "module",
6
6
  "main": "./dist/kernel/index.js",
@@ -25,6 +25,7 @@
25
25
  "bin/infinicode.js",
26
26
  "bin/robopark.js",
27
27
  "dist",
28
+ "packages/robopark/scheduler",
28
29
  ".opencode/plugins",
29
30
  ".opencode/themes",
30
31
  ".opencode/tui.json",
@@ -0,0 +1,63 @@
1
+ # robopark
2
+
3
+ The **RoboPark fleet control CLI** — set up, watch, and drive a room full of
4
+ talking robots from one command. `robopark` is the operator front-end; it rides
5
+ the [`infinicode`](https://www.npmjs.com/package/infinicode) device mesh, which
6
+ it installs as a dependency. You install and think in one name — everything else
7
+ is plumbing.
8
+
9
+ ## Install
10
+
11
+ ```sh
12
+ npm install -g robopark
13
+ ```
14
+
15
+ ## The whole setup — two commands
16
+
17
+ Operators think in **scheduler / robot / laptop**; the mesh underneath thinks in
18
+ hub / satellite / peer. `robopark` translates, and each role turns on the right
19
+ defaults automatically.
20
+
21
+ ```sh
22
+ # On the on-site hub (LiveKit Server 1) — LAN + Tailscale + dashboard on:
23
+ robopark setup --scheduler --gateway ws://<infinibot-gateway>:18789 --start
24
+
25
+ # On each robot Pi — accept-only, LAN-discovered:
26
+ robopark setup --robot --name robopanda --start
27
+
28
+ # From anywhere — a live table of the whole fleet:
29
+ robopark fleet --watch
30
+ ```
31
+
32
+ Run `robopark setup` with no role for a guided wizard.
33
+
34
+ ## Commands
35
+
36
+ | Command | Does |
37
+ |---|---|
38
+ | `robopark setup` | Configure this device's role + site and (with `--start`) launch its node. |
39
+ | `robopark fleet [--watch]` | Live table of every node the mesh can see. |
40
+ | `robopark run <node> <cmd>` | Run a command on one node (use `.` for the local node). |
41
+ | `robopark apply` | Publish this hub's providers / keys / policy to every satellite. |
42
+ | `robopark dashboard [--open]` | Open the web control panel served by the hub. |
43
+
44
+ ## How it fits together
45
+
46
+ ```
47
+ you ── robopark ──▶ infinicode nodes (the mesh) ──▶ InfiniBot (watch)
48
+ └──▶ web dashboard :47913 (watch / drive)
49
+ ```
50
+
51
+ - **robopark** — the remote control. A CLI, no daemon. Writes config and calls
52
+ each node's HTTP API.
53
+ - **infinicode** — the runtime. `infinicode serve` runs on every device, forms
54
+ the mesh, runs agents, streams telemetry, and serves the dashboard.
55
+ - **InfiniBot** — the cockpit. Each node pushes its status *up* to InfiniBot;
56
+ you watch there (or in the built-in dashboard).
57
+
58
+ `robopark` never talks to InfiniBot directly — it drives infinicode nodes, and
59
+ those surface in InfiniBot.
60
+
61
+ ## License
62
+
63
+ MIT
@@ -0,0 +1,24 @@
1
+ # RoboPark Session Scheduler
2
+ FROM python:3.11-slim
3
+
4
+ WORKDIR /app
5
+
6
+ # Install dependencies
7
+ COPY requirements.txt .
8
+ RUN pip install --no-cache-dir -r requirements.txt
9
+
10
+ # Copy application
11
+ COPY main.py .
12
+
13
+ # Create data directory
14
+ RUN mkdir -p /app/data
15
+
16
+ # Expose port
17
+ EXPOSE 8080
18
+
19
+ # Health check
20
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=5s \
21
+ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/api/robots')"
22
+
23
+ # Run
24
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]