Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
1ba08ce
chore: updated ai agents skills and implementation plan for core agen…
biersoeckli Jun 22, 2026
dea81ee
feat: add immutable project types
biersoeckli Jun 22, 2026
48fb48f
feat: make project authorization workload-neutral
biersoeckli Jun 22, 2026
178e7af
feat: implement LLM Gateways management with CRUD operations and conn…
biersoeckli Jun 22, 2026
05cae7f
feat: implement Agent creation with navigation and sandbox resources
biersoeckli Jun 22, 2026
94b7869
feat: implement Agent runtime configuration management
biersoeckli Jun 22, 2026
a0c1b3d
feat: extend workload permissions to Agents
biersoeckli Jun 22, 2026
47e29af
feat: implement Agent start/stop with live status
biersoeckli Jun 22, 2026
ad9a934
fix: update namespace handling to use project IDs instead of names
biersoeckli Jun 22, 2026
688af7c
feat: split agent configuration into cards for environment variables,…
biersoeckli Jun 22, 2026
8e364a5
feat: implement Agent stop/delete lifecycle with virtual key cleanup …
biersoeckli Jun 23, 2026
0060c57
feat: add Agent logs streaming and events diagnostics
biersoeckli Jun 23, 2026
67af60b
feat: add fullscreen Agent OpenCode terminal
biersoeckli Jun 23, 2026
2d52b7d
feat: Add agent instance management view
biersoeckli Jun 23, 2026
2e11267
feat: update agent adapter to CRD v0.5.0
biersoeckli Jun 23, 2026
11780c6
feat: integrate agent sandbox template management with status bar and…
biersoeckli Jun 23, 2026
43c5ae3
chore: bump nextjs to v15
biersoeckli Jun 24, 2026
4b18110
feat: enhance agent sandbox with opencode web ui
biersoeckli Jun 24, 2026
6114715
refactor: agent sandbox adapter and service integration for more flex…
biersoeckli Jun 24, 2026
17b2631
feat: add filebrowser container and workspace volume to agent service
biersoeckli Jun 24, 2026
1af35ed
feat: implement agent access management with Ingress and JWT handling
biersoeckli Jun 25, 2026
c79af7c
refactor: ingress management and introduce qs-auth-proxy service
biersoeckli Jun 25, 2026
9ee1277
feat: add filebrowser container configuration with base URL to agent …
biersoeckli Jun 25, 2026
962f093
feat: implement agent volume management with CRUD operations and UI c…
biersoeckli Jun 26, 2026
97ec3a2
feat: enhance PVC integration with longhorn
biersoeckli Jun 26, 2026
3a1957a
test: fix failed tests for agent services
biersoeckli Jun 26, 2026
3f10234
feat: add agent file mount CRUD and shared UI for app ang agents
biersoeckli Jun 26, 2026
0bd3b3e
feat: implement config map service for agent file mounts
biersoeckli Jun 26, 2026
f24d999
feat: add agent container configuration with command, arguments, and …
biersoeckli Jun 26, 2026
04c98c7
feat: update container command handling to the same like args
biersoeckli Jun 26, 2026
85e34d9
feat: extended agent source handling for authenticated git and contai…
biersoeckli Jun 28, 2026
f952e9c
feat: introduced template feature for agents
biersoeckli Jun 28, 2026
86c9e5a
feat: updated build job services to support agent workload types
biersoeckli Jun 28, 2026
70c2dea
feat: created types for agent-sandbox adapter.
biersoeckli Jun 30, 2026
0ff6ed6
chore: bump @kubernetes/client-node to 1.4.0
biersoeckli Jun 30, 2026
1d5a445
feat: enhance project and agent management UI with empty states and i…
biersoeckli Jul 1, 2026
151d931
refactore: cleanup agent service code and fixed tests
biersoeckli Jul 2, 2026
131ef76
test: add cleanup for appGitSshKey in Prisma test context and integra…
biersoeckli Jul 2, 2026
206907b
test: switch from Prisma to K3s test context in GitService tests
biersoeckli Jul 2, 2026
ea58a52
test: mock kubernetes API adapter in GitService unit tests
biersoeckli Jul 2, 2026
2007e40
refactor: update model property to support function in GitSshKeyServi…
biersoeckli Jul 2, 2026
7460193
fix: update createAgent function to use saveAgent method in agentService
biersoeckli Jul 2, 2026
e5bab4e
chore: updated eslint and remove unused imports and clean up code
biersoeckli Jul 2, 2026
87b9df8
feat: add LiteLLM app template
biersoeckli Jul 2, 2026
3b9d8c8
feat: integrate storage classes into agent and app components
biersoeckli Jul 2, 2026
2ca4ff9
fix: enhance kubernetes patch options with PatchStrategy and type def…
biersoeckli Jul 2, 2026
6d5c489
fix: update updateSecret method to delete and recreate secret instead…
biersoeckli Jul 3, 2026
6efb230
fix: add toPullSecretId method and update secret handling in SecretSe…
biersoeckli Jul 3, 2026
328b881
feat: add LiteLLM instance deployment functionality and integrate pro…
biersoeckli Jul 3, 2026
9ab704f
feat: add agent network policy egress rule edit overlay and related s…
biersoeckli Jul 3, 2026
e4c8d7d
fix: update network policy test to use correct ingress field name
biersoeckli Jul 3, 2026
270bb32
feat: mock kubernetes-api.adapter in unit tests for agent and agent-r…
biersoeckli Jul 3, 2026
dbe0a97
feat: allow shared hostnames across different agents in AgentDomain m…
biersoeckli Jul 3, 2026
90e2196
feat: filter agents by user access in AppsPage and conditionally rend…
biersoeckli Jul 3, 2026
124bc4d
refactor: migrated auth proxy to go and fixed websocket problem
biersoeckli Jul 4, 2026
280c669
fix: removing lint issues
biersoeckli Jul 4, 2026
02f3d35
chore: add Dockerfiles for amd64 and arm64 architectures for quicksta…
biersoeckli Jul 4, 2026
895e2a1
fix: qs-auth-proxy gitignore removed internal folder accidentially
biersoeckli Jul 4, 2026
4944ee1
feat: add redeploy functionality for QuickStack Auth Proxy
biersoeckli Jul 4, 2026
583e93a
feat: refactor agent model alias handling to support mutliple models
biersoeckli Jul 4, 2026
e3adeb9
fix: remove minimum length requirement for modelAlias in AgentExtende…
biersoeckli Jul 4, 2026
5c9aaa5
refactor: LiteLlmApiAdapter to utilize generated models from openapi …
biersoeckli Jul 4, 2026
c9450b4
feat: add working directory property for agents and made agent harnes…
biersoeckli Jul 4, 2026
2bbd32e
refactor: CreateTemplateAppSetupDialog to use DialogContext and fix e…
biersoeckli Jul 5, 2026
7178fe2
fix: update agent service to use AgentExtendedWriteZodModel for input…
biersoeckli Jul 5, 2026
60550f2
feat: enhance AgentDetailClient with configuration sections and dynam…
biersoeckli Jul 5, 2026
3338c5c
fix: breadcrumb issues
biersoeckli Jul 5, 2026
2cc2ad1
fix: handling of litellm instance creation from litellm settings page
biersoeckli Jul 5, 2026
40e1201
feat: implement agent management API with CRUD operations and deploym…
biersoeckli Jul 9, 2026
aa0463b
feat: API implement nested create identity stripping and subitem owne…
biersoeckli Jul 9, 2026
9079a38
feat: enhance app service with rollback functionality for nested subi…
biersoeckli Jul 9, 2026
a93871f
feat: add agent sandbox routes and service implementation
biersoeckli Jul 9, 2026
3b4b2a7
feat: add tags and opertaionId to API routes for better categorizatio…
biersoeckli Jul 9, 2026
6decf4e
test: enhance Kubernetes API mock with namespace management for integ…
biersoeckli Jul 9, 2026
19bb195
refactor: environment variable management ui ad table layout
biersoeckli Jul 18, 2026
736780e
feat: implement agent sandbox access URL retrieval and validation
biersoeckli Jul 19, 2026
7cf3035
feat: add customTag support to agent sandbox and runtime services
biersoeckli Jul 19, 2026
a87f950
feat: update SandboxClaim to use annotations for custom tags and adju…
biersoeckli Jul 19, 2026
b929e4b
feat: update SessionCookie to enforce secure and cross-site iframe su…
biersoeckli Jul 20, 2026
0baa25b
test: mock kubernetes API adapter in agent sandbox route tests
biersoeckli Jul 20, 2026
196c3ba
fix: update agent sandbox file handling to support absolute paths and…
biersoeckli Jul 20, 2026
9cb1f53
chore: updated @hookform/resolvers to be compatible with zod 4
biersoeckli Aug 1, 2026
5eceb9c
fix: update agent sandbox service tests to clarify error messages for…
biersoeckli Aug 1, 2026
efd508e
refactor: renamed agent sandbox instances to "sandbox" fr public faci…
biersoeckli Aug 1, 2026
c0b81de
fix: update descriptions to consistently refer to "agent sandbox" in …
biersoeckli Aug 2, 2026
31b990e
feat: add apiOnlyUser field to User model and related functionality f…
biersoeckli Aug 2, 2026
8bd76dc
refactor: remove scanExistingJobs method from BuildWatchService to st…
biersoeckli Aug 2, 2026
c08a70e
feat: implement access token consumption and replay protection in aut…
biersoeckli Aug 2, 2026
89c4cf5
feat: enhance agent deployment and sandbox routes with improved descr…
biersoeckli Aug 2, 2026
c46d7b7
feat: make timeoutSec optional in commandRequestZodModel for flexibility
biersoeckli Aug 2, 2026
7d44fa4
fix: enhance file writing methods to support streaming content over s…
biersoeckli Aug 2, 2026
5d5cbb3
feat: implement streaming file read and write functionality in agent …
biersoeckli Aug 2, 2026
4ddc6dc
feat: enhance agent sandbox file handling with streaming support and …
biersoeckli Aug 4, 2026
b922e1f
feat: remove multipart upload test for agent sandbox routes
biersoeckli Aug 4, 2026
b865c9b
feat: add health check configuration to agent model and related services
biersoeckli Aug 4, 2026
5b9bd4c
feat: update listFiles method to handle NUL-delimited output and impr…
biersoeckli Aug 4, 2026
77a589d
feat: add deployFileBrowser configuration to Agent model and related …
biersoeckli Aug 4, 2026
329d66a
fix: mock kubernetes API adapter in agent sandbox service tests
biersoeckli Aug 4, 2026
27f1d85
feat: implement debug reporting for unauthorized access in auth proxy
biersoeckli Aug 4, 2026
da6492d
feat: add port to AgentAccessTokenPayload and update related methods
biersoeckli Aug 5, 2026
26213ca
feat: remove QuickStack Auth Proxy and related configurations from th…
biersoeckli Aug 5, 2026
40eb226
Merge branch 'main' into feat/k8s-agent-sandbox-integration
biersoeckli Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .agents/skills/backend-services/REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ Rules:

