From a8217afc109bc045ac93a62ee7c8e0a5b7aad095 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:15:58 +0000 Subject: [PATCH 1/4] Initial plan From d11f0dd320523fd09ee3aceec6d789b44d932609 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:29:58 +0000 Subject: [PATCH 2/4] Add parseDefaultMetaFromEnv function and integrate environment metadata parsing Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- packages/core/src/env.ts | 34 ++++++++ packages/core/src/template.ts | 19 +++++ packages/core/test/env.test.ts | 81 +++++++++++++++++- packages/core/test/template.test.ts | 125 +++++++++++++++++++++++++++- 4 files changed, 257 insertions(+), 2 deletions(-) diff --git a/packages/core/src/env.ts b/packages/core/src/env.ts index 16c3171852..c60510babb 100644 --- a/packages/core/src/env.ts +++ b/packages/core/src/env.ts @@ -69,6 +69,8 @@ import type { TraceOptions } from "./trace.js"; import type { CancellationOptions } from "./cancellation.js"; import { genaiscriptDebug } from "./debug.js"; import { YAMLTryParse } from "./yaml.js"; +import { JSON5TryParse } from "./json5.js"; +import type { PromptArgs, PromptScript } from "./types.js"; const dbg = genaiscriptDebug("config:env"); /** @@ -122,6 +124,38 @@ export function findEnvVar( return undefined; } +/** + * Parses default script metadata from GENAISCRIPT_DEFAULT_META environment variable. + * The environment variable should contain a JSON payload of PromptScript metadata. + * This metadata gets merged last into the main script metadata object. + * + * @param env - The environment variables as key-value pairs. + * @returns A PromptArgs object containing the parsed metadata, or undefined if no valid metadata found. + */ +export function parseDefaultMetaFromEnv(env: Record): Partial | undefined { + const envValue = env.GENAISCRIPT_DEFAULT_META; + if (!envValue) { + dbg("GENAISCRIPT_DEFAULT_META not found in environment variables"); + return undefined; + } + + dbg(`found GENAISCRIPT_DEFAULT_META: ${envValue}`); + + try { + const parsed = JSON5TryParse(envValue); + if (!parsed || typeof parsed !== "object") { + dbg("GENAISCRIPT_DEFAULT_META could not be parsed as valid JSON object"); + return undefined; + } + + dbg(`parsed GENAISCRIPT_DEFAULT_META: %O`, parsed); + return parsed as Partial; + } catch (error) { + dbg(`failed to parse GENAISCRIPT_DEFAULT_META: ${error}`); + return undefined; + } +} + /** * Parses default configuration values from the provided environment variables. * diff --git a/packages/core/src/template.ts b/packages/core/src/template.ts index a3b174ddf5..2bed81c30f 100644 --- a/packages/core/src/template.ts +++ b/packages/core/src/template.ts @@ -15,6 +15,7 @@ import { deleteUndefinedValues } from "./cleaners.js"; import { markdownScriptParse } from "./markdownscript.js"; import { readJSON } from "./fs.js"; import { frontmatterTryParse } from "./frontmatter.js"; +import { parseDefaultMetaFromEnv } from "./env.js"; import type { PromptArgs, PromptScript, @@ -241,5 +242,23 @@ export async function parsePromptScript(filename: string, content: string) { }; } + // Parse and merge default metadata from environment variables (last to take priority) + const envDefaults = parseDefaultMetaFromEnv(process.env); + if (envDefaults) { + // Merge environment defaults last so they take highest priority + Object.assign(script, { + ...script, // existing script metadata + ...envDefaults, // environment defaults override + }); + + // Special handling for metadata field to ensure it's properly merged and validated + if (envDefaults.metadata || script.metadata) { + script.metadata = metadataValidate({ + ...(script.metadata || {}), + ...(envDefaults.metadata || {}), // env metadata takes precedence + }); + } + } + return script; } diff --git a/packages/core/test/env.test.ts b/packages/core/test/env.test.ts index 9c63bdc640..ce2d3fe26a 100644 --- a/packages/core/test/env.test.ts +++ b/packages/core/test/env.test.ts @@ -1,5 +1,5 @@ import { describe, test, assert } from "vitest"; -import { parseAllowedDomains } from "../src/env.js"; +import { parseAllowedDomains, parseDefaultMetaFromEnv } from "../src/env.js"; describe("env", () => { describe("parseAllowedDomains", () => { @@ -53,4 +53,83 @@ describe("env", () => { assert.deepStrictEqual(result, ["github.com"]); }); }); + + describe("parseDefaultMetaFromEnv", () => { + test("returns undefined when GENAISCRIPT_DEFAULT_META not set", () => { + const result = parseDefaultMetaFromEnv({}); + assert.strictEqual(result, undefined); + }); + + test("parses valid JSON metadata", () => { + const env = { + GENAISCRIPT_DEFAULT_META: '{"temperature": 0.5, "model": "gpt-4", "title": "Default Title"}' + }; + const result = parseDefaultMetaFromEnv(env); + assert.deepStrictEqual(result, { + temperature: 0.5, + model: "gpt-4", + title: "Default Title" + }); + }); + + test("parses valid JSON5 metadata", () => { + const env = { + GENAISCRIPT_DEFAULT_META: '{temperature: 0.5, model: "gpt-4", unlisted: true}' + }; + const result = parseDefaultMetaFromEnv(env); + assert.deepStrictEqual(result, { + temperature: 0.5, + model: "gpt-4", + unlisted: true + }); + }); + + test("handles metadata with nested objects", () => { + const env = { + GENAISCRIPT_DEFAULT_META: '{"metadata": {"key1": "value1", "key2": "value2"}, "vars": {"var1": "val1"}}' + }; + const result = parseDefaultMetaFromEnv(env); + assert.deepStrictEqual(result, { + metadata: { + key1: "value1", + key2: "value2" + }, + vars: { + var1: "val1" + } + }); + }); + + test("returns undefined for invalid JSON", () => { + const env = { + GENAISCRIPT_DEFAULT_META: 'invalid json {' + }; + const result = parseDefaultMetaFromEnv(env); + assert.strictEqual(result, undefined); + }); + + test("returns undefined for non-object values", () => { + const env = { + GENAISCRIPT_DEFAULT_META: '"just a string"' + }; + const result = parseDefaultMetaFromEnv(env); + assert.strictEqual(result, undefined); + }); + + test("returns undefined for null values", () => { + const env = { + GENAISCRIPT_DEFAULT_META: 'null' + }; + const result = parseDefaultMetaFromEnv(env); + assert.strictEqual(result, undefined); + }); + + test("handles empty object", () => { + const env = { + GENAISCRIPT_DEFAULT_META: '{}' + }; + const result = parseDefaultMetaFromEnv(env); + assert.deepStrictEqual(result, {}); + }); + }); }); \ No newline at end of file diff --git a/packages/core/test/template.test.ts b/packages/core/test/template.test.ts index 2fb581dfae..c9926b24b7 100644 --- a/packages/core/test/template.test.ts +++ b/packages/core/test/template.test.ts @@ -1,4 +1,4 @@ -import { describe, test, assert } from "vitest" +import { describe, test, assert, vi, beforeEach, afterEach } from "vitest" import { parsePromptScript } from "../src/template.js" describe("template.ts - frontmatter parameters", () => { @@ -119,4 +119,127 @@ Configuration test with {{items}} and {{config}}.` maximum: 1 }) }) +}) + +describe("template.ts - environment variable default metadata", () => { + let originalEnv: any + + beforeEach(() => { + originalEnv = { ...process.env } + }) + + afterEach(() => { + process.env = originalEnv + }) + + test("should merge environment default metadata into script", async () => { + process.env.GENAISCRIPT_DEFAULT_META = '{"temperature": 0.5, "model": "gpt-4", "unlisted": true}' + + const content = `script({ + title: "Test Script", + description: "A test script" + }) + + Hello world!` + + const script = await parsePromptScript("test.genai.mts", content) + + assert.strictEqual(script.temperature, 0.5) + assert.strictEqual(script.model, "gpt-4") + assert.strictEqual(script.unlisted, true) + assert.strictEqual(script.title, "Test Script") + assert.strictEqual(script.description, "A test script") + }) + + test("should handle environment metadata without script metadata", async () => { + process.env.GENAISCRIPT_DEFAULT_META = '{"temperature": 0.7, "maxTokens": 1000}' + + const content = `Hello world!` + + const script = await parsePromptScript("test.genai.mts", content) + + assert.strictEqual(script.temperature, 0.7) + assert.strictEqual(script.maxTokens, 1000) + }) + + test("should merge environment metadata with existing metadata field", async () => { + process.env.GENAISCRIPT_DEFAULT_META = '{"metadata": {"env_key": "env_value", "shared_key": "env_shared"}, "temperature": 0.5}' + + const content = `script({ + metadata: { + script_key: "script_value", + shared_key: "script_shared" + } + }) + + Hello world!` + + const script = await parsePromptScript("test.genai.mts", content) + + assert.strictEqual(script.temperature, 0.5) + assert.ok(script.metadata) + assert.strictEqual(script.metadata.env_key, "env_value") + assert.strictEqual(script.metadata.script_key, "script_value") + // Environment metadata should take precedence for shared keys + assert.strictEqual(script.metadata.shared_key, "env_shared") + }) + + test("should work without environment variable set", async () => { + delete process.env.GENAISCRIPT_DEFAULT_META + + const content = `script({ + title: "Test Script", + temperature: 0.8 + }) + + Hello world!` + + const script = await parsePromptScript("test.genai.mts", content) + + assert.strictEqual(script.title, "Test Script") + assert.strictEqual(script.temperature, 0.8) + }) + + test("should handle invalid JSON in environment variable gracefully", async () => { + process.env.GENAISCRIPT_DEFAULT_META = 'invalid json {' + + const content = `script({ + title: "Test Script" + }) + + Hello world!` + + const script = await parsePromptScript("test.genai.mts", content) + + assert.strictEqual(script.title, "Test Script") + // Should not throw an error, just ignore the invalid env var + }) + + test("should handle environment metadata with complex nested objects", async () => { + process.env.GENAISCRIPT_DEFAULT_META = '{"vars": {"env_var": "env_value"}, "parameters": {"env_param": {"type": "string", "default": "env_default"}}}' + + const content = `script({ + vars: { + script_var: "script_value" + }, + parameters: { + script_param: { + type: "number", + default: 42 + } + } + }) + + Hello world!` + + const script = await parsePromptScript("test.genai.mts", content) + + assert.ok(script.vars) + assert.strictEqual(script.vars.env_var, "env_value") + assert.strictEqual(script.vars.script_var, "script_value") + + assert.ok(script.parameters) + assert.deepEqual(script.parameters.env_param, { type: "string", default: "env_default" }) + assert.deepEqual(script.parameters.script_param, { type: "number", default: 42 }) + }) }) \ No newline at end of file From 50354b59c1dd2a941cced4edfb515865493f06aa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Sep 2025 16:01:23 +0000 Subject: [PATCH 3/4] Rename GENAISCRIPT_DEFAULT_META to GENAISCRIPT_DEFAULT_SCRIPT_META Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- packages/core/src/env.ts | 14 +++++++------- packages/core/test/env.test.ts | 16 ++++++++-------- packages/core/test/template.test.ts | 12 ++++++------ 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/core/src/env.ts b/packages/core/src/env.ts index c60510babb..424fc3c223 100644 --- a/packages/core/src/env.ts +++ b/packages/core/src/env.ts @@ -125,7 +125,7 @@ export function findEnvVar( } /** - * Parses default script metadata from GENAISCRIPT_DEFAULT_META environment variable. + * Parses default script metadata from GENAISCRIPT_DEFAULT_SCRIPT_META environment variable. * The environment variable should contain a JSON payload of PromptScript metadata. * This metadata gets merged last into the main script metadata object. * @@ -133,25 +133,25 @@ export function findEnvVar( * @returns A PromptArgs object containing the parsed metadata, or undefined if no valid metadata found. */ export function parseDefaultMetaFromEnv(env: Record): Partial | undefined { - const envValue = env.GENAISCRIPT_DEFAULT_META; + const envValue = env.GENAISCRIPT_DEFAULT_SCRIPT_META; if (!envValue) { - dbg("GENAISCRIPT_DEFAULT_META not found in environment variables"); + dbg("GENAISCRIPT_DEFAULT_SCRIPT_META not found in environment variables"); return undefined; } - dbg(`found GENAISCRIPT_DEFAULT_META: ${envValue}`); + dbg(`found GENAISCRIPT_DEFAULT_SCRIPT_META: ${envValue}`); try { const parsed = JSON5TryParse(envValue); if (!parsed || typeof parsed !== "object") { - dbg("GENAISCRIPT_DEFAULT_META could not be parsed as valid JSON object"); + dbg("GENAISCRIPT_DEFAULT_SCRIPT_META could not be parsed as valid JSON object"); return undefined; } - dbg(`parsed GENAISCRIPT_DEFAULT_META: %O`, parsed); + dbg(`parsed GENAISCRIPT_DEFAULT_SCRIPT_META: %O`, parsed); return parsed as Partial; } catch (error) { - dbg(`failed to parse GENAISCRIPT_DEFAULT_META: ${error}`); + dbg(`failed to parse GENAISCRIPT_DEFAULT_SCRIPT_META: ${error}`); return undefined; } } diff --git a/packages/core/test/env.test.ts b/packages/core/test/env.test.ts index ce2d3fe26a..d5c0a9d065 100644 --- a/packages/core/test/env.test.ts +++ b/packages/core/test/env.test.ts @@ -55,14 +55,14 @@ describe("env", () => { }); describe("parseDefaultMetaFromEnv", () => { - test("returns undefined when GENAISCRIPT_DEFAULT_META not set", () => { + test("returns undefined when GENAISCRIPT_DEFAULT_SCRIPT_META not set", () => { const result = parseDefaultMetaFromEnv({}); assert.strictEqual(result, undefined); }); test("parses valid JSON metadata", () => { const env = { - GENAISCRIPT_DEFAULT_META: '{"temperature": 0.5, "model": "gpt-4", "title": "Default Title"}' + GENAISCRIPT_DEFAULT_SCRIPT_META: '{"temperature": 0.5, "model": "gpt-4", "title": "Default Title"}' }; const result = parseDefaultMetaFromEnv(env); assert.deepStrictEqual(result, { @@ -74,7 +74,7 @@ describe("env", () => { test("parses valid JSON5 metadata", () => { const env = { - GENAISCRIPT_DEFAULT_META: '{temperature: 0.5, model: "gpt-4", unlisted: true}' + GENAISCRIPT_DEFAULT_SCRIPT_META: '{temperature: 0.5, model: "gpt-4", unlisted: true}' }; const result = parseDefaultMetaFromEnv(env); assert.deepStrictEqual(result, { @@ -86,7 +86,7 @@ describe("env", () => { test("handles metadata with nested objects", () => { const env = { - GENAISCRIPT_DEFAULT_META: '{"metadata": {"key1": "value1", "key2": "value2"}, "vars": {"var1": "val1"}}' + GENAISCRIPT_DEFAULT_SCRIPT_META: '{"metadata": {"key1": "value1", "key2": "value2"}, "vars": {"var1": "val1"}}' }; const result = parseDefaultMetaFromEnv(env); assert.deepStrictEqual(result, { @@ -102,7 +102,7 @@ describe("env", () => { test("returns undefined for invalid JSON", () => { const env = { - GENAISCRIPT_DEFAULT_META: 'invalid json {' + GENAISCRIPT_DEFAULT_SCRIPT_META: 'invalid json {' }; const result = parseDefaultMetaFromEnv(env); assert.strictEqual(result, undefined); @@ -110,7 +110,7 @@ describe("env", () => { test("returns undefined for non-object values", () => { const env = { - GENAISCRIPT_DEFAULT_META: '"just a string"' + GENAISCRIPT_DEFAULT_SCRIPT_META: '"just a string"' }; const result = parseDefaultMetaFromEnv(env); assert.strictEqual(result, undefined); @@ -118,7 +118,7 @@ describe("env", () => { test("returns undefined for null values", () => { const env = { - GENAISCRIPT_DEFAULT_META: 'null' + GENAISCRIPT_DEFAULT_SCRIPT_META: 'null' }; const result = parseDefaultMetaFromEnv(env); assert.strictEqual(result, undefined); @@ -126,7 +126,7 @@ describe("env", () => { test("handles empty object", () => { const env = { - GENAISCRIPT_DEFAULT_META: '{}' + GENAISCRIPT_DEFAULT_SCRIPT_META: '{}' }; const result = parseDefaultMetaFromEnv(env); assert.deepStrictEqual(result, {}); diff --git a/packages/core/test/template.test.ts b/packages/core/test/template.test.ts index c9926b24b7..31583fd78d 100644 --- a/packages/core/test/template.test.ts +++ b/packages/core/test/template.test.ts @@ -133,7 +133,7 @@ describe("template.ts - environment variable default metadata", () => { }) test("should merge environment default metadata into script", async () => { - process.env.GENAISCRIPT_DEFAULT_META = '{"temperature": 0.5, "model": "gpt-4", "unlisted": true}' + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"temperature": 0.5, "model": "gpt-4", "unlisted": true}' const content = `script({ title: "Test Script", @@ -152,7 +152,7 @@ describe("template.ts - environment variable default metadata", () => { }) test("should handle environment metadata without script metadata", async () => { - process.env.GENAISCRIPT_DEFAULT_META = '{"temperature": 0.7, "maxTokens": 1000}' + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"temperature": 0.7, "maxTokens": 1000}' const content = `Hello world!` @@ -163,7 +163,7 @@ describe("template.ts - environment variable default metadata", () => { }) test("should merge environment metadata with existing metadata field", async () => { - process.env.GENAISCRIPT_DEFAULT_META = '{"metadata": {"env_key": "env_value", "shared_key": "env_shared"}, "temperature": 0.5}' + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"metadata": {"env_key": "env_value", "shared_key": "env_shared"}, "temperature": 0.5}' const content = `script({ metadata: { @@ -185,7 +185,7 @@ describe("template.ts - environment variable default metadata", () => { }) test("should work without environment variable set", async () => { - delete process.env.GENAISCRIPT_DEFAULT_META + delete process.env.GENAISCRIPT_DEFAULT_SCRIPT_META const content = `script({ title: "Test Script", @@ -201,7 +201,7 @@ describe("template.ts - environment variable default metadata", () => { }) test("should handle invalid JSON in environment variable gracefully", async () => { - process.env.GENAISCRIPT_DEFAULT_META = 'invalid json {' + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = 'invalid json {' const content = `script({ title: "Test Script" @@ -216,7 +216,7 @@ describe("template.ts - environment variable default metadata", () => { }) test("should handle environment metadata with complex nested objects", async () => { - process.env.GENAISCRIPT_DEFAULT_META = '{"vars": {"env_var": "env_value"}, "parameters": {"env_param": {"type": "string", "default": "env_default"}}}' + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"vars": {"env_var": "env_value"}, "parameters": {"env_param": {"type": "string", "default": "env_default"}}}' const content = `script({ vars: { From 4d56cde4003893c29cf2a940be856a3c3430ef37 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Sep 2025 16:07:43 +0000 Subject: [PATCH 4/4] Restrict environment defaults to only merge metadata fields and filter to valid PromptArgs Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- packages/core/src/env.ts | 14 +++++- packages/core/src/template.ts | 18 ++----- packages/core/test/template.test.ts | 76 +++++++++++------------------ 3 files changed, 47 insertions(+), 61 deletions(-) diff --git a/packages/core/src/env.ts b/packages/core/src/env.ts index 424fc3c223..7834958112 100644 --- a/packages/core/src/env.ts +++ b/packages/core/src/env.ts @@ -149,7 +149,19 @@ export function parseDefaultMetaFromEnv(env: Record): Partial; + + // Filter to only include valid PromptArgs fields (exclude text, id, jsSource, defTools, resolvedSystem) + const excludedFields = new Set(['text', 'id', 'jsSource', 'defTools', 'resolvedSystem']); + const filtered: Partial = {}; + + for (const [key, value] of Object.entries(parsed)) { + if (!excludedFields.has(key)) { + (filtered as any)[key] = value; + } + } + + dbg(`filtered GENAISCRIPT_DEFAULT_SCRIPT_META: %O`, filtered); + return filtered; } catch (error) { dbg(`failed to parse GENAISCRIPT_DEFAULT_SCRIPT_META: ${error}`); return undefined; diff --git a/packages/core/src/template.ts b/packages/core/src/template.ts index 2bed81c30f..98c763f846 100644 --- a/packages/core/src/template.ts +++ b/packages/core/src/template.ts @@ -244,20 +244,12 @@ export async function parsePromptScript(filename: string, content: string) { // Parse and merge default metadata from environment variables (last to take priority) const envDefaults = parseDefaultMetaFromEnv(process.env); - if (envDefaults) { - // Merge environment defaults last so they take highest priority - Object.assign(script, { - ...script, // existing script metadata - ...envDefaults, // environment defaults override + if (envDefaults?.metadata) { + // Only merge metadata field from environment defaults + script.metadata = metadataValidate({ + ...(script.metadata || {}), + ...(envDefaults.metadata || {}), // env metadata takes precedence }); - - // Special handling for metadata field to ensure it's properly merged and validated - if (envDefaults.metadata || script.metadata) { - script.metadata = metadataValidate({ - ...(script.metadata || {}), - ...(envDefaults.metadata || {}), // env metadata takes precedence - }); - } } return script; diff --git a/packages/core/test/template.test.ts b/packages/core/test/template.test.ts index 31583fd78d..4345378be2 100644 --- a/packages/core/test/template.test.ts +++ b/packages/core/test/template.test.ts @@ -132,64 +132,56 @@ describe("template.ts - environment variable default metadata", () => { process.env = originalEnv }) - test("should merge environment default metadata into script", async () => { - process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"temperature": 0.5, "model": "gpt-4", "unlisted": true}' + test("should merge environment default metadata into script metadata field", async () => { + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"metadata": {"env_key": "env_value", "shared_key": "env_shared"}}' const content = `script({ title: "Test Script", - description: "A test script" + description: "A test script", + metadata: { + script_key: "script_value", + shared_key: "script_shared" + } }) Hello world!` const script = await parsePromptScript("test.genai.mts", content) - assert.strictEqual(script.temperature, 0.5) - assert.strictEqual(script.model, "gpt-4") - assert.strictEqual(script.unlisted, true) assert.strictEqual(script.title, "Test Script") assert.strictEqual(script.description, "A test script") + assert.ok(script.metadata) + assert.strictEqual(script.metadata.env_key, "env_value") + assert.strictEqual(script.metadata.script_key, "script_value") + // Environment metadata should take precedence for shared keys + assert.strictEqual(script.metadata.shared_key, "env_shared") }) - test("should handle environment metadata without script metadata", async () => { - process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"temperature": 0.7, "maxTokens": 1000}' - - const content = `Hello world!` - - const script = await parsePromptScript("test.genai.mts", content) - - assert.strictEqual(script.temperature, 0.7) - assert.strictEqual(script.maxTokens, 1000) - }) - - test("should merge environment metadata with existing metadata field", async () => { - process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"metadata": {"env_key": "env_value", "shared_key": "env_shared"}, "temperature": 0.5}' + test("should handle environment metadata without existing script metadata", async () => { + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"metadata": {"env_key": "env_value"}}' const content = `script({ - metadata: { - script_key: "script_value", - shared_key: "script_shared" - } + title: "Test Script" }) Hello world!` const script = await parsePromptScript("test.genai.mts", content) - assert.strictEqual(script.temperature, 0.5) + assert.strictEqual(script.title, "Test Script") assert.ok(script.metadata) assert.strictEqual(script.metadata.env_key, "env_value") - assert.strictEqual(script.metadata.script_key, "script_value") - // Environment metadata should take precedence for shared keys - assert.strictEqual(script.metadata.shared_key, "env_shared") }) + test("should work without environment variable set", async () => { delete process.env.GENAISCRIPT_DEFAULT_SCRIPT_META const content = `script({ title: "Test Script", - temperature: 0.8 + metadata: { + original: "value" + } }) Hello world!` @@ -197,7 +189,8 @@ describe("template.ts - environment variable default metadata", () => { const script = await parsePromptScript("test.genai.mts", content) assert.strictEqual(script.title, "Test Script") - assert.strictEqual(script.temperature, 0.8) + assert.ok(script.metadata) + assert.strictEqual(script.metadata.original, "value") }) test("should handle invalid JSON in environment variable gracefully", async () => { @@ -215,31 +208,20 @@ describe("template.ts - environment variable default metadata", () => { // Should not throw an error, just ignore the invalid env var }) - test("should handle environment metadata with complex nested objects", async () => { - process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"vars": {"env_var": "env_value"}, "parameters": {"env_param": {"type": "string", "default": "env_default"}}}' + test("should handle environment metadata with nested objects", async () => { + process.env.GENAISCRIPT_DEFAULT_SCRIPT_META = '{"metadata": {"nested": {"key": "value"}, "simple": "data"}}' const content = `script({ - vars: { - script_var: "script_value" - }, - parameters: { - script_param: { - type: "number", - default: 42 - } - } + title: "Test Script" }) Hello world!` const script = await parsePromptScript("test.genai.mts", content) - assert.ok(script.vars) - assert.strictEqual(script.vars.env_var, "env_value") - assert.strictEqual(script.vars.script_var, "script_value") - - assert.ok(script.parameters) - assert.deepEqual(script.parameters.env_param, { type: "string", default: "env_default" }) - assert.deepEqual(script.parameters.script_param, { type: "number", default: 42 }) + assert.strictEqual(script.title, "Test Script") + assert.ok(script.metadata) + assert.deepEqual(script.metadata.nested, { key: "value" }) + assert.strictEqual(script.metadata.simple, "data") }) }) \ No newline at end of file