diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 74087e691..bf87a7b42 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,6 +25,14 @@ independent blind review using only requirements, acceptance criteria, boundarie repository path and comparison baseline. Fix in-scope blockers before delivery. Do not use `codex exec` as a substitute reviewer. +The Core Web is an administrator console for execution and resource operations; +business collaboration remains in Parsar. Environment Template management shares +the Session creation catalog and uses the existing public client operations. Patch +only edited fields, confirm deletion, and never automatically retry an uncertain +write. A Core connection change must discard the previous connection's forms, +pending results and notices. Saving a Template must not allocate a Runtime, call a +model or imply execution readiness. Keep unsupported advanced profiles explicit. + For subsequent alignment and milestone closure batches, the main thread coordinates design, shared interface agreements, file ownership, integration and merge. First reconcile main and the boards, then list remaining mandatory milestone work, diff --git a/apps/web/e2e/environment-templates.spec.ts b/apps/web/e2e/environment-templates.spec.ts new file mode 100644 index 000000000..d56661715 --- /dev/null +++ b/apps/web/e2e/environment-templates.spec.ts @@ -0,0 +1,314 @@ +import { expect, test, type APIRequestContext, type Page } from "@playwright/test"; + +const fixtureBaseUrl = `http://127.0.0.1:${process.env.AGENTS_FIXTURE_PORT ?? 18092}`; +const collectionPath = "/v1/agents/environments/templates"; +const beta = { "OpenAI-Beta": "agents=v1" }; + +interface Template { + id: string; + name: string | null; + network: { access: "enabled" | "disabled"; allowed_domains: string[] }; + created_at: number; + updated_at: number; +} + +interface RecordedRequest { + method: string; + path: string; + query: string; + beta: string | null; + body?: Record; +} + +async function control(request: APIRequestContext, values: Record) { + expect((await request.post(`${fixtureBaseUrl}/__fixture/control`, { data: values })).ok()).toBe(true); +} + +async function requests(request: APIRequestContext): Promise { + return (await request.get(`${fixtureBaseUrl}/__fixture/requests`)).json(); +} + +async function seed(request: APIRequestContext, name: string, access: "enabled" | "disabled" = "enabled"): Promise