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.
- package/dist/kernel/federation/dashboard-html.d.ts +1 -1
- package/dist/kernel/federation/dashboard-html.js +3440 -231
- package/dist/kernel/federation/transport-http.d.ts +2 -0
- package/dist/kernel/federation/transport-http.js +56 -0
- package/package.json +105 -105
- package/packages/robopark/scheduler/main.py +838 -29
- package/packages/robopark/scheduler/preview_agent.py +620 -57
- package/packages/robopark/scheduler/robot_supervisor.py +320 -0
- package/packages/robopark/scheduler/scripts/install-robot-supervisor-linux.sh +33 -0
- package/packages/robopark/scheduler/scripts/install-robot-supervisor-windows.ps1 +49 -0
- package/packages/robopark/scheduler/scripts/robopark-supervisor.service +20 -0
- package/packages/robopark/scheduler/scripts/start-scheduler-local.ps1 +50 -0
- package/packages/robopark/scheduler/supervisor.example.json +26 -0
- package/packages/robopark/scheduler/vision_motion_trigger.py +101 -0
|
@@ -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.
|
|
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
|
+
}
|