@kody-ade/kody-engine 0.4.604 → 0.4.606
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/bin/kody.js +45 -3
- package/package.json +1 -1
- package/templates/kody.yml +1 -0
package/dist/bin/kody.js
CHANGED
|
@@ -15,7 +15,7 @@ var init_package = __esm({
|
|
|
15
15
|
"package.json"() {
|
|
16
16
|
package_default = {
|
|
17
17
|
name: "@kody-ade/kody-engine",
|
|
18
|
-
version: "0.4.
|
|
18
|
+
version: "0.4.606",
|
|
19
19
|
description: "kody \u2014 autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative implementation profiles.",
|
|
20
20
|
license: "MIT",
|
|
21
21
|
type: "module",
|
|
@@ -2353,7 +2353,7 @@ function parseCapabilityRequirements(raw) {
|
|
|
2353
2353
|
if (raw === void 0) return void 0;
|
|
2354
2354
|
if (!isPlainObject(raw)) throw new Error("contract.json requirements must be an object");
|
|
2355
2355
|
const unsupported = Object.keys(raw).filter(
|
|
2356
|
-
(key) => key !== "browser" && key !== "qaCredentials" && key !== "githubTestToken" && key !== "browserOnly"
|
|
2356
|
+
(key) => key !== "browser" && key !== "qaCredentials" && key !== "githubTestToken" && key !== "qaAccountCredentials" && key !== "browserOnly"
|
|
2357
2357
|
);
|
|
2358
2358
|
if (unsupported.length > 0) {
|
|
2359
2359
|
throw new Error(`contract.json requirements contains unsupported fields: ${unsupported.join(", ")}`);
|
|
@@ -2367,16 +2367,22 @@ function parseCapabilityRequirements(raw) {
|
|
|
2367
2367
|
if (raw.githubTestToken !== void 0 && typeof raw.githubTestToken !== "boolean") {
|
|
2368
2368
|
throw new Error("contract.json requirements.githubTestToken must be boolean");
|
|
2369
2369
|
}
|
|
2370
|
+
if (raw.qaAccountCredentials !== void 0 && (!Array.isArray(raw.qaAccountCredentials) || raw.qaAccountCredentials.length === 0 || !raw.qaAccountCredentials.every(
|
|
2371
|
+
(name) => typeof name === "string" && /^[A-Z][A-Z0-9_]{0,127}$/.test(name)
|
|
2372
|
+
))) {
|
|
2373
|
+
throw new Error("contract.json requirements.qaAccountCredentials must contain valid credential names");
|
|
2374
|
+
}
|
|
2370
2375
|
if (raw.browserOnly !== void 0 && typeof raw.browserOnly !== "boolean") {
|
|
2371
2376
|
throw new Error("contract.json requirements.browserOnly must be boolean");
|
|
2372
2377
|
}
|
|
2373
|
-
if ((raw.qaCredentials === true || raw.githubTestToken === true || raw.browserOnly === true) && raw.browser !== true) {
|
|
2378
|
+
if ((raw.qaCredentials === true || raw.githubTestToken === true || raw.qaAccountCredentials !== void 0 || raw.browserOnly === true) && raw.browser !== true) {
|
|
2374
2379
|
throw new Error("contract.json authentication requirements require browser");
|
|
2375
2380
|
}
|
|
2376
2381
|
const requirements = {
|
|
2377
2382
|
...raw.browser === true ? { browser: true } : {},
|
|
2378
2383
|
...raw.qaCredentials === true ? { qaCredentials: true } : {},
|
|
2379
2384
|
...raw.githubTestToken === true ? { githubTestToken: true } : {},
|
|
2385
|
+
...Array.isArray(raw.qaAccountCredentials) ? { qaAccountCredentials: [...new Set(raw.qaAccountCredentials)] } : {},
|
|
2380
2386
|
...raw.browserOnly === true ? { browserOnly: true } : {}
|
|
2381
2387
|
};
|
|
2382
2388
|
return Object.keys(requirements).length > 0 ? requirements : void 0;
|
|
@@ -18481,6 +18487,36 @@ async function saveAccountRepositoryAuth(targetUrl, cookie, auth) {
|
|
|
18481
18487
|
});
|
|
18482
18488
|
if (!response.ok) throw new Error(`app repository setup returned ${response.status}`);
|
|
18483
18489
|
}
|
|
18490
|
+
async function prepareAccountCredentials(ctx, profile, input) {
|
|
18491
|
+
const cookie = browserSessionCookieHeader(profile, input.targetUrl);
|
|
18492
|
+
if (!cookie) {
|
|
18493
|
+
appendAuthMessage(ctx, "Auth: QA account credentials could not be prepared because the app session is missing.");
|
|
18494
|
+
return false;
|
|
18495
|
+
}
|
|
18496
|
+
const origin = browserOrigin(input.targetUrl);
|
|
18497
|
+
for (const name of input.names) {
|
|
18498
|
+
if (!/^[A-Z][A-Z0-9_]{0,127}$/.test(name)) {
|
|
18499
|
+
appendAuthMessage(ctx, "Auth: QA account credentials contain an invalid credential name.");
|
|
18500
|
+
return false;
|
|
18501
|
+
}
|
|
18502
|
+
const credential = await resolveRuntimeSecret(name, ctx);
|
|
18503
|
+
if (!credential.value) {
|
|
18504
|
+
appendAuthMessage(ctx, `Auth: QA account setup is incomplete because no \`${name}\` secret was found.`);
|
|
18505
|
+
return false;
|
|
18506
|
+
}
|
|
18507
|
+
const response = await fetch(`${origin}/api/kody/account/credentials`, {
|
|
18508
|
+
method: "PUT",
|
|
18509
|
+
headers: { "content-type": "application/json", cookie, origin },
|
|
18510
|
+
body: JSON.stringify({ name, value: credential.value })
|
|
18511
|
+
});
|
|
18512
|
+
if (!response.ok) {
|
|
18513
|
+
appendAuthMessage(ctx, `Auth: QA account credential setup returned ${response.status}.`);
|
|
18514
|
+
return false;
|
|
18515
|
+
}
|
|
18516
|
+
}
|
|
18517
|
+
appendAuthMessage(ctx, "Auth: the QA account's required model credentials are already prepared by the engine.");
|
|
18518
|
+
return true;
|
|
18519
|
+
}
|
|
18484
18520
|
function mergeStorageStates(existingPath, nextPath) {
|
|
18485
18521
|
if (existingPath === nextPath || !fs48.existsSync(existingPath)) return;
|
|
18486
18522
|
const existing = JSON.parse(fs48.readFileSync(existingPath, "utf-8"));
|
|
@@ -18872,6 +18908,12 @@ var init_prepareSimpleCapabilityRuntime = __esm({
|
|
|
18872
18908
|
login: String(ctx.data.qaLogin ?? ""),
|
|
18873
18909
|
targetUrl
|
|
18874
18910
|
});
|
|
18911
|
+
if (requirements.qaAccountCredentials?.length) {
|
|
18912
|
+
await prepareAccountCredentials(ctx, profile, {
|
|
18913
|
+
names: requirements.qaAccountCredentials,
|
|
18914
|
+
targetUrl
|
|
18915
|
+
});
|
|
18916
|
+
}
|
|
18875
18917
|
}
|
|
18876
18918
|
if (requirements.githubTestToken) {
|
|
18877
18919
|
const capabilityInput = ctx.data.capabilityInput && typeof ctx.data.capabilityInput === "object" && !Array.isArray(ctx.data.capabilityInput) ? ctx.data.capabilityInput : {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kody-ade/kody-engine",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.606",
|
|
4
4
|
"description": "kody — autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative implementation profiles.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
package/templates/kody.yml
CHANGED
|
@@ -82,6 +82,7 @@ jobs:
|
|
|
82
82
|
GH_PAT: ${{ secrets.GH_PAT }}
|
|
83
83
|
KODY_TOKEN: ${{ secrets.KODY_TOKEN }}
|
|
84
84
|
E2E_GITHUB_TOKEN: ${{ secrets.E2E_GITHUB_TOKEN }}
|
|
85
|
+
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
|
|
85
86
|
KODY_APP_ID: ${{ secrets.KODY_APP_ID }}
|
|
86
87
|
KODY_APP_PRIVATE_KEY: ${{ secrets.KODY_APP_PRIVATE_KEY }}
|
|
87
88
|
SESSION_ID: ${{ inputs.sessionId }}
|