@celestea/core 2.7.1

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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/contracts/data-files/checkpoint.schema.json +111 -0
  4. package/contracts/data-files/cli-main-jsonl-precompact.schema.json +27 -0
  5. package/contracts/data-files/cli-main-jsonl.schema.json +22 -0
  6. package/contracts/data-files/fallbacks.schema.json +71 -0
  7. package/contracts/data-files/index.json +124 -0
  8. package/contracts/data-files/pricing.schema.json +65 -0
  9. package/contracts/data-files/prompts.schema.json +130 -0
  10. package/contracts/data-files/providers.schema.json +177 -0
  11. package/contracts/data-files/registry-tsv.schema.json +74 -0
  12. package/contracts/data-files/session.schema.json +51 -0
  13. package/contracts/data-files/usage-ledger.schema.json +112 -0
  14. package/contracts/data-files/workspaces.schema.json +63 -0
  15. package/contracts/endpoints.json +4390 -0
  16. package/contracts/probe-evidence.json +219 -0
  17. package/contracts/route-table.snapshot.json +377 -0
  18. package/contracts/scope-hash-vectors.json +273 -0
  19. package/contracts/session-event.schema.json +441 -0
  20. package/contracts/sse-events.json +202 -0
  21. package/contracts/tools.json +730 -0
  22. package/dist/agent.d.ts +65 -0
  23. package/dist/agent.js +36 -0
  24. package/dist/celestea-home.d.ts +63 -0
  25. package/dist/celestea-home.js +96 -0
  26. package/dist/celestea-sources.d.ts +53 -0
  27. package/dist/celestea-sources.js +61 -0
  28. package/dist/context.d.ts +33 -0
  29. package/dist/context.js +55 -0
  30. package/dist/contracts/index.d.ts +234 -0
  31. package/dist/contracts/index.js +159 -0
  32. package/dist/errors.d.ts +16 -0
  33. package/dist/errors.js +22 -0
  34. package/dist/event-bus.d.ts +60 -0
  35. package/dist/event-bus.js +100 -0
  36. package/dist/index.d.ts +66 -0
  37. package/dist/index.js +66 -0
  38. package/dist/injection.d.ts +61 -0
  39. package/dist/injection.js +27 -0
  40. package/dist/json.d.ts +34 -0
  41. package/dist/json.js +127 -0
  42. package/dist/llm.d.ts +34 -0
  43. package/dist/llm.js +41 -0
  44. package/dist/memory.d.ts +72 -0
  45. package/dist/memory.js +123 -0
  46. package/dist/message.d.ts +189 -0
  47. package/dist/message.js +252 -0
  48. package/dist/plugin.d.ts +38 -0
  49. package/dist/plugin.js +49 -0
  50. package/dist/projection.d.ts +67 -0
  51. package/dist/projection.js +168 -0
  52. package/dist/question.d.ts +154 -0
  53. package/dist/question.js +82 -0
  54. package/dist/redact.d.ts +40 -0
  55. package/dist/redact.js +185 -0
  56. package/dist/repo.d.ts +14 -0
  57. package/dist/repo.js +87 -0
  58. package/dist/sandbox.d.ts +182 -0
  59. package/dist/sandbox.js +78 -0
  60. package/dist/session-event.d.ts +57 -0
  61. package/dist/session-event.js +425 -0
  62. package/dist/session-log.d.ts +71 -0
  63. package/dist/session-log.js +66 -0
  64. package/dist/skill-catalog.d.ts +29 -0
  65. package/dist/skill-catalog.js +52 -0
  66. package/dist/skills.d.ts +116 -0
  67. package/dist/skills.js +273 -0
  68. package/dist/sse-bus.d.ts +40 -0
  69. package/dist/sse-bus.js +105 -0
  70. package/dist/stream.d.ts +115 -0
  71. package/dist/stream.js +52 -0
  72. package/dist/tool-surface.d.ts +45 -0
  73. package/dist/tool-surface.js +98 -0
  74. package/dist/tool.d.ts +77 -0
  75. package/dist/tool.js +15 -0
  76. package/dist/turn-id.d.ts +37 -0
  77. package/dist/turn-id.js +76 -0
  78. package/dist/types.d.ts +396 -0
  79. package/dist/types.js +58 -0
  80. package/package.json +27 -0
