create-agentmark 0.9.0 → 0.10.1

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.
@@ -6,7 +6,6 @@ interface AdapterConfig {
6
6
  /** Class names used in generated code */
7
7
  classes: {
8
8
  modelRegistry: string;
9
- toolRegistry: string;
10
9
  webhookHandler: string;
11
10
  };
12
11
  }
@@ -15,7 +14,7 @@ declare function getAdapterConfig(adapter: string, provider: string): AdapterCon
15
14
 
16
15
  declare const getIndexFileContent: (adapter?: string, deploymentMode?: "cloud" | "static") => string;
17
16
 
18
- declare const getEnvFileContent: (_modelProvider: string, apiKey?: string, adapter?: string) => string;
17
+ declare const getEnvFileContent: (_modelProvider: string, apiKey?: string, adapter?: string, deploymentMode?: "cloud" | "static") => string;
19
18
 
20
19
  /**
21
20
  * Type definitions for existing repository initialization.
@@ -6,7 +6,6 @@ var createAdapterConfig = (provider) => {
6
6
  dependencies: ["ai@^5", `@ai-sdk/${provider}@^2`],
7
7
  classes: {
8
8
  modelRegistry: "VercelAIModelRegistry",
9
- toolRegistry: "VercelAIToolRegistry",
10
9
  webhookHandler: "VercelAdapterWebhookHandler"
11
10
  }
12
11
  },
@@ -15,11 +14,11 @@ var createAdapterConfig = (provider) => {
15
14
  dependencies: [
16
15
  "@mastra/core@<0.20.0",
17
16
  "@mastra/mcp@<0.13.4",
18
- `@ai-sdk/${provider}@<2`
17
+ `@ai-sdk/${provider}@<2`,
18
+ "ai@^4"
19
19
  ],
20
20
  classes: {
21
21
  modelRegistry: "MastraModelRegistry",
22
- toolRegistry: "MastraToolRegistry",
23
22
  webhookHandler: "MastraAdapterWebhookHandler"
24
23
  }
25
24
  },
@@ -28,7 +27,6 @@ var createAdapterConfig = (provider) => {
28
27
  dependencies: ["@anthropic-ai/claude-agent-sdk@^0.1.0"],
29
28
  classes: {
30
29
  modelRegistry: "ClaudeAgentModelRegistry",
31
- toolRegistry: "ClaudeAgentToolRegistry",
32
30
  webhookHandler: "ClaudeAgentWebhookHandler"
33
31
  }
34
32
  }
@@ -218,16 +216,22 @@ main();
218
216
  };
219
217
 
220
218
  // src/utils/examples/templates/env.ts
221
- var getEnvFileContent = (_modelProvider, apiKey = "", adapter = "ai-sdk") => {
219
+ var getEnvFileContent = (_modelProvider, apiKey = "", adapter = "ai-sdk", deploymentMode = "cloud") => {
222
220
  const apiKeyValue = apiKey || "your_api_key_here";
223
221
  const apiKeyName = adapter === "claude-agent-sdk" ? "ANTHROPIC_API_KEY" : "OPENAI_API_KEY";
224
- return `# Cloud deployment: Set these environment variables
222
+ const cloudEnvVars = deploymentMode === "cloud" ? `
223
+ # AgentMark Cloud \u2014 required for managed deployments
224
+ AGENTMARK_API_KEY=your_agentmark_api_key
225
+ AGENTMARK_APP_ID=your_agentmark_app_id
226
+ ` : `
227
+ # Cloud deployment: Set these environment variables
225
228
  # AGENTMARK_BASE_URL=https://api.agentmark.co
226
229
  # AGENTMARK_API_KEY=your_agentmark_api_key
227
230
  # AGENTMARK_APP_ID=your_agentmark_app_id
231
+ `;
232
+ return `${apiKeyName}=${apiKeyValue}
233
+ ${cloudEnvVars}
228
234
  # Learn more: https://docs.agentmark.co/platform/getting_started/quickstart
229
-
230
- ${apiKeyName}=${apiKeyValue}
231
235
  `;
232
236
  };
233
237
 
@@ -466,15 +470,7 @@ text_config:
466
470
  model_name: ${model}
467
471
  max_calls: 2
468
472
  tools:
469
- search_knowledgebase:
470
- description: Search the company knowledgebase for information about shipping, warranty, and returns policies.
471
- parameters:
472
- type: object
473
- properties:
474
- query:
475
- type: string
476
- description: The search query to find relevant information
477
- required: [query]
473
+ - search_knowledgebase
478
474
  test_settings:
479
475
  dataset: customer-query.jsonl
480
476
  props:
@@ -624,8 +620,9 @@ var createExamplePrompts = (model, targetPath = ".", adapter = "ai-sdk") => {
624
620
  // src/utils/examples/templates/user-client-config.ts
625
621
  var getClientConfigContent = (options) => {
626
622
  const { provider, adapter, deploymentMode = "cloud" } = options;
623
+ const isMastra = adapter === "mastra";
627
624
  const adapterConfig = getAdapterConfig(adapter, provider);
628
- const { modelRegistry, toolRegistry } = adapterConfig.classes;
625
+ const { modelRegistry } = adapterConfig.classes;
629
626
  const isClaudeAgentSdk = adapter === "claude-agent-sdk";
630
627
  const providerImport = isClaudeAgentSdk ? "" : `import { ${provider} } from '@ai-sdk/${provider}';`;
631
628
  const loaderImport = deploymentMode === "cloud" ? `import { ApiLoader } from "@agentmark-ai/loader-api";` : `import { ApiLoader } from "@agentmark-ai/loader-api";
@@ -684,64 +681,98 @@ const adapterOptions = {
684
681
  // allowedTools: ['Read', 'Write', 'Glob'],
685
682
  // disallowedTools: ['Bash'],
686
683
  };` : "";
687
- const createClientCall = isClaudeAgentSdk ? `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry, adapterOptions });` : `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry });`;
684
+ const toolImport = isClaudeAgentSdk ? `import { tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
685
+ import { z } from 'zod';` : isMastra ? `import { tool } from 'ai';
686
+ import type { ToolsInput } from '@mastra/core/agent';
687
+ import { z } from 'zod';` : `import { tool } from 'ai';
688
+ import type { Tool } from 'ai';
689
+ import { z } from 'zod';`;
690
+ const createClientCall = isClaudeAgentSdk ? `return createAgentMarkClient<AgentMarkTypes>({ loader, modelRegistry, evalRegistry, adapterOptions, mcpServers: { 'customer-support': customerSupportTools } });` : `return createAgentMarkClient<AgentMarkTypes>({ loader, modelRegistry, tools, evalRegistry });`;
691
+ const toolSchemaField = isMastra ? `parameters: z.object({ query: z.string().describe('The search query') })` : `inputSchema: z.object({ query: z.string().describe('The search query') })`;
692
+ const toolsReturnType = isMastra ? "ToolsInput" : "Record<string, Tool>";
693
+ const toolsSetup = isClaudeAgentSdk ? `
694
+ // Custom tools exposed as an MCP server \u2014 the SDK's native tool mechanism.
695
+ // The server name is used in mcpServers config; tool names are used in prompt files.
696
+ const knowledgeBase = tool(
697
+ 'search_knowledgebase',
698
+ 'Search the knowledge base for relevant articles',
699
+ { query: z.string().describe('The search query') },
700
+ async ({ query }) => ({
701
+ content: [{ type: 'text' as const, text: JSON.stringify({
702
+ articles: [
703
+ { topic: 'shipping', content: 'Standard shipping takes 3\u20135 business days.' },
704
+ { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },
705
+ { topic: 'returns', content: 'You can return items within 30 days of delivery.' },
706
+ ],
707
+ }) }],
708
+ })
709
+ );
710
+
711
+ const customerSupportTools = createSdkMcpServer({
712
+ name: 'customer-support',
713
+ tools: [knowledgeBase],
714
+ });` : `
715
+ function createTools(): ${toolsReturnType} {
716
+ return {
717
+ search_knowledgebase: tool({
718
+ description: 'Search the knowledge base for relevant articles',
719
+ ${toolSchemaField},
720
+ execute: async ({ query }) => {
721
+ // Simulate search delay
722
+ await new Promise(resolve => setTimeout(resolve, 500));
723
+
724
+ // Return all three knowledge base articles
725
+ // The LLM will select the relevant one based on the query
726
+ return {
727
+ articles: [
728
+ { topic: 'shipping', content: 'Standard shipping takes 3\u20135 business days.' },
729
+ { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },
730
+ { topic: 'returns', content: 'You can return items within 30 days of delivery.' }
731
+ ]
732
+ };
733
+ },
734
+ }),
735
+ };
736
+ }`;
737
+ const toolsVariable = isClaudeAgentSdk ? "" : ` const tools = createTools();`;
688
738
  return `// agentmark.client.ts
689
739
  import path from 'node:path';
690
740
  import dotenv from 'dotenv';
691
741
  dotenv.config({ path: path.resolve(__dirname, '.env') });
692
- import { createAgentMarkClient, ${modelRegistry}, ${toolRegistry}, EvalRegistry } from "${adapterConfig.package}";
742
+ import { createAgentMarkClient, ${modelRegistry} } from "${adapterConfig.package}";
743
+ import type { EvalRegistry } from "${adapterConfig.package}";
693
744
  ${loaderImport}
694
- import AgentMarkTypes, { Tools } from './agentmark.types';
745
+ import AgentMarkTypes from './agentmark.types';
695
746
  ${providerImport}
747
+ ${toolImport}
696
748
  ${adapterOptionsImport}
697
749
 
698
750
  ${modelRegistrySetup}
751
+ ${toolsSetup}
699
752
 
700
- function createToolRegistry() {
701
- const toolRegistry = new ${toolRegistry}<Tools>()
702
- .register('search_knowledgebase', async ({ query }) => {
703
- // Simulate search delay
704
- await new Promise(resolve => setTimeout(resolve, 500));
705
-
706
- // Return all three knowledge base articles
707
- // The LLM will select the relevant one based on the query
753
+ const evalRegistry: EvalRegistry = {
754
+ exact_match_json: ({ output, expectedOutput }) => {
755
+ if (!expectedOutput) {
756
+ return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };
757
+ }
758
+ try {
759
+ const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));
708
760
  return {
709
- articles: [
710
- { topic: 'shipping', content: 'Standard shipping takes 3\u20135 business days.' },
711
- { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },
712
- { topic: 'returns', content: 'You can return items within 30 days of delivery.' }
713
- ]
761
+ score: ok ? 1 : 0,
762
+ label: ok ? 'correct' : 'incorrect',
763
+ reason: ok ? 'Exact match' : 'Mismatch',
764
+ passed: ok
714
765
  };
715
- });
716
- return toolRegistry;
717
- }
718
-
719
- function createEvalRegistry() {
720
- const evalRegistry = new EvalRegistry()
721
- .register('exact_match_json', ({ output, expectedOutput }) => {
722
- if (!expectedOutput) {
723
- return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };
724
- }
725
- try {
726
- const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));
727
- return {
728
- score: ok ? 1 : 0,
729
- label: ok ? 'correct' : 'incorrect',
730
- reason: ok ? 'Exact match' : 'Mismatch',
731
- passed: ok
732
- };
733
- } catch (e) {
734
- return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };
735
- }
736
- });
737
- return evalRegistry;
738
- }
766
+ } catch (e) {
767
+ return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };
768
+ }
769
+ },
770
+ };
739
771
 
740
772
  function createClient() {
741
773
  ${loaderSetup}
742
774
  const modelRegistry = createModelRegistry();
743
- const toolRegistry = createToolRegistry();
744
- const evalRegistry = createEvalRegistry();
775
+ ${toolsVariable}
745
776
  ${createClientCall}
746
777
  }
747
778
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/examples/templates/adapters.ts","../../../../src/utils/examples/templates/app-index.ts","../../../../src/utils/examples/templates/env.ts","../../../../src/utils/examples/templates/package-setup.ts","../../../../src/utils/file-merge.ts","../../../../src/utils/types.ts","../../../../src/utils/examples/templates/tsconfig.ts","../../../../src/utils/examples/templates/animal-drawing-prompt.ts","../../../../src/utils/examples/templates/customer-support-prompt.ts","../../../../src/utils/examples/templates/party-planner-prompt.ts","../../../../src/utils/examples/templates/story-teller-prompt.ts","../../../../src/utils/examples/templates/datasets.ts","../../../../src/utils/examples/templates/example-prompts.ts","../../../../src/utils/examples/templates/user-client-config.ts"],"sourcesContent":["export interface AdapterConfig {\n /** npm package name for the adapter */\n package: string;\n /** Additional npm packages required by this adapter */\n dependencies: string[];\n /** Class names used in generated code */\n classes: {\n modelRegistry: string;\n toolRegistry: string;\n webhookHandler: string;\n };\n}\n\nexport const createAdapterConfig = (\n provider: string\n): Record<string, AdapterConfig> => {\n return {\n \"ai-sdk\": {\n package: \"@agentmark-ai/ai-sdk-v5-adapter\",\n dependencies: [\"ai@^5\", `@ai-sdk/${provider}@^2`],\n classes: {\n modelRegistry: \"VercelAIModelRegistry\",\n toolRegistry: \"VercelAIToolRegistry\",\n webhookHandler: \"VercelAdapterWebhookHandler\",\n },\n },\n mastra: {\n package: \"@agentmark-ai/mastra-v0-adapter\",\n dependencies: [\n \"@mastra/core@<0.20.0\",\n \"@mastra/mcp@<0.13.4\",\n `@ai-sdk/${provider}@<2`,\n ],\n classes: {\n modelRegistry: \"MastraModelRegistry\",\n toolRegistry: \"MastraToolRegistry\",\n webhookHandler: \"MastraAdapterWebhookHandler\",\n },\n },\n \"claude-agent-sdk\": {\n package: \"@agentmark-ai/claude-agent-sdk-adapter\",\n dependencies: [\"@anthropic-ai/claude-agent-sdk@^0.1.0\"],\n classes: {\n modelRegistry: \"ClaudeAgentModelRegistry\",\n toolRegistry: \"ClaudeAgentToolRegistry\",\n webhookHandler: \"ClaudeAgentWebhookHandler\",\n },\n },\n };\n};\n\nexport function getAdapterConfig(\n adapter: string,\n provider: string\n): AdapterConfig {\n const config = createAdapterConfig(provider)[adapter];\n if (!config) {\n throw new Error(\n `Unknown adapter: ${adapter}. Available adapters: ${Object.keys(\n createAdapterConfig(provider)\n ).join(\", \")}`\n );\n }\n return config;\n}\n","export const getIndexFileContent = (adapter: string = \"ai-sdk\", deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const tracingImport = `import { AgentMarkSDK } from \"@agentmark-ai/sdk\";\n`;\n\n const cloudTracingInit = `\n// Initialize tracing - traces will be sent to AgentMark Cloud\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: process.env.AGENTMARK_API_KEY ?? \"\",\n appId: process.env.AGENTMARK_APP_ID ?? \"\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const staticTracingInit = `\n// Initialize tracing - traces will be sent to local dev server\n// Make sure to run \"npm run agentmark dev\" in another terminal first\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: \"\",\n appId: \"\",\n baseUrl: \"http://localhost:9418\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `import \"dotenv/config\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { withTracing } from \"@agentmark-ai/claude-agent-sdk-adapter\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const adapted = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n // Execute with Claude Agent SDK using withTracing for telemetry\n // The adapted object contains { query, telemetry } ready for withTracing()\n const tracedResult = await withTracing(query, adapted);\n\n // traceId is available immediately\n console.log(\"Trace ID:\", tracedResult.traceId);\n\n let result = \"\";\n for await (const message of tracedResult) {\n if (message.type === \"result\" && message.subtype === \"success\") {\n result = message.result || \"\";\n }\n }\n\n return result;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else if (adapter === \"mastra\") {\n return `import \"dotenv/config\";\nimport { Agent } from \"@mastra/core/agent\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const agentConfig = await prompt.formatAgent({\n options: {\n telemetry,\n },\n });\n\n const [messages, generateOptions] = await agentConfig.formatMessages({\n props: {\n customer_question: customer_message,\n },\n });\n\n const agent = new Agent(agentConfig);\n const response = await agent.generate(messages, generateOptions);\n\n return (response as any).text || (response as any).content || String(response);\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else {\n return `import \"dotenv/config\";\nimport { generateText } from \"ai\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const vercelInput = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n const resp = await generateText(vercelInput);\n\n return resp.text;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n }\n};\n","export const getEnvFileContent = (\n _modelProvider: string,\n apiKey: string = '',\n adapter: string = 'ai-sdk'\n): string => {\n const apiKeyValue = apiKey || 'your_api_key_here';\n\n // Use ANTHROPIC_API_KEY for claude-agent-sdk adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n return `# Cloud deployment: Set these environment variables\n# AGENTMARK_BASE_URL=https://api.agentmark.co\n# AGENTMARK_API_KEY=your_agentmark_api_key\n# AGENTMARK_APP_ID=your_agentmark_app_id\n# Learn more: https://docs.agentmark.co/platform/getting_started/quickstart\n\n${apiKeyName}=${apiKeyValue}\n`;\n};\n","import fs from \"fs-extra\";\nimport { execSync } from \"child_process\";\nimport { getAdapterConfig } from \"./adapters.js\";\nimport { mergePackageJson } from \"../../file-merge.js\";\nimport { DEFAULT_PACKAGE_MANAGER } from \"../../types.js\";\nimport type { ProjectInfo, PackageManagerConfig } from \"../../types.js\";\n\nexport const setupPackageJson = (\n targetPath: string = \".\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null\n) => {\n const packageJsonPath = `${targetPath}/package.json`;\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log(\"Creating package.json...\");\n execSync(\"npm init -y\", { cwd: targetPath });\n }\n\n // For existing projects, use merge logic\n if (isExistingProject && fs.existsSync(packageJsonPath)) {\n // Build scripts to add - with namespacing for conflicts\n const scriptsToAdd: Record<string, string> = {\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n if (deploymentMode === \"static\") {\n scriptsToAdd[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n // Use mergePackageJson for existing projects\n const result = mergePackageJson(targetPath, {}, {}, scriptsToAdd);\n\n if (result.added.length > 0) {\n console.log(`✅ Added to package.json: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing in package.json: ${result.skipped.join(', ')}`);\n }\n if (result.warnings.length > 0) {\n result.warnings.forEach((w) => console.log(`⚠️ ${w}`));\n }\n } else {\n // Update the created package.json with additional information\n const pkgJson = fs.readJsonSync(packageJsonPath);\n pkgJson.name =\n pkgJson.name === \"test\" || !pkgJson.name\n ? \"agentmark-example-app\"\n : pkgJson.name;\n pkgJson.description =\n pkgJson.description || \"A simple Node.js app using the Agentmark SDK\";\n\n // Base scripts for all modes\n const scripts: Record<string, string> = {\n ...pkgJson.scripts,\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n // For static/self-hosted mode, add the build script\n if (deploymentMode === \"static\") {\n scripts[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n pkgJson.scripts = scripts;\n\n fs.writeJsonSync(packageJsonPath, pkgJson, { spaces: 2 });\n }\n};\n\nexport const installDependencies = (\n modelProvider: string,\n targetPath: string = \".\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n packageManager: PackageManagerConfig | null = null\n) => {\n console.log(\"Installing required packages...\");\n console.log(\"This might take a moment...\");\n\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n\n // Use detected package manager or default to npm\n const pm = packageManager || DEFAULT_PACKAGE_MANAGER;\n\n // npm needs --legacy-peer-deps due to some transitive dependency conflicts\n const npmSuffix = pm.name === 'npm' ? ' --legacy-peer-deps' : '';\n\n try {\n // Dev dependencies to install\n const devDeps = ['typescript', 'ts-node', '@types/node', '@agentmark-ai/cli'];\n\n // Install dev dependencies using detected package manager config\n const devDepsCmd = `${pm.addDevCmd} ${devDeps.join(' ')}${npmSuffix}`;\n\n console.log(`Using ${pm.name} to install dependencies...`);\n\n execSync(devDepsCmd, {\n stdio: \"inherit\",\n cwd: targetPath,\n });\n\n // Install the common packages\n // SDK is required for both local (connects to agentmark serve) and cloud (connects to API)\n // Loader packages are imported directly - ApiLoader always needed, FileLoader only for static mode\n const loaderPackages = deploymentMode === \"static\"\n ? [\"@agentmark-ai/loader-api\", \"@agentmark-ai/loader-file\"]\n : [\"@agentmark-ai/loader-api\"];\n\n const deps = [\n \"dotenv\",\n \"@agentmark-ai/prompt-core\",\n \"@agentmark-ai/sdk\",\n adapterConfig.package,\n ...loaderPackages,\n ...adapterConfig.dependencies,\n ];\n\n // Install regular dependencies using detected package manager config\n const depsCmd = `${pm.addCmd} ${deps.join(' ')}${npmSuffix}`;\n\n execSync(depsCmd, { stdio: \"inherit\", cwd: targetPath });\n\n console.log(\"Packages installed successfully!\");\n } catch (error) {\n console.error(\"Error installing packages:\", error);\n throw new Error(\n \"Failed to install required packages. Please check your network connection and try again.\"\n );\n }\n};\n","/**\n * File merge utilities for handling existing files during initialization.\n * Supports merging package.json, appending to .gitignore and .env files.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport type { MergeResult } from './types.js';\n\n/**\n * Merge AgentMark dependencies and scripts into an existing package.json.\n * Preserves all existing content, only adds missing AgentMark entries.\n */\nexport function mergePackageJson(\n targetPath: string,\n agentmarkDeps: Record<string, string>,\n agentmarkDevDeps: Record<string, string>,\n agentmarkScripts: Record<string, string>\n): MergeResult {\n const packageJsonPath = path.join(targetPath, 'package.json');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n // Read existing package.json\n if (!fs.existsSync(packageJsonPath)) {\n result.warnings.push('No existing package.json found');\n return result;\n }\n\n const existing = fs.readJsonSync(packageJsonPath) as Record<string, unknown>;\n\n // Initialize sections if they don't exist\n if (!existing.dependencies) {\n existing.dependencies = {};\n }\n if (!existing.devDependencies) {\n existing.devDependencies = {};\n }\n if (!existing.scripts) {\n existing.scripts = {};\n }\n\n const deps = existing.dependencies as Record<string, string>;\n const devDeps = existing.devDependencies as Record<string, string>;\n const scripts = existing.scripts as Record<string, string>;\n\n // Add AgentMark dependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDeps)) {\n if (deps[pkg]) {\n result.skipped.push(`dependency: ${pkg} (already exists)`);\n } else {\n deps[pkg] = version;\n result.added.push(`dependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark devDependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDevDeps)) {\n if (devDeps[pkg]) {\n result.skipped.push(`devDependency: ${pkg} (already exists)`);\n } else {\n devDeps[pkg] = version;\n result.added.push(`devDependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark scripts (use namespace if conflict exists)\n for (const [scriptName, scriptCmd] of Object.entries(agentmarkScripts)) {\n if (scripts[scriptName]) {\n // Conflict - use namespaced script name\n const namespacedName = `agentmark:${scriptName}`;\n if (scripts[namespacedName]) {\n // Both the original and namespaced version exist - skip with warning\n result.skipped.push(`script: ${scriptName}`);\n result.warnings.push(\n `Script \"${scriptName}\" and \"${namespacedName}\" both already exist. Skipping.`\n );\n } else {\n scripts[namespacedName] = scriptCmd;\n result.added.push(`script: ${namespacedName} (namespaced due to conflict)`);\n result.warnings.push(\n `Script \"${scriptName}\" already exists. Added as \"${namespacedName}\" instead.`\n );\n }\n } else {\n scripts[scriptName] = scriptCmd;\n result.added.push(`script: ${scriptName}`);\n }\n }\n\n // Write merged package.json\n fs.writeJsonSync(packageJsonPath, existing, { spaces: 2 });\n\n result.success = true;\n result.content = JSON.stringify(existing, null, 2);\n return result;\n } catch (error) {\n result.warnings.push(`Error merging package.json: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark entries to an existing .gitignore file.\n * Checks for duplicates before adding.\n */\nexport function appendGitignore(targetPath: string, entries: string[]): MergeResult {\n const gitignorePath = path.join(targetPath, '.gitignore');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(gitignorePath)) {\n existingContent = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n // Parse existing entries (normalize trailing slashes)\n const existingEntries = new Set(\n existingContent\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .map((line) => line.replace(/\\/$/, '')) // Remove trailing slashes for comparison\n );\n\n const entriesToAdd: string[] = [];\n\n for (const entry of entries) {\n const normalizedEntry = entry.replace(/\\/$/, '');\n if (existingEntries.has(normalizedEntry)) {\n result.skipped.push(entry);\n } else {\n entriesToAdd.push(entry);\n result.added.push(entry);\n }\n }\n\n if (entriesToAdd.length > 0) {\n // Add a header comment and the new entries\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n newContent += entriesToAdd.join('\\n');\n newContent += '\\n';\n\n fs.writeFileSync(gitignorePath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .gitignore: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark environment variables to an existing .env file.\n * Does not overwrite existing keys.\n */\nexport function appendEnv(\n targetPath: string,\n envVars: Record<string, string>\n): MergeResult {\n const envPath = path.join(targetPath, '.env');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(envPath)) {\n existingContent = fs.readFileSync(envPath, 'utf-8');\n }\n\n // Parse existing keys\n const existingKeys = new Set<string>();\n const lines = existingContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([^=]+)=/);\n if (match && match[1]) {\n existingKeys.add(match[1]);\n }\n }\n }\n\n const varsToAdd: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n if (existingKeys.has(key)) {\n result.skipped.push(key);\n } else {\n varsToAdd.push([key, value]);\n result.added.push(key);\n }\n }\n\n if (varsToAdd.length > 0) {\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n for (const [key, value] of varsToAdd) {\n newContent += `${key}=${value}\\n`;\n }\n\n fs.writeFileSync(envPath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .env: ${error}`);\n return result;\n }\n}\n\n/**\n * Check if a file should be skipped based on existing project detection.\n * Used for files like index.ts that should never be generated in existing projects.\n */\nexport function shouldSkipFile(\n fileName: string,\n isExistingProject: boolean,\n skipFiles: string[]\n): boolean {\n if (!isExistingProject) {\n return false;\n }\n return skipFiles.includes(fileName);\n}\n","/**\n * Type definitions for existing repository initialization.\n * These types support project detection, conflict resolution, and package manager handling.\n */\n\n/** Supported package managers for TypeScript projects */\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/** Configuration for a specific package manager */\nexport interface PackageManagerConfig {\n /** Package manager name */\n name: PackageManager;\n /** Lock file that indicates this package manager is in use */\n lockFile: string;\n /** Command to install all dependencies */\n installCmd: string;\n /** Command to add a production dependency */\n addCmd: string;\n /** Command to add a dev dependency */\n addDevCmd: string;\n /** Command prefix for running scripts (e.g., 'npm run', 'yarn') */\n runCmd: string;\n}\n\n/** Package manager configurations indexed by lock file name */\nexport const PACKAGE_MANAGERS: Record<string, PackageManagerConfig> = {\n 'yarn.lock': {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCmd: 'yarn install',\n addCmd: 'yarn add',\n addDevCmd: 'yarn add --dev',\n runCmd: 'yarn',\n },\n 'pnpm-lock.yaml': {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCmd: 'pnpm install',\n addCmd: 'pnpm add',\n addDevCmd: 'pnpm add --save-dev',\n runCmd: 'pnpm',\n },\n 'bun.lockb': {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCmd: 'bun install',\n addCmd: 'bun add',\n addDevCmd: 'bun add --dev',\n runCmd: 'bun run',\n },\n 'package-lock.json': {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCmd: 'npm install',\n addCmd: 'npm install',\n addDevCmd: 'npm install --save-dev',\n runCmd: 'npm run',\n },\n};\n\n/** Default package manager when no lock file is found */\nexport const DEFAULT_PACKAGE_MANAGER: PackageManagerConfig = PACKAGE_MANAGERS['package-lock.json']!;\n\n/** Information about a detected Python virtual environment */\nexport interface PythonVenvInfo {\n /** Absolute path to the venv directory */\n path: string;\n /** Relative name (e.g., '.venv' or 'venv') */\n name: string;\n /** Platform-specific activate command */\n activateCmd: string;\n /** Platform-specific pip path */\n pipPath: string;\n}\n\n/** Type of file for determining merge strategy */\nexport type FileType = 'config' | 'source' | 'directory' | 'dotfile';\n\n/** Resolution strategy for a conflicting file */\nexport type ConflictStrategy = 'merge' | 'append' | 'prompt' | 'skip';\n\n/** Represents a file that may conflict with AgentMark initialization */\nexport interface ConflictFile {\n /** Relative path from project root */\n path: string;\n /** Type of file for determining merge strategy */\n type: FileType;\n /** Recommended resolution strategy */\n strategy: ConflictStrategy;\n}\n\n/** Files that may conflict with AgentMark initialization */\nexport const CONFLICT_FILES: ConflictFile[] = [\n { path: 'agentmark.json', type: 'config', strategy: 'prompt' },\n { path: 'agentmark', type: 'directory', strategy: 'prompt' },\n { path: 'agentmark.client.ts', type: 'source', strategy: 'prompt' },\n { path: 'agentmark_client.py', type: 'source', strategy: 'prompt' },\n { path: '.gitignore', type: 'dotfile', strategy: 'append' },\n { path: '.env', type: 'dotfile', strategy: 'append' },\n { path: 'package.json', type: 'config', strategy: 'merge' },\n { path: 'index.ts', type: 'source', strategy: 'skip' },\n { path: 'main.py', type: 'source', strategy: 'skip' },\n { path: 'tsconfig.json', type: 'config', strategy: 'skip' },\n { path: 'pyproject.toml', type: 'config', strategy: 'skip' },\n];\n\n/** User's resolution choice for a conflict */\nexport type ConflictAction = 'skip' | 'overwrite' | 'merge';\n\n/** A conflict resolution decision from the user */\nexport interface ConflictResolution {\n /** Path to the conflicting file */\n path: string;\n /** Action chosen by the user */\n action: ConflictAction;\n}\n\n/** Detected information about an existing project */\nexport interface ProjectInfo {\n /** Whether any project indicators were found */\n isExistingProject: boolean;\n /** Detected project type */\n type: 'typescript' | 'python' | 'unknown';\n /** Detected package manager (for TypeScript projects) */\n packageManager: PackageManagerConfig;\n /** Files that exist and may conflict */\n conflictingFiles: ConflictFile[];\n /** Whether the agentmark/ directory already exists */\n hasAgentmarkDir: boolean;\n /** Whether an existing Python venv was detected */\n pythonVenv: PythonVenvInfo | null;\n}\n\n/** Result of a file merge operation */\nexport interface MergeResult {\n /** Whether the merge was successful */\n success: boolean;\n /** The merged content (if applicable) */\n content?: string;\n /** Any warnings generated during merge */\n warnings: string[];\n /** What was added (for user feedback) */\n added: string[];\n /** What was skipped (already present) */\n skipped: string[];\n}\n\n/** Extended options for initialization in existing projects */\nexport interface InitOptions {\n /** Target directory path */\n targetPath: string;\n /** Selected language */\n language: 'typescript' | 'python';\n /** Selected adapter (TypeScript only) */\n adapter?: string;\n /** Deployment mode */\n deploymentMode: 'cloud' | 'static';\n /** API key (if provided) */\n apiKey?: string;\n /** IDE client for MCP setup */\n client: string;\n /** Detected project info (null if new project) */\n projectInfo: ProjectInfo | null;\n /** User's conflict resolutions */\n conflictResolutions: ConflictResolution[];\n}\n","export const getTsConfigContent = (): object => {\n return {\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n };\n}; ","export const getAnimalDrawingPrompt = (): string => {\n return `---\nname: animal-drawing\nimage_config:\n model_name: openai/dall-e-3\n num_images: 1\n size: 1024x1024\n aspect_ratio: 1:1\ntest_settings:\n dataset: animal.jsonl\n props:\n animal: \"cat\"\n---\n\n<ImagePrompt>\nDraw a hyper-realistic picture of a {props.animal}\n</ImagePrompt>`;\n};","export const getCustomerSupportPrompt = (model: string): string => {\n return `---\nname: customer-support-agent\ntext_config:\n model_name: ${model}\n max_calls: 2\n tools:\n search_knowledgebase:\n description: Search the company knowledgebase for information about shipping, warranty, and returns policies.\n parameters:\n type: object\n properties:\n query:\n type: string\n description: The search query to find relevant information\n required: [query]\ntest_settings:\n dataset: customer-query.jsonl\n props:\n customer_question: \"I'm having trouble with my order. How long does shipping take?\"\ninput_schema:\n type: object\n properties:\n customer_question:\n type: string\n description: \"The customer's question\"\n required:\n - customer_question\n---\n\n<System>\nYou are a customer service agent for a company that sells products online. You are given a customer's question and you need to respond to the customer. You need to be friendly, professional, and helpful.\n\nYou have access to the following tool:\n- search_knowledgebase: Search the company knowledgebase for information about shipping, warranty, and returns. Use this when customers ask about these topics.\n</System>\n\n<User>{props.customer_question}</User>`;\n};","export const getPartyPlannerPrompt = (model: string): string => {\n return `---\nname: party-planner\nobject_config:\n model_name: ${model}\n schema:\n type: object\n properties:\n names:\n type: array\n description: \"List of names of people attending the party.\"\n items:\n type: string\n required:\n - names\ntest_settings:\n dataset: party.jsonl\n evals:\n - exact_match_json\n props:\n party_text: \"We're having a party with Alice, Bob, and Carol.\"\ninput_schema:\n type: object\n properties:\n party_text:\n type: string\n description: \"A block of text describing the upcoming party and attendees.\"\n required:\n - party_text\n---\n\n<System>\nExtract the names of all people attending the party from the following text. Respond with a list of names only.\n</System>\n\n<User>\nText: {props.party_text}\n</User>`;\n};","export const getStoryTellerPrompt = (): string => {\n return `---\nname: story-teller\nspeech_config:\n model_name: openai/tts-1-hd\n voice: \"nova\"\n speed: 1.0\n output_format: \"mp3\"\ntest_settings:\n dataset: story.jsonl\n props:\n story: \"Once upon a time, there was a cat who loved to play with a ball.\"\n---\n\n<System>\nYou are a storyteller for children. Make sure your story is engaging and interesting.\n</System>\n\n<SpeechPrompt>\n- {props.story}\n</SpeechPrompt>`;\n};","export const getAnimalDataset = (): string => {\n return `{\"input\": {\"animal\": \"cat\"}, \"expected_output\": \"A realistic picture of a cat\"}\n{\"input\": {\"animal\": \"dog\"}, \"expected_output\": \"A realistic picture of a dog\"}\n{\"input\": {\"animal\": \"bird\"}, \"expected_output\": \"A realistic picture of a bird\"}`;\n};\n\nexport const getCustomerQueryDataset = (): string => {\n return `{\"input\": {\"customer_question\": \"My package hasn't arrived yet. Can you help me track it?\"}}\n{\"input\": {\"customer_question\": \"I received the wrong item in my order. What should I do?\"}}\n{\"input\": {\"customer_question\": \"How do I return a product that I purchased last week?\"}}`;\n};\n\nexport const getPartyDataset = (): string => {\n return `{\"input\": {\"party_text\": \"We're having a party with Alice, Bob, and Carol.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Alice\\\\\", \\\\\"Bob\\\\\", \\\\\"Carol\\\\\"]}\"}\n{\"input\": {\"party_text\": \"The guest list includes Dave, Emma, and Frank.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Dave\\\\\", \\\\\"Emma\\\\\", \\\\\"Frank\\\\\"]}\"}\n{\"input\": {\"party_text\": \"Join us for a celebration with Grace, Henry, and Isla.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Grace\\\\\", \\\\\"Henry\\\\\", \\\\\"Isla\\\\\"]}\"}`;\n};\n\nexport const getStoryDataset = (): string => {\n return `{\"input\": {\"story\": \"Once upon a time, the Moon woke up and found her glow missing! She floated around the sky asking stars, clouds, and even comets if they'd seen her light. It wasn't until she peeked into a mountain lake that she saw her glow shining back—hidden in her own reflection! Laughing, she realized she had never lost it—it was with her all along, just hiding beneath a cloudy sky.\"}}\n{\"input\": {\"story\": \"Benny was no ordinary banana—he dreamed of becoming a superhero. One day, when a monkey slipped in the jungle and cried for help, Benny rolled into action, dodging vines and swinging from branches using his peel like a lasso. The monkey was saved, and from that day on, Benny was known as \\\\\"The Peel of Justice,\\\\\" the bravest fruit in the whole rainforest.\"}}\n{\"input\": {\"story\": \"In the town of Maplebrook, there was a library that whispered stories when no one was looking. Curious little Nia tiptoed in one rainy day and heard the books giggling softly. She opened one called The Secret Tunnel, and to her surprise, it sucked her in! She found herself riding a dragon through glittering caves. When she returned, the book winked shut—waiting for its next reader to listen.\"}}`;\n};","import fs from 'fs-extra';\nimport { getAnimalDrawingPrompt } from './animal-drawing-prompt.js';\nimport { getCustomerSupportPrompt } from './customer-support-prompt.js';\nimport { getPartyPlannerPrompt } from './party-planner-prompt.js';\nimport { getStoryTellerPrompt } from './story-teller-prompt.js';\nimport { getAnimalDataset, getCustomerQueryDataset, getPartyDataset, getStoryDataset } from './datasets.js';\n\n/**\n * Creates example prompt files and returns the list of model IDs they use.\n * The returned array is the authoritative source for `builtInModels` in agentmark.json —\n * it reflects exactly which models were written, so the two can never drift apart.\n */\nexport const createExamplePrompts = (model: string, targetPath: string = \".\", adapter: string = \"ai-sdk\"): string[] => {\n // Ensure the templates directory exists\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n const noImageSupport = [\"mastra\", \"claude-agent-sdk\", \"pydantic-ai\"];\n const noSpeechSupport = [\"mastra\", \"claude-agent-sdk\", \"pydantic-ai\"];\n const skipImagePrompts = noImageSupport.includes(adapter);\n const skipSpeechPrompts = noSpeechSupport.includes(adapter);\n\n const usedModels: string[] = [];\n\n // Create animal drawing prompt and dataset (uses image_config - skip for unsupported adapters)\n if (!skipImagePrompts) {\n const animalDrawingPrompt = getAnimalDrawingPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/animal-drawing.prompt.mdx`, animalDrawingPrompt);\n const animalDataset = getAnimalDataset();\n fs.writeFileSync(`${targetPath}/agentmark/animal.jsonl`, animalDataset);\n usedModels.push('openai/dall-e-3');\n }\n\n // Create customer support prompt and dataset\n const customerSupportPrompt = getCustomerSupportPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/customer-support-agent.prompt.mdx`, customerSupportPrompt);\n const customerQueryDataset = getCustomerQueryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/customer-query.jsonl`, customerQueryDataset);\n usedModels.push(model);\n\n // Create party planner prompt and dataset\n const partyPlannerPrompt = getPartyPlannerPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/party-planner.prompt.mdx`, partyPlannerPrompt);\n const partyDataset = getPartyDataset();\n fs.writeFileSync(`${targetPath}/agentmark/party.jsonl`, partyDataset);\n\n // Create story teller prompt and dataset (uses speech_config - skip for unsupported adapters)\n if (!skipSpeechPrompts) {\n const storyTellerPrompt = getStoryTellerPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/story-teller.prompt.mdx`, storyTellerPrompt);\n const storyDataset = getStoryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/story.jsonl`, storyDataset);\n usedModels.push('openai/tts-1-hd');\n }\n\n // Deduplicate in case the language model appears under multiple prompts\n return [...new Set(usedModels)];\n};","import { getAdapterConfig } from \"./adapters.js\";\n\nexport const getClientConfigContent = (options: { provider: string; adapter: string; deploymentMode?: \"cloud\" | \"static\" }) => {\n const { provider, adapter, deploymentMode = \"cloud\" } = options;\n const adapterConfig = getAdapterConfig(adapter, provider);\n const { modelRegistry, toolRegistry } = adapterConfig.classes;\n\n // Claude Agent SDK doesn't use @ai-sdk provider imports\n const isClaudeAgentSdk = adapter === \"claude-agent-sdk\";\n const providerImport = isClaudeAgentSdk ? '' : `import { ${provider} } from '@ai-sdk/${provider}';`;\n\n // Import loaders from dedicated packages\n const loaderImport = deploymentMode === \"cloud\"\n ? `import { ApiLoader } from \"@agentmark-ai/loader-api\";`\n : `import { ApiLoader } from \"@agentmark-ai/loader-api\";\nimport { FileLoader } from \"@agentmark-ai/loader-file\";`;\n\n const loaderSetup = deploymentMode === \"cloud\"\n ? ` // ApiLoader works for both development and production\n // - Development: 'agentmark dev' sets AGENTMARK_BASE_URL to localhost\n // - Production: Set AGENTMARK_API_KEY and AGENTMARK_APP_ID for cloud\n const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : ApiLoader.cloud({\n apiKey: process.env.AGENTMARK_API_KEY!,\n appId: process.env.AGENTMARK_APP_ID!,\n });`\n : ` const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : new FileLoader('./dist/agentmark');`;\n\n // Claude Agent SDK model registry setup is different\n const modelRegistrySetup = isClaudeAgentSdk\n ? `function createModelRegistry() {\n // Claude Agent SDK accepts model names directly.\n // Use createDefault() for simple pass-through of model names.\n const modelRegistry = ${modelRegistry}.createDefault();\n\n // To configure specific models (e.g., extended thinking), use:\n // const modelRegistry = new ${modelRegistry}()\n // .registerModels(/claude-.*-thinking/, (name) => ({\n // model: name,\n // maxThinkingTokens: 10000, // Enable extended thinking\n // }))\n // .registerModels(\"claude-sonnet-4-20250514\", (name) => ({ model: name }));\n\n return modelRegistry;\n}`\n : `function createModelRegistry() {\n const modelRegistry = new ${modelRegistry}()\n .registerProviders({ ${provider} });\n return modelRegistry;\n}`;\n\n // Claude Agent SDK adapter options\n const adapterOptionsImport = isClaudeAgentSdk\n ? `\n// Claude Agent SDK adapter options\n// See: https://github.com/anthropics/claude-agent-sdk\nconst adapterOptions = {\n // Permission mode controls tool access:\n // - 'default': Requires user approval for each tool use\n // - 'acceptEdits': Auto-approve file edits only\n // - 'bypassPermissions': Auto-approve all tools (use for automated pipelines)\n // - 'plan': Planning mode only, no tool execution\n permissionMode: 'bypassPermissions' as const,\n\n // Maximum conversation turns before stopping\n maxTurns: 20,\n\n // Optional: Set working directory for file operations\n // cwd: process.cwd(),\n\n // Optional: Budget limit in USD\n // maxBudgetUsd: 10.00,\n\n // Optional: Restrict which tools the agent can use\n // allowedTools: ['Read', 'Write', 'Glob'],\n // disallowedTools: ['Bash'],\n};`\n : '';\n\n const createClientCall = isClaudeAgentSdk\n ? `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry, adapterOptions });`\n : `return createAgentMarkClient<AgentMarkTypes, typeof toolRegistry>({ loader, modelRegistry, toolRegistry, evalRegistry });`;\n\n return `// agentmark.client.ts\nimport path from 'node:path';\nimport dotenv from 'dotenv';\ndotenv.config({ path: path.resolve(__dirname, '.env') });\nimport { createAgentMarkClient, ${modelRegistry}, ${toolRegistry}, EvalRegistry } from \"${adapterConfig.package}\";\n${loaderImport}\nimport AgentMarkTypes, { Tools } from './agentmark.types';\n${providerImport}\n${adapterOptionsImport}\n\n${modelRegistrySetup}\n\nfunction createToolRegistry() {\n const toolRegistry = new ${toolRegistry}<Tools>()\n .register('search_knowledgebase', async ({ query }) => {\n // Simulate search delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Return all three knowledge base articles\n // The LLM will select the relevant one based on the query\n return {\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' }\n ]\n };\n });\n return toolRegistry;\n}\n\nfunction createEvalRegistry() {\n const evalRegistry = new EvalRegistry()\n .register('exact_match_json', ({ output, expectedOutput }) => {\n if (!expectedOutput) {\n return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };\n }\n try {\n const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));\n return {\n score: ok ? 1 : 0,\n label: ok ? 'correct' : 'incorrect',\n reason: ok ? 'Exact match' : 'Mismatch',\n passed: ok\n };\n } catch (e) {\n return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };\n }\n });\n return evalRegistry;\n}\n\nfunction createClient() {\n${loaderSetup}\n const modelRegistry = createModelRegistry();\n const toolRegistry = createToolRegistry();\n const evalRegistry = createEvalRegistry();\n ${createClientCall}\n}\n\nexport const client = createClient();\n`;\n};\n"],"mappings":"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","names":["fs","fs","fs","fs"]}
1
+ {"version":3,"sources":["../../../../src/utils/examples/templates/adapters.ts","../../../../src/utils/examples/templates/app-index.ts","../../../../src/utils/examples/templates/env.ts","../../../../src/utils/examples/templates/package-setup.ts","../../../../src/utils/file-merge.ts","../../../../src/utils/types.ts","../../../../src/utils/examples/templates/tsconfig.ts","../../../../src/utils/examples/templates/animal-drawing-prompt.ts","../../../../src/utils/examples/templates/customer-support-prompt.ts","../../../../src/utils/examples/templates/party-planner-prompt.ts","../../../../src/utils/examples/templates/story-teller-prompt.ts","../../../../src/utils/examples/templates/datasets.ts","../../../../src/utils/examples/templates/example-prompts.ts","../../../../src/utils/examples/templates/user-client-config.ts"],"sourcesContent":["export interface AdapterConfig {\n /** npm package name for the adapter */\n package: string;\n /** Additional npm packages required by this adapter */\n dependencies: string[];\n /** Class names used in generated code */\n classes: {\n modelRegistry: string;\n webhookHandler: string;\n };\n}\n\nexport const createAdapterConfig = (\n provider: string\n): Record<string, AdapterConfig> => {\n return {\n \"ai-sdk\": {\n package: \"@agentmark-ai/ai-sdk-v5-adapter\",\n dependencies: [\"ai@^5\", `@ai-sdk/${provider}@^2`],\n classes: {\n modelRegistry: \"VercelAIModelRegistry\",\n webhookHandler: \"VercelAdapterWebhookHandler\",\n },\n },\n mastra: {\n package: \"@agentmark-ai/mastra-v0-adapter\",\n dependencies: [\n \"@mastra/core@<0.20.0\",\n \"@mastra/mcp@<0.13.4\",\n `@ai-sdk/${provider}@<2`,\n \"ai@^4\",\n ],\n classes: {\n modelRegistry: \"MastraModelRegistry\",\n webhookHandler: \"MastraAdapterWebhookHandler\",\n },\n },\n \"claude-agent-sdk\": {\n package: \"@agentmark-ai/claude-agent-sdk-adapter\",\n dependencies: [\"@anthropic-ai/claude-agent-sdk@^0.1.0\"],\n classes: {\n modelRegistry: \"ClaudeAgentModelRegistry\",\n webhookHandler: \"ClaudeAgentWebhookHandler\",\n },\n },\n };\n};\n\nexport function getAdapterConfig(\n adapter: string,\n provider: string\n): AdapterConfig {\n const config = createAdapterConfig(provider)[adapter];\n if (!config) {\n throw new Error(\n `Unknown adapter: ${adapter}. Available adapters: ${Object.keys(\n createAdapterConfig(provider)\n ).join(\", \")}`\n );\n }\n return config;\n}\n","export const getIndexFileContent = (adapter: string = \"ai-sdk\", deploymentMode: \"cloud\" | \"static\" = \"cloud\"): string => {\n const isCloud = deploymentMode === \"cloud\";\n\n const tracingImport = `import { AgentMarkSDK } from \"@agentmark-ai/sdk\";\n`;\n\n const cloudTracingInit = `\n// Initialize tracing - traces will be sent to AgentMark Cloud\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: process.env.AGENTMARK_API_KEY ?? \"\",\n appId: process.env.AGENTMARK_APP_ID ?? \"\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const staticTracingInit = `\n// Initialize tracing - traces will be sent to local dev server\n// Make sure to run \"npm run agentmark dev\" in another terminal first\n// To disable tracing, comment out sdk.initTracing() below\nconst sdk = new AgentMarkSDK({\n apiKey: \"\",\n appId: \"\",\n baseUrl: \"http://localhost:9418\",\n});\nsdk.initTracing({ disableBatch: true });\n`;\n\n const tracingInit = isCloud ? cloudTracingInit : staticTracingInit;\n\n if (adapter === \"claude-agent-sdk\") {\n return `import \"dotenv/config\";\nimport { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { withTracing } from \"@agentmark-ai/claude-agent-sdk-adapter\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const adapted = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n // Execute with Claude Agent SDK using withTracing for telemetry\n // The adapted object contains { query, telemetry } ready for withTracing()\n const tracedResult = await withTracing(query, adapted);\n\n // traceId is available immediately\n console.log(\"Trace ID:\", tracedResult.traceId);\n\n let result = \"\";\n for await (const message of tracedResult) {\n if (message.type === \"result\" && message.subtype === \"success\") {\n result = message.result || \"\";\n }\n }\n\n return result;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else if (adapter === \"mastra\") {\n return `import \"dotenv/config\";\nimport { Agent } from \"@mastra/core/agent\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const agentConfig = await prompt.formatAgent({\n options: {\n telemetry,\n },\n });\n\n const [messages, generateOptions] = await agentConfig.formatMessages({\n props: {\n customer_question: customer_message,\n },\n });\n\n const agent = new Agent(agentConfig);\n const response = await agent.generate(messages, generateOptions);\n\n return (response as any).text || (response as any).content || String(response);\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n } else {\n return `import \"dotenv/config\";\nimport { generateText } from \"ai\";\n${tracingImport}import { client } from \"./agentmark.client\";\n${tracingInit}\nconst telemetry = {\n isEnabled: true,\n metadata: {\n trace_name: \"customer-support\",\n user_id: \"user-123\",\n session_id: \"session-123\",\n session_name: \"my-first-session\",\n },\n};\n\nconst runCustomerSupport = async (customer_message: string) => {\n const prompt = await client.loadTextPrompt(\"customer-support-agent\");\n const vercelInput = await prompt.format({\n props: {\n customer_question: customer_message,\n },\n telemetry,\n });\n\n const resp = await generateText(vercelInput);\n\n return resp.text;\n};\n\nconst main = async () => {\n try {\n const user_message = \"How long does shipping take?\";\n const assistant = await runCustomerSupport(user_message);\n console.log(\"Customer support response:\", assistant);\n } catch (error) {\n console.error(error);\n }\n};\n\nmain();\n`;\n }\n};\n","export const getEnvFileContent = (\n _modelProvider: string,\n apiKey: string = '',\n adapter: string = 'ai-sdk',\n deploymentMode: 'cloud' | 'static' = 'cloud'\n): string => {\n const apiKeyValue = apiKey || 'your_api_key_here';\n\n // Use ANTHROPIC_API_KEY for claude-agent-sdk adapter\n const apiKeyName = adapter === 'claude-agent-sdk' ? 'ANTHROPIC_API_KEY' : 'OPENAI_API_KEY';\n\n const cloudEnvVars = deploymentMode === 'cloud'\n ? `\n# AgentMark Cloud — required for managed deployments\nAGENTMARK_API_KEY=your_agentmark_api_key\nAGENTMARK_APP_ID=your_agentmark_app_id\n`\n : `\n# Cloud deployment: Set these environment variables\n# AGENTMARK_BASE_URL=https://api.agentmark.co\n# AGENTMARK_API_KEY=your_agentmark_api_key\n# AGENTMARK_APP_ID=your_agentmark_app_id\n`;\n\n return `${apiKeyName}=${apiKeyValue}\n${cloudEnvVars}\n# Learn more: https://docs.agentmark.co/platform/getting_started/quickstart\n`;\n};\n","import fs from \"fs-extra\";\nimport { execSync } from \"child_process\";\nimport { getAdapterConfig } from \"./adapters.js\";\nimport { mergePackageJson } from \"../../file-merge.js\";\nimport { DEFAULT_PACKAGE_MANAGER } from \"../../types.js\";\nimport type { ProjectInfo, PackageManagerConfig } from \"../../types.js\";\n\nexport const setupPackageJson = (\n targetPath: string = \".\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n projectInfo: ProjectInfo | null = null\n) => {\n const packageJsonPath = `${targetPath}/package.json`;\n const isExistingProject = projectInfo?.isExistingProject ?? false;\n\n if (!fs.existsSync(packageJsonPath)) {\n console.log(\"Creating package.json...\");\n execSync(\"npm init -y\", { cwd: targetPath });\n }\n\n // For existing projects, use merge logic\n if (isExistingProject && fs.existsSync(packageJsonPath)) {\n // Build scripts to add - with namespacing for conflicts\n const scriptsToAdd: Record<string, string> = {\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n if (deploymentMode === \"static\") {\n scriptsToAdd[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n // Use mergePackageJson for existing projects\n const result = mergePackageJson(targetPath, {}, {}, scriptsToAdd);\n\n if (result.added.length > 0) {\n console.log(`✅ Added to package.json: ${result.added.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n console.log(`⏭️ Skipped existing in package.json: ${result.skipped.join(', ')}`);\n }\n if (result.warnings.length > 0) {\n result.warnings.forEach((w) => console.log(`⚠️ ${w}`));\n }\n } else {\n // Update the created package.json with additional information\n const pkgJson = fs.readJsonSync(packageJsonPath);\n pkgJson.name =\n pkgJson.name === \"test\" || !pkgJson.name\n ? \"agentmark-example-app\"\n : pkgJson.name;\n pkgJson.description =\n pkgJson.description || \"A simple Node.js app using the Agentmark SDK\";\n\n // Base scripts for all modes\n const scripts: Record<string, string> = {\n ...pkgJson.scripts,\n \"demo\": \"npx tsx index.ts\",\n \"agentmark\": \"agentmark\",\n };\n\n // For static/self-hosted mode, add the build script\n if (deploymentMode === \"static\") {\n scripts[\"build\"] = \"agentmark build --out dist/agentmark\";\n }\n\n pkgJson.scripts = scripts;\n\n fs.writeJsonSync(packageJsonPath, pkgJson, { spaces: 2 });\n }\n};\n\nexport const installDependencies = (\n modelProvider: string,\n targetPath: string = \".\",\n adapter: string = \"ai-sdk\",\n deploymentMode: \"cloud\" | \"static\" = \"cloud\",\n packageManager: PackageManagerConfig | null = null\n) => {\n console.log(\"Installing required packages...\");\n console.log(\"This might take a moment...\");\n\n const adapterConfig = getAdapterConfig(adapter, modelProvider);\n\n // Use detected package manager or default to npm\n const pm = packageManager || DEFAULT_PACKAGE_MANAGER;\n\n // npm needs --legacy-peer-deps due to some transitive dependency conflicts\n const npmSuffix = pm.name === 'npm' ? ' --legacy-peer-deps' : '';\n\n try {\n // Dev dependencies to install\n const devDeps = ['typescript', 'ts-node', '@types/node', '@agentmark-ai/cli'];\n\n // Install dev dependencies using detected package manager config\n const devDepsCmd = `${pm.addDevCmd} ${devDeps.join(' ')}${npmSuffix}`;\n\n console.log(`Using ${pm.name} to install dependencies...`);\n\n execSync(devDepsCmd, {\n stdio: \"inherit\",\n cwd: targetPath,\n });\n\n // Install the common packages\n // SDK is required for both local (connects to agentmark serve) and cloud (connects to API)\n // Loader packages are imported directly - ApiLoader always needed, FileLoader only for static mode\n const loaderPackages = deploymentMode === \"static\"\n ? [\"@agentmark-ai/loader-api\", \"@agentmark-ai/loader-file\"]\n : [\"@agentmark-ai/loader-api\"];\n\n const deps = [\n \"dotenv\",\n \"@agentmark-ai/prompt-core\",\n \"@agentmark-ai/sdk\",\n adapterConfig.package,\n ...loaderPackages,\n ...adapterConfig.dependencies,\n ];\n\n // Install regular dependencies using detected package manager config\n const depsCmd = `${pm.addCmd} ${deps.join(' ')}${npmSuffix}`;\n\n execSync(depsCmd, { stdio: \"inherit\", cwd: targetPath });\n\n console.log(\"Packages installed successfully!\");\n } catch (error) {\n console.error(\"Error installing packages:\", error);\n throw new Error(\n \"Failed to install required packages. Please check your network connection and try again.\"\n );\n }\n};\n","/**\n * File merge utilities for handling existing files during initialization.\n * Supports merging package.json, appending to .gitignore and .env files.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport type { MergeResult } from './types.js';\n\n/**\n * Merge AgentMark dependencies and scripts into an existing package.json.\n * Preserves all existing content, only adds missing AgentMark entries.\n */\nexport function mergePackageJson(\n targetPath: string,\n agentmarkDeps: Record<string, string>,\n agentmarkDevDeps: Record<string, string>,\n agentmarkScripts: Record<string, string>\n): MergeResult {\n const packageJsonPath = path.join(targetPath, 'package.json');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n // Read existing package.json\n if (!fs.existsSync(packageJsonPath)) {\n result.warnings.push('No existing package.json found');\n return result;\n }\n\n const existing = fs.readJsonSync(packageJsonPath) as Record<string, unknown>;\n\n // Initialize sections if they don't exist\n if (!existing.dependencies) {\n existing.dependencies = {};\n }\n if (!existing.devDependencies) {\n existing.devDependencies = {};\n }\n if (!existing.scripts) {\n existing.scripts = {};\n }\n\n const deps = existing.dependencies as Record<string, string>;\n const devDeps = existing.devDependencies as Record<string, string>;\n const scripts = existing.scripts as Record<string, string>;\n\n // Add AgentMark dependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDeps)) {\n if (deps[pkg]) {\n result.skipped.push(`dependency: ${pkg} (already exists)`);\n } else {\n deps[pkg] = version;\n result.added.push(`dependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark devDependencies (only if not already present)\n for (const [pkg, version] of Object.entries(agentmarkDevDeps)) {\n if (devDeps[pkg]) {\n result.skipped.push(`devDependency: ${pkg} (already exists)`);\n } else {\n devDeps[pkg] = version;\n result.added.push(`devDependency: ${pkg}@${version}`);\n }\n }\n\n // Add AgentMark scripts (use namespace if conflict exists)\n for (const [scriptName, scriptCmd] of Object.entries(agentmarkScripts)) {\n if (scripts[scriptName]) {\n // Conflict - use namespaced script name\n const namespacedName = `agentmark:${scriptName}`;\n if (scripts[namespacedName]) {\n // Both the original and namespaced version exist - skip with warning\n result.skipped.push(`script: ${scriptName}`);\n result.warnings.push(\n `Script \"${scriptName}\" and \"${namespacedName}\" both already exist. Skipping.`\n );\n } else {\n scripts[namespacedName] = scriptCmd;\n result.added.push(`script: ${namespacedName} (namespaced due to conflict)`);\n result.warnings.push(\n `Script \"${scriptName}\" already exists. Added as \"${namespacedName}\" instead.`\n );\n }\n } else {\n scripts[scriptName] = scriptCmd;\n result.added.push(`script: ${scriptName}`);\n }\n }\n\n // Write merged package.json\n fs.writeJsonSync(packageJsonPath, existing, { spaces: 2 });\n\n result.success = true;\n result.content = JSON.stringify(existing, null, 2);\n return result;\n } catch (error) {\n result.warnings.push(`Error merging package.json: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark entries to an existing .gitignore file.\n * Checks for duplicates before adding.\n */\nexport function appendGitignore(targetPath: string, entries: string[]): MergeResult {\n const gitignorePath = path.join(targetPath, '.gitignore');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(gitignorePath)) {\n existingContent = fs.readFileSync(gitignorePath, 'utf-8');\n }\n\n // Parse existing entries (normalize trailing slashes)\n const existingEntries = new Set(\n existingContent\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .map((line) => line.replace(/\\/$/, '')) // Remove trailing slashes for comparison\n );\n\n const entriesToAdd: string[] = [];\n\n for (const entry of entries) {\n const normalizedEntry = entry.replace(/\\/$/, '');\n if (existingEntries.has(normalizedEntry)) {\n result.skipped.push(entry);\n } else {\n entriesToAdd.push(entry);\n result.added.push(entry);\n }\n }\n\n if (entriesToAdd.length > 0) {\n // Add a header comment and the new entries\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n newContent += entriesToAdd.join('\\n');\n newContent += '\\n';\n\n fs.writeFileSync(gitignorePath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .gitignore: ${error}`);\n return result;\n }\n}\n\n/**\n * Append AgentMark environment variables to an existing .env file.\n * Does not overwrite existing keys.\n */\nexport function appendEnv(\n targetPath: string,\n envVars: Record<string, string>\n): MergeResult {\n const envPath = path.join(targetPath, '.env');\n const result: MergeResult = {\n success: false,\n warnings: [],\n added: [],\n skipped: [],\n };\n\n try {\n let existingContent = '';\n\n if (fs.existsSync(envPath)) {\n existingContent = fs.readFileSync(envPath, 'utf-8');\n }\n\n // Parse existing keys\n const existingKeys = new Set<string>();\n const lines = existingContent.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([^=]+)=/);\n if (match && match[1]) {\n existingKeys.add(match[1]);\n }\n }\n }\n\n const varsToAdd: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(envVars)) {\n if (existingKeys.has(key)) {\n result.skipped.push(key);\n } else {\n varsToAdd.push([key, value]);\n result.added.push(key);\n }\n }\n\n if (varsToAdd.length > 0) {\n let newContent = existingContent;\n\n // Ensure file ends with newline\n if (newContent && !newContent.endsWith('\\n')) {\n newContent += '\\n';\n }\n\n // Add blank line if file has content\n if (newContent.trim()) {\n newContent += '\\n';\n }\n\n newContent += '# AgentMark\\n';\n for (const [key, value] of varsToAdd) {\n newContent += `${key}=${value}\\n`;\n }\n\n fs.writeFileSync(envPath, newContent);\n result.content = newContent;\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.warnings.push(`Error appending to .env: ${error}`);\n return result;\n }\n}\n\n/**\n * Check if a file should be skipped based on existing project detection.\n * Used for files like index.ts that should never be generated in existing projects.\n */\nexport function shouldSkipFile(\n fileName: string,\n isExistingProject: boolean,\n skipFiles: string[]\n): boolean {\n if (!isExistingProject) {\n return false;\n }\n return skipFiles.includes(fileName);\n}\n","/**\n * Type definitions for existing repository initialization.\n * These types support project detection, conflict resolution, and package manager handling.\n */\n\n/** Supported package managers for TypeScript projects */\nexport type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\n/** Configuration for a specific package manager */\nexport interface PackageManagerConfig {\n /** Package manager name */\n name: PackageManager;\n /** Lock file that indicates this package manager is in use */\n lockFile: string;\n /** Command to install all dependencies */\n installCmd: string;\n /** Command to add a production dependency */\n addCmd: string;\n /** Command to add a dev dependency */\n addDevCmd: string;\n /** Command prefix for running scripts (e.g., 'npm run', 'yarn') */\n runCmd: string;\n}\n\n/** Package manager configurations indexed by lock file name */\nexport const PACKAGE_MANAGERS: Record<string, PackageManagerConfig> = {\n 'yarn.lock': {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCmd: 'yarn install',\n addCmd: 'yarn add',\n addDevCmd: 'yarn add --dev',\n runCmd: 'yarn',\n },\n 'pnpm-lock.yaml': {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCmd: 'pnpm install',\n addCmd: 'pnpm add',\n addDevCmd: 'pnpm add --save-dev',\n runCmd: 'pnpm',\n },\n 'bun.lockb': {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCmd: 'bun install',\n addCmd: 'bun add',\n addDevCmd: 'bun add --dev',\n runCmd: 'bun run',\n },\n 'package-lock.json': {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCmd: 'npm install',\n addCmd: 'npm install',\n addDevCmd: 'npm install --save-dev',\n runCmd: 'npm run',\n },\n};\n\n/** Default package manager when no lock file is found */\nexport const DEFAULT_PACKAGE_MANAGER: PackageManagerConfig = PACKAGE_MANAGERS['package-lock.json']!;\n\n/** Information about a detected Python virtual environment */\nexport interface PythonVenvInfo {\n /** Absolute path to the venv directory */\n path: string;\n /** Relative name (e.g., '.venv' or 'venv') */\n name: string;\n /** Platform-specific activate command */\n activateCmd: string;\n /** Platform-specific pip path */\n pipPath: string;\n}\n\n/** Type of file for determining merge strategy */\nexport type FileType = 'config' | 'source' | 'directory' | 'dotfile';\n\n/** Resolution strategy for a conflicting file */\nexport type ConflictStrategy = 'merge' | 'append' | 'prompt' | 'skip';\n\n/** Represents a file that may conflict with AgentMark initialization */\nexport interface ConflictFile {\n /** Relative path from project root */\n path: string;\n /** Type of file for determining merge strategy */\n type: FileType;\n /** Recommended resolution strategy */\n strategy: ConflictStrategy;\n}\n\n/** Files that may conflict with AgentMark initialization */\nexport const CONFLICT_FILES: ConflictFile[] = [\n { path: 'agentmark.json', type: 'config', strategy: 'prompt' },\n { path: 'agentmark', type: 'directory', strategy: 'prompt' },\n { path: 'agentmark.client.ts', type: 'source', strategy: 'prompt' },\n { path: 'agentmark_client.py', type: 'source', strategy: 'prompt' },\n { path: '.gitignore', type: 'dotfile', strategy: 'append' },\n { path: '.env', type: 'dotfile', strategy: 'append' },\n { path: 'package.json', type: 'config', strategy: 'merge' },\n { path: 'index.ts', type: 'source', strategy: 'skip' },\n { path: 'main.py', type: 'source', strategy: 'skip' },\n { path: 'tsconfig.json', type: 'config', strategy: 'skip' },\n { path: 'pyproject.toml', type: 'config', strategy: 'skip' },\n];\n\n/** User's resolution choice for a conflict */\nexport type ConflictAction = 'skip' | 'overwrite' | 'merge';\n\n/** A conflict resolution decision from the user */\nexport interface ConflictResolution {\n /** Path to the conflicting file */\n path: string;\n /** Action chosen by the user */\n action: ConflictAction;\n}\n\n/** Detected information about an existing project */\nexport interface ProjectInfo {\n /** Whether any project indicators were found */\n isExistingProject: boolean;\n /** Detected project type */\n type: 'typescript' | 'python' | 'unknown';\n /** Detected package manager (for TypeScript projects) */\n packageManager: PackageManagerConfig;\n /** Files that exist and may conflict */\n conflictingFiles: ConflictFile[];\n /** Whether the agentmark/ directory already exists */\n hasAgentmarkDir: boolean;\n /** Whether an existing Python venv was detected */\n pythonVenv: PythonVenvInfo | null;\n}\n\n/** Result of a file merge operation */\nexport interface MergeResult {\n /** Whether the merge was successful */\n success: boolean;\n /** The merged content (if applicable) */\n content?: string;\n /** Any warnings generated during merge */\n warnings: string[];\n /** What was added (for user feedback) */\n added: string[];\n /** What was skipped (already present) */\n skipped: string[];\n}\n\n/** Extended options for initialization in existing projects */\nexport interface InitOptions {\n /** Target directory path */\n targetPath: string;\n /** Selected language */\n language: 'typescript' | 'python';\n /** Selected adapter (TypeScript only) */\n adapter?: string;\n /** Deployment mode */\n deploymentMode: 'cloud' | 'static';\n /** API key (if provided) */\n apiKey?: string;\n /** IDE client for MCP setup */\n client: string;\n /** Detected project info (null if new project) */\n projectInfo: ProjectInfo | null;\n /** User's conflict resolutions */\n conflictResolutions: ConflictResolution[];\n}\n","export const getTsConfigContent = (): object => {\n return {\n \"compilerOptions\": {\n \"target\": \"ES2020\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"strict\": true,\n \"skipLibCheck\": true\n }\n };\n}; ","export const getAnimalDrawingPrompt = (): string => {\n return `---\nname: animal-drawing\nimage_config:\n model_name: openai/dall-e-3\n num_images: 1\n size: 1024x1024\n aspect_ratio: 1:1\ntest_settings:\n dataset: animal.jsonl\n props:\n animal: \"cat\"\n---\n\n<ImagePrompt>\nDraw a hyper-realistic picture of a {props.animal}\n</ImagePrompt>`;\n};","export const getCustomerSupportPrompt = (model: string): string => {\n return `---\nname: customer-support-agent\ntext_config:\n model_name: ${model}\n max_calls: 2\n tools:\n - search_knowledgebase\ntest_settings:\n dataset: customer-query.jsonl\n props:\n customer_question: \"I'm having trouble with my order. How long does shipping take?\"\ninput_schema:\n type: object\n properties:\n customer_question:\n type: string\n description: \"The customer's question\"\n required:\n - customer_question\n---\n\n<System>\nYou are a customer service agent for a company that sells products online. You are given a customer's question and you need to respond to the customer. You need to be friendly, professional, and helpful.\n\nYou have access to the following tool:\n- search_knowledgebase: Search the company knowledgebase for information about shipping, warranty, and returns. Use this when customers ask about these topics.\n</System>\n\n<User>{props.customer_question}</User>`;\n};","export const getPartyPlannerPrompt = (model: string): string => {\n return `---\nname: party-planner\nobject_config:\n model_name: ${model}\n schema:\n type: object\n properties:\n names:\n type: array\n description: \"List of names of people attending the party.\"\n items:\n type: string\n required:\n - names\ntest_settings:\n dataset: party.jsonl\n evals:\n - exact_match_json\n props:\n party_text: \"We're having a party with Alice, Bob, and Carol.\"\ninput_schema:\n type: object\n properties:\n party_text:\n type: string\n description: \"A block of text describing the upcoming party and attendees.\"\n required:\n - party_text\n---\n\n<System>\nExtract the names of all people attending the party from the following text. Respond with a list of names only.\n</System>\n\n<User>\nText: {props.party_text}\n</User>`;\n};","export const getStoryTellerPrompt = (): string => {\n return `---\nname: story-teller\nspeech_config:\n model_name: openai/tts-1-hd\n voice: \"nova\"\n speed: 1.0\n output_format: \"mp3\"\ntest_settings:\n dataset: story.jsonl\n props:\n story: \"Once upon a time, there was a cat who loved to play with a ball.\"\n---\n\n<System>\nYou are a storyteller for children. Make sure your story is engaging and interesting.\n</System>\n\n<SpeechPrompt>\n- {props.story}\n</SpeechPrompt>`;\n};","export const getAnimalDataset = (): string => {\n return `{\"input\": {\"animal\": \"cat\"}, \"expected_output\": \"A realistic picture of a cat\"}\n{\"input\": {\"animal\": \"dog\"}, \"expected_output\": \"A realistic picture of a dog\"}\n{\"input\": {\"animal\": \"bird\"}, \"expected_output\": \"A realistic picture of a bird\"}`;\n};\n\nexport const getCustomerQueryDataset = (): string => {\n return `{\"input\": {\"customer_question\": \"My package hasn't arrived yet. Can you help me track it?\"}}\n{\"input\": {\"customer_question\": \"I received the wrong item in my order. What should I do?\"}}\n{\"input\": {\"customer_question\": \"How do I return a product that I purchased last week?\"}}`;\n};\n\nexport const getPartyDataset = (): string => {\n return `{\"input\": {\"party_text\": \"We're having a party with Alice, Bob, and Carol.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Alice\\\\\", \\\\\"Bob\\\\\", \\\\\"Carol\\\\\"]}\"}\n{\"input\": {\"party_text\": \"The guest list includes Dave, Emma, and Frank.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Dave\\\\\", \\\\\"Emma\\\\\", \\\\\"Frank\\\\\"]}\"}\n{\"input\": {\"party_text\": \"Join us for a celebration with Grace, Henry, and Isla.\"}, \"expected_output\": \"{\\\\\"names\\\\\": [\\\\\"Grace\\\\\", \\\\\"Henry\\\\\", \\\\\"Isla\\\\\"]}\"}`;\n};\n\nexport const getStoryDataset = (): string => {\n return `{\"input\": {\"story\": \"Once upon a time, the Moon woke up and found her glow missing! She floated around the sky asking stars, clouds, and even comets if they'd seen her light. It wasn't until she peeked into a mountain lake that she saw her glow shining back—hidden in her own reflection! Laughing, she realized she had never lost it—it was with her all along, just hiding beneath a cloudy sky.\"}}\n{\"input\": {\"story\": \"Benny was no ordinary banana—he dreamed of becoming a superhero. One day, when a monkey slipped in the jungle and cried for help, Benny rolled into action, dodging vines and swinging from branches using his peel like a lasso. The monkey was saved, and from that day on, Benny was known as \\\\\"The Peel of Justice,\\\\\" the bravest fruit in the whole rainforest.\"}}\n{\"input\": {\"story\": \"In the town of Maplebrook, there was a library that whispered stories when no one was looking. Curious little Nia tiptoed in one rainy day and heard the books giggling softly. She opened one called The Secret Tunnel, and to her surprise, it sucked her in! She found herself riding a dragon through glittering caves. When she returned, the book winked shut—waiting for its next reader to listen.\"}}`;\n};","import fs from 'fs-extra';\nimport { getAnimalDrawingPrompt } from './animal-drawing-prompt.js';\nimport { getCustomerSupportPrompt } from './customer-support-prompt.js';\nimport { getPartyPlannerPrompt } from './party-planner-prompt.js';\nimport { getStoryTellerPrompt } from './story-teller-prompt.js';\nimport { getAnimalDataset, getCustomerQueryDataset, getPartyDataset, getStoryDataset } from './datasets.js';\n\n/**\n * Creates example prompt files and returns the list of model IDs they use.\n * The returned array is the authoritative source for `builtInModels` in agentmark.json —\n * it reflects exactly which models were written, so the two can never drift apart.\n */\nexport const createExamplePrompts = (model: string, targetPath: string = \".\", adapter: string = \"ai-sdk\"): string[] => {\n // Ensure the templates directory exists\n fs.ensureDirSync(`${targetPath}/agentmark`);\n\n const noImageSupport = [\"mastra\", \"claude-agent-sdk\", \"pydantic-ai\"];\n const noSpeechSupport = [\"mastra\", \"claude-agent-sdk\", \"pydantic-ai\"];\n const skipImagePrompts = noImageSupport.includes(adapter);\n const skipSpeechPrompts = noSpeechSupport.includes(adapter);\n\n const usedModels: string[] = [];\n\n // Create animal drawing prompt and dataset (uses image_config - skip for unsupported adapters)\n if (!skipImagePrompts) {\n const animalDrawingPrompt = getAnimalDrawingPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/animal-drawing.prompt.mdx`, animalDrawingPrompt);\n const animalDataset = getAnimalDataset();\n fs.writeFileSync(`${targetPath}/agentmark/animal.jsonl`, animalDataset);\n usedModels.push('openai/dall-e-3');\n }\n\n // Create customer support prompt and dataset\n const customerSupportPrompt = getCustomerSupportPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/customer-support-agent.prompt.mdx`, customerSupportPrompt);\n const customerQueryDataset = getCustomerQueryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/customer-query.jsonl`, customerQueryDataset);\n usedModels.push(model);\n\n // Create party planner prompt and dataset\n const partyPlannerPrompt = getPartyPlannerPrompt(model);\n fs.writeFileSync(`${targetPath}/agentmark/party-planner.prompt.mdx`, partyPlannerPrompt);\n const partyDataset = getPartyDataset();\n fs.writeFileSync(`${targetPath}/agentmark/party.jsonl`, partyDataset);\n\n // Create story teller prompt and dataset (uses speech_config - skip for unsupported adapters)\n if (!skipSpeechPrompts) {\n const storyTellerPrompt = getStoryTellerPrompt();\n fs.writeFileSync(`${targetPath}/agentmark/story-teller.prompt.mdx`, storyTellerPrompt);\n const storyDataset = getStoryDataset();\n fs.writeFileSync(`${targetPath}/agentmark/story.jsonl`, storyDataset);\n usedModels.push('openai/tts-1-hd');\n }\n\n // Deduplicate in case the language model appears under multiple prompts\n return [...new Set(usedModels)];\n};","import { getAdapterConfig } from \"./adapters.js\";\n\nexport const getClientConfigContent = (options: { provider: string; adapter: string; deploymentMode?: \"cloud\" | \"static\" }) => {\n const { provider, adapter, deploymentMode = \"cloud\" } = options;\n const isMastra = adapter === \"mastra\";\n const adapterConfig = getAdapterConfig(adapter, provider);\n const { modelRegistry } = adapterConfig.classes;\n\n // Claude Agent SDK doesn't use @ai-sdk provider imports\n const isClaudeAgentSdk = adapter === \"claude-agent-sdk\";\n const providerImport = isClaudeAgentSdk ? '' : `import { ${provider} } from '@ai-sdk/${provider}';`;\n\n // Import loaders from dedicated packages\n const loaderImport = deploymentMode === \"cloud\"\n ? `import { ApiLoader } from \"@agentmark-ai/loader-api\";`\n : `import { ApiLoader } from \"@agentmark-ai/loader-api\";\nimport { FileLoader } from \"@agentmark-ai/loader-file\";`;\n\n const loaderSetup = deploymentMode === \"cloud\"\n ? ` // ApiLoader works for both development and production\n // - Development: 'agentmark dev' sets AGENTMARK_BASE_URL to localhost\n // - Production: Set AGENTMARK_API_KEY and AGENTMARK_APP_ID for cloud\n const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : ApiLoader.cloud({\n apiKey: process.env.AGENTMARK_API_KEY!,\n appId: process.env.AGENTMARK_APP_ID!,\n });`\n : ` const loader = process.env.NODE_ENV === 'development'\n ? ApiLoader.local({ baseUrl: process.env.AGENTMARK_BASE_URL || 'http://localhost:9418' })\n : new FileLoader('./dist/agentmark');`;\n\n // Claude Agent SDK model registry setup is different\n const modelRegistrySetup = isClaudeAgentSdk\n ? `function createModelRegistry() {\n // Claude Agent SDK accepts model names directly.\n // Use createDefault() for simple pass-through of model names.\n const modelRegistry = ${modelRegistry}.createDefault();\n\n // To configure specific models (e.g., extended thinking), use:\n // const modelRegistry = new ${modelRegistry}()\n // .registerModels(/claude-.*-thinking/, (name) => ({\n // model: name,\n // maxThinkingTokens: 10000, // Enable extended thinking\n // }))\n // .registerModels(\"claude-sonnet-4-20250514\", (name) => ({ model: name }));\n\n return modelRegistry;\n}`\n : `function createModelRegistry() {\n const modelRegistry = new ${modelRegistry}()\n .registerProviders({ ${provider} });\n return modelRegistry;\n}`;\n\n // Claude Agent SDK adapter options\n const adapterOptionsImport = isClaudeAgentSdk\n ? `\n// Claude Agent SDK adapter options\n// See: https://github.com/anthropics/claude-agent-sdk\nconst adapterOptions = {\n // Permission mode controls tool access:\n // - 'default': Requires user approval for each tool use\n // - 'acceptEdits': Auto-approve file edits only\n // - 'bypassPermissions': Auto-approve all tools (use for automated pipelines)\n // - 'plan': Planning mode only, no tool execution\n permissionMode: 'bypassPermissions' as const,\n\n // Maximum conversation turns before stopping\n maxTurns: 20,\n\n // Optional: Set working directory for file operations\n // cwd: process.cwd(),\n\n // Optional: Budget limit in USD\n // maxBudgetUsd: 10.00,\n\n // Optional: Restrict which tools the agent can use\n // allowedTools: ['Read', 'Write', 'Glob'],\n // disallowedTools: ['Bash'],\n};`\n : '';\n\n // Tool import: each adapter imports tools differently\n const toolImport = isClaudeAgentSdk\n ? `import { tool, createSdkMcpServer } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from 'zod';`\n : isMastra\n ? `import { tool } from 'ai';\nimport type { ToolsInput } from '@mastra/core/agent';\nimport { z } from 'zod';`\n : `import { tool } from 'ai';\nimport type { Tool } from 'ai';\nimport { z } from 'zod';`;\n\n const createClientCall = isClaudeAgentSdk\n ? `return createAgentMarkClient<AgentMarkTypes>({ loader, modelRegistry, evalRegistry, adapterOptions, mcpServers: { 'customer-support': customerSupportTools } });`\n : `return createAgentMarkClient<AgentMarkTypes>({ loader, modelRegistry, tools, evalRegistry });`;\n\n // AI SDK v5 uses inputSchema (Zod), Mastra uses parameters (Zod via ai v4 tool helper)\n const toolSchemaField = isMastra\n ? `parameters: z.object({ query: z.string().describe('The search query') })`\n : `inputSchema: z.object({ query: z.string().describe('The search query') })`;\n\n const toolsReturnType = isMastra ? 'ToolsInput' : 'Record<string, Tool>';\n\n const toolsSetup = isClaudeAgentSdk\n ? `\n// Custom tools exposed as an MCP server — the SDK's native tool mechanism.\n// The server name is used in mcpServers config; tool names are used in prompt files.\nconst knowledgeBase = tool(\n 'search_knowledgebase',\n 'Search the knowledge base for relevant articles',\n { query: z.string().describe('The search query') },\n async ({ query }) => ({\n content: [{ type: 'text' as const, text: JSON.stringify({\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' },\n ],\n }) }],\n })\n);\n\nconst customerSupportTools = createSdkMcpServer({\n name: 'customer-support',\n tools: [knowledgeBase],\n});`\n : `\nfunction createTools(): ${toolsReturnType} {\n return {\n search_knowledgebase: tool({\n description: 'Search the knowledge base for relevant articles',\n ${toolSchemaField},\n execute: async ({ query }) => {\n // Simulate search delay\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Return all three knowledge base articles\n // The LLM will select the relevant one based on the query\n return {\n articles: [\n { topic: 'shipping', content: 'Standard shipping takes 3–5 business days.' },\n { topic: 'warranty', content: 'All products include a 1-year limited warranty.' },\n { topic: 'returns', content: 'You can return items within 30 days of delivery.' }\n ]\n };\n },\n }),\n };\n}`;\n\n const toolsVariable = isClaudeAgentSdk ? '' : ` const tools = createTools();`;\n\n return `// agentmark.client.ts\nimport path from 'node:path';\nimport dotenv from 'dotenv';\ndotenv.config({ path: path.resolve(__dirname, '.env') });\nimport { createAgentMarkClient, ${modelRegistry} } from \"${adapterConfig.package}\";\nimport type { EvalRegistry } from \"${adapterConfig.package}\";\n${loaderImport}\nimport AgentMarkTypes from './agentmark.types';\n${providerImport}\n${toolImport}\n${adapterOptionsImport}\n\n${modelRegistrySetup}\n${toolsSetup}\n\nconst evalRegistry: EvalRegistry = {\n exact_match_json: ({ output, expectedOutput }) => {\n if (!expectedOutput) {\n return { score: 0, label: 'error', reason: 'No expected output provided', passed: false };\n }\n try {\n const ok = JSON.stringify(output) === JSON.stringify(JSON.parse(expectedOutput));\n return {\n score: ok ? 1 : 0,\n label: ok ? 'correct' : 'incorrect',\n reason: ok ? 'Exact match' : 'Mismatch',\n passed: ok\n };\n } catch (e) {\n return { score: 0, label: 'error', reason: 'Failed to parse expected output as JSON', passed: false };\n }\n },\n};\n\nfunction createClient() {\n${loaderSetup}\n const modelRegistry = createModelRegistry();\n${toolsVariable}\n ${createClientCall}\n}\n\nexport const client = createClient();\n`;\n};\n"],"mappings":";AAYO,IAAM,sBAAsB,CACjC,aACkC;AAClC,SAAO;AAAA,IACL,UAAU;AAAA,MACR,SAAS;AAAA,MACT,cAAc,CAAC,SAAS,WAAW,QAAQ,KAAK;AAAA,MAChD,SAAS;AAAA,QACP,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,oBAAoB;AAAA,MAClB,SAAS;AAAA,MACT,cAAc,CAAC,uCAAuC;AAAA,MACtD,SAAS;AAAA,QACP,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBACd,SACA,UACe;AACf,QAAM,SAAS,oBAAoB,QAAQ,EAAE,OAAO;AACpD,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,oBAAoB,OAAO,yBAAyB,OAAO;AAAA,QACzD,oBAAoB,QAAQ;AAAA,MAC9B,EAAE,KAAK,IAAI,CAAC;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;;;AC7DO,IAAM,sBAAsB,CAAC,UAAkB,UAAU,iBAAqC,YAAoB;AACvH,QAAM,UAAU,mBAAmB;AAEnC,QAAM,gBAAgB;AAAA;AAGtB,QAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzB,QAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY1B,QAAM,cAAc,UAAU,mBAAmB;AAEjD,MAAI,YAAY,oBAAoB;AAClC,WAAO;AAAA;AAAA;AAAA,EAGT,aAAa;AAAA,EACb,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiDX,WAAW,YAAY,UAAU;AAC/B,WAAO;AAAA;AAAA,EAET,aAAa;AAAA,EACb,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2CX,OAAO;AACL,WAAO;AAAA;AAAA,EAET,aAAa;AAAA,EACb,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqCX;AACF;;;AC7KO,IAAM,oBAAoB,CAC/B,gBACA,SAAiB,IACjB,UAAkB,UAClB,iBAAqC,YAC1B;AACX,QAAM,cAAc,UAAU;AAG9B,QAAM,aAAa,YAAY,qBAAqB,sBAAsB;AAE1E,QAAM,eAAe,mBAAmB,UACpC;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOJ,SAAO,GAAG,UAAU,IAAI,WAAW;AAAA,EACnC,YAAY;AAAA;AAAA;AAGd;;;AC5BA,OAAOA,SAAQ;AACf,SAAS,gBAAgB;;;ACIzB,OAAO,QAAQ;AACf,OAAO,UAAU;AAOV,SAAS,iBACd,YACA,eACA,kBACA,kBACa;AACb,QAAM,kBAAkB,KAAK,KAAK,YAAY,cAAc;AAC5D,QAAM,SAAsB;AAAA,IAC1B,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,IACX,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI;AAEF,QAAI,CAAC,GAAG,WAAW,eAAe,GAAG;AACnC,aAAO,SAAS,KAAK,gCAAgC;AACrD,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,GAAG,aAAa,eAAe;AAGhD,QAAI,CAAC,SAAS,cAAc;AAC1B,eAAS,eAAe,CAAC;AAAA,IAC3B;AACA,QAAI,CAAC,SAAS,iBAAiB;AAC7B,eAAS,kBAAkB,CAAC;AAAA,IAC9B;AACA,QAAI,CAAC,SAAS,SAAS;AACrB,eAAS,UAAU,CAAC;AAAA,IACtB;AAEA,UAAM,OAAO,SAAS;AACtB,UAAM,UAAU,SAAS;AACzB,UAAM,UAAU,SAAS;AAGzB,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC1D,UAAI,KAAK,GAAG,GAAG;AACb,eAAO,QAAQ,KAAK,eAAe,GAAG,mBAAmB;AAAA,MAC3D,OAAO;AACL,aAAK,GAAG,IAAI;AACZ,eAAO,MAAM,KAAK,eAAe,GAAG,IAAI,OAAO,EAAE;AAAA,MACnD;AAAA,IACF;AAGA,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AAC7D,UAAI,QAAQ,GAAG,GAAG;AAChB,eAAO,QAAQ,KAAK,kBAAkB,GAAG,mBAAmB;AAAA,MAC9D,OAAO;AACL,gBAAQ,GAAG,IAAI;AACf,eAAO,MAAM,KAAK,kBAAkB,GAAG,IAAI,OAAO,EAAE;AAAA,MACtD;AAAA,IACF;AAGA,eAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACtE,UAAI,QAAQ,UAAU,GAAG;AAEvB,cAAM,iBAAiB,aAAa,UAAU;AAC9C,YAAI,QAAQ,cAAc,GAAG;AAE3B,iBAAO,QAAQ,KAAK,WAAW,UAAU,EAAE;AAC3C,iBAAO,SAAS;AAAA,YACd,WAAW,UAAU,UAAU,cAAc;AAAA,UAC/C;AAAA,QACF,OAAO;AACL,kBAAQ,cAAc,IAAI;AAC1B,iBAAO,MAAM,KAAK,WAAW,cAAc,+BAA+B;AAC1E,iBAAO,SAAS;AAAA,YACd,WAAW,UAAU,+BAA+B,cAAc;AAAA,UACpE;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU,IAAI;AACtB,eAAO,MAAM,KAAK,WAAW,UAAU,EAAE;AAAA,MAC3C;AAAA,IACF;AAGA,OAAG,cAAc,iBAAiB,UAAU,EAAE,QAAQ,EAAE,CAAC;AAEzD,WAAO,UAAU;AACjB,WAAO,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC;AACjD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,SAAS,KAAK,+BAA+B,KAAK,EAAE;AAC3D,WAAO;AAAA,EACT;AACF;;;AChFO,IAAM,mBAAyD;AAAA,EACpE,aAAa;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AAGO,IAAM,0BAAgD,iBAAiB,mBAAmB;;;AFtD1F,IAAM,mBAAmB,CAC9B,aAAqB,KACrB,iBAAqC,SACrC,cAAkC,SAC/B;AACH,QAAM,kBAAkB,GAAG,UAAU;AACrC,QAAM,oBAAoB,aAAa,qBAAqB;AAE5D,MAAI,CAACC,IAAG,WAAW,eAAe,GAAG;AACnC,YAAQ,IAAI,0BAA0B;AACtC,aAAS,eAAe,EAAE,KAAK,WAAW,CAAC;AAAA,EAC7C;AAGA,MAAI,qBAAqBA,IAAG,WAAW,eAAe,GAAG;AAEvD,UAAM,eAAuC;AAAA,MAC3C,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAEA,QAAI,mBAAmB,UAAU;AAC/B,mBAAa,OAAO,IAAI;AAAA,IAC1B;AAGA,UAAM,SAAS,iBAAiB,YAAY,CAAC,GAAG,CAAC,GAAG,YAAY;AAEhE,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,cAAQ,IAAI,iCAA4B,OAAO,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,IACnE;AACA,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,cAAQ,IAAI,mDAAyC,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IAClF;AACA,QAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,aAAO,SAAS,QAAQ,CAAC,MAAM,QAAQ,IAAI,iBAAO,CAAC,EAAE,CAAC;AAAA,IACxD;AAAA,EACF,OAAO;AAEL,UAAM,UAAUA,IAAG,aAAa,eAAe;AAC/C,YAAQ,OACN,QAAQ,SAAS,UAAU,CAAC,QAAQ,OAChC,0BACA,QAAQ;AACd,YAAQ,cACN,QAAQ,eAAe;AAGzB,UAAM,UAAkC;AAAA,MACtC,GAAG,QAAQ;AAAA,MACX,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAGA,QAAI,mBAAmB,UAAU;AAC/B,cAAQ,OAAO,IAAI;AAAA,IACrB;AAEA,YAAQ,UAAU;AAElB,IAAAA,IAAG,cAAc,iBAAiB,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,EAC1D;AACF;AAEO,IAAM,sBAAsB,CACjC,eACA,aAAqB,KACrB,UAAkB,UAClB,iBAAqC,SACrC,iBAA8C,SAC3C;AACH,UAAQ,IAAI,iCAAiC;AAC7C,UAAQ,IAAI,6BAA6B;AAEzC,QAAM,gBAAgB,iBAAiB,SAAS,aAAa;AAG7D,QAAM,KAAK,kBAAkB;AAG7B,QAAM,YAAY,GAAG,SAAS,QAAQ,wBAAwB;AAE9D,MAAI;AAEF,UAAM,UAAU,CAAC,cAAc,WAAW,eAAe,mBAAmB;AAG5E,UAAM,aAAa,GAAG,GAAG,SAAS,IAAI,QAAQ,KAAK,GAAG,CAAC,GAAG,SAAS;AAEnE,YAAQ,IAAI,SAAS,GAAG,IAAI,6BAA6B;AAEzD,aAAS,YAAY;AAAA,MACnB,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AAKD,UAAM,iBAAiB,mBAAmB,WACtC,CAAC,4BAA4B,2BAA2B,IACxD,CAAC,0BAA0B;AAE/B,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,GAAG;AAAA,MACH,GAAG,cAAc;AAAA,IACnB;AAGA,UAAM,UAAU,GAAG,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG,SAAS;AAE1D,aAAS,SAAS,EAAE,OAAO,WAAW,KAAK,WAAW,CAAC;AAEvD,YAAQ,IAAI,kCAAkC;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AGpIO,IAAM,qBAAqB,MAAc;AAC9C,SAAO;AAAA,IACL,mBAAmB;AAAA,MACjB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,oCAAoC;AAAA,MACpC,UAAU;AAAA,MACV,gBAAgB;AAAA,IAClB;AAAA,EACF;AACF;;;ACZO,IAAM,yBAAyB,MAAc;AAClD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBT;;;ACjBO,IAAM,2BAA2B,CAAC,UAA0B;AACjE,SAAO;AAAA;AAAA;AAAA,gBAGO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BrB;;;AC9BO,IAAM,wBAAwB,CAAC,UAA0B;AAC9D,SAAO;AAAA;AAAA;AAAA,gBAGO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCrB;;;ACtCO,IAAM,uBAAuB,MAAc;AAChD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBT;;;ACrBO,IAAM,mBAAmB,MAAc;AAC5C,SAAO;AAAA;AAAA;AAGT;AAEO,IAAM,0BAA0B,MAAc;AACnD,SAAO;AAAA;AAAA;AAGT;AAEO,IAAM,kBAAkB,MAAc;AAC3C,SAAO;AAAA;AAAA;AAGT;AAEO,IAAM,kBAAkB,MAAc;AAC3C,SAAO;AAAA;AAAA;AAGT;;;ACtBA,OAAOC,SAAQ;AAYR,IAAM,uBAAuB,CAAC,OAAe,aAAqB,KAAK,UAAkB,aAAuB;AAErH,EAAAC,IAAG,cAAc,GAAG,UAAU,YAAY;AAE1C,QAAM,iBAAiB,CAAC,UAAU,oBAAoB,aAAa;AACnE,QAAM,kBAAkB,CAAC,UAAU,oBAAoB,aAAa;AACpE,QAAM,mBAAmB,eAAe,SAAS,OAAO;AACxD,QAAM,oBAAoB,gBAAgB,SAAS,OAAO;AAE1D,QAAM,aAAuB,CAAC;AAG9B,MAAI,CAAC,kBAAkB;AACrB,UAAM,sBAAsB,uBAAuB;AACnD,IAAAA,IAAG,cAAc,GAAG,UAAU,wCAAwC,mBAAmB;AACzF,UAAM,gBAAgB,iBAAiB;AACvC,IAAAA,IAAG,cAAc,GAAG,UAAU,2BAA2B,aAAa;AACtE,eAAW,KAAK,iBAAiB;AAAA,EACnC;AAGA,QAAM,wBAAwB,yBAAyB,KAAK;AAC5D,EAAAA,IAAG,cAAc,GAAG,UAAU,gDAAgD,qBAAqB;AACnG,QAAM,uBAAuB,wBAAwB;AACrD,EAAAA,IAAG,cAAc,GAAG,UAAU,mCAAmC,oBAAoB;AACrF,aAAW,KAAK,KAAK;AAGrB,QAAM,qBAAqB,sBAAsB,KAAK;AACtD,EAAAA,IAAG,cAAc,GAAG,UAAU,uCAAuC,kBAAkB;AACvF,QAAM,eAAe,gBAAgB;AACrC,EAAAA,IAAG,cAAc,GAAG,UAAU,0BAA0B,YAAY;AAGpE,MAAI,CAAC,mBAAmB;AACtB,UAAM,oBAAoB,qBAAqB;AAC/C,IAAAA,IAAG,cAAc,GAAG,UAAU,sCAAsC,iBAAiB;AACrF,UAAM,eAAe,gBAAgB;AACrC,IAAAA,IAAG,cAAc,GAAG,UAAU,0BAA0B,YAAY;AACpE,eAAW,KAAK,iBAAiB;AAAA,EACnC;AAGA,SAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAChC;;;ACtDO,IAAM,yBAAyB,CAAC,YAAwF;AAC7H,QAAM,EAAE,UAAU,SAAS,iBAAiB,QAAQ,IAAI;AACxD,QAAM,WAAW,YAAY;AAC7B,QAAM,gBAAgB,iBAAiB,SAAS,QAAQ;AACxD,QAAM,EAAE,cAAc,IAAI,cAAc;AAGxC,QAAM,mBAAmB,YAAY;AACrC,QAAM,iBAAiB,mBAAmB,KAAK,YAAY,QAAQ,oBAAoB,QAAQ;AAG/F,QAAM,eAAe,mBAAmB,UACpC,0DACA;AAAA;AAGJ,QAAM,cAAc,mBAAmB,UACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aASA;AAAA;AAAA;AAKJ,QAAM,qBAAqB,mBACvB;AAAA;AAAA;AAAA,0BAGoB,aAAa;AAAA;AAAA;AAAA,iCAGN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASxC;AAAA,8BACwB,aAAa;AAAA,2BAChB,QAAQ;AAAA;AAAA;AAKjC,QAAM,uBAAuB,mBACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA;AAGJ,QAAM,aAAa,mBACf;AAAA,4BAEA,WACE;AAAA;AAAA,4BAGA;AAAA;AAAA;AAIN,QAAM,mBAAmB,mBACrB,qKACA;AAGJ,QAAM,kBAAkB,WACpB,6EACA;AAEJ,QAAM,kBAAkB,WAAW,eAAe;AAElD,QAAM,aAAa,mBACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAsBA;AAAA,0BACoB,eAAe;AAAA;AAAA;AAAA;AAAA,QAIjC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBrB,QAAM,gBAAgB,mBAAmB,KAAK;AAE9C,SAAO;AAAA;AAAA;AAAA;AAAA,kCAIyB,aAAa,YAAY,cAAc,OAAO;AAAA,qCAC3C,cAAc,OAAO;AAAA,EACxD,YAAY;AAAA;AAAA,EAEZ,cAAc;AAAA,EACd,UAAU;AAAA,EACV,oBAAoB;AAAA;AAAA,EAEpB,kBAAkB;AAAA,EAClB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBV,WAAW;AAAA;AAAA,EAEX,aAAa;AAAA,IACX,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAKpB;","names":["fs","fs","fs","fs"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-agentmark",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "type": "module",
5
5
  "description": "Create AgentMark projects with npm create agentmark",
6
6
  "main": "dist/index.js",