Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
950b6e3
feat: add opt-in chat-first workbench
steve8708 Aug 8, 2026
368b72c
fix: scope chat-first changeset to versioned packages
steve8708 Aug 8, 2026
311450c
fix: include toolkit in chat-first changeset
steve8708 Aug 8, 2026
a5b6d1a
fix: format chat-first environment variable docs
steve8708 Aug 8, 2026
26ae55a
chore: sync workspace app skills
steve8708 Aug 8, 2026
823ca52
fix: preserve structured document titles
steve8708 Aug 8, 2026
5042c14
fix: prerender public template pages
steve8708 Aug 8, 2026
6a8df27
fix: fence background automation workers
steve8708 Aug 8, 2026
27d6aeb
feat: support autonomous workspace app builds
steve8708 Aug 8, 2026
4af71d7
chore: finish shared infrastructure updates
steve8708 Aug 8, 2026
d9d9a04
fix: sync turn-into-app template skills
steve8708 Aug 8, 2026
d08ca3b
feat: refine chat-first drawer and desktop chat
steve8708 Aug 8, 2026
cfb0847
fix: keep changeset package scope valid
steve8708 Aug 8, 2026
0b56c80
feat: refine chat-first workbench UX
steve8708 Aug 9, 2026
e1dfe82
feat: connect chat-first app creation flow
steve8708 Aug 9, 2026
c2c0e3b
fix: keep shared settings exports buildable
steve8708 Aug 9, 2026
919a21b
fix: publish chat-first client entrypoint
steve8708 Aug 9, 2026
62eeb7e
style: format environment variable docs
steve8708 Aug 9, 2026
093d69a
fix: remove untracked quick prompt consumers
steve8708 Aug 9, 2026
aaaae98
fix: close chat-first review gaps
steve8708 Aug 9, 2026
b4ef602
fix: keep desktop chat exports buildable
steve8708 Aug 9, 2026
4602c8c
fix: keep dispatch chat-first props buildable
steve8708 Aug 9, 2026
d3f974c
fix: keep partial SSR smoke coverage explicit
steve8708 Aug 9, 2026
53739c0
test: complete MCP onboarding mock
steve8708 Aug 9, 2026
4f42a68
fix: address chat-first review findings
steve8708 Aug 9, 2026
b51e55e
fix: close final chat-first review findings
steve8708 Aug 9, 2026
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "agent-native-turn-into-app",
"version": "1.0.0+codex.5430c9cab656",
"version": "1.0.0+codex.c50dbd31a986",
"description": "Turn visible project context, a proven thread, skill, or workflow into a runnable Agent-Native app. On Claude or ChatGPT Web, it hands a bounded source brief to Builder through Dispatch; local code agents can build and verify in a workspace.",
"author": { "name": "Agent-Native", "url": "https://agent-native.com" },
"homepage": "https://dispatch.agent-native.com",
Expand Down
2 changes: 1 addition & 1 deletion .agents/plugins/agent-native-turn-into-app/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "agent-native-turn-into-app",
"version": "1.0.0+codex.5430c9cab656",
"version": "1.0.0+codex.c50dbd31a986",
"description": "Turn visible project context, a proven thread, skill, or workflow into a runnable Agent-Native app. On Claude or ChatGPT Web, it hands a bounded source brief to Builder through Dispatch; local code agents can build and verify in a workspace.",
"author": { "name": "Agent-Native", "url": "https://agent-native.com" },
"homepage": "https://dispatch.agent-native.com",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ name: turn-into-app
description: >-
Turn visible project context, a proven thread, skill, or workflow into a
runnable Agent-Native app with simple buttons, visible agent steps, preview,
and deployment handoff. Use when a user invokes `/turn-into-app` or asks to
make a workflow into an app, including from Claude or ChatGPT on the web.
and deployment handoff. Use when a user invokes `/turn-into-app`,
`/make-into-app`, or asks to make a workflow into an app, including from
Claude or ChatGPT on the web.
user-invocable: true
scope: both
metadata:
Expand Down Expand Up @@ -38,6 +39,15 @@ The build location depends on the host. Treat this as a hard routing rule:
workspace, follow the local implementation steps below. The local agent may
scaffold, edit, run, and verify the app there.

Once the source brief is sufficient to identify a repeatable workflow, the
handoff is non-interactive. Do not ask the user for visual, product, copy,
layout, template, integration, or implementation choices that can be resolved
from the source. Select the source's recommended option; otherwise choose the
most direct conventional default and record the assumption for later review.
Only stop for a genuine hard blocker such as missing authorization, a
destructive external action, an ambiguous target workspace, or no identifiable
workflow at all.

## Default behavior

