infinicode 2.8.36 → 2.8.38
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 +4586 -364
- package/dist/kernel/federation/transport-http.d.ts +2 -0
- package/dist/kernel/federation/transport-http.js +56 -0
- package/dist/robopark/add-robot.d.ts +2 -0
- package/dist/robopark/add-robot.js +9 -0
- package/dist/robopark/secrets.d.ts +8 -0
- package/dist/robopark/secrets.js +41 -0
- package/dist/robopark/setup.d.ts +3 -0
- package/dist/robopark/setup.js +9 -2
- package/dist/robopark-cli.js +22 -0
- package/package.json +105 -105
- package/packages/robopark/scheduler/main.py +1573 -108
- package/packages/robopark/scheduler/preview_agent.py +620 -57
- package/packages/robopark/scheduler/robot_supervisor.py +729 -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
|
}
|
|
@@ -7,5 +7,7 @@ export interface AddRobotOptions extends ExplicitContextOpts {
|
|
|
7
7
|
/** Force a specific park-map pad/character preset id instead of the
|
|
8
8
|
* fuzzy name-based match below — e.g. `--character jaguar`. */
|
|
9
9
|
character?: string;
|
|
10
|
+
lan?: boolean;
|
|
11
|
+
tailscale?: boolean;
|
|
10
12
|
}
|
|
11
13
|
export declare function roboparkAddRobot(config: Conf<InfinicodeConfig>, opts: AddRobotOptions): Promise<void>;
|
|
@@ -73,6 +73,11 @@ export async function roboparkAddRobot(config, opts) {
|
|
|
73
73
|
console.log(chalk.red(' ✗ --name is required, e.g. --name robobmw'));
|
|
74
74
|
process.exit(1);
|
|
75
75
|
}
|
|
76
|
+
if (opts.lan && opts.tailscale) {
|
|
77
|
+
console.log(chalk.red(' ✗ choose exactly one network mode: --lan or --tailscale'));
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
const network = opts.tailscale ? 'tailscale' : 'lan';
|
|
76
81
|
const ctx = await resolveContext(opts);
|
|
77
82
|
if (!ctx.schedulerUrl) {
|
|
78
83
|
console.log(chalk.red(' ✗ no scheduler URL resolved. Pass --scheduler-url/--hub-url, run `robopark hub-use` first, or run this on/near the hub.'));
|
|
@@ -80,6 +85,7 @@ export async function roboparkAddRobot(config, opts) {
|
|
|
80
85
|
}
|
|
81
86
|
console.log(` scheduler: ${chalk.cyan(ctx.schedulerUrl)}`);
|
|
82
87
|
console.log(` name: ${chalk.cyan(opts.name)}${ctx.site ? chalk.dim(' @ ' + ctx.site) : ''}`);
|
|
88
|
+
console.log(` network: ${chalk.cyan(network)}`);
|
|
83
89
|
console.log();
|
|
84
90
|
const characterId = opts.character?.trim() || await pickCharacterPreset(ctx.schedulerUrl, opts.name);
|
|
85
91
|
if (characterId) {
|
|
@@ -114,6 +120,8 @@ export async function roboparkAddRobot(config, opts) {
|
|
|
114
120
|
schedulerPort: ctx.schedulerUrl ? String(new URL(ctx.schedulerUrl).port || '8080') : undefined,
|
|
115
121
|
enrollmentToken: minted.enrollment_token,
|
|
116
122
|
start: true,
|
|
123
|
+
lan: opts.lan,
|
|
124
|
+
tailscale: opts.tailscale,
|
|
117
125
|
});
|
|
118
126
|
return;
|
|
119
127
|
}
|
|
@@ -131,6 +139,7 @@ export async function roboparkAddRobot(config, opts) {
|
|
|
131
139
|
const schedulerPort = new URL(ctx.schedulerUrl).port || '8080';
|
|
132
140
|
argv.push('--scheduler-port', schedulerPort);
|
|
133
141
|
}
|
|
142
|
+
argv.push(network === 'tailscale' ? '--tailscale' : '--lan');
|
|
134
143
|
argv.push('--enrollment-token', minted.enrollment_token, '--start', '--auto-start');
|
|
135
144
|
console.log(chalk.dim(` run this ON THE ROBOT${characterId ? ` (binds to pad: ${characterId})` : ''}:`));
|
|
136
145
|
console.log(' ' + chalk.cyan(commandString(argv)));
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
function updateEnv(contents, token) {
|
|
5
|
+
const line = `ROBOPARK_AGENT_TOKEN=${token}`;
|
|
6
|
+
const re = /^ROBOPARK_AGENT_TOKEN=.*$/m;
|
|
7
|
+
return re.test(contents)
|
|
8
|
+
? contents.replace(re, line)
|
|
9
|
+
: `${contents.trimEnd()}\n${line}\n`;
|
|
10
|
+
}
|
|
11
|
+
/** Provision the scheduler's shared worker secret into a ROBOVOICE .env file. */
|
|
12
|
+
export async function roboparkSecrets(opts) {
|
|
13
|
+
const base = opts.schedulerUrl.replace(/\/$/, '');
|
|
14
|
+
const response = await fetch(`${base}/api/settings/agent-token/provision`, {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
headers: { 'content-type': 'application/json' },
|
|
17
|
+
body: JSON.stringify({ rotate: Boolean(opts.rotate) }),
|
|
18
|
+
});
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
throw new Error(`scheduler rejected secret provisioning (${response.status})`);
|
|
21
|
+
}
|
|
22
|
+
const body = await response.json();
|
|
23
|
+
if (!body.agent_token)
|
|
24
|
+
throw new Error('scheduler returned no agent token');
|
|
25
|
+
let current = '';
|
|
26
|
+
try {
|
|
27
|
+
current = await readFile(opts.workerEnv, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err?.code !== 'ENOENT')
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
const next = updateEnv(current, body.agent_token);
|
|
34
|
+
await mkdir(dirname(opts.workerEnv), { recursive: true });
|
|
35
|
+
const temp = `${opts.workerEnv}.tmp-${process.pid}`;
|
|
36
|
+
await writeFile(temp, next, { encoding: 'utf8', mode: 0o600 });
|
|
37
|
+
await rename(temp, opts.workerEnv);
|
|
38
|
+
console.log(chalk.green(` ✓ ROBOVOICE secret synchronized to ${opts.workerEnv}`));
|
|
39
|
+
if (opts.rotate)
|
|
40
|
+
console.log(chalk.yellow(' Restart the ROBOVOICE worker to use the rotated secret.'));
|
|
41
|
+
}
|
package/dist/robopark/setup.d.ts
CHANGED
|
@@ -21,5 +21,8 @@ export interface SetupOptions {
|
|
|
21
21
|
autoStart?: boolean;
|
|
22
22
|
yes?: boolean;
|
|
23
23
|
foreground?: boolean;
|
|
24
|
+
/** Robot transport. Defaults to LAN for backwards compatibility. */
|
|
25
|
+
lan?: boolean;
|
|
26
|
+
tailscale?: boolean;
|
|
24
27
|
}
|
|
25
28
|
export declare function roboparkSetup(config: Conf<InfinicodeConfig>, opts: SetupOptions): Promise<void>;
|
package/dist/robopark/setup.js
CHANGED
|
@@ -171,6 +171,12 @@ async function setupHub(config, opts, internal) {
|
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
async function setupRobot(config, opts, ctx, internal) {
|
|
174
|
+
if (opts.lan && opts.tailscale) {
|
|
175
|
+
console.log(chalk.red(' ✗ choose exactly one robot network: --lan or --tailscale'));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const network = opts.tailscale ? 'tailscale' : 'lan';
|
|
179
|
+
const networkFlag = network === 'tailscale' ? '--tailscale' : '--lan';
|
|
174
180
|
const hubUrl = opts.hub ?? (ctx.hub ? `http://${ctx.hub.ip}:${internal.port}` : undefined);
|
|
175
181
|
if (!hubUrl) {
|
|
176
182
|
console.log(chalk.red(' ✗ no hub discovered. Pass --hub http://HUB_IP:47913'));
|
|
@@ -184,7 +190,7 @@ async function setupRobot(config, opts, ctx, internal) {
|
|
|
184
190
|
displayName: internal.name,
|
|
185
191
|
token: internal.token,
|
|
186
192
|
seeds: [hubUrl],
|
|
187
|
-
lan:
|
|
193
|
+
lan: network === 'lan',
|
|
188
194
|
};
|
|
189
195
|
config.set('federation', fed);
|
|
190
196
|
const args = [
|
|
@@ -193,7 +199,7 @@ async function setupRobot(config, opts, ctx, internal) {
|
|
|
193
199
|
'--port', String(internal.port),
|
|
194
200
|
'--token', internal.token,
|
|
195
201
|
'--seed', hubUrl,
|
|
196
|
-
|
|
202
|
+
networkFlag,
|
|
197
203
|
'--auto-update',
|
|
198
204
|
'--supervised',
|
|
199
205
|
];
|
|
@@ -225,6 +231,7 @@ async function setupRobot(config, opts, ctx, internal) {
|
|
|
225
231
|
console.log(' ' + chalk.cyan(`robopark ${previewAgentArgs.join(' ')}`));
|
|
226
232
|
if (visionEnabled)
|
|
227
233
|
console.log(' ' + chalk.cyan(`robopark ${visionAgentArgs.join(' ')}`));
|
|
234
|
+
console.log(chalk.dim(` network: ${network} (scheduler: ${schedulerUrl})`));
|
|
228
235
|
console.log();
|
|
229
236
|
if (opts.start) {
|
|
230
237
|
const robotArgv = await infinicodeArgv(args);
|
package/dist/robopark-cli.js
CHANGED
|
@@ -20,6 +20,7 @@ import { roboparkDoctor } from './robopark/doctor.js';
|
|
|
20
20
|
import { roboparkAddRobot } from './robopark/add-robot.js';
|
|
21
21
|
import { saveHubProfile, clearHubProfile } from './robopark/profile.js';
|
|
22
22
|
import { roboparkAgentUp, roboparkAgentDown, roboparkAgentLogs } from './robopark/agent-ctl.js';
|
|
23
|
+
import { roboparkSecrets } from './robopark/secrets.js';
|
|
23
24
|
// Read the real version from package.json so `--version` never drifts from
|
|
24
25
|
// what is actually installed (this was a hardcoded constant that went stale
|
|
25
26
|
// across several releases — see the identical fix + comment in cli.ts).
|
|
@@ -97,6 +98,21 @@ program
|
|
|
97
98
|
.action(async (opts) => {
|
|
98
99
|
await roboparkServe(opts);
|
|
99
100
|
});
|
|
101
|
+
program
|
|
102
|
+
.command('secrets')
|
|
103
|
+
.description('Provision the scheduler-managed ROBOVOICE authentication secret')
|
|
104
|
+
.option('--scheduler-url <url>', 'scheduler base URL', 'http://localhost:8080')
|
|
105
|
+
.option('--worker-env <path>', 'ROBOVOICE worker .env file', '.env')
|
|
106
|
+
.option('--rotate', 'rotate the shared secret before synchronizing it')
|
|
107
|
+
.action(async (opts) => {
|
|
108
|
+
try {
|
|
109
|
+
await roboparkSecrets(opts);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
console.error(chalk.red(` ✗ secret provisioning failed: ${err?.message ?? err}`));
|
|
113
|
+
process.exitCode = 1;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
100
116
|
program
|
|
101
117
|
.command('enroll')
|
|
102
118
|
.description('Enroll this robot/satellite with the RoboPark scheduler')
|
|
@@ -227,6 +243,8 @@ program
|
|
|
227
243
|
.option('--token <token>', 'shared mesh token (defaults to saved hub profile / auto-discovery)')
|
|
228
244
|
.option('--scheduler-url <url>', 'scheduler base URL (defaults to saved hub profile / auto-discovery)')
|
|
229
245
|
.option('--character <id>', 'force a specific park-map pad/character preset id (default: fuzzy-matched from the robot name)')
|
|
246
|
+
.option('--lan', 'generate a robot command for the same local network (default)')
|
|
247
|
+
.option('--tailscale', 'generate a robot command for a Tailscale-reachable hub')
|
|
230
248
|
.option('--start', 'start the robot node on this machine now, instead of printing the one-liner')
|
|
231
249
|
.action(async (name, opts) => {
|
|
232
250
|
await roboparkAddRobot(config, { name, ...opts });
|
|
@@ -272,6 +290,8 @@ program
|
|
|
272
290
|
.option('--tailscale-auth <token>', 'Tailscale auth key for the hub')
|
|
273
291
|
.option('--tag <tag>', 'Tailscale tag filter')
|
|
274
292
|
.option('--enrollment-token <token>', 'one-time scheduler enrollment token for robots')
|
|
293
|
+
.option('--lan', 'use LAN discovery and LAN hub/scheduler addresses (default for robots)')
|
|
294
|
+
.option('--tailscale', 'use Tailscale discovery and Tailscale hub/scheduler addresses')
|
|
275
295
|
.option('--video-device <dev>', 'default camera for robot preview agent', 'auto')
|
|
276
296
|
.option('--audio-device <dev>', 'default microphone for robot preview agent', 'default')
|
|
277
297
|
.option('--no-vision', 'do not start the vision (camera/motion trigger) agent for a robot — armed by default')
|
|
@@ -303,6 +323,8 @@ program
|
|
|
303
323
|
start: opts.start,
|
|
304
324
|
autoStart: opts.autoStart,
|
|
305
325
|
yes: opts.yes,
|
|
326
|
+
lan: opts.lan,
|
|
327
|
+
tailscale: opts.tailscale,
|
|
306
328
|
});
|
|
307
329
|
});
|
|
308
330
|
// Keep legacy fleet/run/apply/dashboard commands available while migrating.
|
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.38",
|
|
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
|
+
}
|