feat: RBAC checks, ./cli export, adapter-utils range, models.ts

- Add secrets (create/delete/get) and persistentvolumeclaims (get) RBAC checks to testEnvironment
- Add ./cli export and picocolors dependency to package.json
- Change @paperclipai/adapter-utils peer dep to >= range
- Add src/server/models.ts with listK8sModels() returning OpenCode provider-prefixed model IDs
- Wire listModels into ServerAdapterModule (replaces static undefined models field)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-24 21:58:00 +00:00
parent ea4db3ba9b
commit 3ed6e95085
5 changed files with 27 additions and 7 deletions
+5 -3
View File
@@ -10,7 +10,8 @@
"exports": {
".": "./dist/index.js",
"./server": "./dist/server/index.js",
"./ui-parser": "./dist/ui-parser.js"
"./ui-parser": "./dist/ui-parser.js",
"./cli": "./dist/cli/index.js"
},
"files": [
"dist"
@@ -23,10 +24,11 @@
"test:watch": "vitest"
},
"dependencies": {
"@kubernetes/client-node": "^1.0.0"
"@kubernetes/client-node": "^1.0.0",
"picocolors": "^1.1.1"
},
"peerDependencies": {
"@paperclipai/adapter-utils": "2026.415.0-canary.7"
"@paperclipai/adapter-utils": ">=2026.415.0-canary.7"
},
"devDependencies": {
"@paperclipai/adapter-utils": "2026.415.0-canary.7",
-2
View File
@@ -1,8 +1,6 @@
export const type = "opencode_k8s";
export const label = "OpenCode (Kubernetes)";
export const models: undefined = undefined;
import type { CLIAdapterModule } from "@paperclipai/adapter-utils";
import { formatEvent } from "./cli/format-event.js";
+3 -2
View File
@@ -1,6 +1,7 @@
import type { ServerAdapterModule } from "@paperclipai/adapter-utils";
import { getAdapterSessionManagement } from "@paperclipai/adapter-utils";
import { type, models, agentConfigurationDoc } from "../index.js";
import { type, agentConfigurationDoc } from "../index.js";
import { listK8sModels } from "./models.js";
import { execute } from "./execute.js";
import { testEnvironment } from "./test.js";
import { sessionCodec } from "./session.js";
@@ -13,7 +14,7 @@ export function createServerAdapter(): ServerAdapterModule {
execute,
testEnvironment,
sessionCodec,
models,
listModels: listK8sModels,
listSkills: listOpenCodeSkills,
syncSkills: syncOpenCodeSkills,
supportsLocalAgentJwt: true,
+15
View File
@@ -0,0 +1,15 @@
import type { AdapterModel } from "@paperclipai/adapter-utils";
const MODELS: AdapterModel[] = [
{ id: "anthropic/claude-opus-4-7", label: "Claude Opus 4.7" },
{ id: "anthropic/claude-sonnet-4-6", label: "Claude Sonnet 4.6" },
{ id: "anthropic/claude-haiku-4-5", label: "Claude Haiku 4.5" },
{ id: "openai/gpt-4o", label: "GPT-4o" },
{ id: "openai/gpt-4o-mini", label: "GPT-4o mini" },
{ id: "google/gemini-2.5-pro", label: "Gemini 2.5 Pro" },
{ id: "google/gemini-2.5-flash", label: "Gemini 2.5 Flash" },
];
export async function listK8sModels(): Promise<AdapterModel[]> {
return MODELS;
}
+4
View File
@@ -87,6 +87,10 @@ async function checkRbac(
{ resource: "jobs", group: "batch", verb: "get", code: "k8s_rbac_job_get", label: "get Jobs" },
{ resource: "pods", group: "", verb: "list", code: "k8s_rbac_pod_list", label: "list Pods" },
{ resource: "pods/log", group: "", verb: "get", code: "k8s_rbac_pod_log", label: "get Pod logs" },
{ resource: "secrets", group: "", verb: "create", code: "k8s_rbac_secret_create", label: "create Secrets" },
{ resource: "secrets", group: "", verb: "delete", code: "k8s_rbac_secret_delete", label: "delete Secrets" },
{ resource: "secrets", group: "", verb: "get", code: "k8s_rbac_secret_get", label: "get Secrets" },
{ resource: "persistentvolumeclaims", group: "", verb: "get", code: "k8s_rbac_pvc_get", label: "get PersistentVolumeClaims" },
];
for (const check of rbacChecks) {