For a local code-agent runtime this is an end-to-end build skill, not a request
Expand Down Expand Up @@ -104,14 +114,16 @@ before creating the app. Read the host-provided context in this order:
Record the brief with these headings before handoff: source and provenance,
project goal, configuration and constraints, knowledge sources, repeatable
workflow, inputs and outputs, judgment and review points, representative runs,
integrations and permissions, and unknowns. This is the compact contract for
integrations and permissions, and unknowns and assumptions. This is the compact contract for
the app. It keeps the new app useful without pretending that hidden Project
history was imported. See [the fresh Project reference](references/fresh-project.md)
for the host setup and brief template.

If the visible Project context has no concrete repeatable job, ask for one
focused clarification or a representative artifact. Do not fall back to a
generic “what app do you want to make?” builder.
If the visible Project context has no concrete repeatable job and no primary
goal can be inferred, ask for one focused clarification or a representative
artifact. Otherwise use the project's primary goal and source conventions; do
not ask a questionnaire and do not fall back to a generic “what app do you
want to make?” builder.

## Source selection guard

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Inputs and outputs:
Judgment and review points:
Representative runs: none, or 1-3 selected examples
Integrations and permissions:
Unknowns and follow-up:
Unknowns and assumptions:
```

Keep source references bounded. Prefer a file name, URL, resource ID, or short
Expand Down Expand Up @@ -69,6 +69,13 @@ do not fall back to a local sandbox build. Claude Code and Codex Code are the
local-agent exception and may follow the implementation steps in the main
skill.

The brief is an implementation authorization, not a questionnaire. After a
repeatable workflow is identifiable, choose any source-recommended option
automatically. For unresolved non-blocking choices, use the most direct
conventional default, record it under assumptions, and continue. Ask only when
there is no identifiable workflow, no authorized target workspace, or a
destructive/credential boundary genuinely prevents the handoff.

In a new Project chat, say:

```text
Expand Down
9 changes: 9 additions & 0 deletions .agents/skills/adding-a-feature/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,13 @@ or other file-like payloads, design the upload path in the same change:
provider upload first, then URL/id/blob handle in SQL. Do not add base64/binary
columns or stuff files into `application_state`.

If the feature adds a server-side dependency carrying a native binary or heavy
runtime — headless browser, ffmpeg, image/video processing, ML runtime — read
the `performance` skill §9 before adding it. A deployed app has one `/*` page
function that every visitor's cache miss wakes, and it ships whatever the server
bundle depends on. Run that work from a background function or a job so the page
function never carries the weight.

**If the action produces or lists a navigable resource**, add a `link` builder that returns `{ url: buildDeepLink({ app, view, params }), label }`. External coding agents and MCP hosts (Claude / ChatGPT / Claude Code / Cowork / Codex, over MCP/A2A) then surface an "Open in … →" deep link that drops the user back into the running UI focused on the record — for free. If a compatible MCP host should render an inline review/edit surface, also add `mcpApp` with `embedApp()` so the action embeds the real React app route instead of a one-off HTML UI. The `link` builder and `mcpApp` metadata must be pure and synchronous (no I/O). Any external-agent read/ingest action must be `http: { method: "GET" }` + `readOnly: true` + `publicAgent: { expose: true, readOnly: true, requiresAuth: true }`. See the `external-agents` skill.

