2026-08-04 00:25:19 +08:00
|
|
|
{
|
|
|
|
|
"name": "@deepseek-ai/dsh-client-ui-agent-preset",
|
feat(web): author agent presets from a settings page
A composition is a file, but "edit it on the filesystem" is not a browser
affordance. The roster gains `read`/`write`/`remove` beside `select`, and
the browser gains a settings section over them: the presets as rows, one
composition open in a YAML editor at a time, and per-row default, duplicate,
and delete.
All four authoring methods are loopback-pinned. A composition names the
plugins a session runs, so reading one is reconnaissance, writing one is
arbitrary capability, and selecting one can move a session onto a preset
that edits the live runtime. `agentPreset.list` deliberately stays ordinary
and now reports `authorable`, so a surface knows whether creating is
possible at all rather than offering a button whose save always fails.
Authoring starts by duplicating: a shipped preset opens read-only because
the deployment's copy is what a broken local one is compared against. Ids
are contained before they become directory names, and the text is parsed
with the loader's own schema, so a save cannot leave a file no session
could load.
Fixes a defect the real-composition test found: a preset written under the
user's home could never mount, because the loader resolves a row against the
composition's own directory and Node's `node_modules` walk from there never
reaches the installed harness. The mount now records the host base and sends
bare specifiers there, leaving relative paths resolving from the preset.
Also closes the coverage the earlier surfaces in this stack shipped without —
the General row, the composer seat, and the plugin halves now have tests.
2026-08-04 12:23:40 +08:00
|
|
|
"description": "Agent-preset surfaces: the default for later sessions, this session's seat, and the composition editor",
|
2026-08-13 05:02:17 +08:00
|
|
|
"version": "0.0.1-rc.4",
|
2026-08-11 00:02:53 +08:00
|
|
|
"publishConfig": {
|
|
|
|
|
"access": "restricted"
|
|
|
|
|
},
|
|
|
|
|
"repository": {
|
|
|
|
|
"type": "git",
|
|
|
|
|
"url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
|
|
|
|
|
"directory": "packages/client/ui-agent-preset"
|
|
|
|
|
},
|
2026-08-04 00:25:19 +08:00
|
|
|
"type": "module",
|
|
|
|
|
"main": "lib/index.js",
|
|
|
|
|
"types": "lib/types/index.d.ts",
|
|
|
|
|
"exports": {
|
|
|
|
|
".": {
|
|
|
|
|
"types": "./lib/types/index.d.ts",
|
|
|
|
|
"default": "./lib/index.js"
|
|
|
|
|
},
|
|
|
|
|
"./invariant": {
|
|
|
|
|
"types": "./lib/types/invariant.d.ts",
|
|
|
|
|
"default": "./lib/invariant.js"
|
|
|
|
|
},
|
|
|
|
|
"./client": {
|
|
|
|
|
"types": "./lib/types/client/index.d.ts",
|
|
|
|
|
"default": "./lib/client.js"
|
|
|
|
|
},
|
|
|
|
|
"./src/*": "./src/*",
|
|
|
|
|
"./package.json": "./package.json"
|
|
|
|
|
},
|
2026-08-10 20:39:26 +08:00
|
|
|
"dsh": {
|
|
|
|
|
"client": {
|
|
|
|
|
"inject": [
|
|
|
|
|
"@deepseek-ai/dsh-client-connection",
|
|
|
|
|
"@deepseek-ai/dsh-client-locale",
|
|
|
|
|
"@deepseek-ai/dsh-client-runtime",
|
|
|
|
|
"@deepseek-ai/dsh-client-ui-conversation",
|
2026-08-10 21:32:50 +08:00
|
|
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
|
|
|
"@deepseek-ai/dsh-api-remotes"
|
2026-08-10 20:39:26 +08:00
|
|
|
],
|
|
|
|
|
"platform": "web"
|
|
|
|
|
}
|
2026-08-04 00:25:19 +08:00
|
|
|
},
|
|
|
|
|
"scripts": {
|
|
|
|
|
"bundle": "tsdown",
|
|
|
|
|
"watch": "tsdown --watch"
|
|
|
|
|
},
|
|
|
|
|
"license": "BSD-3-Clause",
|
|
|
|
|
"peerDependencies": {
|
2026-08-10 21:32:50 +08:00
|
|
|
"@deepseek-ai/cordis": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-api-remotes": "workspace:^",
|
2026-08-11 00:16:45 +08:00
|
|
|
"@deepseek-ai/dsh-client-connection": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-locale": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-runtime": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-ui-settings": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-ui-slots": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-web-react": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-invariants": "workspace:^",
|
2026-08-04 00:25:19 +08:00
|
|
|
"react": "^18.2.0"
|
|
|
|
|
},
|
|
|
|
|
"devDependencies": {
|
2026-08-10 21:32:50 +08:00
|
|
|
"@deepseek-ai/dsh-api-remotes": "workspace:^",
|
2026-08-04 00:25:19 +08:00
|
|
|
"@deepseek-ai/dsh-client-connection": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-locale": "workspace:^",
|
|
|
|
|
"@deepseek-ai/dsh-client-runtime": "workspace:^",
|
feat(web): author agent presets from a settings page
A composition is a file, but "edit it on the filesystem" is not a browser
affordance. The roster gains `read`/`write`/`remove` beside `select`, and
the browser gains a settings section over them: the presets as rows, one
composition open in a YAML editor at a time, and per-row default, duplicate,
and delete.
All four authoring methods are loopback-pinned. A composition names the
plugins a session runs, so reading one is reconnaissance, writing one is
arbitrary capability, and selecting one can move a session onto a preset
that edits the live runtime. `agentPreset.list` deliberately stays ordinary
and now reports `authorable`, so a surface knows whether creating is
possible at all rather than offering a button whose save always fails.
Authoring starts by duplicating: a shipped preset opens read-only because
the deployment's copy is what a broken local one is compared against. Ids
are contained before they become directory names, and the text is parsed
with the loader's own schema, so a save cannot leave a file no session
could load.
Fixes a defect the real-composition test found: a preset written under the
user's home could never mount, because the loader resolves a row against the
composition's own directory and Node's `node_modules` walk from there never
reaches the installed harness. The mount now records the host base and sends
bare specifiers there, leaving relative paths resolving from the preset.
Also closes the coverage the earlier surfaces in this stack shipped without —
the General row, the composer seat, and the plugin halves now have tests.
2026-08-04 12:23:40 +08:00
|
|
|
"@deepseek-ai/dsh-client-test-runtime": "workspace:^",
|
2026-08-04 10:54:13 +08:00
|
|
|
"@deepseek-ai/dsh-client-ui-conversation": "workspace:^",
|
2026-08-04 00:25:19 +08:00
|
|
|
"@deepseek-ai/dsh-client-ui-primitives": "workspace:^",
|
feat(web): author agent presets from a settings page
A composition is a file, but "edit it on the filesystem" is not a browser
affordance. The roster gains `read`/`write`/`remove` beside `select`, and
the browser gains a settings section over them: the presets as rows, one
composition open in a YAML editor at a time, and per-row default, duplicate,
and delete.
All four authoring methods are loopback-pinned. A composition names the
plugins a session runs, so reading one is reconnaissance, writing one is
arbitrary capability, and selecting one can move a session onto a preset
that edits the live runtime. `agentPreset.list` deliberately stays ordinary
and now reports `authorable`, so a surface knows whether creating is
possible at all rather than offering a button whose save always fails.
Authoring starts by duplicating: a shipped preset opens read-only because
the deployment's copy is what a broken local one is compared against. Ids
are contained before they become directory names, and the text is parsed
with the loader's own schema, so a save cannot leave a file no session
could load.
Fixes a defect the real-composition test found: a preset written under the
user's home could never mount, because the loader resolves a row against the
composition's own directory and Node's `node_modules` walk from there never
reaches the installed harness. The mount now records the host base and sends
bare specifiers there, leaving relative paths resolving from the preset.
Also closes the coverage the earlier surfaces in this stack shipped without —
the General row, the composer seat, and the plugin halves now have tests.
2026-08-04 12:23:40 +08:00
|
|
|
"@deepseek-ai/dsh-client-ui-settings": "workspace:^",
|
2026-08-04 00:25:19 +08:00
|
|
|
"@deepseek-ai/dsh-client-ui-slots": "workspace:^",
|
feat(web): author agent presets from a settings page
A composition is a file, but "edit it on the filesystem" is not a browser
affordance. The roster gains `read`/`write`/`remove` beside `select`, and
the browser gains a settings section over them: the presets as rows, one
composition open in a YAML editor at a time, and per-row default, duplicate,
and delete.
All four authoring methods are loopback-pinned. A composition names the
plugins a session runs, so reading one is reconnaissance, writing one is
arbitrary capability, and selecting one can move a session onto a preset
that edits the live runtime. `agentPreset.list` deliberately stays ordinary
and now reports `authorable`, so a surface knows whether creating is
possible at all rather than offering a button whose save always fails.
Authoring starts by duplicating: a shipped preset opens read-only because
the deployment's copy is what a broken local one is compared against. Ids
are contained before they become directory names, and the text is parsed
with the loader's own schema, so a save cannot leave a file no session
could load.
Fixes a defect the real-composition test found: a preset written under the
user's home could never mount, because the loader resolves a row against the
composition's own directory and Node's `node_modules` walk from there never
reaches the installed harness. The mount now records the host base and sends
bare specifiers there, leaving relative paths resolving from the preset.
Also closes the coverage the earlier surfaces in this stack shipped without —
the General row, the composer seat, and the plugin halves now have tests.
2026-08-04 12:23:40 +08:00
|
|
|
"@deepseek-ai/dsh-client-web-react": "workspace:^",
|
2026-08-04 00:25:19 +08:00
|
|
|
"@deepseek-ai/dsh-invariants": "workspace:^",
|
|
|
|
|
"@types/react": "~18.3.1",
|
2026-08-11 00:16:45 +08:00
|
|
|
"@deepseek-ai/cordis": "workspace:^",
|
2026-08-04 00:25:19 +08:00
|
|
|
"react": "^18.2.0"
|
|
|
|
|
},
|
|
|
|
|
"files": [
|
|
|
|
|
"lib/index.js",
|
|
|
|
|
"lib/invariant.js",
|
|
|
|
|
"lib/client.js",
|
fix(web): record which preset a session actually runs
The creation header names the preset a session STARTED with and is frozen,
which is correct — it is a creation fact. Switching is legal only while a
session is blank, and that looked like enough: no history exists yet.
It is not, because the switch's effect outlives the blank window. The user
switches, then sends the first message; every turn from there runs under the
new composition while the header still names the old one. The session is
then locked around a misrecorded preset, and resume reads the header to
rebuild it — composing one preset's tools over a history another produced,
which is exactly the replay the blank-only lock exists to prevent, reached
by another route. A picker showed `standard` for a session running
`core-web`.
A switch is now an `agent-preset/selected` event appended after the swap
commits, and `resolveSessionPreset()` (last selection, else the header) is
what every reconstruction reads: the summary, resume, the conflict guard,
and the fork introduced one layer down.
2026-08-05 15:46:44 +08:00
|
|
|
"lib/types/**/*.d.ts"
|
2026-08-04 00:25:19 +08:00
|
|
|
]
|
|
|
|
|
}
|