{"version":3,"sources":["../src/tools/self-modify.ts"],"names":["get","set","z","tool","del"],"mappings":"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","file":"chunk-TZLQ2JUC.cjs","sourcesContent":["/**\n * Self-modification tools: agent creates/lists/deletes its own tools,\n * updates its own system prompt. Inspired by agi-diy `create_tool`.\n *\n * Custom tools are stored in IndexedDB as JS source code.\n * On each agent build, they're eval'd back into tool() instances.\n */\nimport { tool, type Tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\nimport { get, set, del } from 'idb-keyval'\n\nconst CUSTOM_TOOLS_KEY = 'careless-custom-tools'\nconst SYSTEM_PROMPT_ADDITIONS_KEY = 'careless-system-prompt-additions'\n\ninterface StoredCustomTool {\n  name: string\n  description: string\n  /** JSON schema-ish; keys w/ {type, description} */\n  params: Record<string, { type: string; description?: string; required?: boolean }>\n  /** JS source for the callback; async function body. Has `input` in scope. */\n  source: string\n  createdAt: number\n}\n\nexport async function loadCustomTools(): Promise<StoredCustomTool[]> {\n  try {\n    const stored = await get<StoredCustomTool[]>(CUSTOM_TOOLS_KEY)\n    return Array.isArray(stored) ? stored : []\n  } catch { return [] }\n}\n\ninterface ParamSpec {\n  type?: 'string' | 'number' | 'boolean' | 'array' | 'object'\n  description?: string\n  required?: boolean\n}\n\nasync function saveCustomTools(tools: StoredCustomTool[]) {\n  await set(CUSTOM_TOOLS_KEY, tools)\n}\n\nfunction paramsToZod(params: Record<string, ParamSpec>) {\n  const shape: Record<string, z.ZodTypeAny> = {}\n  for (const [k, v] of Object.entries(params || {})) {\n    let t: z.ZodTypeAny = z.string()\n    if (v.type === 'number') t = z.number()\n    else if (v.type === 'boolean') t = z.boolean()\n    else if (v.type === 'array') t = z.array(z.any())\n    else if (v.type === 'object') t = z.record(z.string(), z.any())\n    if (v.description) t = t.describe(v.description)\n    if (v.required === false) t = t.optional()\n    shape[k] = t\n  }\n  return z.object(shape)\n}\n\n/** Build actual tool() instances from stored custom tools. */\nexport async function buildCustomTools() {\n  const stored = await loadCustomTools()\n  const result: Tool[] = []\n  for (const s of stored) {\n    try {\n      const inputSchema = paramsToZod(s.params as Record<string, ParamSpec>)\n      // Build callback from source. `input` is in scope.\n      // eslint-disable-next-line @typescript-eslint/no-implied-eval\n      const fn = new Function('input', `return (async () => { ${s.source} })()`)\n      const t = tool({\n        name: s.name,\n        description: s.description + ' [custom user tool]',\n        inputSchema,\n        callback: async (input: unknown) => {\n          try {\n            const r = await fn(input)\n            return typeof r === 'string' ? r : JSON.stringify(r)\n          } catch (err: unknown) {\n            const msg = err instanceof Error ? (err as Error).message : String(err)\n            return JSON.stringify({ status: 'error', error: msg })\n          }\n        },\n      })\n      result.push(t)\n    } catch (e) {\n      console.warn('[custom-tool] failed to build', s.name, e)\n    }\n  }\n  return result\n}\n\nexport const createToolTool = tool({\n  name: 'create_tool',\n  description: 'Define a new tool for yourself at runtime. Takes a name, description, JSON-style params schema, and JS source (async, `input` in scope, return a string or JSON-serializable value). Persists across sessions.',\n  inputSchema: z.object({\n    name: z.string().describe('Snake_case tool name (must be unique)'),\n    description: z.string().describe('What this tool does; agent sees this'),\n    params: z.string().describe('JSON string: {paramName: {type: \"string\"|\"number\"|\"boolean\", description?: \"...\", required?: true}}'),\n    source: z.string().describe('JS code. `input` object in scope. Return or await any value.'),\n  }),\n  callback: async (input) => {\n    try {\n      const existing = await loadCustomTools()\n      if (existing.find(t => t.name === input.name)) {\n        return JSON.stringify({ status: 'error', error: `Tool ${input.name} already exists. Delete it first.` })\n      }\n      let params: any = {}\n      try { params = JSON.parse(input.params || '{}') } catch (e: unknown) {\n        return JSON.stringify({ status: 'error', error: `params JSON parse: ${(e as Error).message}` })\n      }\n      // Validate source compiles\n      try {\n        // eslint-disable-next-line @typescript-eslint/no-implied-eval\n        new Function('input', `return (async () => { ${input.source} })()`)\n      } catch (e: unknown) {\n        return JSON.stringify({ status: 'error', error: `source compile: ${(e as Error).message}` })\n      }\n      const newTool: StoredCustomTool = {\n        name: input.name,\n        description: input.description,\n        params,\n        source: input.source,\n        createdAt: Date.now(),\n      }\n      await saveCustomTools([...existing, newTool])\n      window.dispatchEvent(new CustomEvent('careless:custom-tools-changed'))\n      return JSON.stringify({ status: 'created', name: input.name, total: existing.length + 1, note: 'Tool available on next agent turn.' })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const listCustomToolsTool = tool({\n  name: 'list_custom_tools',\n  description: 'List all user-created custom tools (created via create_tool).',\n  inputSchema: z.object({}),\n  callback: async () => {\n    const tools = await loadCustomTools()\n    return JSON.stringify({\n      status: 'success',\n      count: tools.length,\n      tools: tools.map(t => ({ name: t.name, description: t.description, created_at: t.createdAt })),\n    })\n  },\n})\n\nexport const deleteCustomToolTool = tool({\n  name: 'delete_custom_tool',\n  description: 'Delete a user-created custom tool by name.',\n  inputSchema: z.object({ name: z.string() }),\n  callback: async (input) => {\n    const existing = await loadCustomTools()\n    const filtered = existing.filter(t => t.name !== input.name)\n    if (filtered.length === existing.length) {\n      return JSON.stringify({ status: 'error', error: `Tool ${input.name} not found` })\n    }\n    await saveCustomTools(filtered)\n    window.dispatchEvent(new CustomEvent('careless:custom-tools-changed'))\n    return JSON.stringify({ status: 'deleted', name: input.name, remaining: filtered.length })\n  },\n})\n\nexport const updateSelfPromptTool = tool({\n  name: 'update_self_prompt',\n  description: 'Append a learning/insight to your own system prompt. Persists across sessions. Use this to remember things about the user or evolve your behavior.',\n  inputSchema: z.object({\n    addition: z.string().describe('Text to append to system prompt'),\n    reason: z.string().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const existing = (await get<string[]>(SYSTEM_PROMPT_ADDITIONS_KEY)) || []\n      existing.push(input.addition)\n      await set(SYSTEM_PROMPT_ADDITIONS_KEY, existing)\n      window.dispatchEvent(new CustomEvent('careless:system-prompt-changed'))\n      return JSON.stringify({ status: 'added', total_additions: existing.length, reason: input.reason })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const listSelfPromptAdditionsTool = tool({\n  name: 'list_self_prompt_additions',\n  description: 'List all self-added system prompt additions.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    const additions = (await get<string[]>(SYSTEM_PROMPT_ADDITIONS_KEY)) || []\n    return JSON.stringify({ status: 'success', count: additions.length, additions })\n  },\n})\n\nexport const clearSelfPromptAdditionsTool = tool({\n  name: 'clear_self_prompt_additions',\n  description: 'Clear all self-added system prompt additions.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    await del(SYSTEM_PROMPT_ADDITIONS_KEY)\n    window.dispatchEvent(new CustomEvent('careless:system-prompt-changed'))\n    return JSON.stringify({ status: 'cleared' })\n  },\n})\n\nexport async function getSelfPromptAdditions(): Promise<string> {\n  const additions = (await get<string[]>(SYSTEM_PROMPT_ADDITIONS_KEY)) || []\n  if (!additions.length) return ''\n  return `\\n\\n## 📝 Self-Learned Context\\n${additions.map((a, i) => `${i + 1}. ${a}`).join('\\n')}`\n}\n\nexport const SELF_MODIFY_TOOLS = [\n  createToolTool, listCustomToolsTool, deleteCustomToolTool,\n  updateSelfPromptTool, listSelfPromptAdditionsTool, clearSelfPromptAdditionsTool,\n]\n\n\n/** Helper: get just the names of stored custom tools. */\nexport async function getCustomToolNames(): Promise<string[]> {\n  const tools = await loadCustomTools()\n  return tools.map(t => t.name)\n}\n"]}