### 3. Skills / Instructions
Expand Down Expand Up @@ -195,4 +202,6 @@ TL;DR: declare the vocabulary once with `defineAppRoles({ appId, roles, defaultR
- **create-skill** — How to create skills for new patterns (area 3 in detail)
- **storing-data** — Where to store the feature's data
- **real-time-sync** — How the UI stays in sync when the agent writes data
- **performance** — Query/load cost, and (§9) cold-start artifact size when a
feature adds a server-side dependency
- **internationalization** — How to update localized UI copy and catalogs
54 changes: 54 additions & 0 deletions .agents/skills/chat-first-workbench/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
name: chat-first-workbench
description: >-
Implement or extend the opt-in Codex/T3-like chat-first shell. Use when
changing chat rails, contextual app panes, app opening, or local/mobile shell
preferences across Electron, Dispatch, or mobile.
scope: dev
---

# Chat-first workbench

## Contract

The chat remains the primary surface. Workspace apps are a bounded discovery
rail, not a second navigation system. An app pane is opened from an explicit
app selection or a completed open_app action and carries only an app id plus a
validated app-relative path or view.

## Client behavior

- The preference is opt-in and local to the client. Keep the existing app-first
shell unchanged when it is disabled.
- Electron uses the shared Code Agents rail and AppWebview.
- Dispatch uses list-workspace-apps and create_embed_session; never iframe a
raw workspace URL. Resolve an absolute open_app URL against the registered
app first, then pass the resulting app-relative path.
- Mobile uses the existing app registry and secure AppWebView routes instead of
accepting arbitrary URLs or adding a second navigator.
- Show no nested app sidebar or browser chrome in a contextual pane.
- The app shelf is capped at six visible entries. Pinning and drag-reordering
are device-local presentation preferences; the agent-visible target remains
the registered app id and route.

## Agent and state boundaries

- Keep app discovery, embed-session minting, and thread operations on the
existing action surfaces.
- Emit the shared chat-first open-app event only for the completed first-party
`open_app` action with a real app, path, or view. A missing or unreadable
result is not success, and namespaced third-party tools cannot steer the
pane.
- Both web and desktop resolve the event through the same core origin/base-path
allow-list. An unresolved target produces a visible notice and no pane.
- If the agent needs to know which app is visible, expose a compact
application-state selection instead of scraping the iframe DOM.
- Cloud handoff is a future execution-residence seam. Do not claim that a local
run has moved to a worker until a durable worker snapshot and readback exist.

## Verification

Test the disabled path and the enabled path separately. For the enabled path,
verify rail ordering, chat history, app selection, embed-session errors, pane
close, and completed open_app behavior in a running client. Treat configuration
alone as insufficient proof.
24 changes: 18 additions & 6 deletions .agents/skills/turn-into-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ name: turn-into-app
description: >-
Turn visible project context, a proven thread, skill, or workflow into a
runnable Agent-Native app with simple buttons, visible agent steps, preview,
and deployment handoff. Use when a user invokes `/turn-into-app` or asks to
make a workflow into an app, including from Claude or ChatGPT on the web.
and deployment handoff. Use when a user invokes `/turn-into-app`,
`/make-into-app`, or asks to make a workflow into an app, including from
Claude or ChatGPT on the web.
user-invocable: true
scope: both
metadata:
Expand Down Expand Up @@ -38,6 +39,15 @@ The build location depends on the host. Treat this as a hard routing rule:
workspace, follow the local implementation steps below. The local agent may
scaffold, edit, run, and verify the app there.

Once the source brief is sufficient to identify a repeatable workflow, the
handoff is non-interactive. Do not ask the user for visual, product, copy,
layout, template, integration, or implementation choices that can be resolved
from the source. Select the source's recommended option; otherwise choose the
most direct conventional default and record the assumption for later review.
Only stop for a genuine hard blocker such as missing authorization, a
destructive external action, an ambiguous target workspace, or no identifiable
workflow at all.

## Default behavior

For a local code-agent runtime this is an end-to-end build skill, not a request
Expand Down Expand Up @@ -104,14 +114,16 @@ before creating the app. Read the host-provided context in this order:
Record the brief with these headings before handoff: source and provenance,
project goal, configuration and constraints, knowledge sources, repeatable
workflow, inputs and outputs, judgment and review points, representative runs,
integrations and permissions, and unknowns. This is the compact contract for
integrations and permissions, and unknowns and assumptions. This is the compact contract for
the app. It keeps the new app useful without pretending that hidden Project
history was imported. See [the fresh Project reference](references/fresh-project.md)
for the host setup and brief template.

If the visible Project context has no concrete repeatable job, ask for one
focused clarification or a representative artifact. Do not fall back to a
generic “what app do you want to make?” builder.
If the visible Project context has no concrete repeatable job and no primary
goal can be inferred, ask for one focused clarification or a representative
artifact. Otherwise use the project's primary goal and source conventions; do
not ask a questionnaire and do not fall back to a generic “what app do you
want to make?” builder.

## Source selection guard

Expand Down
9 changes: 8 additions & 1 deletion .agents/skills/turn-into-app/references/fresh-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Inputs and outputs:
Judgment and review points:
Representative runs: none, or 1-3 selected examples
Integrations and permissions:
Unknowns and follow-up:
Unknowns and assumptions:
```

Keep source references bounded. Prefer a file name, URL, resource ID, or short
Expand Down Expand Up @@ -69,6 +69,13 @@ do not fall back to a local sandbox build. Claude Code and Codex Code are the
local-agent exception and may follow the implementation steps in the main
skill.

The brief is an implementation authorization, not a questionnaire. After a
repeatable workflow is identifiable, choose any source-recommended option
automatically. For unresolved non-blocking choices, use the most direct
conventional default, record it under assumptions, and continue. Ask only when
there is no identifiable workflow, no authorized target workspace, or a
destructive/credential boundary genuinely prevents the handoff.

In a new Project chat, say:

