chore: scaffold Agent Studio workspace

This commit is contained in:
Wenxin Duan
2026-09-07 15:19:45 +08:00
parent 9933672c2e
commit 98baf9aee7
25 changed files with 6783 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
AGENT_PROVIDER=
AGENT_MODEL=
LLM_BASE_URL=
LLM_API=openai-responses
ALLOW_PRIVATE_LLM_BASE_URLS=false
SESSION_RUN_TIMEOUT_MS=120000
APPROVAL_TIMEOUT_MS=60000
MAX_IMAGE_BYTES=5242880
MAX_IMAGES_PER_MESSAGE=4
+10
View File
@@ -1 +1,11 @@
.worktrees/ .worktrees/
node_modules/
dist/
coverage/
.env
.env.*
!.env.example
workspace/sessions/*
!workspace/sessions/.gitkeep
*.log
.DS_Store
+15
View File
@@ -0,0 +1,15 @@
# Agent Studio Mini
Training-grade Agent Harness built with Pi Coding Agent SDK, Fastify, SSE, React, and assistant-ui.
The project is under active construction. Verified setup, security guidance, and demo instructions are added with the completed implementation.
## Verified dependency baseline
- Node.js 22.22.3 (Pi 0.85.1 requires Node.js 22.19 or newer)
- pnpm 11.7.0
- TypeScript 5.9.3 (the newest release supported by typescript-eslint 8.69)
- Pi Coding Agent SDK 0.85.1, using `typebox` 1.3.7
- assistant-ui React 0.15.18
The original brief allowed Node.js 20+ and referred generically to the current TypeBox package. The installed Pi release has a higher Node.js floor and directly uses the `typebox` package rather than `@sinclair/typebox`; this project follows the installed public types.
+20
View File
@@ -0,0 +1,20 @@
{
"name": "@agent-studio/server",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"build": "tsc -p tsconfig.build.json",
"dev": "tsx watch src/index.ts",
"lint": "eslint 'src/**/*.ts' 'tests/**/*.ts' --no-error-on-unmatched-pattern --max-warnings 0",
"typecheck": "tsc -p tsconfig.json",
"test": "vitest run --passWithNoTests"
},
"dependencies": {
"@agent-studio/harness": "workspace:*",
"@agent-studio/shared": "workspace:*",
"@fastify/multipart": "^10.1.1",
"fastify": "^5.12.3",
"zod": "^4.5.4"
}
}
+1
View File
@@ -0,0 +1 @@
export {};
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": false,
"sourceMap": true,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}
+7
View File
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "."
},
"include": ["src", "tests"]
}
+13
View File
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#111111" />
<title>Agent Studio Mini</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
+30
View File
@@ -0,0 +1,30 @@
{
"name": "@agent-studio/web",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"build": "tsc -p tsconfig.json && vite build",
"dev": "vite --host 127.0.0.1",
"lint": "eslint 'src/**/*.{ts,tsx}' 'tests/**/*.{ts,tsx}' vite.config.ts --no-error-on-unmatched-pattern --max-warnings 0",
"typecheck": "tsc -p tsconfig.json",
"test": "vitest run --passWithNoTests --environment jsdom"
},
"dependencies": {
"@agent-studio/shared": "workspace:*",
"@assistant-ui/react": "^0.15.18",
"lucide-react": "^1.41.0",
"react": "^19.2.8",
"react-dom": "^19.2.8"
},
"devDependencies": {
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.3",
"@testing-library/user-event": "^14.6.7",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.7",
"@vitejs/plugin-react": "^6.1.1",
"jsdom": "^30.0.1",
"vite": "^8.2.2"
}
}
+10
View File
@@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"types": ["vite/client", "vitest/globals", "@testing-library/jest-dom"]
},
"include": ["src", "tests", "vite.config.ts"]
}
+13
View File
@@ -0,0 +1,13 @@
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
export default defineConfig({
plugins: [react()],
server: {
port: 5173,
proxy: {
"/api": "http://127.0.0.1:3000",
"/health": "http://127.0.0.1:3000"
}
}
});
+26
View File
@@ -0,0 +1,26 @@
import eslint from "@eslint/js";
import tseslint from "typescript-eslint";
export default tseslint.config(
{
ignores: ["**/dist/**", "**/coverage/**", "**/node_modules/**"],
},
eslint.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/no-explicit-any": "error"
},
},
{
files: ["**/*.config.js", "**/*.config.ts", "eslint.config.js"],
extends: [tseslint.configs.disableTypeChecked],
},
);
+27
View File
@@ -0,0 +1,27 @@
{
"name": "agent-studio-mini",
"version": "0.1.0",
"private": true,
"type": "module",
"packageManager": "pnpm@11.7.0",
"engines": {
"node": ">=20"
},
"scripts": {
"dev": "pnpm --parallel --filter @agent-studio/server --filter @agent-studio/web dev",
"lint": "pnpm -r lint",
"typecheck": "pnpm -r typecheck",
"test": "pnpm -r test",
"build": "pnpm -r build"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@types/node": "^26.4.1",
"@vitest/coverage-v8": "^5.0.0",
"eslint": "^10.10.0",
"tsx": "^4.23.13",
"typescript": "^5.9.3",
"typescript-eslint": "^8.69.0",
"vitest": "^5.0.0"
}
}
+24
View File
@@ -0,0 +1,24 @@
{
"name": "@agent-studio/harness",
"version": "0.1.0",
"private": true,
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"scripts": {
"build": "tsc -p tsconfig.build.json",
"lint": "eslint 'src/**/*.ts' 'tests/**/*.ts' --no-error-on-unmatched-pattern --max-warnings 0",
"typecheck": "tsc -p tsconfig.json",
"test": "vitest run --passWithNoTests"
},
"dependencies": {
"@agent-studio/shared": "workspace:*",
"@earendil-works/pi-coding-agent": "^0.85.1",
"sharp": "^0.35.4",
"typebox": "1.3.7"
}
}
+1
View File
@@ -0,0 +1 @@
export {};
+11
View File
@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": false,
"declaration": true,
"sourceMap": true,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}
+7
View File
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "."
},
"include": ["src", "tests"]
}
+21
View File
@@ -0,0 +1,21 @@
{
"name": "@agent-studio/shared",
"version": "0.1.0",
"private": true,
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"scripts": {
"build": "tsc -p tsconfig.build.json",
"lint": "eslint 'src/**/*.ts' 'tests/**/*.ts' --no-error-on-unmatched-pattern --max-warnings 0",
"typecheck": "tsc -p tsconfig.json",
"test": "vitest run --passWithNoTests"
},
"dependencies": {
"zod": "^4.5.4"
}
}
+1
View File
@@ -0,0 +1 @@
export {};
+11
View File
@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": false,
"declaration": true,
"sourceMap": true,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}
+7
View File
@@ -0,0 +1,7 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"rootDir": "."
},
"include": ["src", "tests"]
}
+6479
View File
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
packages:
- apps/*
- packages/*
allowBuilds:
'@google/genai': false
esbuild: true
protobufjs: false
sharp: true
+18
View File
@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,
"useUnknownInCatchVariables": true,
"verbatimModuleSyntax": true,
"isolatedModules": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"noEmit": true
}
}
+1
View File
@@ -0,0 +1 @@