@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 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.604",
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.604",
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",
@@ -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 }}