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
13 changes: 13 additions & 0 deletions .changeset/no-planner-sessions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@sapiom/harness": minor
---

**Breaking.** Studio never creates a planner session. Selecting a project or its Plan Agents row shows the Agent Map from durable state and starts nothing; a project's first session is an ordinary session started explicitly, through the same createSession path as the + tab, and it has the Agent Map tools.

Migration:

- `HarnessSession.planning` is removed. Sessions persisted with planner metadata load and resume as ordinary sessions; the stale key is dropped on registry load and nothing on disk is deleted. Drop any read of `session.planning`.
- `POST /api/projects/:id/planner-sessions`, its `/messages` child and its `/greeting/retry` child now answer `410` with `planner_sessions_removed`.
- The eight `planner_session.*` and `planner_greeting.*` `AnalyticsEventType` members are no longer emitted. They stay in the union, deprecated, for one release so an exhaustive switch still compiles; they are removed in the next minor.

The planner greeting coordinator, the planning session service and the planner profile are deleted. The Agent Map store, its MCP tools and the renderer are unchanged.
11 changes: 11 additions & 0 deletions .changeset/project-row-plus-is-new-agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@sapiom/harness": minor
---

A project row's `+` is **New agent**, scoped to that project, and a plain session is no longer a row verb.

Creation had been delegated to the pinned Agent Map: `mapOwnsCreation` is true for every project on a current server, and it gated both the row's create action and the empty project's create row, so neither rendered. The Agent Map has no create control of its own — its only route to generating agents was the planner session, which SAP-3143 removes. A project that already held agents was left with no scoped way to grow another; the rail's top CTA opens the composer with no project context and cannot create into an existing project.

The `+` now opens the new-agent screen for the row's own project (`project-create-agent-{label}`), and a bare project keeps its distinct scaffold verb (`workspace-scaffold-{label}`). `project-start-session-{label}` is removed: a plain session starts from the tab strip, or from the **Start a session** on the project's own pane. The empty project still gets no create row of its own — its Agent Map row is the CTA.

Follows design-eng `IA.md` 219 and D34(a); D34(e) and D35 item 6 for sessions belonging to the tab strip.
9 changes: 9 additions & 0 deletions .changeset/project-row-remove-action.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@sapiom/harness": patch
---

A project row's remove verb is a hover action, not an overflow menu. The `⋮` on every project row opened a 248px card to hold a single item — on plan-first projects its create item is suppressed, because the Agent Map owns creation, so the popover existed to carry one `Remove … from the rail`. That verb is now an `X` beside the session shortcut, hover-revealed like every other row action, and it opens the same confirmation as before: the project named, the count of running sessions it will end, and the statement that nothing on disk is touched.

Row actions state their subject in the accessible name and the tooltip rather than in visible menu text. The `project-remove-{label}` testid is unchanged and now belongs to the button itself; `project-menu-{label}` and `project-menu-card-{label}` are gone, as is the `openProjectMenu` e2e helper.

Follows design-eng D33: a project row's verbs are hover actions on the header, and a per-row menu would be a new idiom.
6 changes: 0 additions & 6 deletions packages/harness/src/core/paths.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ describe("resolveStatePaths", () => {
expect(paths.settings).toBe(path.join(root, "settings.json"));
expect(paths.studioProjects).toBe(path.join(root, "studio-projects.json"));
expect(paths.agentMap).toBe(path.join(root, "agent-map"));
expect(paths.plannerSessions).toBe(
path.join(root, "agent-map", "planner-sessions"),
);
expect(paths.generated).toBe(path.join(root, "generated"));
expect(paths.sampleProject).toBe(path.join(root, "sample-project"));
});
Expand All @@ -48,9 +45,6 @@ describe("resolveStatePaths", () => {
expect(paths.settings).toBe("/scratch/state/settings.json");
expect(paths.studioProjects).toBe("/scratch/state/studio-projects.json");
expect(paths.agentMap).toBe("/scratch/state/agent-map");
expect(paths.plannerSessions).toBe(
"/scratch/state/agent-map/planner-sessions",
);
expect(paths.generated).toBe("/scratch/state/generated");
expect(paths.sampleProject).toBe("/scratch/state/sample-project");
});
Expand Down
2 changes: 0 additions & 2 deletions packages/harness/src/core/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ export interface HarnessStatePaths {
studioProjects: string;
pendingSecrets: string;
agentMap: string;
plannerSessions: string;
generated: string;
records: string;
sampleProject: string;
Expand Down Expand Up @@ -60,7 +59,6 @@ export function resolveStatePaths(stateRoot?: string): HarnessStatePaths {
studioProjects: join(root, relativeToHome(HARNESS_PATHS.studioProjects)),
pendingSecrets: join(root, relativeToHome(HARNESS_PATHS.pendingSecrets)),
agentMap: join(root, relativeToHome(HARNESS_PATHS.agentMap)),
plannerSessions: join(root, "agent-map", "planner-sessions"),
generated: join(root, relativeToHome(HARNESS_PATHS.generated)),
records: join(root, relativeToHome(HARNESS_PATHS.records)),
sampleProject: join(root, relativeToHome(HARNESS_PATHS.sampleProject)),
Expand Down
Loading
Loading