openwork-server 0.18.42 → 0.18.44

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/README.md CHANGED
@@ -23,6 +23,44 @@ The server logs the client token and host token on boot when they are auto-gener
23
23
 
24
24
  Add `--verbose` to print resolved config details on startup. Use `--version` to print the server version and exit.
25
25
 
26
+ ## Desktop task recovery
27
+
28
+ The desktop enables `resumeInterruptedTasks` when embedding a server that owns
29
+ its local engines. Standalone servers, attached engines, remote workspaces, and
30
+ read-only servers do not opt in. Recovery works with both OpenCode v1 and v2 and
31
+ does not depend on an open conversation tab.
32
+
33
+ The `desktop_task_recovery` table in the existing runtime SQLite database stores
34
+ up to 1,000 task identities, their workspace path, original engine, last observed
35
+ user turn, and recovery phase. It stores no prompts, transcripts, or credentials.
36
+ Only tasks admitted after this feature is enabled are tracked; old unfinished
37
+ conversations are not swept or resumed retroactively.
38
+
39
+ On quit or update, a final checkpoint runs before engine teardown with two task
40
+ snapshots in flight and a 10-second budget. On restart, the coordinator checks two task
41
+ snapshots every two seconds and admits at most one continuation every two seconds,
42
+ with at most two recovered tasks active. Already-active native runs are observed,
43
+ not re-prompted, and native active work also limits new recovery admissions.
44
+
45
+ Completed, archived, manually stopped, approval/question-blocked, and active
46
+ delegated work are excluded. New manual work invalidates the old recovery intent.
47
+ Missing workspaces, changed directories, unavailable policy, and unverified
48
+ snapshots never authorize a send. V1 requires the original user turn and model
49
+ in its recent 100-message snapshot; v2 keeps the session's native model. A
50
+ continuation asks to inspect completed effects first, not rerun the original prompt.
51
+
52
+ A send is claimed durably before admission. Lost acknowledgements are never
53
+ blindly retried, even after another restart. Crash recovery requires an observed
54
+ running task and a still-unfinished matching turn; unexplained aborts stay stopped.
55
+ Tasks whose admission or shutdown checkpoint cannot be confirmed remain manual.
56
+ This prevents duplicate recovery admissions, not exactly-once execution of external
57
+ tools; uncertain earlier effects must be inspected or clarified before continuing.
58
+
59
+ Desktop Automation and remote-command requests opt out with
60
+ `x-openwork-task-recovery: off`; their existing execution ownership is unchanged.
61
+ Runtime journey verification for actual Electron restarts on both engines remains
62
+ separate from the focused coordinator and mocked-proxy tests.
63
+
26
64
  ## Config file
27
65
 
28
66
  Defaults to `~/.config/openwork/server.json` (override with `OPENWORK_SERVER_CONFIG` or `--config`).
@@ -100,7 +138,7 @@ Sandbox advertisement (for capability discovery):
100
138
  - `GET /workspace/:id/audit`
101
139
  - `GET /workspace/:id/export`
102
140
 
103
- Token management (host/owner auth):
141
+ Token management (collaborator or owner bearer token):
104
142
 
105
143
  - `GET /tokens`
106
144
  - `POST /tokens` (body: `{ "scope": "owner"|"collaborator"|"viewer", "label"?: string }`)
@@ -116,6 +154,18 @@ Inbox/outbox:
116
154
  - `GET /files/sessions/:sessionId/catalog/snapshot`
117
155
  - `POST /files/sessions/:sessionId/ops`
118
156
 
157
+ UI control mailbox:
158
+
159
+ - `POST /experimental/ui-control/request` (collaborator or owner bearer token)
160
+ - `GET /experimental/ui-control/pending` (collaborator or owner bearer token; optional `?wait=1`)
161
+ - `POST /experimental/ui-control/:id/reply` (collaborator or owner bearer token)
162
+
163
+ Desktop and web renderers poll the same server they are connected to. The first
164
+ polling window claims each request; commands are never broadcast to every tab.
165
+ Requests expire after five seconds, and a server with no recent renderer poll
166
+ returns an explicit no-window result. The external desktop UI MCP bridge remains
167
+ available; in-app tools no longer discover or fall back to that bridge.
168
+
119
169
  OpenCode proxy:
120
170
 
121
171
  - `GET|POST|... /opencode/*`
@@ -136,3 +186,24 @@ Approvals endpoints:
136
186
  - `POST /approvals/:id` with `{ "reply": "allow" | "deny" }`
137
187
 
138
188
  Set `OPENWORK_APPROVAL_MODE=auto` to auto-approve during local development.
189
+
190
+ ## Automatic title recovery
191
+
192
+ The managed v1 engine ships a title-only compatibility plugin. If a provider
193
+ returns HTTP 400 with `unsupported_value` or `unsupported_parameter` for
194
+ `reasoning.effort`, `reasoning_effort`, `temperature`, or `top_p`, it makes at
195
+ most one corrected request. It uses a reported supported effort or omits the
196
+ rejected optional parameter so the same model can use its default. Provider,
197
+ model, credentials, conversation content, and normal chat options stay intact.
198
+ Access, quota, transport, and unrelated request errors do not trigger an added
199
+ recovery request. The engine's own transport retry policy still applies.
200
+
201
+ Engine log records with service `openwork.title` / message `Automatic title
202
+ generation` contain only session/provider/model IDs, outcome, recovery attempt,
203
+ HTTP status, and the rejected parameter name. `accepted_after_recovery` means
204
+ the provider accepted the retry; `title_available` separately confirms a real
205
+ title was observed in a session update. An accepted request with no title update
206
+ within 60 seconds is `title_unconfirmed`, which can mean empty output, a stream
207
+ failure, or missing persistence; it is not reported as success. The app's
208
+ existing bounded placeholder probes and warning remain the user-facing safety
209
+ net. Existing untitled conversations are not bulk-regenerated.
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openwork-server",
3
- "version": "0.18.42",
3
+ "version": "0.18.44",
4
4
  "description": "Filesystem-backed API for OpenWork remote clients",
5
5
  "type": "module",
6
6
  "bin": {