@ottocode/server 0.1.264 → 0.1.266

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 (74) hide show
  1. package/package.json +3 -3
  2. package/src/routes/auth/copilot.ts +699 -0
  3. package/src/routes/auth/oauth.ts +578 -0
  4. package/src/routes/auth/onboarding.ts +45 -0
  5. package/src/routes/auth/providers.ts +189 -0
  6. package/src/routes/auth/service.ts +167 -0
  7. package/src/routes/auth/state.ts +23 -0
  8. package/src/routes/auth/status.ts +203 -0
  9. package/src/routes/auth/wallet.ts +229 -0
  10. package/src/routes/auth.ts +12 -2080
  11. package/src/routes/config/models-service.ts +411 -0
  12. package/src/routes/config/models.ts +6 -426
  13. package/src/routes/config/providers-service.ts +237 -0
  14. package/src/routes/config/providers.ts +10 -242
  15. package/src/routes/files/handlers.ts +297 -0
  16. package/src/routes/files/service.ts +313 -0
  17. package/src/routes/files.ts +12 -608
  18. package/src/routes/git/commit-service.ts +207 -0
  19. package/src/routes/git/commit.ts +6 -220
  20. package/src/routes/git/remote-service.ts +116 -0
  21. package/src/routes/git/remote.ts +8 -115
  22. package/src/routes/git/staging-service.ts +111 -0
  23. package/src/routes/git/staging.ts +10 -205
  24. package/src/routes/mcp/auth.ts +338 -0
  25. package/src/routes/mcp/lifecycle.ts +263 -0
  26. package/src/routes/mcp/servers.ts +212 -0
  27. package/src/routes/mcp/service.ts +664 -0
  28. package/src/routes/mcp/state.ts +13 -0
  29. package/src/routes/mcp.ts +6 -1233
  30. package/src/routes/ottorouter/billing.ts +593 -0
  31. package/src/routes/ottorouter/service.ts +92 -0
  32. package/src/routes/ottorouter/topup.ts +301 -0
  33. package/src/routes/ottorouter/wallet.ts +370 -0
  34. package/src/routes/ottorouter.ts +6 -1319
  35. package/src/routes/research/service.ts +339 -0
  36. package/src/routes/research.ts +12 -390
  37. package/src/routes/sessions/crud.ts +563 -0
  38. package/src/routes/sessions/queue.ts +242 -0
  39. package/src/routes/sessions/retry.ts +121 -0
  40. package/src/routes/sessions/service.ts +768 -0
  41. package/src/routes/sessions/share.ts +434 -0
  42. package/src/routes/sessions.ts +8 -1977
  43. package/src/routes/skills/service.ts +221 -0
  44. package/src/routes/skills/spec.ts +309 -0
  45. package/src/routes/skills.ts +31 -909
  46. package/src/routes/terminals/service.ts +326 -0
  47. package/src/routes/terminals.ts +19 -295
  48. package/src/routes/tunnel/service.ts +217 -0
  49. package/src/routes/tunnel.ts +29 -219
  50. package/src/runtime/agent/registry-prompts.ts +147 -0
  51. package/src/runtime/agent/registry.ts +6 -124
  52. package/src/runtime/agent/runner-errors.ts +116 -0
  53. package/src/runtime/agent/runner-reminders.ts +45 -0
  54. package/src/runtime/agent/runner-setup-model.ts +75 -0
  55. package/src/runtime/agent/runner-setup-prompt.ts +185 -0
  56. package/src/runtime/agent/runner-setup-tools.ts +103 -0
  57. package/src/runtime/agent/runner-setup-utils.ts +21 -0
  58. package/src/runtime/agent/runner-setup.ts +54 -288
  59. package/src/runtime/agent/runner-telemetry.ts +112 -0
  60. package/src/runtime/agent/runner-text.ts +108 -0
  61. package/src/runtime/agent/runner-tool-observer.ts +86 -0
  62. package/src/runtime/agent/runner.ts +79 -378
  63. package/src/runtime/ask/service.ts +1 -0
  64. package/src/runtime/provider/custom.ts +73 -0
  65. package/src/runtime/provider/index.ts +6 -85
  66. package/src/runtime/provider/reasoning-builders.ts +280 -0
  67. package/src/runtime/provider/reasoning.ts +68 -264
  68. package/src/runtime/provider/xai.ts +8 -0
  69. package/src/tools/adapter/events.ts +116 -0
  70. package/src/tools/adapter/execution.ts +160 -0
  71. package/src/tools/adapter/pending.ts +37 -0
  72. package/src/tools/adapter/persistence.ts +166 -0
  73. package/src/tools/adapter/results.ts +97 -0
  74. package/src/tools/adapter.ts +124 -451