```text
Expand Down
7 changes: 7 additions & 0 deletions .agents/skills/workspace-conventions/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,12 @@ Preview before `--apply`, commit `agent-native.ejections.json`, and never edit
data, or credential-looking literals in source, docs, prompts, fixtures,
application state, action responses, or generated app content. Use
secrets/OAuth/runtime configuration and obvious placeholders in examples.
- Each app deploys its own `/*` page function, and that function ships whatever
the app's server bundle depends on — including a dependency only a background
job uses. Before an app takes on a heavy runtime (headless browser, ffmpeg,
media processing, ML), read `.agents/skills/performance/SKILL.md` §9 and keep
that work in a background function or job. A dependency belonging to one app
does not belong in `packages/shared`.
- Prefer framework defaults until the workspace has a real custom rule,
component, plugin, action, or skill to share.
- Keep the Workspace files view for user-authored or user-requested resources.
Expand All @@ -91,5 +97,6 @@ Preview before `--apply`, commit `agent-native.ejections.json`, and never edit
- **agent-native-toolkit** — Inventory of shared workspace and agent UI.
- **customizing-agent-native** — The configure → compose → eject ladder.
- **delegate-to-agent** — Routing every AI feature through the agent chat.
- **performance** — Load cost, and (§9) cold-start artifact size per app.
- **secrets** — Registering API keys and service credentials.
- **storing-data** — Where structured data and large payloads belong.
5 changes: 5 additions & 0 deletions .changeset/agent-plugin-agent-visible.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@agent-native/core": patch
---

Keep imported Agent Plugin skills in the agent-visible workspace skills tree, including namespaced plugin skills.
5 changes: 5 additions & 0 deletions .changeset/autonomous-workspace-app-builds.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@agent-native/dispatch": patch
---

Make turn-into-app Builder handoffs autonomous by choosing recommended defaults and recording non-blocking assumptions instead of stopping for questions.
7 changes: 7 additions & 0 deletions .changeset/chat-first-workbench.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@agent-native/core": minor
"@agent-native/dispatch": minor
"@agent-native/toolkit": patch
---

Add an opt-in chat-first workbench with contextual app surfaces for desktop, Dispatch, and mobile clients.
5 changes: 5 additions & 0 deletions .changeset/fence-background-automation-workers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@agent-native/core": patch
---

Prevent duplicate recurring automation dispatch across multiple app deployments and preserve verified Builder credentials for detached background runs.
5 changes: 5 additions & 0 deletions .changeset/prerender-public-template-pages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@agent-native/core": patch
---

Document prerendering in the scaffolded app's `react-router.config.ts`: a commented, correct example with the three conditions a path must meet (public, build-time constant, never redirecting), left off by default because every route the scaffold ships is signed-in and a prerendered file is served without auth middleware running.
5 changes: 5 additions & 0 deletions .changeset/repair-structured-document-titles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@agent-native/core": patch
---

Repair structured route metadata before it can appear as a serialized payload in browser tab titles.
16 changes: 10 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -618,18 +618,22 @@ jobs:
- name: Build Content template (Cloudflare Pages preset)
run: NITRO_PRESET=cloudflare_pages pnpm --filter content build

# Plan covers diagram-heavy SSR and Clips covers public-share SSR. Build
# both real Netlify function artifacts so a core runtime dependency cannot
# be missing from either deployment's server bundle.
- name: Build Plan and Clips templates (netlify preset)
run: NITRO_PRESET=netlify pnpm --filter plan --filter clips build
# Three templates, one per size class, because building all 17 per PR is
# too slow: Plan covers diagram-heavy SSR, Clips covers public-share SSR,
# and Assets is the one that legitimately depends on creative-context — so
# it is the only build that exercises the browser-runtime size budget.
- name: Build Plan, Clips, and Assets templates (netlify preset)
run: NITRO_PRESET=netlify pnpm --filter plan --filter clips --filter assets build

- name: Import SSR handler — must not crash at cold-start
# External timeout is a backstop against a pathological synchronous hang;
# the script itself races module eval against a 30s window and force-exits.
# Match the deployed Netlify environment so failed best-effort local
# SQLite setup cannot call process.exit during this import-only probe.
run: NETLIFY=true timeout 120 node scripts/ssr-boot-smoke.mjs plan clips
# This lane intentionally probes the three built representatives above.
# The smoke script's optional `--report-uncovered` mode is fail-closed;
# use it only when the caller intends to gate on full template coverage.
run: NETLIFY=true timeout 180 node scripts/ssr-boot-smoke.mjs plan clips assets

# Exercise the two other Node serverless presets as well. These import
# their generated handlers, so an unresolved bare runtime dependency
Expand Down
Loading
Loading