infinicode 2.8.36 → 2.8.37

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.
@@ -53,6 +53,8 @@ export declare class MeshServer {
53
53
  start(): Promise<void>;
54
54
  /** Proxy a dashboard request to the RoboPark scheduler (product data). */
55
55
  private proxyToScheduler;
56
+ /** Protected local runtime controls for the RoboPark operator dashboard. */
57
+ private runtimeDocker;
56
58
  /** Push a frame to every connected stream subscriber. */
57
59
  broadcast(frame: StreamFrame): void;
58
60
  /** Token presented on a request — Bearer header (peers/CLI) OR ?token= query
@@ -15,10 +15,13 @@
15
15
  */
16
16
  import { createServer } from 'node:http';
17
17
  import { createServer as createHttpsServer } from 'node:https';
18
+ import { execFile } from 'node:child_process';
19
+ import { promisify } from 'node:util';
18
20
  import { timingSafeEqual } from 'node:crypto';
19
21
  import { readFileSync } from 'node:fs';
20
22
  import { createRequire } from 'node:module';
21
23
  import { frameToSSE, parseSSE } from './protocol.js';
24
+ const execFileAsync = promisify(execFile);
22
25
  /** Read the livekit-client UMD bundle from the installed dependency, once.
23
26
  * Returns null (cached) if the package isn't present — the dashboard then
24
27
  * falls back to an idle camera panel instead of erroring. */
@@ -120,6 +123,51 @@ export class MeshServer {
120
123
  res.end(JSON.stringify({ ok: false, error: `scheduler unreachable: ${err instanceof Error ? err.message : String(err)}` }));
121
124
  });
122
125
  }
126
+ /** Protected local runtime controls for the RoboPark operator dashboard. */
127
+ async runtimeDocker(req, res, path) {
128
+ const send = (status, body) => {
129
+ res.writeHead(status, { 'content-type': 'application/json', 'cache-control': 'no-store' });
130
+ res.end(JSON.stringify(body));
131
+ };
132
+ const run = async (args, timeout = 8000) => {
133
+ const out = await execFileAsync('docker', args, { timeout, maxBuffer: 2_000_000, windowsHide: true });
134
+ return out.stdout.trim();
135
+ };
136
+ try {
137
+ if (req.method === 'GET' && path === '/robopark/runtime/health') {
138
+ const schedulerUrl = this.opts.schedulerUrl?.replace(/\/+$/, '');
139
+ const [docker, containers, scheduler] = await Promise.all([
140
+ run(['info', '--format', '{{json .}}']).then(v => ({ ok: true, data: JSON.parse(v) })).catch(e => ({ ok: false, error: String(e.message ?? e) })),
141
+ run(['ps', '-a', '--format', '{{json .}}']).then(v => ({ ok: true, data: v ? v.split(/\r?\n/).filter(Boolean).map(x => JSON.parse(x)) : [] })).catch(e => ({ ok: false, error: String(e.message ?? e) })),
142
+ schedulerUrl ? fetch(`${schedulerUrl}/api/telemetry`, { signal: AbortSignal.timeout(5000) }).then(async (r) => ({ ok: r.ok, data: r.ok ? await r.json() : await r.text() })).catch(e => ({ ok: false, error: String(e.message ?? e) })) : Promise.resolve({ ok: false, error: 'scheduler not linked' }),
143
+ ]);
144
+ send(200, { ts: Date.now(), docker, containers, scheduler });
145
+ return;
146
+ }
147
+ if (req.method !== 'POST' || path !== '/robopark/runtime/docker') {
148
+ send(404, { ok: false, error: 'not found' });
149
+ return;
150
+ }
151
+ const body = JSON.parse(await this.readBody(req) || '{}');
152
+ const action = body.action;
153
+ const container = body.container?.trim();
154
+ if (!container || !/^[a-zA-Z0-9_.-]+$/.test(container)) {
155
+ send(400, { ok: false, error: 'container is required and must be a Docker container name' });
156
+ return;
157
+ }
158
+ if (!['start', 'stop', 'restart', 'logs'].includes(action ?? '')) {
159
+ send(400, { ok: false, error: 'action must be start, stop, restart, or logs' });
160
+ return;
161
+ }
162
+ const output = action === 'logs'
163
+ ? await run(['logs', '--tail', '100', '--timestamps', container], 30_000)
164
+ : await run([action, container], 30_000);
165
+ send(200, { ok: true, action, container, output });
166
+ }
167
+ catch (e) {
168
+ send(500, { ok: false, error: String(e.message ?? e) });
169
+ }
170
+ }
123
171
  /** Push a frame to every connected stream subscriber. */
