Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions go/core/internal/grpcserver/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,12 @@ func (s *systemServer) GetSubstrateStatus(ctx context.Context, request *apiv1alp
}
for _, actorTemplate := range result.ActorTemplates {
response.ActorTemplates = append(response.ActorTemplates, &apiv1alpha1.SubstrateActorTemplate{
Namespace: actorTemplate.Namespace,
Name: actorTemplate.Name,
Phase: actorTemplate.Phase,
GoldenActorId: actorTemplate.GoldenActorID,
GoldenSnapshot: actorTemplate.GoldenSnapshot,
SandboxClass: actorTemplate.SandboxClass,
WorkerSelector: actorTemplate.WorkerSelector,
HarnessName: actorTemplate.HarnessName,
ManagedByKagent: actorTemplate.ManagedByKagent,
Namespace: actorTemplate.Namespace,
Name: actorTemplate.Name,
Phase: actorTemplate.Phase,
GoldenSnapshot: actorTemplate.GoldenSnapshot,
SandboxClass: actorTemplate.SandboxClass,
WorkerSelector: actorTemplate.WorkerSelector,
})
}
for _, actor := range result.Actors {
Expand Down
15 changes: 6 additions & 9 deletions go/core/internal/service/system/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,12 @@ type SubstrateWorkerPool struct {
}

type SubstrateActorTemplate struct {
Namespace string
Name string
Phase string
GoldenActorID string
GoldenSnapshot string
SandboxClass string
WorkerSelector string
HarnessName string
ManagedByKagent bool
Namespace string
Name string
Phase string
GoldenSnapshot string
SandboxClass string
WorkerSelector string
}

type SubstrateActor struct {
Expand Down
7 changes: 2 additions & 5 deletions ui/playwright/tests/substrate/substrate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,11 @@ test("substrate: the inventory renders, and partial runtime data says so", async
await expect(templates).toContainText("kagent/coder-template");
await expect(templates).toContainText("platform/external-template");

// The golden actor, beneath the name: it is the snapshot every new actor of this
// template is cut from, and the one identifier worth carrying beside the name.
await expect(templates).toContainText("golden: actor-golden-001");

// The rest of what decides where and how a template runs.
await expect(templates).toContainText("standard");
await expect(templates).toContainText("pool=default-pool");
await expect(templates).toContainText("openclaw");
await expect(templates.getByRole("columnheader", { name: "Harness" })).toHaveCount(0);
await expect(templates).not.toContainText("golden:");

// Both phases, and coloured by what they mean rather than all alike: a Ready template
// reads as healthy, a Pending one does not.
Expand Down
3 changes: 0 additions & 3 deletions ui/src/api/domain/substrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,9 @@ export interface SubstrateActorTemplateEntry {
namespace: string;
name: string;
phase?: string;
goldenActorId?: string;
goldenSnapshot?: string;
sandboxClass?: string;
workerSelector?: string;
harnessName?: string;
managedByKagent: boolean;
}

/** Runtime actor state, from ate-api rather than from Kubernetes. */
Expand Down
3 changes: 0 additions & 3 deletions ui/src/api/grpc/operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1292,12 +1292,9 @@ function toActorTemplateEntry(
namespace: template.namespace,
name: template.name,
phase: orUndefined(template.phase),
goldenActorId: orUndefined(template.goldenActorId),
goldenSnapshot: orUndefined(template.goldenSnapshot),
sandboxClass: orUndefined(template.sandboxClass),
workerSelector: orUndefined(template.workerSelector),
harnessName: orUndefined(template.harnessName),
managedByKagent: template.managedByKagent,
};
}

Expand Down
3 changes: 1 addition & 2 deletions ui/src/api/operations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -688,7 +688,7 @@ describe("the cluster", () => {
{ namespace: "kagent", name: "pool", replicas: 2, ateomImage: "ateom:1" },
],
actorTemplates: [
{ namespace: "kagent", name: "tpl", managedByKagent: true, phase: "Ready" },
{ namespace: "kagent", name: "tpl", phase: "Ready" },
],
actors: [{ actorId: "a1", atespace: "kagent", status: "Running", version: 3n }],
workers: [],
Expand All @@ -703,7 +703,6 @@ describe("the cluster", () => {
expect(status.ateApiError).toMatch(/ate-api/);
expect(status.actors[0].atespace).toBe("kagent");
expect(status.actors[0].version).toBe(3);
expect(status.actorTemplates[0].managedByKagent).toBe(true);
});

// Proto3 cannot tell an unset string from an empty one, and an empty warning
Expand Down
4 changes: 0 additions & 4 deletions ui/src/mocks/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -479,18 +479,14 @@ export const mockSubstrateStatus: SubstrateStatusResponse = {
namespace: "kagent",
name: "coder-template",
phase: "Ready",
goldenActorId: "actor-golden-001",
goldenSnapshot: "snap-2026-07-28",
sandboxClass: "standard",
workerSelector: "pool=default-pool",
harnessName: "openclaw",
managedByKagent: true,
},
{
namespace: "platform",
name: "external-template",
phase: "Pending",
managedByKagent: false,
},
],
actors: [
Expand Down
3 changes: 0 additions & 3 deletions ui/src/mocks/transport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1510,12 +1510,9 @@ on(SystemService.method.getSubstrateStatus, (input, call) => {
namespace: template.namespace,
name: template.name,
phase: template.phase ?? "",
goldenActorId: template.goldenActorId ?? "",
goldenSnapshot: template.goldenSnapshot ?? "",
sandboxClass: template.sandboxClass ?? "",
workerSelector: template.workerSelector ?? "",
harnessName: template.harnessName ?? "",
managedByKagent: template.managedByKagent ?? false,
})),
actors: actors.map((actor) => ({
actorId: actor.actorId,
Expand Down
22 changes: 1 addition & 21 deletions ui/src/pages/SubstratePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -769,11 +769,9 @@ export function SubstratePage() {
[
template.namespace,
template.name,
template.goldenActorId,
template.phase,
template.sandboxClass,
template.workerSelector,
template.harnessName,
]
.filter(Boolean)
.join(" "),
Expand Down Expand Up @@ -864,16 +862,7 @@ export function SubstratePage() {
key: "template",
sorter: { compare: byText((t) => `${t.namespace}/${t.name}`), multiple: 5 },
render: (_, template) => (
<div>
{qualified(template.namespace, template.name)}
{/* The golden actor is the snapshot every new actor of this template is
cut from, so it is the one identifier worth carrying beside the name. */}
{template.goldenActorId ? (
<Text css={{ ...mono, ...muted, display: "block" }}>
golden: {template.goldenActorId}
</Text>
) : null}
</div>
qualified(template.namespace, template.name)
),
},
{
Expand Down Expand Up @@ -901,15 +890,6 @@ export function SubstratePage() {
"—"
),
},
{
// Text and not a link: the agents list has no namespace filter to send a
// reader to, so a link here would land them on an unfiltered page and imply
// otherwise.
title: "Harness",
key: "harness",
sorter: { compare: byText((t) => t.harnessName ?? ""), multiple: 1 },
render: (_, template) => template.harnessName ?? "—",
},
],
[mono, muted, qualified],
);
Expand Down
Loading