- Use `saveFormAction` for validated form submissions.
- Use `simpleAction` for non-form actions.
- Older server actions used `return new SuccessActionResult(returnData, "App created successfully.");` but this is no longer needed; if theres a return value, just return the variable directly and success messages should be handled in component not server action.
- Put authorization checks inside the callback before service calls.
- Let the wrappers produce success payloads; do not manually construct them unless returning data.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
## Language

**Order**:
{A concise description of the term}
{A one or two sentence description of the term}
_Avoid_: Purchase, transaction

**Invoice**:
Expand All @@ -20,31 +20,14 @@ _Avoid_: Bill, payment request
**Customer**:
A person or organization that places orders.
_Avoid_: Client, buyer, account

## Relationships

- An **Order** produces one or more **Invoices**
- An **Invoice** belongs to exactly one **Customer**

## Example dialogue

> **Dev:** "When a **Customer** places an **Order**, do we create the **Invoice** immediately?"
> **Domain expert:** "No — an **Invoice** is only generated once a **Fulfillment** is confirmed."

## Flagged ambiguities

- "account" was used to mean both **Customer** and **User** — resolved: these are distinct concepts.
```

## Rules

- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid.
- **Flag conflicts explicitly.** If a term is used ambiguously, call it out in "Flagged ambiguities" with a clear resolution.
- **Keep definitions tight.** One sentence max. Define what it IS, not what it does.
- **Show relationships.** Use bold term names and express cardinality where obvious.
- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others under `_Avoid_`.
- **Keep definitions tight.** One or two sentences max. Define what it IS, not what it does.
- **Only include terms specific to this project's context.** General programming concepts (timeouts, error types, utility patterns) don't belong even if the project uses them extensively. Before adding a term, ask: is this a concept unique to this context, or a general programming concept? Only the former belongs.
- **Group terms under subheadings** when natural clusters emerge. If all terms belong to a single cohesive area, a flat list is fine.
- **Write an example dialogue.** A conversation between a dev and a domain expert that demonstrates how the terms interact naturally and clarifies boundaries between related concepts.

## Single vs multi-context repos

Expand Down
74 changes: 74 additions & 0 deletions .agents/skills/domain-modeling/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
name: domain-modeling
description: Build and sharpen a project's domain model. Use when the user wants to pin down domain terminology or a ubiquitous language, record an architectural decision, or when another skill needs to maintain the domain model.
---

# Domain Modeling

Actively build and sharpen the project's domain model as you design. This is the *active* discipline — challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `CONTEXT.md` for vocabulary is not this skill — that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.)

## File structure

Most repos have a single context:

```
/
├── CONTEXT.md
├── docs/
│ └── adr/
│ ├── 0001-event-sourced-orders.md
│ └── 0002-postgres-for-write-model.md
└── src/
```

If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:

```
/
├── CONTEXT-MAP.md
├── docs/
│ └── adr/ ← system-wide decisions
├── src/
│ ├── ordering/
│ │ ├── CONTEXT.md
│ │ └── docs/adr/ ← context-specific decisions
│ └── billing/
│ ├── CONTEXT.md
│ └── docs/adr/
```

Create files lazily — only when you have something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.

## During the session

### Challenge against the glossary

When the user uses a term that conflicts with the existing language in `CONTEXT.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"

