Foundational principles for architectural decisions and code review.
中文简介正在准备中。当前显示原文说明。
Write, test, turn on or off, add and remove gent extensions while gent runs.
中文简介正在准备中。当前显示原文说明。
查看安装方法安装前可以查看交给 AI 代理的指令内容。
An extension adds tools, requests, agents, hooks and Resources to gent. Gent loads extension files at the start of each turn. There is no restart and no file watcher.
~/.gent/extensions/. It reaches every project on this server.<project>/.gent/extensions/. It loads only when the user trusts the project (trustedProjects in ~/.gent/config.json). Only the user can trust a project.An extension is one .ts, .js or .mjs file, or a directory with an index.ts, index.js or index.mjs. A file named *.client.* belongs to the TUI, not to the server. Names that start with . or _ are not loaded.
Write the file with the file tools. Import only effect, @gent/core/extensions/api and @gent/core/extensions/branch-tools; gent binds these to the modules it runs. A module that the file imports by a relative path is built with it. Do not install npm packages for an extension.
import { Effect, Schema } from "effect"
import { defineExtension, ExtensionHost, tool } from "@gent/core/extensions/api"
const Greet = tool({
id: "greet.say",
description: "Greet a person by name",
params: Schema.Struct({ name: Schema.String }),
output: Schema.String,
execute: ({ name }) => Effect.succeed(`Hello, ${name}`),
})
export default defineExtension({
id: "greet",
setup: Effect.gen(function* () {
const host = yield* ExtensionHost
yield* host.register("tool", Greet)
}),
})
Export one defineExtension(...). Register each contribution through yield* ExtensionHost in setup; setup returns nothing. Host facades (Session, Interaction, FileLock, Extensions, State) come from yield* ExtensionContext inside a handler.
tools.extensions.status({ id }). It loads the files as they are now and runs the real loader. A failure names its phase: load (the file did not build or import), setup, validation (a tool id or an agent name collides) or startup (a Resource did not build), with the error.Active.resume to a verb below, or start a child agent: its first turn loads the new files.When an edit breaks an extension that loaded before, gent keeps the last good version running. extensions.status reports it Active with reloadFailed: the phase and the error of the new version. Fix the file; the next turn loads the fix.
Each of these asks the user once. A headless run declines. The change reaches the next turn of every session in the scope, not the running turn.
tools.extensions.disable({ id, scope }) and tools.extensions.enable({ id, scope }) edit disabledExtensions in the scope's config.json. A config file gent cannot read is refused: the user fixes it first.tools.extensions.add({ path, scope }) copies a file or directory into the scope's extensions directory. A name that exists is refused: edit that extension in place.tools.extensions.remove({ id, scope }) moves the extension's file or directory into a new directory under extension-trash in gent's data directory, where the user can get it back. A shipped extension cannot be removed; disable it.tools.extensions.reload({ id }) sets the extensions up again over the same files. It does not ask. A file edit needs no reload.Name the scope (user or project) unless the session runs from the home directory. Pass resume: "<what to do next>" to queue that message as your next turn once the change is made. Use resume only to go on with the task the user gave you.
The ask is consent for the change, not a sandbox: the file tools and bash can write the same files without an ask. Tell the user what you change.
还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Foundational principles for architectural decisions and code review.
中文简介正在准备中。当前显示原文说明。
Fetch and inspect external Git repositories and npm packages with their native command-line tools.
中文简介正在准备中。当前显示原文说明。
Launch gent (this repo's TUI agent harness) on the scripted model in a scratch home, check the run is worth driving, drive the real TUI and `gent ctl` as a user does from a feature map, and keep the proof. Use to check a change in the real TUI, to confirm a turn, a slash command, a pane, a picker or a ctl call works, or to show the owner it works. No paid model call, no owner data.
中文简介正在准备中。当前显示原文说明。