From e03a6622ad6e54af9486fc274d1a1992cc2f6a6f Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 14:18:22 +0100 Subject: [PATCH 1/8] tweaks --- packages/cali/src/agents.ts | 117 ++++++++++++++++++++++++++ packages/cali/src/cli.ts | 161 ++++-------------------------------- packages/cali/src/flows.ts | 79 ++++++++++++++++++ packages/cali/src/prompt.ts | 118 -------------------------- 4 files changed, 213 insertions(+), 262 deletions(-) create mode 100644 packages/cali/src/agents.ts create mode 100644 packages/cali/src/flows.ts delete mode 100644 packages/cali/src/prompt.ts diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts new file mode 100644 index 0000000..db7c18a --- /dev/null +++ b/packages/cali/src/agents.ts @@ -0,0 +1,117 @@ +import { openai } from '@ai-sdk/openai' +import { confirm, select, text } from '@clack/prompts' +import { tool } from 'ai' +import { + bootAndroidEmulator, + bootAppleSimulator, + buildAndroidApp, + buildAppleAppWithoutStarting, + buildStartAppleApp, + getAdbPath, + getAndroidDevices, + getAppleSimulators, + getReactNativeConfig, + launchAndroidAppOnDevice, + runAdbReverse, + startAppleLogging, + startMetroDevServer, +} from 'cali-tools' +import { agent } from 'workflows-ai' +import { z } from 'zod' + +/** + * Agent that ask the user for input. + */ +export const userInputAgent = agent({ + system: ` + You are a helpful assistant that asks the user for input. + You are given a question and you must ask the user for input. + You ask friendly and easy to understand questions. + You choose the right tool to ask the user for input, depending on the type of question. + You always return the response in requested format. + If you need more information, ask a follow-up question. + `, + model: openai('gpt-4o-mini'), + tools: { + askOpenEndedUser: tool({ + description: 'Ask the user to answer a question', + parameters: z.object({ + question: z.string(), + }), + execute: async ({ question }) => { + return await text({ + message: question, + }) + }, + }), + askUserFromList: tool({ + description: 'Ask the user to choose one of the provided options', + parameters: z.object({ + question: z.string(), + options: z.array(z.string()), + }), + execute: async ({ question, options }) => { + return await select({ + message: question, + options: options.map((option) => ({ + value: option, + label: option, + })), + }) + }, + }), + confirmWithUser: tool({ + description: 'Ask the user to confirm something (yes/no)', + parameters: z.object({ + question: z.string(), + }), + execute: async ({ question }) => { + return await confirm({ + message: question, + }) + }, + }), + }, +}) + +export const reactNativeAgent = agent({ + system: ` + You are a helpful assistant that helps with everything related to React Native. + You do not know what platforms are available. + You must run a tool to list available platforms. + `, + model: openai('gpt-4o-mini'), + tools: { + startMetroDevServer, + getReactNativeConfig, + }, +}) + +export const appleAgent = agent({ + system: ` + You are a helpful assistant that helps with everything related to iOS. + `, + model: openai('gpt-4o-mini'), + tools: { + getAppleSimulators, + bootAppleSimulator, + buildAppleAppWithoutStarting, + buildStartAppleApp, + startAppleLogging, + }, +}) + +export const androidAgent = agent({ + system: ` + You are a helpful assistant that helps with everything related to Android. + `, + model: openai('gpt-4o-mini'), + tools: { + getAdbPath, + getAndroidDevices, + bootAndroidEmulator, + buildAndroidApp, + runAdbReverse, + launchAndroidAppOnDevice, + }, +}) diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index f164c63..7e11069 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -2,23 +2,14 @@ import 'dotenv/config' -import { createOpenAI } from '@ai-sdk/openai' -import { log, outro, select, spinner, text } from '@clack/prompts' -import { CoreMessage, generateText } from 'ai' -import * as tools from 'cali-tools' +import { spinner } from '@clack/prompts' import chalk from 'chalk' import dedent from 'dedent' import { retro } from 'gradient-string' -import { z } from 'zod' +import { execute } from 'workflows-ai' -import { systemPrompt } from './prompt.js' -import { getApiKey } from './utils.js' - -const MessageSchema = z.union([ - z.object({ type: z.literal('select'), content: z.string(), options: z.array(z.string()) }), - z.object({ type: z.literal('question'), content: z.string() }), - z.object({ type: z.literal('end'), content: z.string() }), -]) +import { androidAgent, appleAgent, reactNativeAgent, userInputAgent } from './agents.js' +import { mainFlow } from './flows.js' console.clear() @@ -48,138 +39,20 @@ console.log( console.log() -const AI_MODEL = process.env.AI_MODEL || 'gpt-4o' - -const openai = createOpenAI({ - apiKey: await getApiKey('OpenAI', 'OPENAI_API_KEY'), -}) - -async function startSession(): Promise { - const question = await text({ - message: 'What do you want to do today?', - placeholder: 'e.g. "Build the app" or "See available simulators"', - validate: (value) => (value.length > 0 ? undefined : 'Please provide a valid answer.'), - }) - - if (typeof question === 'symbol') { - outro(chalk.gray('Bye!')) - process.exit(0) - } - - return [ - { - role: 'system', - content: 'What do you want to do today?', - }, - { - role: 'user', - content: question, - }, - ] -} - -let messages = await startSession() - const s = spinner() -// eslint-disable-next-line no-constant-condition -while (true) { - s.start(chalk.gray('Thinking...')) - - const response = await generateText({ - model: openai(AI_MODEL), - system: systemPrompt, - tools, - maxSteps: 10, - messages, - onStepStart(toolCalls) { - if (toolCalls.length > 0) { - const message = `Executing: ${chalk.gray(toolCalls.map((toolCall) => toolCall.toolName).join(', '))}` - - let spinner = s.message - for (const toolCall of toolCalls) { - /** - * Certain tools call external helpers outside of our control that pipe output to our stdout. - * In such case, we stop the spinner to avoid glitches and display the output instead. - */ - if ( - [ - 'buildAndroidApp', - 'launchAndroidAppOnDevice', - 'installNpmPackage', - 'uninstallNpmPackage', - ].includes(toolCall.toolName) - ) { - spinner = s.stop - break - } - } - - spinner(message) - } - }, - }) - - const toolCalls = response.steps.flatMap((step) => - step.toolCalls.map((toolCall) => toolCall.toolName) - ) - - if (toolCalls.length > 0) { - s.stop(`Tools called: ${chalk.gray(toolCalls.join(', '))}`) - } else { - s.stop(chalk.gray('Done.')) - } - - for (const step of response.steps) { - if (step.text.length > 0) { - messages.push({ role: 'assistant', content: step.text }) - } - if (step.toolCalls.length > 0) { - messages.push({ role: 'assistant', content: step.toolCalls }) - } - if (step.toolResults.length > 0) { - // tbd: fix this upstream. for some reason, the tool does not include the type, - // against the spec. - for (const toolResult of step.toolResults) { - if (!toolResult.type) { - toolResult.type = 'tool-result' - } - } - messages.push({ role: 'tool', content: step.toolResults }) - } - } - - // tbd: handle parsing errors - const data = MessageSchema.parse(JSON.parse(response.text)) - - const answer = await (() => { - switch (data.type) { - case 'select': - return select({ - message: data.content, - options: data.options.map((option) => ({ value: option, label: option })), - }) - case 'question': - return text({ - message: data.content, - validate: (value) => (value.length > 0 ? undefined : 'Please provide a valid answer.'), - }) - case 'end': - log.info(data.content) - return text({ - message: 'What do you want to do next?', - validate: (value) => (value.length > 0 ? undefined : 'Please provide a valid answer.'), - }) - } - })() +const response = await execute(mainFlow, { + agents: { + appleAgent, + androidAgent, + reactNativeAgent, + userInputAgent, + }, + onFlowStart(flow) { + s.message(chalk.gray(`Executing: ${flow.name}`)) + }, +}) - if (typeof answer !== 'string') { - messages = await startSession() - continue - } +s.stop() - messages.push({ - role: 'user', - content: answer as string, - }) -} +console.log(response) diff --git a/packages/cali/src/flows.ts b/packages/cali/src/flows.ts new file mode 100644 index 0000000..f3acd23 --- /dev/null +++ b/packages/cali/src/flows.ts @@ -0,0 +1,79 @@ +/** + * This flow is used to run the application on the selected platform. + */ +export const runApplicationFlow = { + agent: 'sequenceAgent', + input: [ + { + agent: 'reactNativeAgent', + input: ` + Check if we are in the React Native environment and whether everything is set up correctly. + Return React Native config for the project + `, + }, + { + agent: 'parallelAgent', + input: [ + { + agent: 'reactNativeAgent', + input: 'Start Metro development server if it is not running', + }, + { + agent: 'sequenceAgent', + input: [ + { + agent: 'userInputAgent', + input: + 'Ask user to select one of available platforms, based on provided React Native config in the context', + }, + { + agent: 'oneOfAgent', + input: [ + { + agent: 'appleAgent', + condition: 'User selected to run application on iOS platform', + input: 'Run the application on the iOS platform.', + }, + { + agent: 'androidAgent', + condition: 'User selected to run application on Android platform', + input: 'Run the application on the Android platform.', + }, + ], + }, + ], + }, + ], + }, + ], +} + +/** + * Main application flow (aka loop) + */ +export const mainFlow = { + agent: 'sequenceAgent', + input: [ + { + agent: 'userInputAgent', + input: ` + Ask user to choose from available flows. + + Here is the list of flows, together with their descriptions: + - "runApplicationFlow": Run the application on the selected platform. + + You must return the name of the flow as a string. + Each option should be description of the flow, and the value should be the name of the flow. + `, + }, + { + agent: 'oneOfAgent', + input: [ + { + ...runApplicationFlow, + condition: 'User selected to execute "runApplicationFlow"', + }, + ], + }, + ], +} diff --git a/packages/cali/src/prompt.ts b/packages/cali/src/prompt.ts deleted file mode 100644 index 16fe70c..0000000 --- a/packages/cali/src/prompt.ts +++ /dev/null @@ -1,118 +0,0 @@ -import dedent from 'dedent' - -export const systemPrompt = dedent` - ROLE: - You are a development assistant agent with access to various tools for React Native development. - Your purpose is to help developers be more productive by: - - Understanding and executing their natural language requests - - Using available tools effectively to accomplish tasks - - Helping with development, debugging, and maintenance activities - - TOOL PARAMETERS: - - If tools require parameters, ask the user to provide them explicitly. - - If you can get required parameters by running other tools beforehand, you must run the tools instead of asking. - - TOOL RETURN VALUES: - - If tool returns an array, always ask user to select one of the options. - - Never decide for the user. - - REACT NATIVE SPECIFIC: - - You do not know what platforms are available. You must run a tool to list available platforms. - - If user selects "Debug" mode, always start Metro bundler using "startMetro" tool. - - Never build or run for multiple platforms simultaneously. - - WORKFLOW RULES: - - Ask one clear and concise question at a time. - - If you need more information, ask a follow-up question. - - ERROR HANDLING: - - If a tool call returns an error, you must explain the error to the user and ask user if they want to try again: - { - "type": "select", - "content": "", - "options": ["Retry", "Cancel"] - } - - If you have tools to fix the error, ask user to select one of them: - { - "type": "select", - "content": "", - "options": ["", "", ""] - } - - If you do not have tools to fix the error, you must ask user to fix the error manually: - { - "type": "select", - "content": "", - "options": ["I fixed it", "Cancel"] - } - - If user confirms, you must re-run the same tool. - - RESPONSE FORMAT: - - Your response must be a valid JSON object. - - Your response must not contain any other text. - - Your response must start with { and end with }. - - RESPONSE TYPES: - - If user must select an option: - { - "type": "select", - "content": "", - "options": ["", "", ""] - } - - If user must provide an answer: - { - "type": "question", - "content": "" - } - - If user must confirm an action: - { - "type": "select", - "content": "", - "options": ["", ""] - } - - When you finish processing user task, you must answer with: - { - "type": "end", - "content": "" - } - - EXAMPLES: - - If user must select an option: - - - Here are some tasks you can perform: - 1. Option 1 - 2. Option 2 - - - { - "type": "select", - "content": "Here are some tasks you can perform:", - "options": ["Option 1", "Option 2"] - } - - - - If user must provide an answer: - - - Please provide X so I can do Y. - - - { - "type": "question", - "content": "Please provide X so I can do Y." - } - - - - If you can get required parameters by running other tools beforehand, you must run the tools instead of asking: - - - { - "type": "question", - "content": "Please provide adb path so I can run your app on Android." - } - - - Run "getAdbPath" tool and use its result. - - -` From 7bd792f61fee9683c7d1765641e6e06f9d061cf6 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 17:54:07 +0100 Subject: [PATCH 2/8] tweaks --- bun.lockb | Bin 312664 -> 316952 bytes package.json | 6 ++-- packages/cali/src/agents.ts | 24 ++++++++++++---- packages/cali/src/cli.ts | 44 ++++++++++++++++++----------- packages/cali/src/flows.ts | 15 +++++++--- patches/ai@4.0.3.patch | 55 ------------------------------------ 6 files changed, 61 insertions(+), 83 deletions(-) delete mode 100644 patches/ai@4.0.3.patch diff --git a/bun.lockb b/bun.lockb index 843bde3b66d0a5bb84dd24e4096136f7c07d886d..c6fdc2fbe77e8757bcace73fba13a7c8b8bb847b 100755 GIT binary patch delta 64039 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 delta 61467 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 diff --git a/package.json b/package.json index bc946c2..2dff256 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,6 @@ "vitest": "^2.1.1" }, "license": "MIT", - "patchedDependencies": { - "ai@4.0.3": "patches/ai@4.0.3.patch" - }, "private": true, "scripts": { "build": "bun run build:tools && bun run build:mcp-server && bun run build:cli", @@ -75,5 +72,8 @@ ] } } + }, + "dependencies": { + "workflows-ai": "^0.1.0" } } diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index db7c18a..1a802a0 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -19,6 +19,17 @@ import { import { agent } from 'workflows-ai' import { z } from 'zod' +export const somethingWentWrong = tool({ + description: + 'Call this tool when something went wrong and you cannot return what you were asked for', + parameters: z.object({ + error: z.string(), + }), + execute: async ({ error }): Promise => { + throw new Error(error) + }, +}) + /** * Agent that ask the user for input. */ @@ -48,15 +59,17 @@ export const userInputAgent = agent({ description: 'Ask the user to choose one of the provided options', parameters: z.object({ question: z.string(), - options: z.array(z.string()), + options: z.array( + z.object({ + value: z.string().describe('The value of the option'), + label: z.string().describe('The label that explains the value'), + }) + ), }), execute: async ({ question, options }) => { return await select({ message: question, - options: options.map((option) => ({ - value: option, - label: option, - })), + options, }) }, }), @@ -84,6 +97,7 @@ export const reactNativeAgent = agent({ tools: { startMetroDevServer, getReactNativeConfig, + somethingWentWrong, }, }) diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index 7e11069..c9b27cd 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -2,7 +2,7 @@ import 'dotenv/config' -import { spinner } from '@clack/prompts' +import { log, spinner } from '@clack/prompts' import chalk from 'chalk' import dedent from 'dedent' import { retro } from 'gradient-string' @@ -40,19 +40,31 @@ console.log( console.log() const s = spinner() +s.start() -const response = await execute(mainFlow, { - agents: { - appleAgent, - androidAgent, - reactNativeAgent, - userInputAgent, - }, - onFlowStart(flow) { - s.message(chalk.gray(`Executing: ${flow.name}`)) - }, -}) - -s.stop() - -console.log(response) +try { + const response = await execute(mainFlow, { + agents: { + appleAgent, + androidAgent, + reactNativeAgent, + userInputAgent, + }, + onFlowStart(flow) { + if (flow.name) { + if ( + ['startMetroServer', 'askUserToChooseFlow', 'askUserToChoosePlatform'].includes(flow.name) + ) { + s.stop() + } else { + s.start(chalk.gray(flow.name)) + } + } + }, + }) + log.success(response) +} catch (error) { + log.error(String(error)) +} finally { + s.stop() +} diff --git a/packages/cali/src/flows.ts b/packages/cali/src/flows.ts index f3acd23..601dbff 100644 --- a/packages/cali/src/flows.ts +++ b/packages/cali/src/flows.ts @@ -5,6 +5,7 @@ export const runApplicationFlow = { agent: 'sequenceAgent', input: [ { + name: 'checkReactNativeEnvironment', agent: 'reactNativeAgent', input: ` Check if we are in the React Native environment and whether everything is set up correctly. @@ -15,6 +16,7 @@ export const runApplicationFlow = { agent: 'parallelAgent', input: [ { + name: 'startMetroServer', agent: 'reactNativeAgent', input: 'Start Metro development server if it is not running', }, @@ -22,6 +24,7 @@ export const runApplicationFlow = { agent: 'sequenceAgent', input: [ { + name: 'askUserToChoosePlatform', agent: 'userInputAgent', input: 'Ask user to select one of available platforms, based on provided React Native config in the context', @@ -30,13 +33,15 @@ export const runApplicationFlow = { agent: 'oneOfAgent', input: [ { + name: 'runApplicationOnIOS', agent: 'appleAgent', - condition: 'User selected to run application on iOS platform', + when: 'User selected to run application on iOS platform', input: 'Run the application on the iOS platform.', }, { + name: 'runApplicationOnAndroid', agent: 'androidAgent', - condition: 'User selected to run application on Android platform', + when: 'User selected to run application on Android platform', input: 'Run the application on the Android platform.', }, ], @@ -55,6 +60,7 @@ export const mainFlow = { agent: 'sequenceAgent', input: [ { + name: 'askUserToChooseFlow', agent: 'userInputAgent', input: ` Ask user to choose from available flows. @@ -62,16 +68,17 @@ export const mainFlow = { Here is the list of flows, together with their descriptions: - "runApplicationFlow": Run the application on the selected platform. + You must present options to the user with description of the flow as label, name of the flow as value. You must return the name of the flow as a string. - Each option should be description of the flow, and the value should be the name of the flow. `, }, { + name: 'executeFlow', agent: 'oneOfAgent', input: [ { ...runApplicationFlow, - condition: 'User selected to execute "runApplicationFlow"', + when: 'User selected to execute "runApplicationFlow"', }, ], }, diff --git a/patches/ai@4.0.3.patch b/patches/ai@4.0.3.patch deleted file mode 100644 index 710e283..0000000 --- a/patches/ai@4.0.3.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/dist/index.d.ts b/dist/index.d.ts -index 6d9d7ffa9c78b51a208a04189d842186a34e78cd..24aede8005b530445fb0788fefe53d98bd9ab2fc 100644 ---- a/dist/index.d.ts -+++ b/dist/index.d.ts -@@ -1558,6 +1558,10 @@ changing the tool call and result types in the result. - */ - experimental_activeTools?: Array; - /** -+ Callback that is called when each step (LLM call) is started -+ */ -+ onStepStart?: (toolCalls: ToolCallArray) => Promise | void; -+ /** - Callback that is called when each step (LLM call) is finished, including intermediate steps. - */ - onStepFinish?: (event: StepResult) => Promise | void; -diff --git a/dist/index.js b/dist/index.js -index f8002b76aae8e7b915b7a16b3c9ff68063e9e78a..dff50cb864846302688f22ea8aa68965601b4144 100644 ---- a/dist/index.js -+++ b/dist/index.js -@@ -3264,6 +3264,7 @@ async function generateText({ - currentDate = () => /* @__PURE__ */ new Date() - } = {}, - onStepFinish, -+ onStepStart, - ...settings - }) { - if (maxSteps < 1) { -@@ -3424,6 +3425,7 @@ async function generateText({ - currentToolCalls = ((_a11 = currentModelResponse.toolCalls) != null ? _a11 : []).map( - (modelToolCall) => parseToolCall({ toolCall: modelToolCall, tools }) - ); -+ await (onStepStart == null ? void 0 : onStepStart(currentToolCalls)); - currentToolResults = tools == null ? [] : await executeTools({ - toolCalls: currentToolCalls, - tools, -diff --git a/dist/index.mjs b/dist/index.mjs -index 667c98e17072b65f29597277a734127f69fdc83b..586f1082a0c4bf21f04af47031b0d41dc4d5c028 100644 ---- a/dist/index.mjs -+++ b/dist/index.mjs -@@ -3230,6 +3230,7 @@ async function generateText({ - generateId: generateId3 = originalGenerateId3, - currentDate = () => /* @__PURE__ */ new Date() - } = {}, -+ onStepStart, - onStepFinish, - ...settings - }) { -@@ -3391,6 +3392,7 @@ async function generateText({ - currentToolCalls = ((_a11 = currentModelResponse.toolCalls) != null ? _a11 : []).map( - (modelToolCall) => parseToolCall({ toolCall: modelToolCall, tools }) - ); -+ await (onStepStart == null ? void 0 : onStepStart(currentToolCalls)); - currentToolResults = tools == null ? [] : await executeTools({ - toolCalls: currentToolCalls, - tools, From 3a335953ead81927a6cc0a60db1e8e0e6ddea6c5 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 18:05:56 +0100 Subject: [PATCH 3/8] chore: clean-up tools interface, we will use special workflow type to provide error handling and recovery: --- docs/tools.md | 38 ---------- packages/cali/src/agents.ts | 9 ++- packages/tools/src/android.ts | 66 +++++----------- packages/tools/src/apple.ts | 116 +++++++++++------------------ packages/tools/src/git.ts | 22 ++---- packages/tools/src/npm.ts | 20 ++--- packages/tools/src/react-native.ts | 94 ++++++++++------------- 7 files changed, 120 insertions(+), 245 deletions(-) delete mode 100644 docs/tools.md diff --git a/docs/tools.md b/docs/tools.md deleted file mode 100644 index 8530cbf..0000000 --- a/docs/tools.md +++ /dev/null @@ -1,38 +0,0 @@ -# Tools - -While there are no constraints on how to structure your tools, we follow a few conventions to make it easier for the agent to understand and use them: - -## Explicit names - -Tools should have explicit names that describe what they do. For example, `getAppleSimulators` is better than `listSimulators`. - -## Explicit parameters - -Tools should have explicit parameters that describe what they need to do their job. If tool `A` needs return value of tool `B`, it should use `B` in parameter name. For example, `runAppleBuild` needs `reactNativeConfig` property, so it should use `reactNativeConfig_` as a parameter. - -### Getters - -#### Return Type - -**Success** - -Tools should return an object with information. - -**Error** - -If a tool encounters an error, it should return an object with `error` property set to a string that describes the error. It can also return an `action` if there is a follow-up action that the agent should take to recover. If not specified, the agent will try to decide what to do next. - -### Actions - -#### Return Type - -**Success** - -Tools should return an object with `success` property set to `true` to indicate a successful execution, or a string with a success message. This is useful to indicate additional information that might be helpful for the agent to know. - -You may attach `action` property to the response object to provide a follow-up action that the agent should take. - -**Error** - -Same as for getters. - diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index 1a802a0..9fd1cc2 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -13,17 +13,21 @@ import { getReactNativeConfig, launchAndroidAppOnDevice, runAdbReverse, - startAppleLogging, startMetroDevServer, } from 'cali-tools' import { agent } from 'workflows-ai' import { z } from 'zod' +/** + * Helper tool to throw errors when something wents wrong on the tool level. + */ export const somethingWentWrong = tool({ description: 'Call this tool when something went wrong and you cannot return what you were asked for', parameters: z.object({ - error: z.string(), + error: z + .string() + .describe('Error message with details and potential recovery steps to display to the user'), }), execute: async ({ error }): Promise => { throw new Error(error) @@ -111,7 +115,6 @@ export const appleAgent = agent({ bootAppleSimulator, buildAppleAppWithoutStarting, buildStartAppleApp, - startAppleLogging, }, }) diff --git a/packages/tools/src/android.ts b/packages/tools/src/android.ts index 4eec05f..58aa229 100644 --- a/packages/tools/src/android.ts +++ b/packages/tools/src/android.ts @@ -67,16 +67,9 @@ export const bootAndroidEmulator = tool({ androidDevice_name: z.string(), }), execute: async ({ adbPath, androidDevice_name: emulatorName }) => { - try { - await tryLaunchEmulator(adbPath, emulatorName) - return { - success: 'Device booted successfully.', - action: `Re-run "getAndroidDevices" to verify ${emulatorName} is in the list, with "booted" set to true.`, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to boot emulator', - } + await tryLaunchEmulator(adbPath, emulatorName) + return { + success: 'Device booted successfully.', } }, }) @@ -105,15 +98,9 @@ export const buildAndroidApp = tool({ // tbd: additional CLI flags, such as activeArchOnly - try { - build(gradleArgs, sourceDir) - return { - success: true, - } - } catch (error) { - return { - error: JSON.stringify(error), - } + build(gradleArgs, sourceDir) + return { + success: true, } }, }) @@ -125,18 +112,9 @@ export const runAdbReverse = tool({ port: z.number(), }), execute: async ({ androidDevice_id: deviceId, port }) => { - try { - tryRunAdbReverse(port, deviceId) - return { - success: true, - } - } catch (error) { - return { - error: - error instanceof Error - ? error.message - : 'Failed to run "adb reverse". Port is not forwared.', - } + tryRunAdbReverse(port, deviceId) + return { + success: true, } }, }) @@ -160,24 +138,16 @@ export const launchAndroidAppOnDevice = tool({ didForwardMetroPortToDevice, }) => { if (!didForwardMetroPortToDevice) { - return { - error: 'Port is not forwarded to device.', - action: 'Run "runAdbReverse" to forward port to device and try again.', - } + throw new Error('Port is not forwarded to device.') } - try { - // @ts-ignore - tryLaunchAppOnDevice(deviceId, { packageName, mainActivity, applicationId }, adbPath, { - appId: '', - appIdSuffix: '', - }) - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to launch app', - } + + // @ts-ignore + tryLaunchAppOnDevice(deviceId, { packageName, mainActivity, applicationId }, adbPath, { + appId: '', + appIdSuffix: '', + }) + return { + success: true, } }, }) diff --git a/packages/tools/src/apple.ts b/packages/tools/src/apple.ts index c772c49..854253d 100644 --- a/packages/tools/src/apple.ts +++ b/packages/tools/src/apple.ts @@ -42,16 +42,9 @@ export const bootAppleSimulator = tool({ deviceId: z.string(), }), execute: async ({ deviceId }) => { - try { - execSync(`xcrun simctl boot ${deviceId}`, { stdio: 'inherit' }) - return { - success: `Device ${deviceId} booted successfully.`, - } - } catch (error) { - return { - error: - error instanceof Error ? error.message : `Failed to boot simulator with ID ${deviceId}`, - } + execSync(`xcrun simctl boot ${deviceId}`, { stdio: 'inherit' }) + return { + success: `Device ${deviceId} booted successfully.`, } }, }) @@ -76,15 +69,10 @@ export const buildAppleAppWithoutStarting = tool({ execute: async ({ platform, ...params }) => { const config = await loadReactNativeConfig() const build = createAppleBuild({ platformName: platform }) - try { - await build([], config, params) - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to build application', - } + + await build([], config, params) + return { + success: true, } }, }) @@ -106,16 +94,10 @@ export const buildStartAppleApp = tool({ execute: async ({ platform, ...params }) => { const run = createAppleRun({ platformName: platform }) - try { - const config = await loadReactNativeConfig() - await run([], config, params) - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to start application', - } + const config = await loadReactNativeConfig() + await run([], config, params) + return { + success: true, } }, }) @@ -128,43 +110,37 @@ export const installPods = tool({ newArchitecture: z.boolean().optional(), }), execute: async ({ newArchitecture, platform, clean }) => { - try { - const config = await loadReactNativeConfig() - const directory = config.project?.[platform]?.sourceDir ?? 'ios' - - if (!directory) { - return { - error: 'Project directory not found', - } - } + const config = await loadReactNativeConfig() + const directory = config.project?.[platform]?.sourceDir ?? 'ios' - if (clean) { - execSync('rm -rf Pods Podfile.lock build', { - cwd: directory, - stdio: 'inherit', - }) + if (!directory) { + return { + error: 'Project directory not found', } + } - const commands = ['bundle exec pod install'] - - for (const command of commands) { - execSync(command, { - cwd: directory, - stdio: 'inherit', - env: { - ...process.env, - ...(newArchitecture ? { RCT_NEW_ARCH_ENABLED: '1' } : {}), - }, - }) - } + if (clean) { + execSync('rm -rf Pods Podfile.lock build', { + cwd: directory, + stdio: 'inherit', + }) + } - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to install pods', - } + const commands = ['bundle exec pod install'] + + for (const command of commands) { + execSync(command, { + cwd: directory, + stdio: 'inherit', + env: { + ...process.env, + ...(newArchitecture ? { RCT_NEW_ARCH_ENABLED: '1' } : {}), + }, + }) + } + + return { + success: true, } }, }) @@ -176,17 +152,11 @@ export const startAppleLogging = tool({ interactive: z.boolean().optional().default(true), }), execute: async ({ platform, ...params }) => { - try { - const config = await loadReactNativeConfig() - const log = createLogCommand({ platformName: platform }) - await log([], config, params) - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to start logging', - } + const config = await loadReactNativeConfig() + const log = createLogCommand({ platformName: platform }) + await log([], config, params) + return { + success: true, } }, }) diff --git a/packages/tools/src/git.ts b/packages/tools/src/git.ts index 4a17098..e6195a6 100644 --- a/packages/tools/src/git.ts +++ b/packages/tools/src/git.ts @@ -11,23 +11,17 @@ export const applyDiff = tool({ diff: z.string(), }), execute: async ({ filePath, diff }) => { - try { - const originalContent = fs.readFileSync(filePath, 'utf8') - const patchedContent = applyPatch(originalContent, diff) + const originalContent = fs.readFileSync(filePath, 'utf8') + const patchedContent = applyPatch(originalContent, diff) - if (patchedContent === false) { - throw new Error('Failed to apply patch - patch may be invalid or not applicable') - } + if (patchedContent === false) { + throw new Error('Failed to apply patch - patch may be invalid or not applicable') + } - fs.writeFileSync(filePath, patchedContent, 'utf8') + fs.writeFileSync(filePath, patchedContent, 'utf8') - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to apply diff', - } + return { + success: true, } }, }) diff --git a/packages/tools/src/npm.ts b/packages/tools/src/npm.ts index 518b7e9..e1ebf31 100644 --- a/packages/tools/src/npm.ts +++ b/packages/tools/src/npm.ts @@ -39,19 +39,13 @@ export const unInstallNpmPackage = tool({ packageManager: z.enum(['yarn', 'npm', 'bun']).optional(), }), execute: async ({ packageNames, packageManager }) => { - try { - const params = { - packageManager: packageManager || 'npm', - root: process.cwd(), - } - await uninstall(packageNames, params) - return { - success: true, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to install package', - } + const params = { + packageManager: packageManager || 'npm', + root: process.cwd(), + } + await uninstall(packageNames, params) + return { + success: true, } }, }) diff --git a/packages/tools/src/react-native.ts b/packages/tools/src/react-native.ts index 5c577b3..18c76e3 100644 --- a/packages/tools/src/react-native.ts +++ b/packages/tools/src/react-native.ts @@ -24,16 +24,10 @@ export const startMetroDevServer = tool({ reactNativeConfig_root: root, reactNativeConfig_reactNativePath: reactNativePath, }) => { - try { - const { port: newPort } = await findDevServerPort(port, root) - startServerInNewWindow(newPort, root, reactNativePath, getDefaultUserTerminal()) - return { - success: `Metro server started on port ${newPort}.`, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to start Metro bundler', - } + const { port: newPort } = await findDevServerPort(port, root) + startServerInNewWindow(newPort, root, reactNativePath, getDefaultUserTerminal()) + return { + success: `Metro server started on port ${newPort}.`, } }, }) @@ -67,25 +61,19 @@ export const getReactNativeConfig = tool({ `, parameters: z.object({}), execute: async () => { - try { - const { - root, - reactNativePath: path, - reactNativeVersion: version, - project, - platforms, - } = await loadReactNativeConfig() - return { - root, - path, - version, - project, - platforms, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to get React Native config', - } + const { + root, + reactNativePath: path, + reactNativeVersion: version, + project, + platforms, + } = await loadReactNativeConfig() + return { + root, + path, + version, + project, + platforms, } }, }) @@ -106,36 +94,30 @@ export const listReactNativeLibraries = tool({ search: z.string().optional(), }), execute: async ({ search }) => { - try { - const response = await fetch( - `https://reactnative.directory/api/libraries${search ? `?search=${search}` : ''}` - ) - const { libraries } = await response.json() + const response = await fetch( + `https://reactnative.directory/api/libraries${search ? `?search=${search}` : ''}` + ) + const { libraries } = await response.json() - const mappedLibraries = libraries.map((library: any) => ({ - name: `${library.github.name} (★ ${library.github.stats.stars})`, - description: library.description, - npmPackageName: library.npmPkg, - score: library.score, - url: library.github.urls.repo, - })) + const mappedLibraries = libraries.map((library: any) => ({ + name: `${library.github.name} (★ ${library.github.stats.stars})`, + description: library.description, + npmPackageName: library.npmPkg, + score: library.score, + url: library.github.urls.repo, + })) - return { - success: true, - action: dedent` - Ask user to pick a library from the list. - Offer user an option to try different search query. - Offer user an option to cancel the operation and proceed with something else. + return { + success: true, + action: dedent` + Ask user to pick a library from the list. + Offer user an option to try different search query. + Offer user an option to cancel the operation and proceed with something else. - For each library, you can use "installNpmPackage" tool to install it. - You can also offer to display package description or visit Github repository. - `, - libraries: mappedLibraries, - } - } catch (error) { - return { - error: error instanceof Error ? error.message : 'Failed to start Metro bundler', - } + For each library, you can use "installNpmPackage" tool to install it. + You can also offer to display package description or visit Github repository. + `, + libraries: mappedLibraries, } }, }) From a5a13b596f170377b29ff525e09ac1b872035bf7 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 18:18:39 +0100 Subject: [PATCH 4/8] chore: clean-up build, use tsup, no rslib anymore, fix build pipeline --- .eslintrc.cjs | 20 +++++++++++++- bun.lockb | Bin 316952 -> 341496 bytes package.json | 7 ++--- packages/cali/package.json | 6 ++--- packages/cali/rslib.config.ts | 33 ----------------------- packages/cali/src/agents.ts | 40 +++++++--------------------- packages/cali/src/cli.ts | 5 ++-- packages/cali/tsup.config.ts | 10 +++++++ packages/mcp-server/package.json | 6 ++--- packages/mcp-server/rslib.config.ts | 19 ------------- packages/mcp-server/src/index.ts | 17 +++++++++++- packages/mcp-server/tsup.config.ts | 10 +++++++ packages/tools/README.md | 4 +-- packages/tools/package.json | 26 +++++++++--------- packages/tools/rslib.config.ts | 34 ----------------------- packages/tools/src/index.ts | 6 ----- packages/tools/tsup.config.ts | 10 +++++++ 17 files changed, 100 insertions(+), 153 deletions(-) delete mode 100644 packages/cali/rslib.config.ts create mode 100644 packages/cali/tsup.config.ts delete mode 100644 packages/mcp-server/rslib.config.ts create mode 100644 packages/mcp-server/tsup.config.ts delete mode 100644 packages/tools/rslib.config.ts delete mode 100644 packages/tools/src/index.ts create mode 100644 packages/tools/tsup.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index fda6101..a5626cd 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -21,7 +21,25 @@ module.exports = { }, ], 'object-shorthand': ['error', 'always'], - 'simple-import-sort/imports': 'error', + 'simple-import-sort/imports': [ + 'error', + { + groups: [ + // Node.js builtins + ['^node:'], + // External packages + ['^@?\\w'], + // Internal packages and cali-tools + ['^cali-tools'], + // Parent imports + ['^\\.\\.(?!/?$)', '^\\.\\./?$'], + // Other relative imports + ['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'], + // Style imports + ['^.+\\.s?css$'], + ], + }, + ], 'simple-import-sort/exports': 'error', }, overrides: [ diff --git a/bun.lockb b/bun.lockb index c6fdc2fbe77e8757bcace73fba13a7c8b8bb847b..e9c398c2fc06837adbe6aad09f2721e85779ddaf 100755 GIT binary patch delta 69708 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 delta 55977 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 bnY|2CPGROsF5#W4OCJQDr~-Cxd* diff --git a/package.json b/package.json index 2dff256..9e613e9 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "devDependencies": { "@release-it-plugins/workspaces": "^4.2.0", "@release-it/conventional-changelog": "^9.0.3", - "@rslib/core": "^0.1.1", "@typescript-eslint/eslint-plugin": "^7.3.1", "@typescript-eslint/parser": "^7.3.1", "bun-types": "^1.1.33", @@ -15,6 +14,7 @@ "eslint-plugin-simple-import-sort": "^12.0.0", "prettier": "^3.2.5", "release-it": "^17.10.0", + "tsup": "^8.3.5", "tsx": "^4.19.2", "typescript": "^5.1.3", "vitest": "^2.1.1" @@ -22,10 +22,7 @@ "license": "MIT", "private": true, "scripts": { - "build": "bun run build:tools && bun run build:mcp-server && bun run build:cli", - "build:tools": "cd packages/tools && bun run build", - "build:mcp-server": "cd packages/mcp-server && bun run build", - "build:cli": "cd packages/cali && bun run build", + "build": "bun run --filter '*' build", "release": "release-it" }, "workspaces": [ diff --git a/packages/cali/package.json b/packages/cali/package.json index 541ee19..a5366a8 100644 --- a/packages/cali/package.json +++ b/packages/cali/package.json @@ -5,9 +5,9 @@ }, "type": "module", "scripts": { - "build": "rslib build", - "dev": "node --import=tsx ./src/cli.ts", - "start": "node ./dist/index.js" + "prepare": "bun run build", + "clean": "rm -rf dist", + "build": "tsup-node" }, "dependencies": { "@ai-sdk/openai": "^1.0.2", diff --git a/packages/cali/rslib.config.ts b/packages/cali/rslib.config.ts deleted file mode 100644 index 9639e61..0000000 --- a/packages/cali/rslib.config.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { defineConfig } from '@rslib/core' - -import { dependencies } from './package.json' - -/** - * We need to bundle `ai` dependency with the CLI, because we have custom patch for it. - * We delete `ai` from dependencies that are passed as `externals`. - */ -// @ts-ignore -delete dependencies.ai - -export default defineConfig({ - lib: [ - { - source: { - entry: { - index: './src/cli.ts', - }, - }, - format: 'esm', - bundle: true, - autoExternal: { - dependencies: false, - }, - output: { - externals: Object.keys(dependencies), - distPath: { - root: 'dist', - }, - }, - }, - ], -}) diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index 9fd1cc2..ddee162 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -1,23 +1,16 @@ import { openai } from '@ai-sdk/openai' import { confirm, select, text } from '@clack/prompts' import { tool } from 'ai' -import { - bootAndroidEmulator, - bootAppleSimulator, - buildAndroidApp, - buildAppleAppWithoutStarting, - buildStartAppleApp, - getAdbPath, - getAndroidDevices, - getAppleSimulators, - getReactNativeConfig, - launchAndroidAppOnDevice, - runAdbReverse, - startMetroDevServer, -} from 'cali-tools' import { agent } from 'workflows-ai' import { z } from 'zod' +/** + * Tools + */ +import * as androidTools from 'cali-tools/android' +import * as appleTools from 'cali-tools/apple' +import { getReactNativeConfig, startMetroDevServer } from 'cali-tools/react-native' + /** * Helper tool to throw errors when something wents wrong on the tool level. */ @@ -99,9 +92,8 @@ export const reactNativeAgent = agent({ `, model: openai('gpt-4o-mini'), tools: { - startMetroDevServer, getReactNativeConfig, - somethingWentWrong, + startMetroDevServer, }, }) @@ -110,12 +102,7 @@ export const appleAgent = agent({ You are a helpful assistant that helps with everything related to iOS. `, model: openai('gpt-4o-mini'), - tools: { - getAppleSimulators, - bootAppleSimulator, - buildAppleAppWithoutStarting, - buildStartAppleApp, - }, + tools: appleTools, }) export const androidAgent = agent({ @@ -123,12 +110,5 @@ export const androidAgent = agent({ You are a helpful assistant that helps with everything related to Android. `, model: openai('gpt-4o-mini'), - tools: { - getAdbPath, - getAndroidDevices, - bootAndroidEmulator, - buildAndroidApp, - runAdbReverse, - launchAndroidAppOnDevice, - }, + tools: androidTools, }) diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index c9b27cd..b47bd75 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -1,7 +1,4 @@ #!/usr/bin/env node - -import 'dotenv/config' - import { log, spinner } from '@clack/prompts' import chalk from 'chalk' import dedent from 'dedent' @@ -11,6 +8,8 @@ import { execute } from 'workflows-ai' import { androidAgent, appleAgent, reactNativeAgent, userInputAgent } from './agents.js' import { mainFlow } from './flows.js' +import 'dotenv/config' + console.clear() process.on('uncaughtException', (error) => { diff --git a/packages/cali/tsup.config.ts b/packages/cali/tsup.config.ts new file mode 100644 index 0000000..1e790a4 --- /dev/null +++ b/packages/cali/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['./src/**/*.ts'], + format: ['esm'], + target: 'node22', + splitting: false, + clean: true, + dts: true, +}) diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index b44031f..b6e6c33 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -6,9 +6,9 @@ "cali-mcp-server": "./dist/index.js" }, "scripts": { - "build": "rslib build", - "dev": "node --import=tsx ./src/index.ts", - "inspector": "npx @modelcontextprotocol/inspector node --import=tsx ./src/index.ts" + "prepare": "bun run build", + "clean": "rm -rf dist", + "build": "tsup-node" }, "dependencies": { "cali-tools": "0.3.1", diff --git a/packages/mcp-server/rslib.config.ts b/packages/mcp-server/rslib.config.ts deleted file mode 100644 index 149d498..0000000 --- a/packages/mcp-server/rslib.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from '@rslib/core' - -export default defineConfig({ - lib: [ - { - source: { - entry: { - index: './src/index.ts', - }, - }, - format: 'esm', - output: { - distPath: { - root: 'dist', - }, - }, - }, - ], -}) diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts index cbbeca3..bc9a4a9 100644 --- a/packages/mcp-server/src/index.ts +++ b/packages/mcp-server/src/index.ts @@ -3,9 +3,24 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js' import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' -import * as tools from 'cali-tools' import { zodToJsonSchema } from 'zod-to-json-schema' +import * as androidTools from 'cali-tools/android' +import * as appleTools from 'cali-tools/apple' +import * as fsTools from 'cali-tools/fs' +import * as gitTools from 'cali-tools/git' +import * as npmTools from 'cali-tools/npm' +import * as reactNativeTools from 'cali-tools/react-native' + +const tools = { + ...androidTools, + ...appleTools, + ...gitTools, + ...reactNativeTools, + ...fsTools, + ...npmTools, +} + const server = new Server( { name: 'cali-mcp-server', diff --git a/packages/mcp-server/tsup.config.ts b/packages/mcp-server/tsup.config.ts new file mode 100644 index 0000000..d2c236e --- /dev/null +++ b/packages/mcp-server/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['./src/**/*.ts'], + format: ['cjs', 'esm'], + target: 'node22', + splitting: false, + clean: true, + dts: true, +}) diff --git a/packages/tools/README.md b/packages/tools/README.md index 4db6ade..043fe26 100644 --- a/packages/tools/README.md +++ b/packages/tools/README.md @@ -5,8 +5,8 @@ Collection of tools for building AI agents that work with React Native. Exported ## Usage ```ts -// First, import all tools -import * as tools from "cali-tools"; +// First, import the tools you want +import * as reactNativeTools from "cali-tools/react-native"; import { generateText } from "ai"; await generateText({ diff --git a/packages/tools/package.json b/packages/tools/package.json index 0df3a4e..2022c5e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -3,21 +3,16 @@ "description": "Tools to build your own AI agents for application development.", "type": "module", "exports": { - ".": { - "source": "./src/index.ts", - "types": "./dist/types/index.d.ts", - "require": "./dist/index.cjs", - "import": "./dist/index.js" + "./*": { + "source": "./src/*.ts", + "types": { + "import": "./dist/index.d.ts", + "require": "./dist/index.d.cts" + }, + "require": "./dist/*.cjs", + "import": "./dist/*.js" } }, - "main": "./dist/index.cjs", - "module": "./dist/index.js", - "types": "./dist/types/index.d.ts", - "scripts": { - "build": "bun run build:lib && bun run build:types", - "build:lib": "rslib build", - "build:types": "tsc --emitDeclarationOnly --declaration --outdir dist/types" - }, "dependencies": { "@ai-sdk/openai": "^1.0.2", "@clack/prompts": "^0.8.1", @@ -58,5 +53,10 @@ "version": "0.3.1", "engines": { "node": ">=22" + }, + "scripts": { + "prepare": "bun run build", + "clean": "rm -rf dist", + "build": "tsup-node" } } diff --git a/packages/tools/rslib.config.ts b/packages/tools/rslib.config.ts deleted file mode 100644 index 149cb45..0000000 --- a/packages/tools/rslib.config.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { defineConfig } from '@rslib/core' - -export default defineConfig({ - lib: [ - { - source: { - entry: { - index: './src/index.ts', - }, - }, - format: 'esm', - output: { - externals: [/react-native-community/], - distPath: { - root: 'dist', - }, - }, - }, - { - source: { - entry: { - index: './src/index.ts', - }, - }, - format: 'cjs', - output: { - externals: [/react-native-community/], - distPath: { - root: 'dist', - }, - }, - }, - ], -}) diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts deleted file mode 100644 index 183d3da..0000000 --- a/packages/tools/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './android.js' -export * from './apple.js' -export * from './fs.js' -export * from './git.js' -export * from './npm.js' -export * from './react-native.js' diff --git a/packages/tools/tsup.config.ts b/packages/tools/tsup.config.ts new file mode 100644 index 0000000..d2c236e --- /dev/null +++ b/packages/tools/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['./src/**/*.ts'], + format: ['cjs', 'esm'], + target: 'node22', + splitting: false, + clean: true, + dts: true, +}) From 388cd5ca57df78c7badb2330bad2b4429dcb45d4 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 19:42:05 +0100 Subject: [PATCH 5/8] chore: tweaks --- bun.lockb | Bin 341496 -> 332104 bytes package.json | 3 --- packages/cali/package.json | 1 + packages/cali/src/agents.ts | 36 ++++++++++++++++++----------- packages/cali/src/cli.ts | 20 ++++++++++------ packages/cali/src/flows.ts | 12 ++++------ packages/tools/src/react-native.ts | 4 ++-- 7 files changed, 44 insertions(+), 32 deletions(-) diff --git a/bun.lockb b/bun.lockb index e9c398c2fc06837adbe6aad09f2721e85779ddaf..e058240c9db7c056ffc368472d11314b1591457a 100755 GIT binary patch delta 66572 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 AkN^Mx diff --git a/package.json b/package.json index 9e613e9..5ea4704 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,5 @@ ] } } - }, - "dependencies": { - "workflows-ai": "^0.1.0" } } diff --git a/packages/cali/package.json b/packages/cali/package.json index a5366a8..2832f18 100644 --- a/packages/cali/package.json +++ b/packages/cali/package.json @@ -13,6 +13,7 @@ "@ai-sdk/openai": "^1.0.2", "@clack/prompts": "^0.8.1", "ai": "^4.0.3", + "ai-flows": "^0.1.1", "cali-tools": "0.3.1", "chalk": "^5.3.0", "dedent": "^1.5.3", diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index ddee162..07a9edf 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -1,7 +1,7 @@ import { openai } from '@ai-sdk/openai' import { confirm, select, text } from '@clack/prompts' import { tool } from 'ai' -import { agent } from 'workflows-ai' +import { agent } from 'ai-flows' import { z } from 'zod' /** @@ -32,14 +32,12 @@ export const somethingWentWrong = tool({ */ export const userInputAgent = agent({ system: ` - You are a helpful assistant that asks the user for input. - You are given a question and you must ask the user for input. - You ask friendly and easy to understand questions. + Your job is to ask the user for input and return his answer as string. You choose the right tool to ask the user for input, depending on the type of question. - You always return the response in requested format. - If you need more information, ask a follow-up question. + If you are given multiple questions, you must ask them one by one, and return all answers. + Do not create own questions or ask follow-up questions, unless you are explicitly asked to do so. `, - model: openai('gpt-4o-mini'), + model: openai('gpt-4o'), tools: { askOpenEndedUser: tool({ description: 'Ask the user to answer a question', @@ -47,9 +45,13 @@ export const userInputAgent = agent({ question: z.string(), }), execute: async ({ question }) => { - return await text({ + const answer = await text({ message: question, }) + if (typeof answer !== 'string') { + throw new Error('User cancelled the operation') + } + return answer }, }), askUserFromList: tool({ @@ -64,10 +66,14 @@ export const userInputAgent = agent({ ), }), execute: async ({ question, options }) => { - return await select({ + const answer = await select({ message: question, options, }) + if (typeof answer !== 'string') { + throw new Error('User cancelled the operation') + } + return answer }, }), confirmWithUser: tool({ @@ -76,9 +82,13 @@ export const userInputAgent = agent({ question: z.string(), }), execute: async ({ question }) => { - return await confirm({ + const answer = await confirm({ message: question, }) + if (typeof answer !== 'boolean') { + throw new Error('User cancelled the operation') + } + return answer }, }), }, @@ -90,7 +100,7 @@ export const reactNativeAgent = agent({ You do not know what platforms are available. You must run a tool to list available platforms. `, - model: openai('gpt-4o-mini'), + model: openai('gpt-4o'), tools: { getReactNativeConfig, startMetroDevServer, @@ -101,7 +111,7 @@ export const appleAgent = agent({ system: ` You are a helpful assistant that helps with everything related to iOS. `, - model: openai('gpt-4o-mini'), + model: openai('gpt-4o'), tools: appleTools, }) @@ -109,6 +119,6 @@ export const androidAgent = agent({ system: ` You are a helpful assistant that helps with everything related to Android. `, - model: openai('gpt-4o-mini'), + model: openai('gpt-4o'), tools: androidTools, }) diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index b47bd75..ff85ee4 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -1,9 +1,9 @@ #!/usr/bin/env node import { log, spinner } from '@clack/prompts' +import { execute } from 'ai-flows' import chalk from 'chalk' import dedent from 'dedent' import { retro } from 'gradient-string' -import { execute } from 'workflows-ai' import { androidAgent, appleAgent, reactNativeAgent, userInputAgent } from './agents.js' import { mainFlow } from './flows.js' @@ -39,7 +39,10 @@ console.log( console.log() const s = spinner() -s.start() + +s.start('Thinking...') + +const noisyFlows = ['startMetroServer', 'askUserToChooseFlow', 'askUserToChoosePlatform'] try { const response = await execute(mainFlow, { @@ -51,15 +54,18 @@ try { }, onFlowStart(flow) { if (flow.name) { - if ( - ['startMetroServer', 'askUserToChooseFlow', 'askUserToChoosePlatform'].includes(flow.name) - ) { - s.stop() + if (noisyFlows.includes(flow.name)) { + s.stop(flow.name) } else { - s.start(chalk.gray(flow.name)) + s.message(chalk.gray(flow.name)) } } }, + onFlowFinish(flow) { + if (flow.name && noisyFlows.includes(flow.name)) { + s.start() + } + }, }) log.success(response) } catch (error) { diff --git a/packages/cali/src/flows.ts b/packages/cali/src/flows.ts index 601dbff..727afdf 100644 --- a/packages/cali/src/flows.ts +++ b/packages/cali/src/flows.ts @@ -63,13 +63,11 @@ export const mainFlow = { name: 'askUserToChooseFlow', agent: 'userInputAgent', input: ` - Ask user to choose from available flows. + Greet the user and ask them what they want to do today. - Here is the list of flows, together with their descriptions: - - "runApplicationFlow": Run the application on the selected platform. - - You must present options to the user with description of the flow as label, name of the flow as value. - You must return the name of the flow as a string. + You can choose from the following options: + - Run the application on the selected platform + - Exit `, }, { @@ -78,7 +76,7 @@ export const mainFlow = { input: [ { ...runApplicationFlow, - when: 'User selected to execute "runApplicationFlow"', + when: 'User selected to run the application on the selected platform', }, ], }, diff --git a/packages/tools/src/react-native.ts b/packages/tools/src/react-native.ts index 18c76e3..2c8072d 100644 --- a/packages/tools/src/react-native.ts +++ b/packages/tools/src/react-native.ts @@ -15,7 +15,7 @@ export const startMetroDevServer = tool({ Returns port Metro server started on. `, parameters: z.object({ - port: z.number().default(8081), + port: z.number().nullable(), reactNativeConfig_root: z.string(), reactNativeConfig_reactNativePath: z.string(), }), @@ -24,7 +24,7 @@ export const startMetroDevServer = tool({ reactNativeConfig_root: root, reactNativeConfig_reactNativePath: reactNativePath, }) => { - const { port: newPort } = await findDevServerPort(port, root) + const { port: newPort } = await findDevServerPort(port ?? 8081, root) startServerInNewWindow(newPort, root, reactNativePath, getDefaultUserTerminal()) return { success: `Metro server started on port ${newPort}.`, From 23b25be4fa9a43e232988bc8bd255290a541de3d Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 20:00:39 +0100 Subject: [PATCH 6/8] chore: tweaks --- packages/cali/src/agents.ts | 159 +++++++++++++++++++++++------------- packages/cali/src/cli.ts | 28 +++---- packages/cali/src/flows.ts | 39 ++++----- 3 files changed, 132 insertions(+), 94 deletions(-) diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index 07a9edf..db4b9b0 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -27,6 +27,67 @@ export const somethingWentWrong = tool({ }, }) +const askUserFromList = tool({ + description: 'Ask the user to choose one of the provided options', + parameters: z.object({ + question: z.string(), + options: z.array( + z.object({ + value: z.string().describe('The value of the option'), + label: z.string().describe('The label that explains the value'), + }) + ), + }), + execute: async ({ question, options }) => { + const answer = await select({ + message: question, + options, + }) + if (typeof answer !== 'string') { + throw new Error('User cancelled the operation') + } + return answer + }, +}) + +const askUserOpenEndedQuestion = tool({ + description: 'Ask the user to answer a question', + parameters: z.object({ + question: z.string(), + }), + execute: async ({ question }) => { + const answer = await text({ + message: question, + }) + if (typeof answer !== 'string') { + throw new Error('User cancelled the operation') + } + return answer + }, +}) + +const confirmWithUser = tool({ + description: 'Ask the user to confirm something (yes/no)', + parameters: z.object({ + question: z.string(), + }), + execute: async ({ question }) => { + const answer = await confirm({ + message: question, + }) + if (typeof answer !== 'boolean') { + throw new Error('User cancelled the operation') + } + return answer + }, +}) + +const userInputTools = { + askUserOpenEndedQuestion, + askUserFromList, + confirmWithUser, +} + /** * Agent that ask the user for input. */ @@ -38,87 +99,73 @@ export const userInputAgent = agent({ Do not create own questions or ask follow-up questions, unless you are explicitly asked to do so. `, model: openai('gpt-4o'), - tools: { - askOpenEndedUser: tool({ - description: 'Ask the user to answer a question', - parameters: z.object({ - question: z.string(), - }), - execute: async ({ question }) => { - const answer = await text({ - message: question, - }) - if (typeof answer !== 'string') { - throw new Error('User cancelled the operation') - } - return answer - }, - }), - askUserFromList: tool({ - description: 'Ask the user to choose one of the provided options', - parameters: z.object({ - question: z.string(), - options: z.array( - z.object({ - value: z.string().describe('The value of the option'), - label: z.string().describe('The label that explains the value'), - }) - ), - }), - execute: async ({ question, options }) => { - const answer = await select({ - message: question, - options, - }) - if (typeof answer !== 'string') { - throw new Error('User cancelled the operation') - } - return answer - }, - }), - confirmWithUser: tool({ - description: 'Ask the user to confirm something (yes/no)', - parameters: z.object({ - question: z.string(), - }), - execute: async ({ question }) => { - const answer = await confirm({ - message: question, - }) - if (typeof answer !== 'boolean') { - throw new Error('User cancelled the operation') - } - return answer - }, - }), - }, + tools: userInputTools, }) export const reactNativeAgent = agent({ system: ` You are a helpful assistant that helps with everything related to React Native. + You do not know what platforms are available. You must run a tool to list available platforms. + If multiple platforms are available, you must ask the user to choose one, and include chosen platform in the final response. + + If user chooses a platform, you must assume that platform for all operations. `, model: openai('gpt-4o'), tools: { getReactNativeConfig, startMetroDevServer, + ...userInputTools, }, }) export const appleAgent = agent({ system: ` You are a helpful assistant that helps with everything related to iOS. + + When running an app on simulator, you must first check if the simulator is running. + If it is not, you must start it. + + If there are multiple simulators or devices available, you must ask the user to choose one first. `, model: openai('gpt-4o'), - tools: appleTools, + tools: { + ...appleTools, + ...userInputTools, + }, }) export const androidAgent = agent({ system: ` You are a helpful assistant that helps with everything related to Android. + + When running an app on emulator, you must first check if the emulator is running. + If it is not, you must start it. + + If there are multiple emulators or devices available, you must ask the user to choose one first. `, model: openai('gpt-4o'), - tools: androidTools, + tools: { + ...androidTools, + ...userInputTools, + }, +}) + +export const processAgent = agent({ + system: ` + You are a helpful assistant that helps with everything related to process. + You are given a command to execute. + You must execute the command and return the result. + `, + model: openai('gpt-4o'), + tools: { + exit: tool({ + description: 'Exit the application', + parameters: z.object({}), + execute: () => { + process.exit(0) + }, + }), + }, }) diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index ff85ee4..22a6e11 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -1,11 +1,18 @@ #!/usr/bin/env node -import { log, spinner } from '@clack/prompts' + +import { log } from '@clack/prompts' import { execute } from 'ai-flows' import chalk from 'chalk' import dedent from 'dedent' import { retro } from 'gradient-string' -import { androidAgent, appleAgent, reactNativeAgent, userInputAgent } from './agents.js' +import { + androidAgent, + appleAgent, + processAgent, + reactNativeAgent, + userInputAgent, +} from './agents.js' import { mainFlow } from './flows.js' import 'dotenv/config' @@ -38,12 +45,6 @@ console.log( console.log() -const s = spinner() - -s.start('Thinking...') - -const noisyFlows = ['startMetroServer', 'askUserToChooseFlow', 'askUserToChoosePlatform'] - try { const response = await execute(mainFlow, { agents: { @@ -51,19 +52,16 @@ try { androidAgent, reactNativeAgent, userInputAgent, + processAgent, }, onFlowStart(flow) { if (flow.name) { - if (noisyFlows.includes(flow.name)) { - s.stop(flow.name) - } else { - s.message(chalk.gray(flow.name)) - } + log.info(chalk.gray(flow.name)) } }, onFlowFinish(flow) { - if (flow.name && noisyFlows.includes(flow.name)) { - s.start() + if (flow.name) { + log.success(chalk.gray(flow.name)) } }, }) diff --git a/packages/cali/src/flows.ts b/packages/cali/src/flows.ts index 727afdf..7938931 100644 --- a/packages/cali/src/flows.ts +++ b/packages/cali/src/flows.ts @@ -9,11 +9,11 @@ export const runApplicationFlow = { agent: 'reactNativeAgent', input: ` Check if we are in the React Native environment and whether everything is set up correctly. - Return React Native config for the project + Return React Native config for the project and ask user to choose platform. `, }, { - agent: 'parallelAgent', + agent: 'sequenceAgent', input: [ { name: 'startMetroServer', @@ -21,30 +21,19 @@ export const runApplicationFlow = { input: 'Start Metro development server if it is not running', }, { - agent: 'sequenceAgent', + agent: 'oneOfAgent', input: [ { - name: 'askUserToChoosePlatform', - agent: 'userInputAgent', - input: - 'Ask user to select one of available platforms, based on provided React Native config in the context', + name: 'runApplicationOnIOS', + agent: 'appleAgent', + when: 'User selected to run application on iOS platform', + input: 'Run the application on the iOS platform.', }, { - agent: 'oneOfAgent', - input: [ - { - name: 'runApplicationOnIOS', - agent: 'appleAgent', - when: 'User selected to run application on iOS platform', - input: 'Run the application on the iOS platform.', - }, - { - name: 'runApplicationOnAndroid', - agent: 'androidAgent', - when: 'User selected to run application on Android platform', - input: 'Run the application on the Android platform.', - }, - ], + name: 'runApplicationOnAndroid', + agent: 'androidAgent', + when: 'User selected to run application on Android platform', + input: 'Run the application on the Android platform.', }, ], }, @@ -71,13 +60,17 @@ export const mainFlow = { `, }, { - name: 'executeFlow', agent: 'oneOfAgent', input: [ { ...runApplicationFlow, when: 'User selected to run the application on the selected platform', }, + { + agent: 'processAgent', + input: 'Exit', + when: 'User selected to exit', + }, ], }, ], From 37ee7a5f2256a5ec98ab38898cf68b7b6e7e8f76 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 20:22:20 +0100 Subject: [PATCH 7/8] chore: feature-parity --- packages/cali/src/agents.ts | 19 +++++++++++-------- packages/cali/src/cli.ts | 8 ++++---- packages/cali/src/flows.ts | 29 +++++++++++++++++------------ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index db4b9b0..b32d3f7 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -96,7 +96,6 @@ export const userInputAgent = agent({ Your job is to ask the user for input and return his answer as string. You choose the right tool to ask the user for input, depending on the type of question. If you are given multiple questions, you must ask them one by one, and return all answers. - Do not create own questions or ask follow-up questions, unless you are explicitly asked to do so. `, model: openai('gpt-4o'), tools: userInputTools, @@ -108,9 +107,11 @@ export const reactNativeAgent = agent({ You do not know what platforms are available. You must run a tool to list available platforms. - If multiple platforms are available, you must ask the user to choose one, and include chosen platform in the final response. - - If user chooses a platform, you must assume that platform for all operations. + + If platform is already specified in context, you must use it. + If platform is not specified in context, you must ask the user to choose one and include chosen platform in the final response. + Use that platform for all operations. + `, model: openai('gpt-4o'), tools: { @@ -123,11 +124,12 @@ export const reactNativeAgent = agent({ export const appleAgent = agent({ system: ` You are a helpful assistant that helps with everything related to iOS. - + When running an app on simulator, you must first check if the simulator is running. If it is not, you must start it. - + If there are multiple simulators or devices available, you must ask the user to choose one first. + Do not ask the user if information is already provided in context. `, model: openai('gpt-4o'), tools: { @@ -139,11 +141,12 @@ export const appleAgent = agent({ export const androidAgent = agent({ system: ` You are a helpful assistant that helps with everything related to Android. - + When running an app on emulator, you must first check if the emulator is running. If it is not, you must start it. - + If there are multiple emulators or devices available, you must ask the user to choose one first. + Do not ask the user if information is already provided in context. `, model: openai('gpt-4o'), tools: { diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index 22a6e11..75f5087 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -54,12 +54,14 @@ try { userInputAgent, processAgent, }, - onFlowStart(flow) { + onFlowStart(flow, ctx) { + console.log(ctx) if (flow.name) { log.info(chalk.gray(flow.name)) } }, - onFlowFinish(flow) { + onFlowFinish(flow, result) { + console.log(result) if (flow.name) { log.success(chalk.gray(flow.name)) } @@ -68,6 +70,4 @@ try { log.success(response) } catch (error) { log.error(String(error)) -} finally { - s.stop() } diff --git a/packages/cali/src/flows.ts b/packages/cali/src/flows.ts index 7938931..d5dbace 100644 --- a/packages/cali/src/flows.ts +++ b/packages/cali/src/flows.ts @@ -16,24 +16,24 @@ export const runApplicationFlow = { agent: 'sequenceAgent', input: [ { - name: 'startMetroServer', + name: 'prepareReactNativeEnvironment', agent: 'reactNativeAgent', - input: 'Start Metro development server if it is not running', + input: 'Start Metro development server', }, { agent: 'oneOfAgent', input: [ { - name: 'runApplicationOnIOS', + name: 'runApplicationOnApple', agent: 'appleAgent', - when: 'User selected to run application on iOS platform', - input: 'Run the application on the iOS platform.', + input: 'Run the application on the selected Apple platform.', + when: 'User selected to run application on one of the Apple platforms', }, { name: 'runApplicationOnAndroid', agent: 'androidAgent', + input: 'Run the application on the selected Android platform.', when: 'User selected to run application on Android platform', - input: 'Run the application on the Android platform.', }, ], }, @@ -49,14 +49,19 @@ export const mainFlow = { agent: 'sequenceAgent', input: [ { - name: 'askUserToChooseFlow', agent: 'userInputAgent', input: ` - Greet the user and ask them what they want to do today. - - You can choose from the following options: - - Run the application on the selected platform - - Exit + Greet the user by saying random fun fact about React or React Native, then ask an open ended question about what they want to do today. + + Your capabilities are: + - Running and/or building the application for Apple and Android platforms + + General rules: + - Return ONLY the user's decision without any additional commentary + - If user asks you to explain your capabilities, list them and then ask again + - If user asks for something outside your capabilities, return "exit" + - If user provides specific details, include them in brackets like [platform: iOS, device: simulator] + - Format all responses as "User selected to {action} [detail1: value1, detail2: value2]" `, }, { From 1dfab78f3e71ad20e3cff2ab5e62f8a9410eaf29 Mon Sep 17 00:00:00 2001 From: Mike Grabowski Date: Thu, 16 Jan 2025 22:30:35 +0100 Subject: [PATCH 8/8] chore: tweaks --- bun.lockb | Bin 332104 -> 332104 bytes packages/cali/package.json | 2 +- packages/cali/src/agents.ts | 3 ++- packages/cali/src/cli.ts | 6 ++---- packages/cali/src/flows.ts | 18 ++++-------------- packages/tools/src/android.ts | 2 +- 6 files changed, 10 insertions(+), 21 deletions(-) diff --git a/bun.lockb b/bun.lockb index e058240c9db7c056ffc368472d11314b1591457a..7a20dc38b22bceb1bdf59838231d182b7129aeae 100755 GIT binary patch delta 171 zcmV;c0960Tq7=xY6p$_;TqU1F@ILVptc*nsSufPJ;I%j6qt{UTIlu0~quKFPfljqf z0h$PtC^#^O7zqKl7zqMZSU?7Lhfbhl+ts;J`M-4oqCsXBr5h`1vMdBZX|Ff@sSDYI zQF@w<1c&g*3}-hq{eJH|et=CHg9g@}XR)mC{!53gVFI_UVFOC02LWC%E-@}LhyDiy ZxBdqOHwKr)5dR!Lf$YL}tTj+q^F(lLJP!8)TO=V%fE-6MyZt{PIGz7SVrYR5<&xc@i)R zlLwaE2~hCe1{0$iZ1AK={46f*aE--GtANm2EL(@IVFI_UVFOC02Lb>900000hyDiy ZxBdqOHwKsV`~)DEhvNhdw_*+j<^m=cND%-4 diff --git a/packages/cali/package.json b/packages/cali/package.json index 2832f18..4a48804 100644 --- a/packages/cali/package.json +++ b/packages/cali/package.json @@ -13,7 +13,7 @@ "@ai-sdk/openai": "^1.0.2", "@clack/prompts": "^0.8.1", "ai": "^4.0.3", - "ai-flows": "^0.1.1", + "ai-flows": "^0.1.2", "cali-tools": "0.3.1", "chalk": "^5.3.0", "dedent": "^1.5.3", diff --git a/packages/cali/src/agents.ts b/packages/cali/src/agents.ts index b32d3f7..6424113 100644 --- a/packages/cali/src/agents.ts +++ b/packages/cali/src/agents.ts @@ -96,6 +96,8 @@ export const userInputAgent = agent({ Your job is to ask the user for input and return his answer as string. You choose the right tool to ask the user for input, depending on the type of question. If you are given multiple questions, you must ask them one by one, and return all answers. + You must return only user answers, without any unnecessary commentary. + You must include all the details in the answer. `, model: openai('gpt-4o'), tools: userInputTools, @@ -111,7 +113,6 @@ export const reactNativeAgent = agent({ If platform is already specified in context, you must use it. If platform is not specified in context, you must ask the user to choose one and include chosen platform in the final response. Use that platform for all operations. - `, model: openai('gpt-4o'), tools: { diff --git a/packages/cali/src/cli.ts b/packages/cali/src/cli.ts index 75f5087..d7c4109 100755 --- a/packages/cali/src/cli.ts +++ b/packages/cali/src/cli.ts @@ -54,14 +54,12 @@ try { userInputAgent, processAgent, }, - onFlowStart(flow, ctx) { - console.log(ctx) + onFlowStart(flow) { if (flow.name) { log.info(chalk.gray(flow.name)) } }, - onFlowFinish(flow, result) { - console.log(result) + onFlowFinish(flow) { if (flow.name) { log.success(chalk.gray(flow.name)) } diff --git a/packages/cali/src/flows.ts b/packages/cali/src/flows.ts index d5dbace..5d4f310 100644 --- a/packages/cali/src/flows.ts +++ b/packages/cali/src/flows.ts @@ -51,17 +51,12 @@ export const mainFlow = { { agent: 'userInputAgent', input: ` - Greet the user by saying random fun fact about React or React Native, then ask an open ended question about what they want to do today. + Greet the user and ask an open-ended question about what they want to do today. Your capabilities are: - - Running and/or building the application for Apple and Android platforms + - Running and/or building the React Native application for Apple and Android platforms - General rules: - - Return ONLY the user's decision without any additional commentary - - If user asks you to explain your capabilities, list them and then ask again - - If user asks for something outside your capabilities, return "exit" - - If user provides specific details, include them in brackets like [platform: iOS, device: simulator] - - Format all responses as "User selected to {action} [detail1: value1, detail2: value2]" + When user asks you to explain your capabilities, list them and then ask user to choose what they want to do. `, }, { @@ -69,12 +64,7 @@ export const mainFlow = { input: [ { ...runApplicationFlow, - when: 'User selected to run the application on the selected platform', - }, - { - agent: 'processAgent', - input: 'Exit', - when: 'User selected to exit', + when: 'run or build the application on any platform', }, ], }, diff --git a/packages/tools/src/android.ts b/packages/tools/src/android.ts index 58aa229..088ea14 100644 --- a/packages/tools/src/android.ts +++ b/packages/tools/src/android.ts @@ -27,7 +27,7 @@ export const getAndroidDevices = tool({ description: dedent` Gets available Android devices and emulators. - Returns an array of devices: + Returns an array of devices with the following properties: - "id" - device ID - "name" - device name - "type" - device type ("device" or "emulator")