@kybernesis/create 0.16.0 → 0.17.0
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/README.md +1 -1
- package/dist/agent-limits.js +4 -1
- package/dist/doctor.js +2 -2
- package/dist/eval-cli.d.ts +2 -0
- package/dist/eval-cli.js +55 -0
- package/dist/removed-default-tools.d.ts +12 -0
- package/dist/removed-default-tools.js +49 -0
- package/dist/templates.js +47 -43
- package/dist/upgrade.js +10 -3
- package/dist/util.d.ts +1 -1
- package/dist/util.js +1 -1
- package/package.json +4 -3
- package/skills/fde-engagement/references/playbook.md +13 -4
package/README.md
CHANGED
|
@@ -97,7 +97,7 @@ Before an eve version change, upgrade reads `.eve/.workflow-data/runs`, prints
|
|
|
97
97
|
sessions when available, and requires explicit confirmation. Noninteractive
|
|
98
98
|
runs fail closed unless `--yes` (or `-y`) is supplied. The warning is still printed with
|
|
99
99
|
`--yes` and is not bypassed by `--skip-eval`. Existing direct `eve eval` scripts
|
|
100
|
-
are migrated to `kyb-eval
|
|
100
|
+
are migrated to `kyb-eval` (shipped as a binary of this package from 0.17); custom scripts are left untouched with a manual fix.
|
|
101
101
|
The wrapper counts corruption diagnostics beside the eval result and turns a
|
|
102
102
|
nominally green eve exit into a failure when condemned durable state was seen.
|
|
103
103
|
It also identifies failures from `judge.autoevals.*` assertions as judge
|
package/dist/agent-limits.js
CHANGED
|
@@ -10,7 +10,10 @@ export const CERTIFIED_INHERITED_MAX_INPUT_TOKENS_PER_SESSION = 40_000_000;
|
|
|
10
10
|
export function parseEveInfoInspection(output, readText = (path) => readFileSync(path, "utf8")) {
|
|
11
11
|
let info;
|
|
12
12
|
try {
|
|
13
|
-
|
|
13
|
+
// eve ≥0.62 prints its terminal header ("☰eve v0.68.0 …") ahead of the
|
|
14
|
+
// JSON even with --json, so parse from the first object literal.
|
|
15
|
+
const start = output.indexOf("{");
|
|
16
|
+
info = JSON.parse(start > 0 ? output.slice(start) : output);
|
|
14
17
|
}
|
|
15
18
|
catch (error) {
|
|
16
19
|
return unresolved(`eve info --json was not valid JSON: ${error.message}`);
|
package/dist/doctor.js
CHANGED
|
@@ -313,7 +313,7 @@ export async function doctor() {
|
|
|
313
313
|
const vercelConn = join(cwd, "agent/connections/vercel.ts");
|
|
314
314
|
const selfHostedAgent = Boolean(deps["@kybernesis/exe"]) ||
|
|
315
315
|
(existsSync(join(cwd, "agent/subagents/builder/sandbox/sandbox.ts")) &&
|
|
316
|
-
readFileSync(join(cwd, "agent/subagents/builder/sandbox/sandbox.ts"), "utf8")
|
|
316
|
+
/docker\(|DockerSandbox/.test(readFileSync(join(cwd, "agent/subagents/builder/sandbox/sandbox.ts"), "utf8")));
|
|
317
317
|
if (selfHostedAgent && !existsSync(vercelConn)) {
|
|
318
318
|
add("pass", "no Vercel MCP connection (self-hosted)", "public deploys need the CLIENT's own Vercel token — Vercel Connect does not work off-Vercel");
|
|
319
319
|
}
|
|
@@ -399,7 +399,7 @@ export async function doctor() {
|
|
|
399
399
|
// deployment. None of them are theoretical.
|
|
400
400
|
const selfHosted = Boolean(deps["@kybernesis/exe"]) ||
|
|
401
401
|
existsSync(join(cwd, "agent/sandbox/sandbox.ts")) &&
|
|
402
|
-
readFileSync(join(cwd, "agent/sandbox/sandbox.ts"), "utf8")
|
|
402
|
+
/docker\(|DockerSandbox/.test(readFileSync(join(cwd, "agent/sandbox/sandbox.ts"), "utf8"));
|
|
403
403
|
const templateInspection = await inspectDockerTemplatesViaExe(cwd);
|
|
404
404
|
for (const check of templateInspection ? dockerTemplateDoctorChecks(templateInspection) : []) {
|
|
405
405
|
add(check.verdict, check.label, check.detail);
|
package/dist/eval-cli.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `kyb-eval`: `eve eval` with the two checks eve's own exit code does not make.
|
|
4
|
+
*
|
|
5
|
+
* `kyb upgrade` migrates every agent's `scripts.eval` to this command and runs
|
|
6
|
+
* it as the deploy gate, and the README has described it since 0.14 — but no
|
|
7
|
+
* binary ever shipped, so a migrated agent's `npm run eval` failed with
|
|
8
|
+
* "command not found" and the gate reported red for the wrong reason.
|
|
9
|
+
*
|
|
10
|
+
* What it adds on top of `eve eval <args>`:
|
|
11
|
+
* - a nominally green run that logged condemned durable state
|
|
12
|
+
* (`CORRUPTED_EVENT_LOG`, `REPLAY_DIVERGENCE`) exits 1 — those runs are
|
|
13
|
+
* terminal and a suite that passed beside them proves less than it says;
|
|
14
|
+
* - a run whose failures are all judge errors (evaluation model unreachable,
|
|
15
|
+
* HTTP failures from the judge provider) says so, rather than reading as the
|
|
16
|
+
* agent under test failing.
|
|
17
|
+
*/
|
|
18
|
+
import { spawn } from "node:child_process";
|
|
19
|
+
const CONDEMNED = /CORRUPTED_EVENT_LOG|REPLAY_DIVERGENCE/;
|
|
20
|
+
const JUDGE_FAILURE = /judge[^\n]*(unreachable|ECONNREFUSED|fetch failed|HTTP \d{3}|Unauthenticated|no credentials|not valid)/i;
|
|
21
|
+
function main() {
|
|
22
|
+
const args = process.argv.slice(2);
|
|
23
|
+
const child = spawn("npx", ["eve", "eval", ...args], { stdio: ["inherit", "pipe", "pipe"], env: process.env });
|
|
24
|
+
let condemned = 0;
|
|
25
|
+
let judgeFailures = 0;
|
|
26
|
+
const scan = (chunk, out) => {
|
|
27
|
+
const text = chunk.toString();
|
|
28
|
+
out.write(text);
|
|
29
|
+
for (const line of text.split("\n")) {
|
|
30
|
+
if (CONDEMNED.test(line))
|
|
31
|
+
condemned += 1;
|
|
32
|
+
if (JUDGE_FAILURE.test(line))
|
|
33
|
+
judgeFailures += 1;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
child.stdout.on("data", (chunk) => scan(chunk, process.stdout));
|
|
37
|
+
child.stderr.on("data", (chunk) => scan(chunk, process.stderr));
|
|
38
|
+
child.on("error", (error) => {
|
|
39
|
+
console.error(`kyb-eval: could not start eve eval: ${error.message}`);
|
|
40
|
+
process.exit(2);
|
|
41
|
+
});
|
|
42
|
+
child.on("close", (code) => {
|
|
43
|
+
if (condemned > 0) {
|
|
44
|
+
console.error(`\nkyb-eval: ${condemned} condemned durable-state diagnostic(s) seen (CORRUPTED_EVENT_LOG / REPLAY_DIVERGENCE). ` +
|
|
45
|
+
"Those conversations are terminal; treating this run as red.");
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
if (code !== 0 && judgeFailures > 0) {
|
|
49
|
+
console.error(`\nkyb-eval: ${judgeFailures} judge failure(s) seen — the evaluation model was unreachable or refused, ` +
|
|
50
|
+
"which is a judge-reachability problem, not evidence that the agent under test failed. Fix the judge, then rerun.");
|
|
51
|
+
}
|
|
52
|
+
process.exit(code ?? 1);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
main();
|
|
@@ -27,3 +27,15 @@ export interface RemovedDefaultToolsRepair {
|
|
|
27
27
|
optedIn: string[];
|
|
28
28
|
}
|
|
29
29
|
export declare function repairRemovedDefaultTools(cwd: string): RemovedDefaultToolsRepair;
|
|
30
|
+
/**
|
|
31
|
+
* eve 0.65 took `ask_question` out of the default tool set and made it an
|
|
32
|
+
* opt-in workflow tool (`eve add tool/ask_question`). An agent certified on an
|
|
33
|
+
* earlier line had it everywhere, and the notify hooks, the Buzz approval
|
|
34
|
+
* bridge and the Studio question cards all key on that tool name — so every
|
|
35
|
+
* scope that could ask keeps the tool, and a stale `disableTool()` file (a
|
|
36
|
+
* build error from 0.65) is removed.
|
|
37
|
+
*/
|
|
38
|
+
export declare const OPT_IN_TOOLS_SINCE: {
|
|
39
|
+
readonly ask_question: "0.65.0";
|
|
40
|
+
};
|
|
41
|
+
export declare function repairOptInTools(cwd: string, eveVersion: string): RemovedDefaultToolsRepair;
|
|
@@ -84,3 +84,52 @@ export function repairRemovedDefaultTools(cwd) {
|
|
|
84
84
|
}
|
|
85
85
|
return { removed, optedIn };
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* eve 0.65 took `ask_question` out of the default tool set and made it an
|
|
89
|
+
* opt-in workflow tool (`eve add tool/ask_question`). An agent certified on an
|
|
90
|
+
* earlier line had it everywhere, and the notify hooks, the Buzz approval
|
|
91
|
+
* bridge and the Studio question cards all key on that tool name — so every
|
|
92
|
+
* scope that could ask keeps the tool, and a stale `disableTool()` file (a
|
|
93
|
+
* build error from 0.65) is removed.
|
|
94
|
+
*/
|
|
95
|
+
export const OPT_IN_TOOLS_SINCE = { ask_question: "0.65.0" };
|
|
96
|
+
function askQuestionSource() {
|
|
97
|
+
return [
|
|
98
|
+
"// eve 0.65 made ask_question an opt-in tool. This agent asked people questions",
|
|
99
|
+
"// on the certified earlier line, so it keeps the tool (kyb upgrade wrote this).",
|
|
100
|
+
'import { askQuestion } from "eve/tools/ask_question";',
|
|
101
|
+
"",
|
|
102
|
+
"export default askQuestion();",
|
|
103
|
+
"",
|
|
104
|
+
].join("\n");
|
|
105
|
+
}
|
|
106
|
+
export function repairOptInTools(cwd, eveVersion) {
|
|
107
|
+
const removed = [];
|
|
108
|
+
const optedIn = [];
|
|
109
|
+
if (versionAtLeast(eveVersion, OPT_IN_TOOLS_SINCE.ask_question)) {
|
|
110
|
+
for (const scope of agentScopes(cwd)) {
|
|
111
|
+
const tools = join(scope, "tools");
|
|
112
|
+
const file = join(tools, "ask_question.ts");
|
|
113
|
+
if (existsSync(file)) {
|
|
114
|
+
if (isDisableToolFile(file)) {
|
|
115
|
+
unlinkSync(file);
|
|
116
|
+
removed.push(relative(cwd, file));
|
|
117
|
+
}
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
mkdirSync(tools, { recursive: true });
|
|
121
|
+
writeFileSync(file, askQuestionSource());
|
|
122
|
+
optedIn.push(relative(cwd, file));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { removed, optedIn };
|
|
126
|
+
}
|
|
127
|
+
function versionAtLeast(version, floor) {
|
|
128
|
+
const parse = (v) => v.replace(/^[^\d]*/, "").split("-")[0].split(".").map((n) => Number(n) || 0);
|
|
129
|
+
const a = parse(version), b = parse(floor);
|
|
130
|
+
for (let i = 0; i < 3; i++) {
|
|
131
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0))
|
|
132
|
+
return (a[i] ?? 0) > (b[i] ?? 0);
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
package/dist/templates.js
CHANGED
|
@@ -456,28 +456,26 @@ export function hostSteps(host, name, model) {
|
|
|
456
456
|
function workshopSandbox(host) {
|
|
457
457
|
if (host === "exe") {
|
|
458
458
|
return `import { defineSandbox } from "eve/sandbox";
|
|
459
|
-
import {
|
|
459
|
+
import { DockerSandbox } from "eve/sandbox/docker";
|
|
460
460
|
|
|
461
461
|
/**
|
|
462
462
|
* The engineer workshop, self-hosted: pnpm + Playwright + Chromium baked into
|
|
463
|
-
* the
|
|
463
|
+
* the ENVIRONMENT (prepared once at build, inherited by every session) so warm
|
|
464
|
+
* sessions run render→screenshot→vision in seconds.
|
|
464
465
|
*
|
|
465
|
-
* Docker rather than
|
|
466
|
-
* not exist off-Vercel.
|
|
466
|
+
* Docker rather than Vercel Sandbox: the hosted provider needs Vercel OIDC,
|
|
467
|
+
* which does not exist off-Vercel.
|
|
467
468
|
*
|
|
468
469
|
* HOST PREREQUISITE: some images ship Docker disabled (exe.dev's exeuntu runs
|
|
469
470
|
* \`systemctl disable docker.service\`). Run \`sudo systemctl enable --now docker\`
|
|
470
471
|
* or every build fails with SandboxTemplateNotProvisionedError.
|
|
471
472
|
*
|
|
472
473
|
* NOTE: Docker sessions do not enforce a domain allowlist the way the hosted
|
|
473
|
-
*
|
|
474
|
+
* provider does. Egress control is the HOST's responsibility here — a deliberate
|
|
474
475
|
* difference from the Vercel deployment, not an oversight.
|
|
475
476
|
*/
|
|
476
|
-
export
|
|
477
|
-
|
|
478
|
-
revalidationKey: () => "kybernesis-workshop-v5-docker",
|
|
479
|
-
async bootstrap({ use }) {
|
|
480
|
-
const sandbox = await use();
|
|
477
|
+
export const environment = DockerSandbox.environment({
|
|
478
|
+
prepare: async (sandbox) => {
|
|
481
479
|
// Base image is Debian-family; refresh indexes before installing browser deps.
|
|
482
480
|
await sandbox.run({ command: "apt-get update" });
|
|
483
481
|
await sandbox.run({ command: "npm install -g pnpm" });
|
|
@@ -492,28 +490,49 @@ export default defineSandbox({
|
|
|
492
490
|
});
|
|
493
491
|
},
|
|
494
492
|
});
|
|
493
|
+
|
|
494
|
+
export default defineSandbox(() => environment.open());
|
|
495
495
|
`;
|
|
496
496
|
}
|
|
497
497
|
return `import { defineSandbox } from "eve/sandbox";
|
|
498
|
-
import {
|
|
498
|
+
import { VercelSandbox } from "eve/sandbox/vercel";
|
|
499
499
|
|
|
500
500
|
/**
|
|
501
501
|
* The engineer workshop: a warm, safe cloud dev machine.
|
|
502
502
|
*
|
|
503
|
-
*
|
|
504
|
-
* Chromium.
|
|
505
|
-
* loudly and warm sessions run the full render→screenshot→
|
|
506
|
-
* seconds.
|
|
507
|
-
* dev (run \`vercel link\` + \`vercel env pull\` first), so evals
|
|
508
|
-
* exact production
|
|
503
|
+
* ENVIRONMENT preparation (once at build, inherited by every session): pnpm +
|
|
504
|
+
* Playwright + Chromium. Preparation runs at deploy time, so a broken recipe
|
|
505
|
+
* fails the build loudly and warm sessions run the full render→screenshot→
|
|
506
|
+
* vision loop in seconds. Provider PINNED to Vercel Sandbox — hosted sandboxes
|
|
507
|
+
* even from local dev (run \`vercel link\` + \`vercel env pull\` first), so evals
|
|
508
|
+
* exercise the exact production provider. No Docker anywhere.
|
|
509
509
|
*
|
|
510
510
|
* All sessions run under a domain ALLOWLIST: an agent that installs arbitrary
|
|
511
511
|
* npm packages must not have open egress. A blocked domain fails loudly;
|
|
512
512
|
* treat every addition as a security decision.
|
|
513
513
|
*/
|
|
514
|
-
export
|
|
515
|
-
|
|
516
|
-
|
|
514
|
+
export const environment = VercelSandbox.environment({
|
|
515
|
+
resources: { vcpus: 4 },
|
|
516
|
+
prepare: async (sandbox) => {
|
|
517
|
+
// The egress proxy carries HTTPS only; apt defaults to http:// mirrors, so
|
|
518
|
+
// every index fetch silently fails. Rewrite to https first.
|
|
519
|
+
await sandbox.run({
|
|
520
|
+
command:
|
|
521
|
+
"find /etc/apt -type f \\\\( -name '*.list' -o -name '*.sources' \\\\) -exec sed -i 's|http://|https://|g' {} + && apt-get update",
|
|
522
|
+
});
|
|
523
|
+
await sandbox.run({ command: "npm install -g pnpm" });
|
|
524
|
+
await sandbox.run({
|
|
525
|
+
command:
|
|
526
|
+
"mkdir -p /workspace/.shot && cd /workspace/.shot && echo '{\\"name\\":\\"kyb-shot\\",\\"private\\":true}' > package.json && npm install playwright",
|
|
527
|
+
});
|
|
528
|
+
await sandbox.run({
|
|
529
|
+
command: "cd /workspace/.shot && npx playwright install --with-deps chromium",
|
|
530
|
+
});
|
|
531
|
+
},
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
export default defineSandbox(() =>
|
|
535
|
+
environment.open({
|
|
517
536
|
networkPolicy: {
|
|
518
537
|
allow: [
|
|
519
538
|
"registry.npmjs.org",
|
|
@@ -541,25 +560,7 @@ export default defineSandbox({
|
|
|
541
560
|
],
|
|
542
561
|
},
|
|
543
562
|
}),
|
|
544
|
-
|
|
545
|
-
async bootstrap({ use }) {
|
|
546
|
-
const sandbox = await use();
|
|
547
|
-
// The egress proxy carries HTTPS only; apt defaults to http:// mirrors, so
|
|
548
|
-
// every index fetch silently fails. Rewrite to https first.
|
|
549
|
-
await sandbox.run({
|
|
550
|
-
command:
|
|
551
|
-
"find /etc/apt -type f \\\\( -name '*.list' -o -name '*.sources' \\\\) -exec sed -i 's|http://|https://|g' {} + && apt-get update",
|
|
552
|
-
});
|
|
553
|
-
await sandbox.run({ command: "npm install -g pnpm" });
|
|
554
|
-
await sandbox.run({
|
|
555
|
-
command:
|
|
556
|
-
"mkdir -p /workspace/.shot && cd /workspace/.shot && echo '{\\"name\\":\\"kyb-shot\\",\\"private\\":true}' > package.json && npm install playwright",
|
|
557
|
-
});
|
|
558
|
-
await sandbox.run({
|
|
559
|
-
command: "cd /workspace/.shot && npx playwright install --with-deps chromium",
|
|
560
|
-
});
|
|
561
|
-
},
|
|
562
|
-
});
|
|
563
|
+
);
|
|
563
564
|
`;
|
|
564
565
|
}
|
|
565
566
|
export function engineerPlan(host, model) {
|
|
@@ -671,7 +672,8 @@ export default defineEvalConfig({
|
|
|
671
672
|
// Verified against the exe integration rather than assumed: it validates model
|
|
672
673
|
// names and refuses one it does not carry, so a stale default here fails the
|
|
673
674
|
// whole suite at the judge rather than at anything the agent did.
|
|
674
|
-
|
|
675
|
+
// eve ≥0.62 grades with an EVALUATION model, not a language model instance.
|
|
676
|
+
judge: { model: exe.evaluationModel(process.env.EXE_JUDGE_MODEL ?? "claude-sonnet-5") },
|
|
675
677
|
// Real model and real memory on every turn: generous timeout, gentle concurrency.
|
|
676
678
|
timeoutMs: 300_000,
|
|
677
679
|
maxConcurrency: 1,
|
|
@@ -748,13 +750,15 @@ export { default } from "@kybernesis/notify/extension";
|
|
|
748
750
|
*/
|
|
749
751
|
export function reasoningSandboxLibTs() {
|
|
750
752
|
return `import { defineSandbox } from "eve/sandbox";
|
|
751
|
-
import {
|
|
753
|
+
import { JustBashSandbox } from "eve/sandbox/just-bash";
|
|
752
754
|
|
|
753
755
|
// The sandbox for a reasoning-only specialist: an instant virtual filesystem,
|
|
754
756
|
// no Docker container. See agent/subagents/<id>/sandbox.ts, which re-export
|
|
755
|
-
// this. Only subagents that do real build/git/network work keep a
|
|
757
|
+
// this. Only subagents that do real build/git/network work keep a Docker
|
|
756
758
|
// sandbox of their own.
|
|
757
|
-
export
|
|
759
|
+
export const environment = JustBashSandbox.environment();
|
|
760
|
+
|
|
761
|
+
export default defineSandbox(() => environment.open());
|
|
758
762
|
`;
|
|
759
763
|
}
|
|
760
764
|
/** What each reasoning-only subagent's `sandbox.ts` re-exports. */
|
package/dist/upgrade.js
CHANGED
|
@@ -10,7 +10,7 @@ import { dockerPruneCronArtifact } from "./docker-prune-cron.js";
|
|
|
10
10
|
import { newestOnLine } from "./on-line-version.js";
|
|
11
11
|
import { findMatchingAgentServiceUnit, repairManageRestart } from "./systemd.js";
|
|
12
12
|
import { repairTerminalSandboxCleanupHooks } from "./sandbox-cleanup.js";
|
|
13
|
-
import { repairRemovedDefaultTools as repairRemovedDefaultTools_ } from "./removed-default-tools.js";
|
|
13
|
+
import { repairOptInTools, repairRemovedDefaultTools as repairRemovedDefaultTools_ } from "./removed-default-tools.js";
|
|
14
14
|
import { EVE_VERSION, bold, capture, dim, green, parseEnv, red, run, yellow } from "./util.js";
|
|
15
15
|
import { inspectEveAgent } from "./agent-limits.js";
|
|
16
16
|
import { remoteProjectPath, sshTarget } from "./deploy.js";
|
|
@@ -332,7 +332,14 @@ function repairRemovedDefaultTools(cwd) {
|
|
|
332
332
|
for (const file of optedIn) {
|
|
333
333
|
console.log(` ${green("+")} wrote ${file} ${dim("(keeps the tool this scope had on eve 0.38)")}`);
|
|
334
334
|
}
|
|
335
|
-
|
|
335
|
+
const optIn = repairOptInTools(cwd, EVE_VERSION);
|
|
336
|
+
for (const file of optIn.removed) {
|
|
337
|
+
console.log(` ${green("-")} removed ${file} ${dim("(disabled a tool eve no longer provides by default; a compile error from eve 0.65)")}`);
|
|
338
|
+
}
|
|
339
|
+
for (const file of optIn.optedIn) {
|
|
340
|
+
console.log(` ${green("+")} wrote ${file} ${dim("(ask_question is opt-in from eve 0.65; this scope keeps it)")}`);
|
|
341
|
+
}
|
|
342
|
+
if (removed.length || optedIn.length || optIn.removed.length || optIn.optedIn.length)
|
|
336
343
|
console.log();
|
|
337
344
|
}
|
|
338
345
|
function repairSandboxCleanupHooks(cwd, deps) {
|
|
@@ -578,7 +585,7 @@ function exeJudgeUrl(cwd, env) {
|
|
|
578
585
|
if (!path)
|
|
579
586
|
return null;
|
|
580
587
|
const source = readFileSync(path, "utf8");
|
|
581
|
-
const judgeProvider = /judge\s*:\s*\{[\s\S]*?model\s*:\s*([A-Za-z_$][\w$]*)\s
|
|
588
|
+
const judgeProvider = /judge\s*:\s*\{[\s\S]*?model\s*:\s*([A-Za-z_$][\w$]*)\s*(?:\.evaluationModel\s*)?\(/.exec(source)?.[1];
|
|
582
589
|
if (!judgeProvider)
|
|
583
590
|
return null;
|
|
584
591
|
const escaped = judgeProvider.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
package/dist/util.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const EVE_VERSION = "0.
|
|
1
|
+
export declare const EVE_VERSION = "0.68.0";
|
|
2
2
|
export declare const REGISTRY_URL = "https://registry.kybernesis.ai/r/{name}.json";
|
|
3
3
|
export declare const DEFAULT_ISSUER = "https://agent.kybernesis.ai";
|
|
4
4
|
export declare const green: (s: string) => string;
|
package/dist/util.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { createInterface } from "node:readline/promises";
|
|
3
|
-
export const EVE_VERSION = "0.
|
|
3
|
+
export const EVE_VERSION = "0.68.0";
|
|
4
4
|
export const REGISTRY_URL = "https://registry.kybernesis.ai/r/{name}.json";
|
|
5
5
|
export const DEFAULT_ISSUER = "https://agent.kybernesis.ai";
|
|
6
6
|
const TTY = process.stdout.isTTY === true;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kybernesis/create",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "The Kybernesis agent scaffolder and FDE toolkit: one command to a governed, remembering, multiplayer, self-testing eve agent \u2014 plus doctor and upgrade.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
"NOTICE"
|
|
25
25
|
],
|
|
26
26
|
"bin": {
|
|
27
|
-
"kyb": "./dist/cli.js"
|
|
27
|
+
"kyb": "./dist/cli.js",
|
|
28
|
+
"kyb-eval": "./dist/eval-cli.js"
|
|
28
29
|
},
|
|
29
30
|
"exports": {
|
|
30
31
|
"./package.json": "./package.json"
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
41
|
"@types/node": "24.x",
|
|
41
|
-
"eve": "
|
|
42
|
+
"eve": "0.68.0",
|
|
42
43
|
"typescript": "7.0.2"
|
|
43
44
|
},
|
|
44
45
|
"engines": {
|
|
@@ -1989,7 +1989,7 @@ export default defineAgent({
|
|
|
1989
1989
|
});
|
|
1990
1990
|
```
|
|
1991
1991
|
|
|
1992
|
-
|
|
1992
|
+
Five things to know before you promise it:
|
|
1993
1993
|
|
|
1994
1994
|
- **The exe LLM integration also serves `anthropic/*` ids, and that is NOT this.**
|
|
1995
1995
|
It reaches Anthropic through a gateway, which bills metered usage. Same model,
|
|
@@ -2000,9 +2000,18 @@ Four things to know before you promise it:
|
|
|
2000
2000
|
provider-defined tools, which Anthropic validates by name, and the failure
|
|
2001
2001
|
(`tools.N.web_search_20250305.name: Input should be 'web_search'`) reads like
|
|
2002
2002
|
a bug in the agent's own tool definitions.
|
|
2003
|
-
- **The sign-in is per host and interactive** — a browser step
|
|
2004
|
-
|
|
2005
|
-
|
|
2003
|
+
- **The sign-in is per host and interactive** — a browser step in the container.
|
|
2004
|
+
It survives restarts because it lives in a named volume, but a new VM needs
|
|
2005
|
+
its own.
|
|
2006
|
+
- **And it is not a one-off: the sign-in expires about every 28 days.** The
|
|
2007
|
+
access token refreshes hourly and does so happily the whole time, which tells
|
|
2008
|
+
you nothing — the refresh token underneath carries a fixed expiry that using
|
|
2009
|
+
it does not extend. On expiry the proxy blanks the credential to empty strings
|
|
2010
|
+
and every turn 401s; only `login` recovers it, never `reload` or a restart.
|
|
2011
|
+
**Say this to the client before you promise the arrangement, and put the
|
|
2012
|
+
re-login in someone's calendar** — it is the operational debt you take on in
|
|
2013
|
+
exchange for not billing metered usage. Run `scripts/claude-subscription.sh
|
|
2014
|
+
status` on a schedule: it now reports days remaining and escalates at 7 and 3.
|
|
2006
2015
|
- **It is a process to keep alive.** If the container stops, every turn fails
|
|
2007
2016
|
with a connection error from inside the model SDK, which reads like the model
|
|
2008
2017
|
being down. `hostPreflight({ claudeProxyUrl })` asks about it at boot; the
|