@@ -0,0 +1,219 @@
1
+ {
2
+ "generatedAt": "2026-09-16T06:20:11.193Z",
3
+ "studio": "http://127.0.0.1:3799",
4
+ "policy": "read-only: GET probes + error branches proven mutation-free in the retired backend source",
5
+ "counts": {
6
+ "checks": 28,
7
+ "passed": 28,
8
+ "failed": 0,
9
+ "degraded": 0,
10
+ "endpointsSampled": 22,
11
+ "sseEvents": 9,
12
+ "tools": 12
13
+ },
14
+ "verdict": "consistent",
15
+ "checks": [
16
+ {
17
+ "endpoint": "contracts/endpoints.json",
18
+ "kind": "contract-count",
19
+ "status": "pass",
20
+ "detail": "51 endpoints (contract declares 51)"
21
+ },
22
+ {
23
+ "endpoint": "contracts/sse-events.json",
24
+ "kind": "contract-count",
25
+ "status": "pass",
26
+ "detail": "9 SSE events (contract declares 9)"
27
+ },
28
+ {
29
+ "endpoint": "contracts/tools.json",
30
+ "kind": "contract-count",
31
+ "status": "pass",
32
+ "detail": "12 tool specs (contract declares 12)"
33
+ },
34
+ {
35
+ "endpoint": "GET /api/health",
36
+ "kind": "response-shape",
37
+ "status": "pass",
38
+ "detail": "HTTP 200; 6 key(s)",
39
+ "observedStatus": 200
40
+ },
41
+ {
42
+ "endpoint": "GET /api/status",
43
+ "kind": "response-shape",
44
+ "status": "pass",
45
+ "detail": "HTTP 200; 14 key(s); additive (not in contract doc): busy, effective_model, fallback, grants_active",
46
+ "observedStatus": 200
47
+ },
48
+ {
49
+ "endpoint": "GET /api/tools",
50
+ "kind": "response-shape",
51
+ "status": "pass",
52
+ "detail": "HTTP 200; 1 key(s)",
53
+ "observedStatus": 200
54
+ },
55
+ {
56
+ "endpoint": "GET /api/config",
57
+ "kind": "response-shape",
58
+ "status": "pass",
59
+ "detail": "HTTP 200; 10 key(s)",
60
+ "observedStatus": 200
61
+ },
62
+ {
63
+ "endpoint": "GET /api/sessions",
64
+ "kind": "response-shape",
65
+ "status": "pass",
66
+ "detail": "HTTP 200; 2 key(s)",
67
+ "observedStatus": 200
68
+ },
69
+ {
70
+ "endpoint": "GET /api/sessions/{id}/messages",
71
+ "kind": "response-shape",
72
+ "status": "pass",
73
+ "detail": "HTTP 200; 3 key(s)",
74
+ "observedStatus": 200
75
+ },
76
+ {
77
+ "endpoint": "GET /api/workspaces",
78
+ "kind": "response-shape",
79
+ "status": "pass",
80
+ "detail": "HTTP 200; 2 key(s)",
81
+ "observedStatus": 200
82
+ },
83
+ {
84
+ "endpoint": "GET /api/fs/browse",
85
+ "kind": "response-shape",
86
+ "status": "pass",
87
+ "detail": "HTTP 200; 4 key(s)",
88
+ "observedStatus": 200
89
+ },
90
+ {
91
+ "endpoint": "GET /api/providers",
92
+ "kind": "response-shape",
93
+ "status": "pass",
94
+ "detail": "HTTP 200; 2 key(s)",
95
+ "observedStatus": 200
96
+ },
97
+ {
98
+ "endpoint": "GET /api/prompts",
99
+ "kind": "response-shape",
100
+ "status": "pass",
101
+ "detail": "HTTP 200; 8 key(s)",
102
+ "observedStatus": 200
103
+ },
104
+ {
105
+ "endpoint": "GET /api/worker/status",
106
+ "kind": "response-shape",
107
+ "status": "pass",
108
+ "detail": "HTTP 200; 8 key(s); optional absent: error, wid; additive (not in contract doc): watchdogs",
109
+ "observedStatus": 200
110
+ },
111
+ {
112
+ "endpoint": "GET /login",
113
+ "kind": "response-shape",
114
+ "status": "pass",
115
+ "detail": "HTTP 200; HTML login page (text/html) — no JSON keys to compare",
116
+ "observedStatus": 200
117
+ },
118
+ {
119
+ "endpoint": "GET /auth/check",
120
+ "kind": "response-shape",
121
+ "status": "pass",
122
+ "detail": "HTTP 401; cookie-gated, so the documented 401 \"unauthorized\" branch is the correct answer for an unauthenticated probe",
123
+ "observedStatus": 401
124
+ },
125
+ {
126
+ "endpoint": "POST /api/turn",
127
+ "kind": "error-branch",
128
+ "status": "pass",
129
+ "detail": "HTTP 400 + \"input must not be empty\"",
130
+ "observedStatus": 400,
131
+ "safeBecause": "src/main.rs:986-991 rejects a blank input BEFORE the busy slot is taken"
132
+ },
133
+ {
134
+ "endpoint": "POST /api/cancel",
135
+ "kind": "error-branch",
136
+ "status": "pass",
137
+ "detail": "HTTP 200",
138
+ "observedStatus": 200,
139
+ "safeBecause": "src/main.rs:1028-1037 only signals the watch channel; no state is written"
140
+ },
141
+ {
142
+ "endpoint": "POST /api/workspaces",
143
+ "kind": "error-branch",
144
+ "status": "pass",
145
+ "detail": "HTTP 400 + \"path must not be empty\"",
146
+ "observedStatus": 400,
147
+ "safeBecause": "src/workspaces.rs:825-827 validates before WorkspaceRegistry::register"
148
+ },
149
+ {
150
+ "endpoint": "POST /api/providers/test",
151
+ "kind": "error-branch",
152
+ "status": "pass",
153
+ "detail": "HTTP 400 + \"base_url\"",
154
+ "observedStatus": 400,
155
+ "safeBecause": "src/providers.rs:729-735 builds an inline candidate and fails before run_probe; never persists"
156
+ },
157
+ {
158
+ "endpoint": "POST /api/prompts",
159
+ "kind": "error-branch",
160
+ "status": "pass",
161
+ "detail": "HTTP 400 + \"prompt id must be 1-128 chars\"",
162
+ "observedStatus": 400,
163
+ "safeBecause": "src/prompts.rs:748-751 validates the id before load_prompt_file/persist"
164
+ },
165
+ {
166
+ "endpoint": "POST /api/prompts/__p0_probe_missing__/default",
167
+ "kind": "error-branch",
168
+ "status": "pass",
169
+ "detail": "HTTP 404 + \"unknown prompt\"",
170
+ "observedStatus": 404,
171
+ "safeBecause": "src/prompts.rs:857-860 returns 404 before any persist"
172
+ },
173
+ {
174
+ "endpoint": "GET /api/sessions/no-slash/messages",
175
+ "kind": "error-branch",
176
+ "status": "pass",
177
+ "detail": "HTTP 400 + \"invalid session id\"",
178
+ "observedStatus": 400,
179
+ "safeBecause": "parse_session_id rejects the id before any filesystem access"
180
+ },
181
+ {
182
+ "endpoint": "GET /api/fs/browse?path=relative-not-absolute",
183
+ "kind": "error-branch",
184
+ "status": "pass",
185
+ "detail": "HTTP 400 + \"must be absolute\"",
186
+ "observedStatus": 400,
187
+ "safeBecause": "pure read-only directory listing"
188
+ },
189
+ {
190
+ "endpoint": "GET /api/worker/status?wid=__p0_probe_missing__",
191
+ "kind": "error-branch",
192
+ "status": "pass",
193
+ "detail": "HTTP 200 + \"no worker\"",
194
+ "observedStatus": 200,
195
+ "safeBecause": "read-only registry lookup"
196
+ },
197
+ {
198
+ "endpoint": "GET /api/events",
199
+ "kind": "sse-transport",
200
+ "status": "pass",
201
+ "detail": "content-type=text/event-stream; envelope + 9 event names frozen from source (passive connect, no turn running)",
202
+ "observedStatus": 200
203
+ },
204
+ {
205
+ "endpoint": "GET /api/tools?session=...(standard)",
206
+ "kind": "tool-set",
207
+ "status": "pass",
208
+ "detail": "session=ws/std (mode=standard); 12 names match contracts/tools.json exactly (full registry)",
209
+ "observedStatus": 200
210
+ },
211
+ {
212
+ "endpoint": "GET /api/tools?session=...(execution)",
213
+ "kind": "tool-set",
214
+ "status": "pass",
215
+ "detail": "session=ws/exec (mode=execution); live=[http_request,process_control,run_code,session_send_message,spawn_worker,worker_status] folded-out=[ask_user_question,list_dir,read_file,read_image,run_shell,write_file]; exactly 6 kept: the full registry folded out the four SDK bridge tools + ask_user_question + read_image",
216
+ "observedStatus": 200
217
+ }
218
+ ]
219
+ }
@@ -0,0 +1,377 @@
1
+ {
2
+ "source": "frozen from the retired backend implementation (original source file deleted 2026-09-15); this snapshot is now the authoritative route table",
3
+ "extractedAt": "2026-09-10T01:20:00Z",
4
+ "extraction": "read-only regex over the Router::new() chain",
5
+ "routeDeclarations": 38,
6
+ "methodPathCombos": 43,
7
+ "apiEndpoints": 39,
8
+ "staticRoutes": [
9
+ {
10
+ "method": "GET",
11
+ "path": "/",
12
+ "rustHandler": "get_static"
13
+ },
14
+ {
15
+ "method": "GET",
16
+ "path": "/index.html",
17
+ "rustHandler": "get_static"
18
+ },
19
+ {
20
+ "method": "GET",
21
+ "path": "/assets/{*path}",
22
+ "rustHandler": "get_static"
23
+ },
24
+ {
25
+ "method": "GET",
26
+ "path": "/favicon.ico",
27
+ "rustHandler": "get_static"
28
+ }
29
+ ],
30
+ "routes": [
31
+ {
32
+ "method": "GET",
33
+ "path": "/",
34
+ "rustHandler": "get_static"
35
+ },
36
+ {
37
+ "method": "GET",
38
+ "path": "/index.html",
39
+ "rustHandler": "get_static"
40
+ },
41
+ {
42
+ "method": "GET",
43
+ "path": "/assets/{*path}",
44
+ "rustHandler": "get_static"
45
+ },
46
+ {
47
+ "method": "GET",
48
+ "path": "/favicon.ico",
49
+ "rustHandler": "get_static"
50
+ },
51
+ {
52
+ "method": "GET",
53
+ "path": "/api/health",
54
+ "rustHandler": "get_health"
55
+ },
56
+ {
57
+ "method": "GET",
58
+ "path": "/api/status",
59
+ "rustHandler": "api::get_status"
60
+ },
61
+ {
62
+ "method": "GET",
63
+ "path": "/api/events",
64
+ "rustHandler": "get_events"
65
+ },
66
+ {
67
+ "method": "POST",
68
+ "path": "/api/turn",
69
+ "rustHandler": "post_turn"
70
+ },
71
+ {
72
+ "method": "POST",
73
+ "path": "/api/cancel",
74
+ "rustHandler": "post_cancel"
75
+ },
76
+ {
77
+ "method": "GET",
78
+ "path": "/api/tools",
79
+ "rustHandler": "api::get_tools"
80
+ },
81
+ {
82
+ "method": "GET",
83
+ "path": "/api/config",
84
+ "rustHandler": "api::get_config"
85
+ },
86
+ {
87
+ "method": "POST",
88
+ "path": "/api/config",
89
+ "rustHandler": "api::post_config"
90
+ },
91
+ {
92
+ "method": "GET",
93
+ "path": "/api/sessions",
94
+ "rustHandler": "workspaces::get_sessions"
95
+ },
96
+ {
97
+ "method": "POST",
98
+ "path": "/api/sessions",
99
+ "rustHandler": "workspaces::post_session_create"
100
+ },
101
+ {
102
+ "method": "GET",
103
+ "path": "/api/sessions/{id}/messages",
104
+ "rustHandler": "workspaces::get_session_messages"
105
+ },
106
+ {
107
+ "method": "POST",
108
+ "path": "/api/sessions/{id}/activate",
109
+ "rustHandler": "workspaces::post_session_activate"
110
+ },
111
+ {
112
+ "method": "POST",
113
+ "path": "/api/sessions/{id}/rename",
114
+ "rustHandler": "workspaces::post_session_rename"
115
+ },
116
+ {
117
+ "method": "POST",
118
+ "path": "/api/sessions/{id}/branch",
119
+ "rustHandler": "workspaces::post_session_branch"
120
+ },
121
+ {
122
+ "method": "POST",
123
+ "path": "/api/sessions/{id}/compact",
124
+ "rustHandler": "compact::post_session_compact"
125
+ },
126
+ {
127
+ "method": "POST",
128
+ "path": "/api/sessions/{id}/archive",
129
+ "rustHandler": "workspaces::post_session_archive"
130
+ },
131
+ {
132
+ "method": "POST",
133
+ "path": "/api/sessions/{id}/unarchive",
134
+ "rustHandler": "workspaces::post_session_unarchive"
135
+ },
136
+ {
137
+ "method": "POST",
138
+ "path": "/api/sessions/batch-archive",
139
+ "rustHandler": "workspaces::post_sessions_batch_archive"
140
+ },
141
+ {
142
+ "method": "POST",
143
+ "path": "/api/sessions/batch-delete",
144
+ "rustHandler": "workspaces::post_sessions_batch_delete"
145
+ },
146
+ {
147
+ "method": "GET",
148
+ "path": "/api/workspaces",
149
+ "rustHandler": "workspaces::get_workspaces"
150
+ },
151
+ {
152
+ "method": "POST",
153
+ "path": "/api/workspaces",
154
+ "rustHandler": "workspaces::post_workspace_create"
155
+ },
156
+ {
157
+ "method": "POST",
158
+ "path": "/api/workspaces/{name}/rename",
159
+ "rustHandler": "workspaces::post_workspace_rename"
160
+ },
161
+ {
162
+ "method": "POST",
163
+ "path": "/api/workspaces/{name}/delete",
164
+ "rustHandler": "workspaces::post_workspace_delete"
165
+ },
166
+ {
167
+ "method": "POST",
168
+ "path": "/api/workspaces/batch-delete",
169
+ "rustHandler": "workspaces::post_workspaces_batch_delete"
170
+ },
171
+ {
172
+ "method": "GET",
173
+ "path": "/api/fs/browse",
174
+ "rustHandler": "workspaces::get_fs_browse"
175
+ },
176
+ {
177
+ "method": "GET",
178
+ "path": "/api/providers",
179
+ "rustHandler": "providers::get_providers"
180
+ },
181
+ {
182
+ "method": "POST",
183
+ "path": "/api/providers",
184
+ "rustHandler": "providers::post_providers"
185
+ },
186
+ {
187
+ "method": "POST",
188
+ "path": "/api/providers/{id}/delete",
189
+ "rustHandler": "providers::post_provider_delete"
190
+ },
191
+ {
192
+ "method": "POST",
193
+ "path": "/api/providers/test",
194
+ "rustHandler": "providers::post_provider_test"
195
+ },
196
+ {
197
+ "method": "POST",
198
+ "path": "/api/providers/{id}/models/fetch",
199
+ "rustHandler": "providers::post_models_fetch"
200
+ },
201
+ {
202
+ "method": "POST",
203
+ "path": "/api/providers/default",
204
+ "rustHandler": "providers::post_provider_default"
205
+ },
206
+ {
207
+ "method": "GET",
208
+ "path": "/api/prompts",
209
+ "rustHandler": "prompts::get_prompts"
210
+ },
211
+ {
212
+ "method": "POST",
213
+ "path": "/api/prompts",
214
+ "rustHandler": "prompts::post_prompts_upsert"
215
+ },
216
+ {
217
+ "method": "POST",
218
+ "path": "/api/prompts/{id}/delete",
219
+ "rustHandler": "prompts::post_prompts_delete"
220
+ },
221
+ {
222
+ "method": "POST",
223
+ "path": "/api/prompts/{id}/default",
224
+ "rustHandler": "prompts::post_prompts_default"
225
+ },
226
+ {
227
+ "method": "POST",
228
+ "path": "/api/clear",
229
+ "rustHandler": "workspaces::post_clear"
230
+ },
231
+ {
232
+ "method": "POST",
233
+ "path": "/api/worker/spawn",
234
+ "rustHandler": "api::post_worker_spawn"
235
+ },
236
+ {
237
+ "method": "POST",
238
+ "path": "/api/worker/send",
239
+ "rustHandler": "api::post_worker_send"
240
+ },
241
+ {
242
+ "method": "GET",
243
+ "path": "/api/worker/status",
244
+ "rustHandler": "api::get_worker_status"
245
+ }
246
+ ],
247
+ "tsOnlyRoutes": [
248
+ {
249
+ "method": "GET",
250
+ "path": "/api/sessions/{id}/grants",
251
+ "rustHandler": "(none - TypeScript-only, W516)"
252
+ },
253
+ {
254
+ "method": "POST",
255
+ "path": "/api/sessions/{id}/grants",
256
+ "rustHandler": "(none - TypeScript-only, W516)"
257
+ },
258
+ {
259
+ "method": "DELETE",
260
+ "path": "/api/sessions/{id}/grants",
261
+ "rustHandler": "(none - TypeScript-only, W516)"
262
+ },
263
+ {
264
+ "method": "GET",
265
+ "path": "/api/sessions/{id}/grants/confirm-token",
266
+ "rustHandler": "(none - TypeScript-only, W516)"
267
+ },
268
+ {
269
+ "method": "GET",
270
+ "path": "/api/sessions/{id}/context",
271
+ "rustHandler": "(none - TypeScript-only, W725)"
272
+ },
273
+ {
274
+ "method": "GET",
275
+ "path": "/login",
276
+ "rustHandler": "(none - TypeScript-only, W767)"
277
+ },
278
+ {
279
+ "method": "POST",
280
+ "path": "/auth/login",
281
+ "rustHandler": "(none - TypeScript-only, W767)"
282
+ },
283
+ {
284
+ "method": "GET",
285
+ "path": "/auth/check",
286
+ "rustHandler": "(none - TypeScript-only, W767)"
287
+ },
288
+ {
289
+ "method": "GET",
290
+ "path": "/api/questions",
291
+ "rustHandler": "(none - TypeScript-only, W783)"
292
+ },
293
+ {
294
+ "method": "POST",
295
+ "path": "/api/questions/{id}/answer",
296
+ "rustHandler": "(none - TypeScript-only, W783)"
297
+ },
298
+ {
299
+ "method": "GET",
300
+ "path": "/api/usage/ledger",
301
+ "rustHandler": "(none - TypeScript-only, W785)"
302
+ },
303
+ {
304
+ "method": "POST",
305
+ "path": "/api/sessions/{id}/mode",
306
+ "rustHandler": "(none - TypeScript-only, W791)"
307
+ },
308
+ {
309
+ "method": "GET",
310
+ "path": "/api/permissions/presets",
311
+ "rustHandler": "(none - TypeScript-only, W9)"
312
+ },
313
+ {
314
+ "method": "POST",
315
+ "path": "/api/permissions/presets",
316
+ "rustHandler": "(none - TypeScript-only, W9)"
317
+ },
318
+ {
319
+ "method": "PUT",
320
+ "path": "/api/permissions/presets/{id}",
321
+ "rustHandler": "(none - TypeScript-only, W9)"
322
+ },
323
+ {
324
+ "method": "DELETE",
325
+ "path": "/api/permissions/presets/{id}",
326
+ "rustHandler": "(none - TypeScript-only, W9)"
327
+ },
328
+ {
329
+ "method": "GET",
330
+ "path": "/api/sessions/{id}/permission",
331
+ "rustHandler": "(none - TypeScript-only, W9)"
332
+ },
333
+ {
334
+ "method": "PUT",
335
+ "path": "/api/sessions/{id}/permission",
336
+ "rustHandler": "(none - TypeScript-only, W9)"
337
+ },
338
+ {
339
+ "method": "GET",
340
+ "path": "/api/sessions/{id}/tools",
341
+ "rustHandler": "(none - TypeScript-only, W860)"
342
+ },
343
+ {
344
+ "method": "PUT",
345
+ "path": "/api/sessions/{id}/tools",
346
+ "rustHandler": "(none - TypeScript-only, W860)"
347
+ },
348
+ {
349
+ "method": "GET",
350
+ "path": "/api/plugins",
351
+ "rustHandler": "(none - TypeScript-only, W860)"
352
+ },
353
+ {
354
+ "method": "PUT",
355
+ "path": "/api/sessions/{id}/model",
356
+ "rustHandler": "(none - TypeScript-only, W870)"
357
+ },
358
+ {
359
+ "method": "GET",
360
+ "path": "/api/fs/list",
361
+ "rustHandler": "(none - TypeScript-only, G5)"
362
+ },
363
+ {
364
+ "method": "POST",
365
+ "path": "/api/exec",
366
+ "rustHandler": "(none - TypeScript-only, G2)"
367
+ },
368
+ {
369
+ "method": "GET",
370
+ "path": "/api/fs/read",
371
+ "rustHandler": "(none - TypeScript-only, G5)"
372
+ }
373
+ ],
374
+ "tsApiEndpoints": 64,
375
+ "tsMethodPathCombos": 68,
376
+ "tsOnlyNote": "W516/W725/W767: the sessions grants endpoints, GET /api/sessions/{id}/context and the three W767 login-cookie endpoints (/login, /auth/login, /auth/check) exist ONLY in the TypeScript backend. The frozen extraction above is kept verbatim; a contract endpoint must appear in `route W783 adds GET /api/questions (pending list) and POST /api/questions/{id}/answer. W785 adds GET /api/usage/ledger (the cost/usage ledger aggregate view). W791 adds POST /api/sessions/{id}/mode (the P1 session working mode; TS-only, U8). W860 adds GET|PUT /api/sessions/{id}/tools (session-level tool switches) and GET /api/plugins (host plugin inventory). W870 adds PUT /api/sessions/{id}/model (the session-scoped model switch; TS-only, W870)."
377
+ }