/** @file The neighbor's harness as a Project Think agent, lent a mower. */ import { Think } from "@cloudflare/think"; import { createExecuteTool } from "@cloudflare/think/tools/execute"; import { createWorkersAI } from "workers-ai-provider"; import { MAX_TOKENS, MODEL } from "./model.ts"; import { MowerConnector } from "./mower-connector.ts"; import { makeMower } from "./mower.ts"; type Env = { AI: Ai; LOADER: WorkerLoader }; export class Neighbor extends Think { #mower = makeMower({ width: 40, height: 40, at: { x: 20, y: 20 } }); getModel() { return createWorkersAI({ binding: this.env.AI })(MODEL); } getSystemPrompt() { return `You are my neighbor. You have 50 acres of lawn that need mowing. You act by running code with the execute tool. Things I lend you are namespaces there: the mower is \`mower.*\`. Don't ask me questions: when I lend you something, put it to use, then tell me what you did.`; } beforeTurn() { // only code: Think's workspace tools sent the model looking for the // mower in the filesystem return { maxOutputTokens: MAX_TOKENS, activeTools: ["execute"] }; } getTools() { return { execute: createExecuteTool(this, { connectors: [new MowerConnector(this.ctx, this.env, this.#mower)], }), }; } /** the cells the mower has cut, as `"x,y"` */ cutCells() { return this.#mower.cutCells(); } }