124
172
  broadcast(frame) {
125
173
  if (this.sse.size === 0)
@@ -158,6 +206,10 @@ export class MeshServer {
158
206
  handle(req, res) {
159
207
  const url = req.url ?? '/';
160
208
  const path = url.split('?', 1)[0];
209
+ if (req.method === 'GET' && path === '/favicon.ico') {
210
+ res.writeHead(204).end();
211
+ return;
212
+ }
161
213
  if (!this.authOk(req)) {
162
214
  res.writeHead(401).end('unauthorized');
163
215
  return;
@@ -220,6 +272,10 @@ export class MeshServer {
220
272
  res.end(JSON.stringify({ ok: false, readonly: true, error: 'this node is network-exposed without a token — control actions are disabled. Restart with --token <secret> to enable them.' }));
221
273
  return;
222
274
  }
275
+ if (path.startsWith('/robopark/runtime/')) {
276
+ void this.runtimeDocker(req, res, path);
277
+ return;
278
+ }
223
279
  this.proxyToScheduler(req, res, path);
224
280
  return;
225
281
  }
package/package.json CHANGED
@@ -1,105 +1,105 @@
1
- {
2
- "name": "infinicode",
3
- "version": "2.8.36",
4
- "description": "OpenKernel — provider-agnostic AI execution kernel. Native coding agent + mission-driven execution runtime.",
5
- "type": "module",
6
- "main": "./dist/kernel/index.js",
7
- "types": "./dist/kernel/index.d.ts",
8
- "bin": {
9
- "infinicode": "./bin/infinicode.js",
10
- "ic": "./bin/infinicode.js",
11
- "robopark": "./bin/robopark.js"
12
- },
13
- "exports": {
14
- ".": {
15
- "types": "./dist/kernel/index.d.ts",
16
- "import": "./dist/kernel/index.js"
17
- },
18
- "./kernel": {
19
- "types": "./dist/kernel/index.d.ts",
20
- "import": "./dist/kernel/index.js"
21
- },
22
- "./robopark": "./dist/robopark-cli.js",
23
- "./package.json": "./package.json"
24
- },
25
- "files": [
26
- "bin/infinicode.js",
27
- "bin/robopark.js",
28
- "dist",
29
- "packages/robopark/scheduler",
30
- "packages/robopark/pi-client",
31
- "packages/robopark/vision",
32
- ".opencode/plugins",
33
- ".opencode/themes",
34
- ".opencode/tui.json",
35
- "README.md"
36
- ],
37
- "scripts": {
38
- "build": "tsc",
39
- "dev": "tsc --watch",
40
- "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
41
- "test": "npm run build && node --test \"test/**/*.test.mjs\"",
42
- "prepublishOnly": "npm run build",
43
- "kernel": "node bin/infinicode.js mission",
44
- "typecheck": "tsc --noEmit"
45
- },
46
- "keywords": [
47
- "ai",
48
- "kernel",
49
- "execution",
50
- "runtime",
51
- "mission",
52
- "orchestrator",
53
- "agent",
54
- "ollama",
55
- "llm",
56
- "cli",
57
- "tui",
58
- "coding-agent",
59
- "local",
60
- "self-hosted",
61
- "provider-agnostic",
62
- "openrouter",
63
- "groq",
64
- "gemini"
65
- ],
66
- "author": "Ra Kai'Un",
67
- "license": "MIT",
68
- "repository": {
69
- "type": "git",
70
- "url": "https://github.com/MrYungCEO/infinicode"
71
- },
72
- "engines": {
73
- "node": ">=20"
74
- },
75
- "dependencies": {
76
- "@anthropic-ai/claude-code": "^2.1.207",
77
- "@modelcontextprotocol/sdk": "^1.29.0",
78
- "chalk": "^5.3.0",
79
- "commander": "^12.1.0",
80
- "conf": "^12.0.0",
81
- "execa": "^9.3.0",
82
- "inquirer": "^9.2.23",
83
- "livekit-client": "^2.20.1",
84
- "mitt": "^3.0.1",
85
- "nanoid": "^5.0.7",
86
- "node-fetch": "^3.3.2",
87
- "ora": "^8.0.1",
88
- "yaml": "^2.5.0",
89
- "zod": "^3.23.8"
90
- },
91
- "devDependencies": {
92
- "@types/inquirer": "^9.0.9",
93
- "@types/node": "^20.14.0",
94
- "typescript": "^5.4.5"
95
- },
96
- "optionalDependencies": {
97
- "infinicode-tui-darwin-arm64": "^2.3.0",
98
- "infinicode-tui-darwin-x64": "^2.3.0",
99
- "infinicode-tui-linux-arm64": "^2.3.0",
100
- "infinicode-tui-linux-x64": "^2.3.0",
101
- "infinicode-tui-win32-arm64": "^2.3.0",
102
- "infinicode-tui-win32-x64": "^2.3.0",
103
- "playwright": "^1.47.0"
104
- }
105
- }
1
+ {
2
+ "name": "infinicode",
3
+ "version": "2.8.37",
4
+ "description": "OpenKernel — provider-agnostic AI execution kernel. Native coding agent + mission-driven execution runtime.",
5
+ "type": "module",
6
+ "main": "./dist/kernel/index.js",
7
+ "types": "./dist/kernel/index.d.ts",
8
+ "bin": {
9
+ "infinicode": "./bin/infinicode.js",
10
+ "ic": "./bin/infinicode.js",
11
+ "robopark": "./bin/robopark.js"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/kernel/index.d.ts",
16
+ "import": "./dist/kernel/index.js"
17
+ },
18
+ "./kernel": {
19
+ "types": "./dist/kernel/index.d.ts",
20
+ "import": "./dist/kernel/index.js"
21
+ },
22
+ "./robopark": "./dist/robopark-cli.js",
23
+ "./package.json": "./package.json"
24
+ },
25
+ "files": [
26
+ "bin/infinicode.js",
27
+ "bin/robopark.js",
28
+ "dist",
29
+ "packages/robopark/scheduler",
30
+ "packages/robopark/pi-client",
31
+ "packages/robopark/vision",
32
+ ".opencode/plugins",
33
+ ".opencode/themes",
34
+ ".opencode/tui.json",
35
+ "README.md"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "dev": "tsc --watch",
40
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
41
+ "test": "npm run build && node --test \"test/**/*.test.mjs\"",
42
+ "prepublishOnly": "npm run build",
43
+ "kernel": "node bin/infinicode.js mission",
44
+ "typecheck": "tsc --noEmit"
45
+ },
46
+ "keywords": [
47
+ "ai",
48
+ "kernel",
49
+ "execution",
50
+ "runtime",
51
+ "mission",
52
+ "orchestrator",
53
+ "agent",
54
+ "ollama",
55
+ "llm",
56
+ "cli",
57
+ "tui",
58
+ "coding-agent",
59
+ "local",
60
+ "self-hosted",
61
+ "provider-agnostic",
62
+ "openrouter",
63
+ "groq",
64
+ "gemini"
65
+ ],
66
+ "author": "Ra Kai'Un",
67
+ "license": "MIT",
68
+ "repository": {
69
+ "type": "git",
70
+ "url": "https://github.com/MrYungCEO/infinicode"
71
+ },
72
+ "engines": {
73
+ "node": ">=20"
74
+ },
75
+ "dependencies": {
76
+ "@anthropic-ai/claude-code": "^2.1.207",
77
+ "@modelcontextprotocol/sdk": "^1.29.0",
78
+ "chalk": "^5.3.0",
79
+ "commander": "^12.1.0",
80
+ "conf": "^12.0.0",
81
+ "execa": "^9.3.0",
82
+ "inquirer": "^9.2.23",
83
+ "livekit-client": "^2.20.1",
84
+ "mitt": "^3.0.1",
85
+ "nanoid": "^5.0.7",
86
+ "node-fetch": "^3.3.2",
87
+ "ora": "^8.0.1",
88
+ "yaml": "^2.5.0",
89
+ "zod": "^3.23.8"
90
+ },
91
+ "devDependencies": {
92
+ "@types/inquirer": "^9.0.9",
93
+ "@types/node": "^20.14.0",
94
+ "typescript": "^5.4.5"
95
+ },
96
+ "optionalDependencies": {
97
+ "infinicode-tui-darwin-arm64": "^2.3.0",
98
+ "infinicode-tui-darwin-x64": "^2.3.0",
99
+ "infinicode-tui-linux-arm64": "^2.3.0",
100
+ "infinicode-tui-linux-x64": "^2.3.0",
101
+ "infinicode-tui-win32-arm64": "^2.3.0",
102
+ "infinicode-tui-win32-x64": "^2.3.0",
103
+ "playwright": "^1.47.0"
104
+ }
105
+ }