### Sharpen fuzzy language

When the user uses vague or overloaded terms, propose a precise canonical term. "You're saying 'account' — do you mean the Customer or the User? Those are different things."

### Discuss concrete scenarios

When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts.

### Cross-reference with code

When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?"

### Update CONTEXT.md inline

When a term is resolved, update `CONTEXT.md` right there. Don't batch these up — capture them as they happen. Use the format in [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md).

`CONTEXT.md` should be totally devoid of implementation details. Do not treat `CONTEXT.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else.

### Offer ADRs sparingly

Only offer to create an ADR when all three are true:

1. **Hard to reverse** — the cost of changing your mind later is meaningful
2. **Surprising without context** — a future reader will wonder "why did they do it this way?"
3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons

If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](./ADR-FORMAT.md).
164 changes: 130 additions & 34 deletions .agents/skills/frontend-ui-patterns/REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,15 @@ Use helpers from `action-wrapper.utils.ts`:
Every form follows this pattern:

1. Define or import a Zod schema.
2. `useForm<T>({ resolver: zodResolver(schema) })`
2. Import `z` from `"zod"` and use the schema input/output types: `useForm<z.input<typeof schema>, unknown, z.output<typeof schema>>({ resolver: zodResolver(schema) })`.
3. Wrap in shadcn `<Form>` provider.
4. Use `<FormField>` with `control`, `name`, and `render`.
5. Submit through `Toast.fromAction()` or `Actions.run()`.

```tsx
'use client'

