@schlenkr/ragents 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/server/src/chat-handler.ts +2 -0
- package/apps/server/src/config.ts +6 -0
- package/apps/server/src/host-api.json +1 -0
- package/apps/server/src/layout.ts +0 -15
- package/apps/server/src/plugin-support/agent-tool.ts +2 -3
- package/apps/server/src/plugin-support/plugin-folder.ts +2 -1
- package/apps/server/src/provider.ts +34 -11
- package/apps/server/src/ragents/actor-chat-history.ts +1 -0
- package/apps/server/src/ragents/engine.ts +23 -24
- package/apps/server/src/ragents/journal-chat-events.ts +2 -0
- package/apps/server/src/ragents/run-owner.ts +3 -2
- package/apps/server/src/ragents/session.ts +3 -3
- package/apps/server/src/run-preparation.ts +14 -18
- package/apps/server/src/run-transfer.ts +65 -4
- package/apps/server/src/settings.ts +2 -4
- package/apps/web/dist/assets/{highlighted-body-KPVGNVTW-B9qYBARS.js → highlighted-body-KPVGNVTW-xXXhTDbh.js} +1 -1
- package/apps/web/dist/assets/{main-BCjvD2Hh.js → main-C7JeZFjs.js} +1 -1
- package/apps/web/dist/assets/{mermaid-HWGCJPDP-CvYYFK_n.js → mermaid-HWGCJPDP-DfsU5ofC.js} +69 -69
- package/apps/web/dist/assets/{runPanel-CG7kRMJh.js → runPanel-ZT6TPDLM.js} +1 -1
- package/apps/web/dist/help/guide-clients.html +13 -4
- package/apps/web/dist/help/guide-clients.md +14 -4
- package/apps/web/dist/help/guide-distributed.html +8 -3
- package/apps/web/dist/help/guide-distributed.md +8 -3
- package/apps/web/dist/help/guide-runtime.html +18 -12
- package/apps/web/dist/help/guide-runtime.md +19 -12
- package/apps/web/dist/help/mini-app.css +23 -3
- package/apps/web/dist/host-web.json +4 -4
- package/apps/web/dist/index.html +2 -2
- package/apps/web/dist/run-panel.html +2 -2
- package/apps/web/src/SessionList.tsx +16 -8
- package/apps/web/src/StartTiles.tsx +1 -1
- package/apps/web/src/api.ts +2 -0
- package/apps/web/src/panel/PanelPage.tsx +1 -1
- package/apps/web/src/panel/RunLine.tsx +4 -2
- package/apps/web/src/panel/contract.ts +2 -0
- package/bundles/ragents.activity/ragents-bundle.json +1 -1
- package/bundles/ragents.actor-programs/ragents-bundle.json +1 -1
- package/bundles/ragents.ask/ragents-bundle.json +1 -1
- package/bundles/ragents.browser/ragents-bundle.json +1 -1
- package/bundles/ragents.documents/ragents-bundle.json +1 -1
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +1 -1
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +1 -1
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +1 -1
- package/bundles/ragents.model-relay/ragents-bundle.json +1 -1
- package/bundles/ragents.orchestration/ragents-bundle.json +1 -1
- package/bundles/ragents.overseer/ragents-bundle.json +1 -1
- package/bundles/ragents.processes/ragents-bundle.json +1 -1
- package/bundles/ragents.product/ragents-bundle.json +1 -1
- package/bundles/ragents.profile-distribution/ragents-bundle.json +1 -1
- package/bundles/ragents.reference/ragents-bundle.json +2 -2
- package/bundles/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +1 -1
- package/bundles/ragents.reference/run-scripts/word-game/tests/program.test.ts +3 -3
- package/bundles/ragents.todo/ragents-bundle.json +1 -1
- package/bundles/ragents.transcript/ragents-bundle.json +1 -1
- package/bundles/ragents.watch/ragents-bundle.json +1 -1
- package/bundles/ragents.workspace/ragents-bundle.json +1 -1
- package/package.json +2 -2
- package/packages/agent/dist/core/agent-settings.d.ts +2 -2
- package/packages/agent/dist/core/compaction/compaction.d.ts +16 -50
- package/packages/agent/dist/core/context-log.d.ts +25 -0
- package/packages/agent/dist/core/messages.d.ts +3 -10
- package/packages/agent/dist/core/tool-definition.d.ts +17 -0
- package/packages/agent/dist/core/tools/bash.d.ts +2 -7
- package/packages/agent/dist/core/tools/edit.d.ts +1 -1
- package/packages/agent/dist/core/tools/read.d.ts +1 -1
- package/packages/agent/dist/core/tools/write.d.ts +1 -1
- package/packages/agent/dist/index.d.ts +7 -8
- package/packages/agent/dist/loop/agent.d.ts +2 -6
- package/packages/agent/package.json +1 -1
- package/packages/agent/src/core/agent-settings.ts +2 -2
- package/packages/agent/src/core/compaction/compaction.ts +49 -175
- package/packages/agent/src/core/context-log.ts +49 -0
- package/packages/agent/src/core/messages.ts +5 -11
- package/packages/agent/src/core/tool-definition.ts +29 -0
- package/packages/agent/src/core/tools/bash.ts +2 -9
- package/packages/agent/src/core/tools/edit.ts +2 -11
- package/packages/agent/src/core/tools/read.ts +3 -18
- package/packages/agent/src/core/tools/write.ts +1 -5
- package/packages/agent/src/index.ts +28 -14
- package/packages/agent/src/loop/agent-loop.ts +1 -2
- package/packages/agent/src/loop/agent.ts +8 -2
- package/packages/ai/dist/api/ai-sdk.d.ts +2 -0
- package/packages/ai/dist/types.d.ts +2 -0
- package/packages/ai/src/api/ai-sdk-messages.ts +15 -10
- package/packages/ai/src/api/ai-sdk.ts +11 -0
- package/packages/ai/src/api/transform-messages.ts +1 -1
- package/packages/ai/src/types.ts +2 -0
- package/packages/ai/src/utils/retry.ts +14 -0
- package/packages/ragents/src/agents/actor-input.ts +15 -0
- package/packages/ragents/src/agents/model-context.ts +360 -0
- package/packages/ragents/src/agents/plugins.ts +5 -0
- package/packages/ragents/src/agents/scheduler.ts +3 -7
- package/packages/ragents/src/agents/tools.ts +2 -2
- package/packages/ragents/src/agents/toolset.ts +47 -20
- package/packages/ragents/src/agents/workspaces.ts +0 -6
- package/packages/ragents/src/domain/event-semantics.ts +51 -0
- package/packages/ragents/src/domain/event-validation.ts +166 -0
- package/packages/ragents/src/domain/events.ts +72 -0
- package/packages/ragents/src/domain/model.ts +4 -2
- package/packages/ragents/src/domain/projection.ts +9 -0
- package/packages/ragents/src/domain/tool-result-text.ts +9 -0
- package/packages/ragents/src/drivers/agent-hooks.ts +25 -38
- package/packages/ragents/src/drivers/agent-runtime.ts +118 -933
- package/packages/ragents/src/drivers/agent-turn.ts +735 -0
- package/packages/ragents/src/drivers/agent.ts +9 -7
- package/packages/ragents/src/drivers/skill-preload.ts +53 -63
- package/packages/ragents/src/drivers/types.ts +21 -5
- package/packages/ragents/src/index.ts +8 -6
- package/packages/ragents/src/plugin-host.ts +60 -13
- package/packages/ragents/src/plugin-types.ts +7 -2
- package/packages/ragents/src/runtime/decisions/actors.ts +10 -0
- package/packages/ragents/src/runtime/decisions/turns.ts +66 -7
- package/packages/ragents/src/runtime/journal-storage.ts +7 -4
- package/packages/ragents/src/runtime/journal.ts +35 -0
- package/packages/ragents/src/runtime/orchestration.ts +140 -9
- package/packages/workspace-executor/src/sandbox-tools.ts +10 -11
- package/plugins/ragents.reference/run-scripts/learning-afternoon/tests/program.test.ts +1 -1
- package/plugins/ragents.reference/run-scripts/word-game/tests/program.test.ts +3 -3
- package/scripts/agent/journal.ts +5 -3
- package/scripts/package/publish-package.ts +4 -3
- package/packages/agent/dist/core/agent-session-runtime.d.ts +0 -33
- package/packages/agent/dist/core/agent-session-services.d.ts +0 -35
- package/packages/agent/dist/core/agent-session.d.ts +0 -234
- package/packages/agent/dist/core/auth-guidance.d.ts +0 -4
- package/packages/agent/dist/core/defaults.d.ts +0 -3
- package/packages/agent/dist/core/extensions/index.d.ts +0 -11
- package/packages/agent/dist/core/extensions/loader.d.ts +0 -12
- package/packages/agent/dist/core/extensions/runner.d.ts +0 -39
- package/packages/agent/dist/core/extensions/types.d.ts +0 -156
- package/packages/agent/dist/core/extensions/wrapper.d.ts +0 -12
- package/packages/agent/dist/core/resource-loader.d.ts +0 -39
- package/packages/agent/dist/core/sdk.d.ts +0 -38
- package/packages/agent/dist/core/session-manager.d.ts +0 -189
- package/packages/agent/dist/core/source-info.d.ts +0 -16
- package/packages/agent/dist/core/system-prompt.d.ts +0 -21
- package/packages/agent/src/core/agent-session-runtime.ts +0 -94
- package/packages/agent/src/core/agent-session-services.ts +0 -74
- package/packages/agent/src/core/agent-session.ts +0 -1108
- package/packages/agent/src/core/auth-guidance.ts +0 -14
- package/packages/agent/src/core/defaults.ts +0 -3
- package/packages/agent/src/core/extensions/index.ts +0 -38
- package/packages/agent/src/core/extensions/loader.ts +0 -125
- package/packages/agent/src/core/extensions/runner.ts +0 -211
- package/packages/agent/src/core/extensions/types.ts +0 -197
- package/packages/agent/src/core/extensions/wrapper.ts +0 -24
- package/packages/agent/src/core/resource-loader.ts +0 -142
- package/packages/agent/src/core/sdk.ts +0 -123
- package/packages/agent/src/core/session-manager.ts +0 -743
- package/packages/agent/src/core/source-info.ts +0 -28
- package/packages/agent/src/core/system-prompt.ts +0 -108
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as M,I as H,u as Z,r as i,j as e,B as y,J as De,K as Ae,w as ze,l as Fe,m as Te,v as _e,k as Me,P as He,H as ce,L as Ue,q as K,s as de,i as Be,N as ue,O as re,T as Ve,V as $e,A as ie,Y as qe,Z as Ke,_ as Ze,$ as Ge,t as Je,a0 as We,e as Qe,a1 as Ye,a2 as Xe,y as et,z as tt,a3 as nt,a4 as st,a5 as rt,F as it,Q as ot,a6 as at,a7 as lt,G as ct}from"./mermaid-HWGCJPDP-
|
|
1
|
+
import{a as M,I as H,u as Z,r as i,j as e,B as y,J as De,K as Ae,w as ze,l as Fe,m as Te,v as _e,k as Me,P as He,H as ce,L as Ue,q as K,s as de,i as Be,N as ue,O as re,T as Ve,V as $e,A as ie,Y as qe,Z as Ke,_ as Ze,$ as Ge,t as Je,a0 as We,e as Qe,a1 as Ye,a2 as Xe,y as et,z as tt,a3 as nt,a4 as st,a5 as rt,F as it,Q as ot,a6 as at,a7 as lt,G as ct}from"./mermaid-HWGCJPDP-DfsU5ofC.js";/**
|
|
2
2
|
* @license lucide-react v1.46.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -205,10 +205,10 @@ The status bar shows the number of connected servers and opens the start page wh
|
|
|
205
205
|
the root <code>README.md</code> for details.</p>
|
|
206
206
|
<p>Install the extension from the Marketplace as <code>purestate.ragents-vscode</code> using "Extensions:
|
|
207
207
|
Install Extension" or <code>code --install-extension purestate.ragents-vscode</code>. To install a locally
|
|
208
|
-
packaged file, run <code>pnpm package:vscode</code
|
|
208
|
+
packaged file, run <code>pnpm package:vscode</code>, which builds
|
|
209
209
|
<code>dist/ragents-vscode-<version>.vsix</code>, then use "Extensions: Install from VSIX" or
|
|
210
|
-
<code>code --install-extension dist/ragents-vscode-<version>.vsix --force</code>.
|
|
211
|
-
|
|
210
|
+
<code>code --install-extension dist/ragents-vscode-<version>.vsix --force</code>. <code>scripts/vscode/install-local.sh</code>
|
|
211
|
+
performs both steps, rebuilds the built-in plugins, and
|
|
212
212
|
rebuilds the web interface if it no longer matches its sources, so that hosts from this checkout
|
|
213
213
|
start again. The script then restarts manually launched
|
|
214
214
|
servers (<code>scripts/start.sh</code>, identified by <code>RAGENTS_LAUNCH=start.sh</code> in their environment, with logs under
|
|
@@ -258,7 +258,9 @@ explains why and offers "Zur Start-Seite" (back to Start). For a new r
|
|
|
258
258
|
soon as it becomes writable. Opening an existing run does not move focus there automatically.</p>
|
|
259
259
|
<p><strong>Runs</strong> shows the complete list in the same grid, with search, "Beendete ausblenden" (hide finished), a server
|
|
260
260
|
filter carried over from Start, and a selection mode that deletes several runs after a dialog
|
|
261
|
-
confirmation. Checkboxes occupy an additional first column without shifting the others
|
|
261
|
+
confirmation. Checkboxes occupy an additional first column without shifting the others. A run the
|
|
262
|
+
server has locked, for example because its journal uses an older format, shows a warning icon whose
|
|
263
|
+
tooltip names the cause; it does not open, but the selection mode deletes it.</p>
|
|
262
264
|
<p><strong>Server</strong> is the configuration page. You can add, edit, sign in, sign out, connect,
|
|
263
265
|
disconnect, and remove servers with confirmation, then open <code>settings.json</code> from the link
|
|
264
266
|
at the bottom.</p>
|
|
@@ -294,6 +296,13 @@ to nested hosted mini-app frames. Text entry, selection, undo, and clipboard act
|
|
|
294
296
|
the input field. Dictation tools that paste their result, such as HEX, use the same input path.
|
|
295
297
|
Keys already handled by the chat or mini-app are not also executed as VS Code commands.
|
|
296
298
|
In a regular browser, native keyboard and clipboard behavior remains in use.</p>
|
|
299
|
+
<p>To make RAgents smaller or larger independently of VS Code's window zoom, set <code>ragents.zoom</code>
|
|
300
|
+
in VS Code Settings. The value is a percentage from 50 to 200, with 100 as the default;
|
|
301
|
+
for example, <code>"ragents.zoom": 90</code> makes the whole interface 10% smaller. It applies to Start,
|
|
302
|
+
Runs, Server, the run panel, and mini-app editor tabs, including nested mini-apps. Changes take
|
|
303
|
+
effect immediately without reloading the page or losing input drafts. Regular browser pages
|
|
304
|
+
are unaffected. This scales text, controls, and spacing together; it is independent of
|
|
305
|
+
<code>editor.fontSize</code> and the built-in chat font settings.</p>
|
|
297
306
|
<p>If a server profile requires users, both the lock on Start and the Server row open the
|
|
298
307
|
same sign-in dialog. For a profile with <code>ACCESS_TOKEN</code>, the dialog requests that token. User name
|
|
299
308
|
and password are stored per server address in VS Code SecretStorage and reused silently next
|
|
@@ -85,10 +85,10 @@ the root `README.md` for details.
|
|
|
85
85
|
|
|
86
86
|
Install the extension from the Marketplace as `purestate.ragents-vscode` using "Extensions:
|
|
87
87
|
Install Extension" or `code --install-extension purestate.ragents-vscode`. To install a locally
|
|
88
|
-
packaged file, run `pnpm package:vscode
|
|
88
|
+
packaged file, run `pnpm package:vscode`, which builds
|
|
89
89
|
`dist/ragents-vscode-<version>.vsix`, then use "Extensions: Install from VSIX" or
|
|
90
|
-
`code --install-extension dist/ragents-vscode-<version>.vsix --force`.
|
|
91
|
-
|
|
90
|
+
`code --install-extension dist/ragents-vscode-<version>.vsix --force`. `scripts/vscode/install-local.sh`
|
|
91
|
+
performs both steps, rebuilds the built-in plugins, and
|
|
92
92
|
rebuilds the web interface if it no longer matches its sources, so that hosts from this checkout
|
|
93
93
|
start again. The script then restarts manually launched
|
|
94
94
|
servers (`scripts/start.sh`, identified by `RAGENTS_LAUNCH=start.sh` in their environment, with logs under
|
|
@@ -144,7 +144,9 @@ soon as it becomes writable. Opening an existing run does not move focus there a
|
|
|
144
144
|
|
|
145
145
|
**Runs** shows the complete list in the same grid, with search, "Beendete ausblenden" (hide finished), a server
|
|
146
146
|
filter carried over from Start, and a selection mode that deletes several runs after a dialog
|
|
147
|
-
confirmation. Checkboxes occupy an additional first column without shifting the others.
|
|
147
|
+
confirmation. Checkboxes occupy an additional first column without shifting the others. A run the
|
|
148
|
+
server has locked, for example because its journal uses an older format, shows a warning icon whose
|
|
149
|
+
tooltip names the cause; it does not open, but the selection mode deletes it.
|
|
148
150
|
|
|
149
151
|
**Server** is the configuration page. You can add, edit, sign in, sign out, connect,
|
|
150
152
|
disconnect, and remove servers with confirmation, then open `settings.json` from the link
|
|
@@ -186,6 +188,14 @@ the input field. Dictation tools that paste their result, such as HEX, use the s
|
|
|
186
188
|
Keys already handled by the chat or mini-app are not also executed as VS Code commands.
|
|
187
189
|
In a regular browser, native keyboard and clipboard behavior remains in use.
|
|
188
190
|
|
|
191
|
+
To make RAgents smaller or larger independently of VS Code's window zoom, set `ragents.zoom`
|
|
192
|
+
in VS Code Settings. The value is a percentage from 50 to 200, with 100 as the default;
|
|
193
|
+
for example, `"ragents.zoom": 90` makes the whole interface 10% smaller. It applies to Start,
|
|
194
|
+
Runs, Server, the run panel, and mini-app editor tabs, including nested mini-apps. Changes take
|
|
195
|
+
effect immediately without reloading the page or losing input drafts. Regular browser pages
|
|
196
|
+
are unaffected. This scales text, controls, and spacing together; it is independent of
|
|
197
|
+
`editor.fontSize` and the built-in chat font settings.
|
|
198
|
+
|
|
189
199
|
If a server profile requires users, both the lock on Start and the Server row open the
|
|
190
200
|
same sign-in dialog. For a profile with `ACCESS_TOKEN`, the dialog requests that token. User name
|
|
191
201
|
and password are stored per server address in VS Code SecretStorage and reused silently next
|
|
@@ -254,9 +254,10 @@ RAGENTS_TOKEN=<token> pnpm run-transfer <source> <target> <
|
|
|
254
254
|
</code></pre>
|
|
255
255
|
<p>The script exports the run from the source with <code>ragents.runs.export</code> and imports it on the target
|
|
256
256
|
with <code>ragents.runs.import</code>. If each side uses a different token, set <code>RAGENTS_SOURCE_TOKEN</code> and
|
|
257
|
-
<code>RAGENTS_TARGET_TOKEN</code>. The transfer includes the journal and payloads,
|
|
258
|
-
|
|
259
|
-
|
|
257
|
+
<code>RAGENTS_TARGET_TOKEN</code>. The transfer includes the journal and payloads, which also hold the model
|
|
258
|
+
contexts of the run's agents, the stored contents the run refers to (attachments and the media of
|
|
259
|
+
the model contexts), actor programs, and all plugin storage for the run, including
|
|
260
|
+
<code>ragents.documents</code> files and the new folder of a run that works on the server. A folder on a workstation stays there, and the
|
|
260
261
|
run keeps its binding to that workstation. Running processes, language servers, and
|
|
261
262
|
browsers are not transferred; they are recreated on the target when next used.</p>
|
|
262
263
|
<p>The transfer enforces these prerequisites:</p>
|
|
@@ -269,6 +270,10 @@ target folder, given as an absolute path on the target server. A workspace bindi
|
|
|
269
270
|
the same ID and as the run owner, or anonymously for an ownerless run.</li>
|
|
270
271
|
<li>The archive must stay below 16 MiB because it travels as Base64 through the message layer.
|
|
271
272
|
A workspace containing <code>node_modules</code> will exceed this; an existing folder on the server usually will not.</li>
|
|
273
|
+
<li>Symbolic links travel only when they are relative and stay inside the run's storage. Links under
|
|
274
|
+
<code>node_modules</code> that point elsewhere, such as a package manager's absolute links, are left out
|
|
275
|
+
and come back with the next install in the workspace. Any other link pointing outside stops the
|
|
276
|
+
export with <code>run-transfer-link</code> and names the links; replace them with files or relative links.</li>
|
|
272
277
|
</ul>
|
|
273
278
|
<p>Export copies the run. It remains on the source and must be deleted there explicitly after a
|
|
274
279
|
real move, otherwise two journals with the same ID diverge. On the target, the run appears
|
|
@@ -155,9 +155,10 @@ RAGENTS_TOKEN=<token> pnpm run-transfer <source> <target> <runId> --workspace /p
|
|
|
155
155
|
|
|
156
156
|
The script exports the run from the source with `ragents.runs.export` and imports it on the target
|
|
157
157
|
with `ragents.runs.import`. If each side uses a different token, set `RAGENTS_SOURCE_TOKEN` and
|
|
158
|
-
`RAGENTS_TARGET_TOKEN`. The transfer includes the journal and payloads,
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
`RAGENTS_TARGET_TOKEN`. The transfer includes the journal and payloads, which also hold the model
|
|
159
|
+
contexts of the run's agents, the stored contents the run refers to (attachments and the media of
|
|
160
|
+
the model contexts), actor programs, and all plugin storage for the run, including
|
|
161
|
+
`ragents.documents` files and the new folder of a run that works on the server. A folder on a workstation stays there, and the
|
|
161
162
|
run keeps its binding to that workstation. Running processes, language servers, and
|
|
162
163
|
browsers are not transferred; they are recreated on the target when next used.
|
|
163
164
|
|
|
@@ -171,6 +172,10 @@ The transfer enforces these prerequisites:
|
|
|
171
172
|
the same ID and as the run owner, or anonymously for an ownerless run.
|
|
172
173
|
- The archive must stay below 16 MiB because it travels as Base64 through the message layer.
|
|
173
174
|
A workspace containing `node_modules` will exceed this; an existing folder on the server usually will not.
|
|
175
|
+
- Symbolic links travel only when they are relative and stay inside the run's storage. Links under
|
|
176
|
+
`node_modules` that point elsewhere, such as a package manager's absolute links, are left out
|
|
177
|
+
and come back with the next install in the workspace. Any other link pointing outside stops the
|
|
178
|
+
export with `run-transfer-link` and names the links; replace them with files or relative links.
|
|
174
179
|
|
|
175
180
|
Export copies the run. It remains on the source and must be deleted there explicitly after a
|
|
176
181
|
real move, otherwise two journals with the same ID diverge. On the target, the run appears
|
|
@@ -184,10 +184,13 @@ earliest after the snippet, as steering or in a later turn. The programming lang
|
|
|
184
184
|
additional decision point for this.</p>
|
|
185
185
|
<h2 id="model-context-across-turns">Model context across turns</h2>
|
|
186
186
|
<p>Each LLM actor has its own conversation context, which persists across turns. A new input adds
|
|
187
|
-
to that conversation.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
the
|
|
187
|
+
to that conversation. The context is part of the run's journal: every input as the model received
|
|
188
|
+
it, every completed model step, every tool result as the model saw it, and every compaction are
|
|
189
|
+
recorded there, and the context is read back from those records before each model request. After
|
|
190
|
+
a restart the actor therefore continues with exactly the same context. A new actor starts with its
|
|
191
|
+
own context or, when spawned with <code>forkOf</code>, with an unchanged copy of the context another LLM actor
|
|
192
|
+
of the same run had at the end of its last finished turn before the spawn. Updating the system
|
|
193
|
+
prompt does not replace the existing conversation history.</p>
|
|
191
194
|
<p>Programmed actor state stores explicitly assigned data for functions and mini-apps. Before a
|
|
192
195
|
replacement state is diffed and journaled, it is converted to JSON form: keys whose value is
|
|
193
196
|
<code>undefined</code> are treated as absent both in memory and on disk, while a <code>set</code> state change without
|
|
@@ -195,6 +198,9 @@ a value remains invalid. The journal records the run's shared events and der
|
|
|
195
198
|
from them. These three forms of state serve different purposes: the visible chat is not a full
|
|
196
199
|
copy of the current model context, and a new turn does not mean the model starts without its
|
|
197
200
|
conversation memory.</p>
|
|
201
|
+
<p>When the context grows too large, the agent compacts it: older parts are replaced by a summary
|
|
202
|
+
written by the model, and recent parts are kept. A compaction is recorded in the journal as well,
|
|
203
|
+
and the chat shows a short system note.</p>
|
|
198
204
|
<h2 id="interrupting-a-turn-stopping-an-actor-stopping-a-run-and-shutting-down-the-server">Interrupting a turn, stopping an actor, stopping a run, and shutting down the server</h2>
|
|
199
205
|
<p>All stop paths follow the same principle: block new work first, then cancel, wait for running
|
|
200
206
|
work, and only then release resources. The exact boundary differs:</p>
|
|
@@ -313,12 +319,12 @@ before its first turn, and the stop reason names the unknown tools. The selectio
|
|
|
313
319
|
inherited, although delegable engine capabilities still are. <code>withoutCapabilities</code> removes
|
|
314
320
|
named technical permissions. Availability and grants also apply when the value is <code>null</code>.
|
|
315
321
|
<code>forkOf</code> (a handle or ID) makes the new agent a fork of an LLM agent in the same run:
|
|
316
|
-
<code>agent.spawned</code> records the source, and
|
|
317
|
-
the source's
|
|
318
|
-
|
|
319
|
-
system prompt, functions, and model. Later turns from the source
|
|
320
|
-
fork require the agent driver; a source without
|
|
321
|
-
|
|
322
|
+
<code>agent.spawned</code> records the source, and the new agent's context begins with an unchanged copy of
|
|
323
|
+
the source's context up to the end of the source's last finished turn, reasoning blocks included.
|
|
324
|
+
Nothing from the turn the source is running at the spawn is copied, and no text is inserted; the
|
|
325
|
+
new agent supplies its own system prompt, functions, and model. Later turns from the source do not
|
|
326
|
+
reach the fork. Both source and fork require the agent driver; a source without a finished turn that
|
|
327
|
+
reached the model, and not itself a fork, is rejected with <code>fork-without-turn</code>. A plain LLM receives no function overview. Its driver must explicitly support this
|
|
322
328
|
isolation or the turn is rejected.</p>
|
|
323
329
|
<p>Equipped LLMs receive <code>typescript_api</code> and <code>typescript_eval</code>, plus an automatically generated
|
|
324
330
|
overview of their available TypeScript functions with names and short descriptions. The
|
|
@@ -333,6 +339,6 @@ suggested as an agent's model choice.</p>
|
|
|
333
339
|
<h2 id="journal-and-projection">Journal and projection</h2>
|
|
334
340
|
<p>The journal is the shared history of a run. Visible state is produced by replaying its events;
|
|
335
341
|
models and functions are not called again in the process. Recorded responses, function calls,
|
|
336
|
-
state changes, and interruptions therefore remain traceable after a restart.
|
|
337
|
-
|
|
342
|
+
state changes, and interruptions therefore remain traceable after a restart. The model context of
|
|
343
|
+
every LLM agent is part of the journal as well; working files are stored separately.</p>
|
|
338
344
|
<p class="guide-source">Source: <a href="https://github.com/SchlenkR/RAgents/blob/main/docs/spec/core.md">docs/spec/core.md</a>. <a href="guide-runtime.md">This chapter as Markdown</a>.</p><p><a href="guide-getting-started.html">Get started</a></p><nav class="guide-next" aria-label="Continue reading"><a href="guide-ideas.html">Previous: Core ideas</a><a href="guide-getting-started.html">Next: Get started</a></nav></article></div></main><footer class="shell"><p>Generated from public documentation. Rebuild with <code>pnpm generate:homepage</code>. Verify with <code>pnpm check:homepage</code>.</p><nav aria-label="More pages"><a href="index.html">Homepage</a><a href="guide.html">Guide</a></nav></footer></body></html>
|
|
@@ -66,10 +66,13 @@ additional decision point for this.
|
|
|
66
66
|
## Model context across turns
|
|
67
67
|
|
|
68
68
|
Each LLM actor has its own conversation context, which persists across turns. A new input adds
|
|
69
|
-
to that conversation.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
the
|
|
69
|
+
to that conversation. The context is part of the run's journal: every input as the model received
|
|
70
|
+
it, every completed model step, every tool result as the model saw it, and every compaction are
|
|
71
|
+
recorded there, and the context is read back from those records before each model request. After
|
|
72
|
+
a restart the actor therefore continues with exactly the same context. A new actor starts with its
|
|
73
|
+
own context or, when spawned with `forkOf`, with an unchanged copy of the context another LLM actor
|
|
74
|
+
of the same run had at the end of its last finished turn before the spawn. Updating the system
|
|
75
|
+
prompt does not replace the existing conversation history.
|
|
73
76
|
|
|
74
77
|
Programmed actor state stores explicitly assigned data for functions and mini-apps. Before a
|
|
75
78
|
replacement state is diffed and journaled, it is converted to JSON form: keys whose value is
|
|
@@ -79,6 +82,10 @@ from them. These three forms of state serve different purposes: the visible chat
|
|
|
79
82
|
copy of the current model context, and a new turn does not mean the model starts without its
|
|
80
83
|
conversation memory.
|
|
81
84
|
|
|
85
|
+
When the context grows too large, the agent compacts it: older parts are replaced by a summary
|
|
86
|
+
written by the model, and recent parts are kept. A compaction is recorded in the journal as well,
|
|
87
|
+
and the chat shows a short system note.
|
|
88
|
+
|
|
82
89
|
## Interrupting a turn, stopping an actor, stopping a run, and shutting down the server
|
|
83
90
|
|
|
84
91
|
All stop paths follow the same principle: block new work first, then cancel, wait for running
|
|
@@ -198,12 +205,12 @@ before its first turn, and the stop reason names the unknown tools. The selectio
|
|
|
198
205
|
inherited, although delegable engine capabilities still are. `withoutCapabilities` removes
|
|
199
206
|
named technical permissions. Availability and grants also apply when the value is `null`.
|
|
200
207
|
`forkOf` (a handle or ID) makes the new agent a fork of an LLM agent in the same run:
|
|
201
|
-
`agent.spawned` records the source, and
|
|
202
|
-
the source's
|
|
203
|
-
|
|
204
|
-
system prompt, functions, and model. Later turns from the source
|
|
205
|
-
fork require the agent driver; a source without
|
|
206
|
-
|
|
208
|
+
`agent.spawned` records the source, and the new agent's context begins with an unchanged copy of
|
|
209
|
+
the source's context up to the end of the source's last finished turn, reasoning blocks included.
|
|
210
|
+
Nothing from the turn the source is running at the spawn is copied, and no text is inserted; the
|
|
211
|
+
new agent supplies its own system prompt, functions, and model. Later turns from the source do not
|
|
212
|
+
reach the fork. Both source and fork require the agent driver; a source without a finished turn that
|
|
213
|
+
reached the model, and not itself a fork, is rejected with `fork-without-turn`. A plain LLM receives no function overview. Its driver must explicitly support this
|
|
207
214
|
isolation or the turn is rejected.
|
|
208
215
|
|
|
209
216
|
Equipped LLMs receive `typescript_api` and `typescript_eval`, plus an automatically generated
|
|
@@ -221,5 +228,5 @@ suggested as an agent's model choice.
|
|
|
221
228
|
|
|
222
229
|
The journal is the shared history of a run. Visible state is produced by replaying its events;
|
|
223
230
|
models and functions are not called again in the process. Recorded responses, function calls,
|
|
224
|
-
state changes, and interruptions therefore remain traceable after a restart.
|
|
225
|
-
|
|
231
|
+
state changes, and interruptions therefore remain traceable after a restart. The model context of
|
|
232
|
+
every LLM agent is part of the journal as well; working files are stored separately.
|
|
@@ -711,9 +711,6 @@
|
|
|
711
711
|
.h-auto {
|
|
712
712
|
height: auto;
|
|
713
713
|
}
|
|
714
|
-
.h-dvh {
|
|
715
|
-
height: 100dvh;
|
|
716
|
-
}
|
|
717
714
|
.h-full {
|
|
718
715
|
height: 100%;
|
|
719
716
|
}
|
|
@@ -1461,6 +1458,12 @@
|
|
|
1461
1458
|
--tw-border-style: dashed;
|
|
1462
1459
|
border-style: dashed;
|
|
1463
1460
|
}
|
|
1461
|
+
.border-\[color-mix\(in_srgb\,var\(--destructive\)_55\%\,var\(--border\)\)\] {
|
|
1462
|
+
border-color: var(--destructive);
|
|
1463
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1464
|
+
border-color: color-mix(in srgb,var(--destructive) 55%,var(--border));
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1464
1467
|
.border-\[color-mix\(in_srgb\,var\(--flow-status\)_60\%\,var\(--border\)\)\] {
|
|
1465
1468
|
border-color: var(--flow-status);
|
|
1466
1469
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -1512,6 +1515,9 @@
|
|
|
1512
1515
|
.border-transparent {
|
|
1513
1516
|
border-color: transparent;
|
|
1514
1517
|
}
|
|
1518
|
+
.border-t-destructive {
|
|
1519
|
+
border-top-color: var(--destructive);
|
|
1520
|
+
}
|
|
1515
1521
|
.border-t-info {
|
|
1516
1522
|
border-top-color: var(--info);
|
|
1517
1523
|
}
|
|
@@ -1620,6 +1626,12 @@
|
|
|
1620
1626
|
background-color: color-mix(in oklab, currentcolor 11%, transparent);
|
|
1621
1627
|
}
|
|
1622
1628
|
}
|
|
1629
|
+
.bg-destructive\/8 {
|
|
1630
|
+
background-color: var(--destructive);
|
|
1631
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1632
|
+
background-color: color-mix(in oklab, var(--destructive) 8%, transparent);
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1623
1635
|
.bg-destructive\/10 {
|
|
1624
1636
|
background-color: var(--destructive);
|
|
1625
1637
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -3372,9 +3384,17 @@
|
|
|
3372
3384
|
.aria-disabled\:pointer-events-none[aria-disabled="true"] {
|
|
3373
3385
|
pointer-events: none;
|
|
3374
3386
|
}
|
|
3387
|
+
.aria-disabled\:cursor-default[aria-disabled="true"] {
|
|
3388
|
+
cursor: default;
|
|
3389
|
+
}
|
|
3375
3390
|
.aria-disabled\:opacity-50[aria-disabled="true"] {
|
|
3376
3391
|
opacity: 50%;
|
|
3377
3392
|
}
|
|
3393
|
+
@media (hover: hover) {
|
|
3394
|
+
.aria-disabled\:hover\:bg-transparent[aria-disabled="true"]:hover {
|
|
3395
|
+
background-color: transparent;
|
|
3396
|
+
}
|
|
3397
|
+
}
|
|
3378
3398
|
.aria-expanded\:bg-accent[aria-expanded="true"] {
|
|
3379
3399
|
background-color: var(--accent);
|
|
3380
3400
|
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"apps/web/src/access-token.ts": "ec06d109a8cc17ccee59804d7e52b3cc253b8496c58df7a7ff0c11c76307bc17",
|
|
16
16
|
"apps/web/src/AccessContext.tsx": "d6b681ba3e5adae4c533076d500304115518212afac9453cfd4ca8a79aafaa73",
|
|
17
17
|
"apps/web/src/actor-conversation.ts": "7e965f618ebad5e5b33f5c17588584b108cff4370ce3f17295138caba5c51bf0",
|
|
18
|
-
"apps/web/src/api.ts": "
|
|
18
|
+
"apps/web/src/api.ts": "fd9ba5c67d1e98d3502bcfc46b33bf4a0d833e3bb8f3109e9d64608de6a6d931",
|
|
19
19
|
"apps/web/src/App.tsx": "aeac2f4ea6c17d776936f4a22f2087d3d08e95bd291ee15a8914613186e03387",
|
|
20
20
|
"apps/web/src/chat-view-settings.tsx": "31a89f3a23bde7386febc0603d76aba8cff799166040d74bbcb155754d3bcf03",
|
|
21
21
|
"apps/web/src/chat/chat-target.ts": "4896dde68fc418ba5fb087385516e78b4d12f2655782afc147bb060a317cd76a",
|
|
@@ -76,13 +76,13 @@
|
|
|
76
76
|
"apps/web/src/run-view.ts": "26e907cca10e943c328d161fbf3ef49ea2b2c7e61d436c9e5c310cee841d690f",
|
|
77
77
|
"apps/web/src/RunPreparationChat.tsx": "36ea72e36bc320b11d672f1922cff151550842ef579c17be178b455a3d361e97",
|
|
78
78
|
"apps/web/src/RunStore.ts": "a5d27040c25574671d451bdb4edf8b9163a1fb358ad15d6ce8d7fb25b48bbbd3",
|
|
79
|
-
"apps/web/src/SessionList.tsx": "
|
|
79
|
+
"apps/web/src/SessionList.tsx": "81ed15b12097a52150cce141b1491a39c30878faf4e5ed06eaac93bfae95cf27",
|
|
80
80
|
"apps/web/src/settings-contributions.ts": "487aa01859d137212800b72a0b04ea75ecc93474b4df2559bbc83719f4562065",
|
|
81
81
|
"apps/web/src/SettingsModal.tsx": "f9c65a50e9ea6ae0f4ef0cc5a3248a5ec357dd60408278e53c14f8f597fafb0c",
|
|
82
82
|
"apps/web/src/SourceCode.tsx": "bc80927cba80ac589dd89c8e0f9d1108dcf48d88a78e650051b084b9364c5001",
|
|
83
83
|
"apps/web/src/StartOptions.tsx": "bd2fd16712e378d345ea15b95464fd469aba8645f5ace300ddeec298a001a2f4",
|
|
84
84
|
"apps/web/src/StartSelection.tsx": "9dd864da06ef31c40186844a95bef2859111390654e84dde5cc9cfecc14bcb5c",
|
|
85
|
-
"apps/web/src/StartTiles.tsx": "
|
|
85
|
+
"apps/web/src/StartTiles.tsx": "63b3c5f462c6db759203856d81272ff985bb097f3933404e6fd093dcd5ce0ead",
|
|
86
86
|
"apps/web/src/StatusGroup.tsx": "e4638f895a6b03381b1927adadfef28c5c6c11d9291fb46af5d6136663e7dc98",
|
|
87
87
|
"apps/web/src/SurfaceShortcuts.tsx": "b05fbcb3d89ca185caec1b3ab3cec0383e5cd8fb6d55066b1660340f1f2e8126",
|
|
88
88
|
"apps/web/src/theme.ts": "5752186de98b10b18c9aeb7c63aeae1901021b9ac1fb5b2e7548e27287de318e",
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
"apps/web/vite.config.ts": "08ad5bbe43fc990ba2763e1e170970d88b3ce9c78e54c14d197d8157ad6730fa",
|
|
133
133
|
"packages/ragents/src/access.ts": "59845358f669c00d42ccc78bbb21bf7a348158228ae1b4a58a76f5de5158d398",
|
|
134
134
|
"packages/ragents/src/domain/actor-reference.ts": "657f18122b55dfa9ceda91f4457a8cb95b51ff301c9e79387e1fd304a22d2da2",
|
|
135
|
-
"packages/ragents/src/domain/events.ts": "
|
|
135
|
+
"packages/ragents/src/domain/events.ts": "9d1a2a96a10e4069191de893ea5e0c689829b43ff64107474a15d0153ee48aff",
|
|
136
136
|
"packages/ragents/src/http/contracts.ts": "0f85568de2d470dc2815497abd2ae5eef88e5f282cdeaad40dd67990e0fb0cdf",
|
|
137
137
|
"packages/ragents/src/rpc/contract.ts": "83edcfb3492dc78239a9344cbaa822dee1d9c13b5f83fe8303c27790c83594e7",
|
|
138
138
|
"packages/ragents/src/rpc/peer.ts": "9c4ace7084f93194e12bacc2865ec3430c10a9236630d84d723d3bab58672c84",
|
package/apps/web/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="stylesheet" href="/ragents.css" />
|
|
7
7
|
<title>RAgents</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
9
|
-
<link rel="modulepreload" crossorigin href="/assets/mermaid-HWGCJPDP-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-C7JeZFjs.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/assets/mermaid-HWGCJPDP-DfsU5ofC.js">
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/mermaid-HWGCJPDP-BPn4aV2r.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="stylesheet" href="/ragents.css" />
|
|
7
7
|
<title>RAgents Panel</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/runPanel-
|
|
9
|
-
<link rel="modulepreload" crossorigin href="/assets/mermaid-HWGCJPDP-
|
|
8
|
+
<script type="module" crossorigin src="/assets/runPanel-ZT6TPDLM.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/assets/mermaid-HWGCJPDP-DfsU5ofC.js">
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/assets/mermaid-HWGCJPDP-BPn4aV2r.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
@@ -32,8 +32,13 @@ const formatTimestamp = (time: number): string => {
|
|
|
32
32
|
: date.toLocaleDateString("de-DE", { day: "2-digit", month: "2-digit" });
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
/** Running, unread and resting runs differ only in their accent colour; the card layout stays the same. */
|
|
35
|
+
/** Running, unread, locked and resting runs differ only in their accent colour; the card layout stays the same. */
|
|
36
36
|
const tones = {
|
|
37
|
+
locked: {
|
|
38
|
+
card: "border-[color-mix(in_srgb,var(--destructive)_55%,var(--border))]",
|
|
39
|
+
head: "border-t-destructive bg-destructive/8",
|
|
40
|
+
text: "text-destructive",
|
|
41
|
+
},
|
|
37
42
|
running: {
|
|
38
43
|
card: "border-[color-mix(in_srgb,var(--info)_55%,var(--border))]",
|
|
39
44
|
head: "border-t-info bg-info/8",
|
|
@@ -80,8 +85,8 @@ export function SessionList({
|
|
|
80
85
|
<ul className={gridClass}>
|
|
81
86
|
{index === 0 && createCard}
|
|
82
87
|
{group.sessions.map((session) => {
|
|
83
|
-
const notice = runActivityNotice(session, seenRevisions[session.id]);
|
|
84
|
-
const tone = tones[session.running ? "running" : notice ? "unread" : "idle"];
|
|
88
|
+
const notice = session.locked === undefined ? runActivityNotice(session, seenRevisions[session.id]) : undefined;
|
|
89
|
+
const tone = tones[session.locked !== undefined ? "locked" : session.running ? "running" : notice ? "unread" : "idle"];
|
|
85
90
|
const picked = session.id === activeId || (selectMode && selectedIds.has(session.id));
|
|
86
91
|
return (
|
|
87
92
|
<li
|
|
@@ -106,9 +111,10 @@ export function SessionList({
|
|
|
106
111
|
aria-current={session.id === activeId ? "true" : undefined}
|
|
107
112
|
aria-pressed={selectMode ? selectedIds.has(session.id) : undefined}
|
|
108
113
|
className={cn(
|
|
109
|
-
"flex min-h-[148px] min-w-0 flex-1 cursor-pointer flex-col items-stretch gap-2.5 rounded-[11px] px-4 pb-4 text-left focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-2",
|
|
114
|
+
"flex min-h-[148px] min-w-0 flex-1 cursor-pointer flex-col items-stretch gap-2.5 rounded-[11px] px-4 pb-4 text-left focus-visible:outline-2 focus-visible:outline-primary focus-visible:outline-offset-2 disabled:cursor-default",
|
|
110
115
|
selectMode && "pl-9",
|
|
111
116
|
)}
|
|
117
|
+
disabled={session.locked !== undefined && !selectMode}
|
|
112
118
|
onClick={() => (selectMode ? onToggleSelected(session.id) : onSelect(session.id))}
|
|
113
119
|
type="button"
|
|
114
120
|
>
|
|
@@ -117,16 +123,18 @@ export function SessionList({
|
|
|
117
123
|
<span className="flex min-h-[18px] flex-wrap items-center gap-x-3.5 gap-y-1.5">
|
|
118
124
|
<span className={cn("flex items-center gap-[7px] text-[0.75rem]", tone.text)}>
|
|
119
125
|
{session.running ? <Spinner aria-hidden className="size-3" /> : <span aria-hidden className="size-[7px] flex-none rounded-full bg-current" />}
|
|
120
|
-
{session.running ? "Läuft" : session.id === activeId ? "Geöffnet" : "Ruhend"}
|
|
126
|
+
{session.locked !== undefined ? "Locked" : session.running ? "Läuft" : session.id === activeId ? "Geöffnet" : "Ruhend"}
|
|
121
127
|
</span>
|
|
122
128
|
{notice && <span className="inline-flex items-center gap-1.5 text-[0.7rem] font-semibold text-primary" title={notice === "updated" ? "Neue Journal-Aktivität seit Deinem letzten Ansehen dieses Runs" : "In diesem Browser noch nicht angesehen"}>
|
|
123
129
|
<span aria-hidden className="size-[7px] flex-none rounded-full bg-current" />{notice === "updated" ? "Neue Aktivität" : "Nicht angesehen"}
|
|
124
130
|
</span>}
|
|
125
131
|
</span>
|
|
126
132
|
</span>
|
|
127
|
-
{
|
|
128
|
-
<
|
|
129
|
-
|
|
133
|
+
{session.locked !== undefined
|
|
134
|
+
? <span className="text-[0.75rem] leading-[1.45] text-destructive [overflow-wrap:anywhere]">{session.locked}</span>
|
|
135
|
+
: registry.sessionMetadata.map(({ id, Metadata }) => (
|
|
136
|
+
<Metadata key={id} placement="list" session={session} />
|
|
137
|
+
))}
|
|
130
138
|
<span className="mt-auto grid gap-0.5 text-muted-foreground">
|
|
131
139
|
{session.createdAt !== undefined && <span className="text-[0.7rem] tabular-nums">Erstellt <time dateTime={new Date(session.createdAt).toISOString()}>
|
|
132
140
|
{new Date(session.createdAt).toLocaleString("de-DE", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit" })}
|
|
@@ -6,7 +6,7 @@ const NEW_CHAT = { category: "Ohne Vorlage", title: "Neuer Chat", description: "
|
|
|
6
6
|
|
|
7
7
|
const sectionClass = "flex items-baseline gap-2 text-[0.66rem] font-bold uppercase tracking-[0.06em] text-muted-foreground";
|
|
8
8
|
const countClass = "font-mono text-[0.62rem] font-normal tracking-normal opacity-80";
|
|
9
|
-
const tileClass = "group/tile flex h-full min-w-0 flex-col gap-1.5 rounded-[12px] border border-border-soft bg-card p-2.5 text-left [--tone:var(--primary)]"
|
|
9
|
+
const tileClass = "group/tile flex h-full w-full min-w-0 flex-col gap-1.5 rounded-[12px] border border-border-soft bg-card p-2.5 text-left [--tone:var(--primary)]"
|
|
10
10
|
+ " enabled:hover:border-border enabled:hover:bg-accent/40 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring/60 disabled:opacity-60";
|
|
11
11
|
const entryIcon = (entry: ConnectionEntry): ReactNode => entry.kind === "skill"
|
|
12
12
|
? <BookIcon aria-hidden className="size-3.5" />
|
package/apps/web/src/api.ts
CHANGED
|
@@ -46,6 +46,8 @@ export interface SessionInfo {
|
|
|
46
46
|
metadata?: Readonly<Record<string, unknown>>;
|
|
47
47
|
/** Warum ein Metadaten-Beitrag keinen Wert hat: gescheitert oder nicht rechtzeitig geantwortet. */
|
|
48
48
|
metadataUnavailable?: Readonly<Record<string, string>>;
|
|
49
|
+
/** Warum der Server den Run gesperrt hat; ein gesperrter Run lässt sich nur noch löschen. */
|
|
50
|
+
locked?: string;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
export const listSessions = (client: RpcClient = rpc): Promise<SessionInfo[]> =>
|
|
@@ -6,7 +6,7 @@ import { StartPage } from "./StartPage";
|
|
|
6
6
|
/** Das Panel ohne geöffneten Run: Start, Runs oder Server; der Run selbst liegt im Run-Panel. */
|
|
7
7
|
export function PanelPage(props: PanelPageProps) {
|
|
8
8
|
const page = props.state.page;
|
|
9
|
-
return <main className="h-
|
|
9
|
+
return <main className="h-full overflow-y-auto p-3">
|
|
10
10
|
{page === "connections" ? <ConnectionsPage {...props} /> : page === "runs" ? <RunsPage key={props.state.runsConnection ?? ""} {...props} /> : <StartPage {...props} />}
|
|
11
11
|
</main>;
|
|
12
12
|
}
|
|
@@ -33,13 +33,15 @@ export function RunLine({ connection, run, showConnection, selecting, selected,
|
|
|
33
33
|
onToggle?: () => void;
|
|
34
34
|
}) {
|
|
35
35
|
const time = shortTime(run.updatedAt);
|
|
36
|
+
const problem = run.locked !== undefined ? `Locked: ${run.locked}` : run.problem;
|
|
36
37
|
return <li className="col-span-full grid grid-cols-subgrid items-center">
|
|
37
38
|
{selecting && <Checkbox aria-label={`${run.title} auswählen`} checked={selected === true} className="ml-1" onCheckedChange={() => onToggle?.()} />}
|
|
38
|
-
<button className={cn(lineClass, selecting ? "col-[2/-1]" : "col-span-full"
|
|
39
|
+
<button aria-disabled={run.locked !== undefined && !selecting} className={cn(lineClass, selecting ? "col-[2/-1]" : "col-span-full", "aria-disabled:cursor-default aria-disabled:hover:bg-transparent")}
|
|
40
|
+
onClick={() => (selecting ? onToggle?.() : run.locked === undefined && onOpen())} title={showConnection ? `${run.title} (${connection.name})` : run.title} type="button">
|
|
39
41
|
<RunStateIcon open={run.pendingActions} state={run.state} />
|
|
40
42
|
<span className="flex min-w-0 items-center gap-1.5">
|
|
41
43
|
<span className="min-w-0 truncate text-[0.8rem] font-medium">{run.title}</span>
|
|
42
|
-
{
|
|
44
|
+
{problem !== undefined && <span className="flex flex-none text-destructive" title={problem}><CircleAlertIcon aria-hidden className="size-3.5" /><span className="sr-only">{problem}</span></span>}
|
|
43
45
|
</span>
|
|
44
46
|
<span className="w-[42px] text-right font-mono text-[0.62rem] text-muted-foreground" data-cell="time" title={longTime(run.updatedAt)}>{time}</span>
|
|
45
47
|
{showConnection && <span className="max-w-[92px] truncate text-[0.64rem] font-semibold text-muted-foreground" data-cell="connection" title={connection.name}>{connection.name}</span>}
|
|
@@ -29,6 +29,8 @@ export interface ConnectionRun {
|
|
|
29
29
|
readonly updatedAt: number;
|
|
30
30
|
/** Die Erweiterung konnte die Run-Ansicht nicht lesen; die Zeile nennt den Grund. */
|
|
31
31
|
readonly problem?: string;
|
|
32
|
+
/** Warum der Server den Run gesperrt hat; die Zeile öffnet ihn nicht, löschen bleibt möglich. */
|
|
33
|
+
readonly locked?: string;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export interface ConnectionEntry {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"stand": "76950227a2595ee5aa386c266cfe5a251b86943efffeda64a971b986ae33faec",
|
|
26
|
-
"sourceStand": "
|
|
26
|
+
"sourceStand": "9f49ba186c2e5bc78cdee4402a8e004b6181e518fd968a3439f095380a8aaba5",
|
|
27
27
|
"server": "server/index.js",
|
|
28
28
|
"web": {
|
|
29
29
|
"entry": "web/index.js",
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
}
|
|
194
194
|
},
|
|
195
195
|
"stand": "7519e19c958a5f4821bff72f212fc3c8d5b7f7e8ac00195d57c5525beb4bab04",
|
|
196
|
-
"sourceStand": "
|
|
196
|
+
"sourceStand": "51b005bf98c8009758fe4b4c07d0ddbeba5f3b9fb29298993d3840cb168ecf54",
|
|
197
197
|
"server": "server/index.js",
|
|
198
198
|
"web": {
|
|
199
199
|
"entry": "web/index.js",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
"stand": "bfcbef3ac8061d0414592043532059dfb3087e9f1e4fc2bbc8f12b66060a96ce",
|
|
77
|
-
"sourceStand": "
|
|
77
|
+
"sourceStand": "f8a0da2327b506d345b997f75a849fc1b3adb7db2c774222370f5692a27b0e1c",
|
|
78
78
|
"server": "server/index.js",
|
|
79
79
|
"web": {
|
|
80
80
|
"entry": "web/index.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"web": {}
|
|
37
37
|
},
|
|
38
38
|
"stand": "d0c11bff127c8ef2beda57eee9baee70c28425e7bf76471034f57905f897e4e0",
|
|
39
|
-
"sourceStand": "
|
|
39
|
+
"sourceStand": "3029e6a53c84be5678c03791e39563dce94aae4383518b48983e894c2b83df53",
|
|
40
40
|
"server": "server/index.js",
|
|
41
41
|
"exports": {
|
|
42
42
|
"server": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
103
|
"stand": "54b40df2365ff3facc92feab74c674d0dc8a14e091227de1df650cb8b28cdd46",
|
|
104
|
-
"sourceStand": "
|
|
104
|
+
"sourceStand": "76cd03df2dc3dcf4300f9582fbf60f57b37974fc0a21912e59272c44a35d095b",
|
|
105
105
|
"server": "server/index.js",
|
|
106
106
|
"web": {
|
|
107
107
|
"entry": "web/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"stand": "2f29e5802d451480af3b5cbf208524672e2ba21dd85825d62e837e1b5cc8d93b",
|
|
37
|
-
"sourceStand": "
|
|
37
|
+
"sourceStand": "9cdd3af4d76f822ed975e0d476331283a9023a95f3b4d937516f58f358d809a1",
|
|
38
38
|
"server": "server/index.js",
|
|
39
39
|
"web": {
|
|
40
40
|
"entry": "web/index.js",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
46
|
"stand": "458216a7329fdae84736358edbb025e59bd5e8e41b9b1319da768a84005e5967",
|
|
47
|
-
"sourceStand": "
|
|
47
|
+
"sourceStand": "034f85bb66604898129eb6cf48462648d4724b6a14fcc79f25f2428f3ea0e5c1",
|
|
48
48
|
"server": "server/index.js",
|
|
49
49
|
"web": {
|
|
50
50
|
"entry": "web/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
"stand": "b808c9dcfbf9f8a766b8704e6ff5284057a5f36d44726eb2a365fc0a9fff0448",
|
|
24
|
-
"sourceStand": "
|
|
24
|
+
"sourceStand": "2563d53fb388d1fdb8e33889dc3ddccaf878afaa960bb5c3ca9bc095533c8b19",
|
|
25
25
|
"server": "server/index.js",
|
|
26
26
|
"web": {
|
|
27
27
|
"entry": "web/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"web": {}
|
|
23
23
|
},
|
|
24
24
|
"stand": "b490de948673e6cf227a3ec4fbff5d4abe86b44c4eb26effa552dfbad803ae9a",
|
|
25
|
-
"sourceStand": "
|
|
25
|
+
"sourceStand": "a05d84e6bba175ae94059fd6734e2fc00af2cae9391a8a1b0fded6690f76046a",
|
|
26
26
|
"server": "server/index.js",
|
|
27
27
|
"exports": {
|
|
28
28
|
"server": {},
|