@@ -0,0 +1,242 @@
1
+ import type { Hono } from 'hono';
2
+ import { openApiRoute } from '../../openapi/route.ts';
3
+ import {
4
+ getSessionQueueState,
5
+ loadProjectDb,
6
+ removeSessionQueueMessage,
7
+ } from './service.ts';
8
+
9
+ export function registerSessionQueueRoutes(app: Hono) {
10
+ // Abort session stream
11
+ openApiRoute(
12
+ app,
13
+ {
14
+ method: 'delete',
15
+ path: '/v1/sessions/{sessionId}/abort',
16
+ tags: ['sessions'],
17
+ operationId: 'abortSession',
18
+ summary: 'Abort a running session',
19
+ description:
20
+ 'Aborts any currently running assistant generation for the session',
21
+ parameters: [
22
+ {
23
+ in: 'path',
24
+ name: 'sessionId',
25
+ required: true,
26
+ schema: {
27
+ type: 'string',
28
+ },
29
+ description: 'Session ID to abort',
30
+ },
31
+ ],
32
+ responses: {
33
+ '200': {
34
+ description: 'OK',
35
+ content: {
36
+ 'application/json': {
37
+ schema: {
38
+ type: 'object',
39
+ properties: {
40
+ success: {
41
+ type: 'boolean',
42
+ },
43
+ },
44
+ required: ['success'],
45
+ },
46
+ },
47
+ },
48
+ },
49
+ },
50
+ },
51
+ async (c) => {
52
+ const sessionId = c.req.param('sessionId');
53
+ const body = (await c.req.json().catch(() => ({}))) as Record<
54
+ string,
55
+ unknown
56
+ >;
57
+ const messageId =
58
+ typeof body.messageId === 'string' ? body.messageId : undefined;
59
+ const clearQueue = body.clearQueue === true;
60
+
61
+ const { abortSession, abortMessage } = await import(
62
+ '../../runtime/agent/runner.ts'
63
+ );
64
+
65
+ if (messageId) {
66
+ const result = abortMessage(sessionId, messageId);
67
+ return c.json({
68
+ success: result.removed,
69
+ wasRunning: result.wasRunning,
70
+ messageId,
71
+ });
72
+ }
73
+
74
+ abortSession(sessionId, clearQueue);
75
+ return c.json({ success: true });
76
+ },
77
+ );
78
+
79
+ // Get queue state for a session
80
+ openApiRoute(
81
+ app,
82
+ {
83
+ method: 'get',
84
+ path: '/v1/sessions/{sessionId}/queue',
85
+ tags: ['sessions'],
86
+ operationId: 'getSessionQueue',
87
+ summary: 'Get queue state for a session',
88
+ parameters: [
89
+ {
90
+ in: 'path',
91
+ name: 'sessionId',
92
+ required: true,
93
+ schema: {
94
+ type: 'string',
95
+ },
96
+ },
97
+ ],
98
+ responses: {
99
+ '200': {
100
+ description: 'OK',
101
+ content: {
102
+ 'application/json': {
103
+ schema: {
104
+ type: 'object',
105
+ properties: {
106
+ currentMessageId: {
107
+ type: 'string',
108
+ nullable: true,
109
+ },
110
+ queuedMessages: {
111
+ type: 'array',
112
+ items: {
113
+ type: 'object',
114
+ properties: {
115
+ assistantMessageId: {
116
+ type: 'string',
117
+ },
118
+ agent: {
119
+ type: 'string',
120
+ },
121
+ provider: {
122
+ type: 'string',
123
+ },
124
+ model: {
125
+ type: 'string',
126
+ },
127
+ },
128
+ },
129
+ },
130
+ isRunning: {
131
+ type: 'boolean',
132
+ },
133
+ },
134
+ required: ['currentMessageId', 'queuedMessages', 'isRunning'],
135
+ },
136
+ },
137
+ },
138
+ },
139
+ },
140
+ },
141
+ async (c) => {
142
+ const sessionId = c.req.param('sessionId');
143
+ return c.json(getSessionQueueState(sessionId));
144
+ },
145
+ );
146
+
147
+ // Remove a message from the queue
148
+ openApiRoute(
149
+ app,
150
+ {
151
+ method: 'delete',
152
+ path: '/v1/sessions/{sessionId}/queue/{messageId}',
153
+ tags: ['sessions'],
154
+ operationId: 'removeFromQueue',
155
+ summary: 'Remove a message from session queue',
156
+ parameters: [
157
+ {
158
+ in: 'path',
159
+ name: 'sessionId',
160
+ required: true,
161
+ schema: {
162
+ type: 'string',
163
+ },
164
+ },
165
+ {
166
+ in: 'path',
167
+ name: 'messageId',
168
+ required: true,
169
+ schema: {
170
+ type: 'string',
171
+ },
172
+ },
173
+ {
174
+ in: 'query',
175
+ name: 'project',
176
+ required: false,
177
+ schema: {
178
+ type: 'string',
179
+ },
180
+ description:
181
+ 'Project root override (defaults to current working directory).',
182
+ },
183
+ ],
184
+ responses: {
185
+ '200': {
186
+ description: 'OK',
187
+ content: {
188
+ 'application/json': {
189
+ schema: {
190
+ type: 'object',
191
+ properties: {
192
+ success: {
193
+ type: 'boolean',
194
+ },
195
+ removed: {
196
+ type: 'boolean',
197
+ },
198
+ wasQueued: {
199
+ type: 'boolean',
200
+ },
201
+ wasRunning: {
202
+ type: 'boolean',
203
+ },
204
+ wasStored: {
205
+ type: 'boolean',
206
+ },
207
+ },
208
+ required: ['success'],
209
+ },
210
+ },
211
+ },
212
+ },
213
+ '404': {
214
+ description: 'Bad Request',
215
+ content: {
216
+ 'application/json': {
217
+ schema: {
218
+ type: 'object',
219
+ properties: {
220
+ error: {
221
+ type: 'string',
222
+ },
223
+ },
224
+ required: ['error'],
225
+ },
226
+ },
227
+ },
228
+ },
229
+ },
230
+ },
231
+ async (c) => {
232
+ const sessionId = c.req.param('sessionId');
233
+ const messageId = c.req.param('messageId');
234
+ const projectRoot = c.req.query('project') || process.cwd();
235
+ const { db } = await loadProjectDb(projectRoot);
236
+ const result = await removeSessionQueueMessage(db, sessionId, messageId);
237
+ return result.status
238
+ ? c.json(result.body, result.status)
239
+ : c.json(result.body);
240
+ },
241
+ );
242
+ }
@@ -0,0 +1,121 @@
1
+ import { logger } from '@ottocode/sdk';
2
+ import type { Hono } from 'hono';
3
+ import { openApiRoute } from '../../openapi/route.ts';
4
+ import { serializeError } from '../../runtime/errors/api-error.ts';
5
+ import { loadProjectDb, retryAssistantMessage } from './service.ts';
6
+
7
+ export function registerSessionRetryRoutes(app: Hono) {
8
+ // Retry a failed assistant message
9
+ openApiRoute(
10
+ app,
11
+ {
12
+ method: 'post',
13
+ path: '/v1/sessions/{sessionId}/messages/{messageId}/retry',
14
+ tags: ['sessions'],
15
+ operationId: 'retryMessage',
16
+ summary: 'Retry a failed assistant message',
17
+ parameters: [
18
+ {
19
+ in: 'path',
20
+ name: 'sessionId',
21
+ required: true,
22
+ schema: {
23
+ type: 'string',
24
+ },
25
+ },
26
+ {
27
+ in: 'path',
28
+ name: 'messageId',
29
+ required: true,
30
+ schema: {
31
+ type: 'string',
32
+ },
33
+ },
34
+ {
35
+ in: 'query',
36
+ name: 'project',
37
+ required: false,
38
+ schema: {
39
+ type: 'string',
40
+ },
41
+ description:
42
+ 'Project root override (defaults to current working directory).',
43
+ },
44
+ ],
45
+ responses: {
46
+ '200': {
47
+ description: 'OK',
48
+ content: {
49
+ 'application/json': {
50
+ schema: {
51
+ type: 'object',
52
+ properties: {
53
+ success: {
54
+ type: 'boolean',
55
+ },
56
+ messageId: {
57
+ type: 'string',
58
+ },
59
+ },
60
+ required: ['success', 'messageId'],
61
+ },
62
+ },
63
+ },
64
+ },
65
+ '400': {
66
+ description: 'Bad Request',
67
+ content: {
68
+ 'application/json': {
69
+ schema: {
70
+ type: 'object',
71
+ properties: {
72
+ error: {
73
+ type: 'string',
74
+ },
75
+ },
76
+ required: ['error'],
77
+ },
78
+ },
79
+ },
80
+ },
81
+ '404': {
82
+ description: 'Bad Request',
83
+ content: {
84
+ 'application/json': {
85
+ schema: {
86
+ type: 'object',
87
+ properties: {
88
+ error: {
89
+ type: 'string',
90
+ },
91
+ },
92
+ required: ['error'],
93
+ },
94
+ },
95
+ },
96
+ },
97
+ },
98
+ },
99
+ async (c) => {
100
+ try {
101
+ const sessionId = c.req.param('sessionId');
102
+ const messageId = c.req.param('messageId');
103
+ const projectRoot = c.req.query('project') || process.cwd();
104
+ const { cfg, db } = await loadProjectDb(projectRoot);
105
+ const result = await retryAssistantMessage(
106
+ cfg,
107
+ db,
108
+ sessionId,
109
+ messageId,
110
+ );
111
+ return result.ok
112
+ ? c.json(result.body)
113
+ : c.json(result.body, result.status);
114
+ } catch (err) {
115
+ logger.error('Failed to retry message', err);
116
+ const errorResponse = serializeError(err);
117
+ return c.json(errorResponse, errorResponse.error.status || 500);
118
+ }
119
+ },
120
+ );
121
+ }