const form = useForm<CreateAppSchema>({
const form = useForm<z.input<typeof createAppSchema>, unknown, z.output<typeof createAppSchema>>({
resolver: zodResolver(createAppSchema),
});

Expand Down Expand Up @@ -121,7 +121,7 @@ const result = await Actions.run(() => getProjectDetails(projectId));
Map validation errors back to the form with:

```tsx
FormUtils.mapValidationErrorsToForm(serverActionResult, form);
FormUtils.mapValidationErrorsToForm<typeof zodModel>(serverActionResult, form);
```

## Zustand State Stores
Expand Down Expand Up @@ -176,58 +176,154 @@ Columns are tuples: `[accessorKey, headerLabel, isVisible, renderFn?]`

## Dialogs

Use Zustand-backed global dialogs instead of one-off dialog state.
Use Zustand-backed global dialogs instead of one-off dialog state. Keep trigger and dialog content in separate components (often separate files for reuse).

### `useDialog`
### Pattern: Trigger + Dialog Content

Prefer responsive sizing options:
**Trigger component** — opens dialog via `useDialog().openDialog()`:

```tsx
const { openDialog } = useDialog();

<Button
type="button"
onClick={() => openDialog(<ImportDialog />, {
width: 'calc(100vw - 2rem)',
maxWidth: '760px',
maxHeight: '90vh',
})}
>
Import
</Button>
'use client'

import { useDialog } from "@/frontend/states/zustand.states";

export default function MyTrigger({ children, someProp }: { children: React.ReactNode; someProp: string }) {
const { openDialog } = useDialog();

const handleOpen = () => {
openDialog(<MyDialogContent someProp={someProp} />, { maxWidth: '520px' });
};

return (
<div onClick={handleOpen}>
{children}
</div>
);
}
```

Inside dialog content, use `useDialogContext()` to close or resolve:
**Dialog content — variant A: with form** (react-hook-form + Server Action):

```tsx
function ImportDialog() {
'use client'

import { useDialogContext } from "@/frontend/states/dialog-context";
import { DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog";
import { ScrollArea } from "@/components/ui/scroll-area";

function MyFormDialog({ someProp }: { someProp: string }) {
const { closeDialog } = useDialogContext();

const form = useForm<z.input<typeof mySchema>, unknown, z.output<typeof mySchema>>({
resolver: zodResolver(mySchema),
defaultValues: { name: someProp ?? '' },
});

const [state, formAction] = useActionState(
(prev, payload) => myServerAction(prev, payload),
FormUtils.getInitialFormState<typeof mySchema>()
);

useEffect(() => {
if (state.status === 'success') {
toast.success(state.message ?? 'Saved.');
closeDialog();
}
FormUtils.mapValidationErrorsToForm<typeof mySchema>(state, form);
}, [state]);

return (
<Form {...form}>
<form
className="flex max-h-[80vh] flex-col overflow-hidden"
action={() => form.handleSubmit((data) => formAction(data))()}
>
<DialogHeader>
<DialogTitle>My Dialog</DialogTitle>
</DialogHeader>
<ScrollArea className="mt-4 flex-1 min-h-0">
<div className="space-y-4 px-2">
{/* form fields */}
</div>
</ScrollArea>
<DialogFooter className="mt-4">
<SubmitButton>Save</SubmitButton>
<Button type="button" variant="outline" onClick={() => closeDialog()}>
Cancel
</Button>
</DialogFooter>
</form>
</Form>
);
}
```

The success (primary) button is always the first button in the footer, cancel is always the last.

**Dialog content — variant B: without form** (simple confirm/info dialog):

```tsx
'use client'

import { useDialogContext } from "@/frontend/states/dialog-context";
import { DialogHeader, DialogTitle, DialogDescription, DialogFooter } from "@/components/ui/dialog";

function MyConfirmDialog({ itemName }: { itemName: string }) {
const { closeDialog } = useDialogContext();

return (
<>
<DialogHeader>
<DialogTitle>Import</DialogTitle>
<DialogDescription>Optional description</DialogDescription>
<DialogTitle>Delete {itemName}?</DialogTitle>
<DialogDescription>This action cannot be undone.</DialogDescription>
</DialogHeader>
<div className="space-y-4">
<div className="flex justify-end gap-2">
<Button type="button" variant="outline" onClick={() => closeDialog(false)}>
Cancel
</Button>
<Button type="button" onClick={() => closeDialog(true)}>
Import
</Button>
</div>
</div>
{/* Here additional content of the dialog can be added. If allot of content -> use ScrollArea */}
<DialogFooter className="mt-4">
<Button type="button" variant="outline" onClick={() => closeDialog(false)}>
Cancel
</Button>
<Button type="button" variant="destructive" onClick={() => closeDialog(true)}>
Delete
</Button>
</DialogFooter>
</>
);
}
```

Simple fixed-width dialogs can still use:
Await result from trigger:

```tsx
openDialog(<PublicDeployKeyDialog publicKey={publicKey} />, '680px');
const confirmed = await openDialog(<MyConfirmDialog itemName="foo" />);
if (confirmed) { /* delete */ }
```

### `useDialog` Sizing

Second arg: `DialogSizeProps` object or shorthand string (= `maxWidth`):

```tsx
// Full size control
openDialog(<Content />, {
width: 'calc(100vw - 2rem)',
maxWidth: '760px',
maxHeight: '90vh',
});

// Shorthand: string = maxWidth
openDialog(<Content />, '680px');
```

### `useDialogContext`

Inside dialog content, close with optional result:

```tsx
const { closeDialog } = useDialogContext();

closeDialog(); // close, no result
closeDialog(someData); // close, pass result to openDialog() awaiter
```
```

### Confirm/Input Dialogs
Expand Down
1 change: 1 addition & 0 deletions .agents/skills/frontend-ui-patterns/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ When creating or updating frontend UI:
## Forms And Actions

- Add route-safe validation with shared or local Zod schemas.
- With Zod 4 and `zodResolver`, type every form with the schema's input and output types. Import `z` from `"zod"` and use `useForm<z.input<typeof schema>, unknown, z.output<typeof schema>>({ resolver: zodResolver(schema), ... })`. Do not use `z.infer` as the `useForm` field-values type when the schema has coercion, transforms, preprocessors, or defaults.
- Map server validation errors back with `FormUtils.mapValidationErrorsToForm(...)`.
- Use `SubmitButton` for form submits when possible.

Expand Down
9 changes: 3 additions & 6 deletions .agents/skills/grill-me/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
---
name: grill-me
description: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
description: A relentless interview to sharpen a plan or design.
disable-model-invocation: true
---

Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.

Ask the questions one at a time.

If a question can be answered by exploring the codebase, explore the codebase instead.
Run a `/grilling` session.
Loading
Loading