@pellux/goodvibes-daemon-sdk 0.18.3
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 +32 -0
- package/dist/api-router.d.ts +3 -0
- package/dist/api-router.d.ts.map +1 -0
- package/dist/api-router.js +13 -0
- package/dist/automation.d.ts +3 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +56 -0
- package/dist/channel-route-types.d.ts +78 -0
- package/dist/channel-route-types.d.ts.map +1 -0
- package/dist/channel-route-types.js +1 -0
- package/dist/channel-routes.d.ts +4 -0
- package/dist/channel-routes.d.ts.map +1 -0
- package/dist/channel-routes.js +264 -0
- package/dist/context.d.ts +207 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1 -0
- package/dist/control-routes.d.ts +57 -0
- package/dist/control-routes.d.ts.map +1 -0
- package/dist/control-routes.js +120 -0
- package/dist/error-response.d.ts +10 -0
- package/dist/error-response.d.ts.map +1 -0
- package/dist/error-response.js +84 -0
- package/dist/http-policy.d.ts +33 -0
- package/dist/http-policy.d.ts.map +1 -0
- package/dist/http-policy.js +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/integration-route-types.d.ts +64 -0
- package/dist/integration-route-types.d.ts.map +1 -0
- package/dist/integration-route-types.js +1 -0
- package/dist/integration-routes.d.ts +4 -0
- package/dist/integration-routes.d.ts.map +1 -0
- package/dist/integration-routes.js +172 -0
- package/dist/knowledge-route-types.d.ts +114 -0
- package/dist/knowledge-route-types.d.ts.map +1 -0
- package/dist/knowledge-route-types.js +1 -0
- package/dist/knowledge-routes.d.ts +4 -0
- package/dist/knowledge-routes.d.ts.map +1 -0
- package/dist/knowledge-routes.js +582 -0
- package/dist/media-route-types.d.ts +66 -0
- package/dist/media-route-types.d.ts.map +1 -0
- package/dist/media-route-types.js +1 -0
- package/dist/media-routes.d.ts +4 -0
- package/dist/media-routes.d.ts.map +1 -0
- package/dist/media-routes.js +328 -0
- package/dist/operator.d.ts +3 -0
- package/dist/operator.d.ts.map +1 -0
- package/dist/operator.js +395 -0
- package/dist/remote-routes.d.ts +40 -0
- package/dist/remote-routes.d.ts.map +1 -0
- package/dist/remote-routes.js +238 -0
- package/dist/remote.d.ts +3 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +35 -0
- package/dist/route-helpers.d.ts +11 -0
- package/dist/route-helpers.d.ts.map +1 -0
- package/dist/route-helpers.js +54 -0
- package/dist/runtime-automation-routes.d.ts +4 -0
- package/dist/runtime-automation-routes.d.ts.map +1 -0
- package/dist/runtime-automation-routes.js +165 -0
- package/dist/runtime-route-types.d.ts +240 -0
- package/dist/runtime-route-types.d.ts.map +1 -0
- package/dist/runtime-route-types.js +1 -0
- package/dist/runtime-routes.d.ts +5 -0
- package/dist/runtime-routes.d.ts.map +1 -0
- package/dist/runtime-routes.js +8 -0
- package/dist/runtime-session-routes.d.ts +4 -0
- package/dist/runtime-session-routes.d.ts.map +1 -0
- package/dist/runtime-session-routes.js +387 -0
- package/dist/sessions.d.ts +3 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +37 -0
- package/dist/system-route-types.d.ts +124 -0
- package/dist/system-route-types.d.ts.map +1 -0
- package/dist/system-route-types.js +1 -0
- package/dist/system-routes.d.ts +4 -0
- package/dist/system-routes.d.ts.map +1 -0
- package/dist/system-routes.js +327 -0
- package/dist/tasks.d.ts +3 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +22 -0
- package/dist/telemetry-routes.d.ts +44 -0
- package/dist/telemetry-routes.d.ts.map +1 -0
- package/dist/telemetry-routes.js +227 -0
- package/package.json +42 -0
package/dist/operator.js
ADDED
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
export async function dispatchOperatorRoutes(req, handlers) {
|
|
2
|
+
const url = new URL(req.url);
|
|
3
|
+
const { pathname } = url;
|
|
4
|
+
const method = req.method;
|
|
5
|
+
if (pathname === '/status' && method === 'GET')
|
|
6
|
+
return handlers.getStatus();
|
|
7
|
+
if ((pathname === '/api/control-plane/auth' || pathname === '/api/control-plane/whoami') && method === 'GET')
|
|
8
|
+
return handlers.getCurrentAuth(req);
|
|
9
|
+
if (pathname === '/api/control-plane' && method === 'GET')
|
|
10
|
+
return handlers.getControlPlaneSnapshot();
|
|
11
|
+
if (pathname === '/api/control-plane/contract' && method === 'GET')
|
|
12
|
+
return handlers.getOperatorContract();
|
|
13
|
+
if (pathname === '/api/control-plane/web' && method === 'GET')
|
|
14
|
+
return handlers.getControlPlaneWeb();
|
|
15
|
+
if (pathname === '/api/control-plane/recent-events' && method === 'GET') {
|
|
16
|
+
const limit = Number(url.searchParams.get('limit') ?? 100);
|
|
17
|
+
return handlers.getControlPlaneRecentEvents(limit);
|
|
18
|
+
}
|
|
19
|
+
if (pathname === '/api/control-plane/messages' && method === 'GET')
|
|
20
|
+
return handlers.getControlPlaneMessages();
|
|
21
|
+
if (pathname === '/api/control-plane/clients' && method === 'GET')
|
|
22
|
+
return handlers.getControlPlaneClients();
|
|
23
|
+
if ((pathname === '/api/telemetry' || pathname === '/api/v1/telemetry') && method === 'GET')
|
|
24
|
+
return handlers.getTelemetrySnapshot(req);
|
|
25
|
+
if ((pathname === '/api/telemetry/events' || pathname === '/api/v1/telemetry/events') && method === 'GET')
|
|
26
|
+
return handlers.getTelemetryEvents(req);
|
|
27
|
+
if ((pathname === '/api/telemetry/errors' || pathname === '/api/v1/telemetry/errors') && method === 'GET')
|
|
28
|
+
return handlers.getTelemetryErrors(req);
|
|
29
|
+
if ((pathname === '/api/telemetry/traces' || pathname === '/api/v1/telemetry/traces') && method === 'GET')
|
|
30
|
+
return handlers.getTelemetryTraces(req);
|
|
31
|
+
if ((pathname === '/api/telemetry/metrics' || pathname === '/api/v1/telemetry/metrics') && method === 'GET')
|
|
32
|
+
return handlers.getTelemetryMetrics(req);
|
|
33
|
+
if ((pathname === '/api/telemetry/stream' || pathname === '/api/v1/telemetry/stream') && method === 'GET')
|
|
34
|
+
return handlers.createTelemetryEventStream(req);
|
|
35
|
+
if ((pathname === '/api/telemetry/otlp/v1/traces' || pathname === '/api/v1/telemetry/otlp/v1/traces') && method === 'GET')
|
|
36
|
+
return handlers.getTelemetryOtlpTraces(req);
|
|
37
|
+
if ((pathname === '/api/telemetry/otlp/v1/logs' || pathname === '/api/v1/telemetry/otlp/v1/logs') && method === 'GET')
|
|
38
|
+
return handlers.getTelemetryOtlpLogs(req);
|
|
39
|
+
if ((pathname === '/api/telemetry/otlp/v1/metrics' || pathname === '/api/v1/telemetry/otlp/v1/metrics') && method === 'GET')
|
|
40
|
+
return handlers.getTelemetryOtlpMetrics(req);
|
|
41
|
+
if (pathname === '/api/control-plane/methods' && method === 'GET')
|
|
42
|
+
return handlers.getGatewayMethods(url);
|
|
43
|
+
const gatewayMethodInvokeMatch = pathname.match(/^\/api\/control-plane\/methods\/([^/]+)\/invoke$/);
|
|
44
|
+
if (gatewayMethodInvokeMatch && method === 'POST')
|
|
45
|
+
return handlers.invokeGatewayMethod(decodeURIComponent(gatewayMethodInvokeMatch[1]), req);
|
|
46
|
+
const gatewayMethodMatch = pathname.match(/^\/api\/control-plane\/methods\/([^/]+)$/);
|
|
47
|
+
if (gatewayMethodMatch && method === 'GET')
|
|
48
|
+
return handlers.getGatewayMethod(decodeURIComponent(gatewayMethodMatch[1]));
|
|
49
|
+
if (pathname === '/api/control-plane/events/catalog' && method === 'GET')
|
|
50
|
+
return handlers.getGatewayEvents(url);
|
|
51
|
+
if (pathname === '/api/control-plane/events' && method === 'GET')
|
|
52
|
+
return handlers.createControlPlaneEventStream(req);
|
|
53
|
+
if (pathname === '/api/routes' && method === 'GET')
|
|
54
|
+
return handlers.getRoutesSnapshot();
|
|
55
|
+
if (pathname === '/api/surfaces' && method === 'GET')
|
|
56
|
+
return handlers.getSurfaces();
|
|
57
|
+
if (pathname === '/api/channels/accounts' && method === 'GET')
|
|
58
|
+
return handlers.getChannelAccounts();
|
|
59
|
+
if (pathname === '/api/channels/capabilities' && method === 'GET')
|
|
60
|
+
return handlers.getChannelCapabilities();
|
|
61
|
+
if (pathname === '/api/channels/tools' && method === 'GET')
|
|
62
|
+
return handlers.getChannelTools();
|
|
63
|
+
if (pathname === '/api/channels/agent-tools' && method === 'GET')
|
|
64
|
+
return handlers.getChannelAgentTools();
|
|
65
|
+
if (pathname === '/api/channels/actions' && method === 'GET')
|
|
66
|
+
return handlers.getChannelActions();
|
|
67
|
+
const channelAccountDefaultActionMatch = pathname.match(/^\/api\/channels\/accounts\/([^/]+)\/actions\/([^/]+)$/);
|
|
68
|
+
if (channelAccountDefaultActionMatch && method === 'POST') {
|
|
69
|
+
return handlers.postChannelAccountAction(decodeURIComponent(channelAccountDefaultActionMatch[1]), null, decodeURIComponent(channelAccountDefaultActionMatch[2]), req);
|
|
70
|
+
}
|
|
71
|
+
const channelAccountActionMatch = pathname.match(/^\/api\/channels\/accounts\/([^/]+)\/([^/]+)\/actions\/([^/]+)$/);
|
|
72
|
+
if (channelAccountActionMatch && method === 'POST') {
|
|
73
|
+
return handlers.postChannelAccountAction(decodeURIComponent(channelAccountActionMatch[1]), decodeURIComponent(channelAccountActionMatch[2]), decodeURIComponent(channelAccountActionMatch[3]), req);
|
|
74
|
+
}
|
|
75
|
+
const channelSetupMatch = pathname.match(/^\/api\/channels\/setup\/([^/]+)$/);
|
|
76
|
+
if (channelSetupMatch && method === 'GET') {
|
|
77
|
+
return handlers.getChannelSetupSchema(decodeURIComponent(channelSetupMatch[1]), url);
|
|
78
|
+
}
|
|
79
|
+
const channelDoctorMatch = pathname.match(/^\/api\/channels\/doctor\/([^/]+)$/);
|
|
80
|
+
if (channelDoctorMatch && method === 'GET') {
|
|
81
|
+
return handlers.getChannelDoctor(decodeURIComponent(channelDoctorMatch[1]), url);
|
|
82
|
+
}
|
|
83
|
+
const channelRepairActionsMatch = pathname.match(/^\/api\/channels\/repair-actions\/([^/]+)$/);
|
|
84
|
+
if (channelRepairActionsMatch && method === 'GET') {
|
|
85
|
+
return handlers.getChannelRepairActions(decodeURIComponent(channelRepairActionsMatch[1]), url);
|
|
86
|
+
}
|
|
87
|
+
const channelLifecycleMigrateMatch = pathname.match(/^\/api\/channels\/lifecycle\/([^/]+)\/migrate$/);
|
|
88
|
+
if (channelLifecycleMigrateMatch && method === 'POST') {
|
|
89
|
+
return handlers.postChannelLifecycleMigrate(decodeURIComponent(channelLifecycleMigrateMatch[1]), req);
|
|
90
|
+
}
|
|
91
|
+
const channelLifecycleMatch = pathname.match(/^\/api\/channels\/lifecycle\/([^/]+)$/);
|
|
92
|
+
if (channelLifecycleMatch && method === 'GET') {
|
|
93
|
+
return handlers.getChannelLifecycle(decodeURIComponent(channelLifecycleMatch[1]), url);
|
|
94
|
+
}
|
|
95
|
+
const channelResolveTargetMatch = pathname.match(/^\/api\/channels\/targets\/([^/]+)\/resolve$/);
|
|
96
|
+
if (channelResolveTargetMatch && method === 'POST') {
|
|
97
|
+
return handlers.postChannelResolveTarget(decodeURIComponent(channelResolveTargetMatch[1]), req);
|
|
98
|
+
}
|
|
99
|
+
const channelAuthorizeMatch = pathname.match(/^\/api\/channels\/authorize\/([^/]+)$/);
|
|
100
|
+
if (channelAuthorizeMatch && method === 'POST') {
|
|
101
|
+
return handlers.postChannelAuthorize(decodeURIComponent(channelAuthorizeMatch[1]), req);
|
|
102
|
+
}
|
|
103
|
+
const channelAllowlistResolveMatch = pathname.match(/^\/api\/channels\/allowlist\/([^/]+)\/resolve$/);
|
|
104
|
+
if (channelAllowlistResolveMatch && method === 'POST') {
|
|
105
|
+
return handlers.postChannelAllowlistResolve(decodeURIComponent(channelAllowlistResolveMatch[1]), req);
|
|
106
|
+
}
|
|
107
|
+
const channelAllowlistEditMatch = pathname.match(/^\/api\/channels\/allowlist\/([^/]+)\/edit$/);
|
|
108
|
+
if (channelAllowlistEditMatch && method === 'POST') {
|
|
109
|
+
return handlers.postChannelAllowlistEdit(decodeURIComponent(channelAllowlistEditMatch[1]), req);
|
|
110
|
+
}
|
|
111
|
+
const channelAccountMatch = pathname.match(/^\/api\/channels\/accounts\/([^/]+)\/([^/]+)$/);
|
|
112
|
+
if (channelAccountMatch && method === 'GET') {
|
|
113
|
+
return handlers.getChannelAccount(decodeURIComponent(channelAccountMatch[1]), decodeURIComponent(channelAccountMatch[2]));
|
|
114
|
+
}
|
|
115
|
+
const channelActionPostMatch = pathname.match(/^\/api\/channels\/actions\/([^/]+)\/([^/]+)$/);
|
|
116
|
+
if (channelActionPostMatch && method === 'POST') {
|
|
117
|
+
return handlers.postChannelAction(decodeURIComponent(channelActionPostMatch[1]), decodeURIComponent(channelActionPostMatch[2]), req);
|
|
118
|
+
}
|
|
119
|
+
const channelSurfaceAccountsMatch = pathname.match(/^\/api\/channels\/accounts\/([^/]+)$/);
|
|
120
|
+
if (channelSurfaceAccountsMatch && method === 'GET') {
|
|
121
|
+
return handlers.getChannelSurfaceAccounts(decodeURIComponent(channelSurfaceAccountsMatch[1]));
|
|
122
|
+
}
|
|
123
|
+
const channelSurfaceCapabilitiesMatch = pathname.match(/^\/api\/channels\/capabilities\/([^/]+)$/);
|
|
124
|
+
if (channelSurfaceCapabilitiesMatch && method === 'GET') {
|
|
125
|
+
return handlers.getChannelSurfaceCapabilities(decodeURIComponent(channelSurfaceCapabilitiesMatch[1]));
|
|
126
|
+
}
|
|
127
|
+
const channelSurfaceToolsMatch = pathname.match(/^\/api\/channels\/tools\/([^/]+)$/);
|
|
128
|
+
if (channelSurfaceToolsMatch && method === 'GET') {
|
|
129
|
+
return handlers.getChannelSurfaceTools(decodeURIComponent(channelSurfaceToolsMatch[1]));
|
|
130
|
+
}
|
|
131
|
+
const channelSurfaceAgentToolsMatch = pathname.match(/^\/api\/channels\/agent-tools\/([^/]+)$/);
|
|
132
|
+
if (channelSurfaceAgentToolsMatch && method === 'GET') {
|
|
133
|
+
return handlers.getChannelSurfaceAgentTools(decodeURIComponent(channelSurfaceAgentToolsMatch[1]));
|
|
134
|
+
}
|
|
135
|
+
const channelToolPostMatch = pathname.match(/^\/api\/channels\/tools\/([^/]+)\/([^/]+)$/);
|
|
136
|
+
if (channelToolPostMatch && method === 'POST') {
|
|
137
|
+
return handlers.postChannelTool(decodeURIComponent(channelToolPostMatch[1]), decodeURIComponent(channelToolPostMatch[2]), req);
|
|
138
|
+
}
|
|
139
|
+
const channelSurfaceActionsMatch = pathname.match(/^\/api\/channels\/actions\/([^/]+)$/);
|
|
140
|
+
if (channelSurfaceActionsMatch && method === 'GET') {
|
|
141
|
+
return handlers.getChannelSurfaceActions(decodeURIComponent(channelSurfaceActionsMatch[1]));
|
|
142
|
+
}
|
|
143
|
+
if (pathname === '/api/channels/policies' && method === 'GET')
|
|
144
|
+
return handlers.getChannelPolicies();
|
|
145
|
+
const channelPolicyMatch = pathname.match(/^\/api\/channels\/policies\/([^/]+)$/);
|
|
146
|
+
if (channelPolicyMatch && method === 'POST')
|
|
147
|
+
return handlers.postChannelPolicy(channelPolicyMatch[1], req);
|
|
148
|
+
if (pathname === '/api/channels/policies/audit' && method === 'GET') {
|
|
149
|
+
const limit = Number(url.searchParams.get('limit') ?? 100);
|
|
150
|
+
return handlers.getChannelPolicyAudit(limit);
|
|
151
|
+
}
|
|
152
|
+
if (pathname === '/api/channels/status' && method === 'GET')
|
|
153
|
+
return handlers.getChannelStatus();
|
|
154
|
+
const channelDirectoryMatch = pathname.match(/^\/api\/channels\/directory\/([^/]+)$/);
|
|
155
|
+
if (channelDirectoryMatch && method === 'GET')
|
|
156
|
+
return handlers.getChannelDirectory(channelDirectoryMatch[1], url);
|
|
157
|
+
if (pathname === '/api/watchers' && method === 'GET')
|
|
158
|
+
return handlers.getWatchers();
|
|
159
|
+
if (pathname === '/api/watchers' && method === 'POST')
|
|
160
|
+
return handlers.postWatcher(req);
|
|
161
|
+
const watcherUpdateMatch = pathname.match(/^\/api\/watchers\/([^/]+)$/);
|
|
162
|
+
if (watcherUpdateMatch && method === 'PATCH')
|
|
163
|
+
return handlers.patchWatcher(watcherUpdateMatch[1], req);
|
|
164
|
+
if (watcherUpdateMatch && method === 'DELETE')
|
|
165
|
+
return handlers.deleteWatcher(watcherUpdateMatch[1]);
|
|
166
|
+
const watcherActionMatch = pathname.match(/^\/api\/watchers\/([^/]+)\/(start|stop|run)$/);
|
|
167
|
+
if (watcherActionMatch && method === 'POST')
|
|
168
|
+
return handlers.watcherAction(watcherActionMatch[1], watcherActionMatch[2]);
|
|
169
|
+
if (pathname === '/api/service/status' && method === 'GET')
|
|
170
|
+
return handlers.getServiceStatus();
|
|
171
|
+
if (pathname === '/api/service/install' && method === 'POST')
|
|
172
|
+
return handlers.installService();
|
|
173
|
+
if (pathname === '/api/service/start' && method === 'POST')
|
|
174
|
+
return handlers.startService();
|
|
175
|
+
if (pathname === '/api/service/stop' && method === 'POST')
|
|
176
|
+
return handlers.stopService();
|
|
177
|
+
if (pathname === '/api/service/restart' && method === 'POST')
|
|
178
|
+
return handlers.restartService();
|
|
179
|
+
if (pathname === '/api/service/uninstall' && method === 'POST')
|
|
180
|
+
return handlers.uninstallService();
|
|
181
|
+
if (pathname === '/api/routes/bindings' && method === 'GET')
|
|
182
|
+
return handlers.getRouteBindings();
|
|
183
|
+
if (pathname === '/api/routes/bindings' && method === 'POST')
|
|
184
|
+
return handlers.postRouteBinding(req);
|
|
185
|
+
const routeBindingMatch = pathname.match(/^\/api\/routes\/bindings\/([^/]+)$/);
|
|
186
|
+
if (routeBindingMatch && method === 'PATCH')
|
|
187
|
+
return handlers.patchRouteBinding(routeBindingMatch[1], req);
|
|
188
|
+
if (routeBindingMatch && method === 'DELETE')
|
|
189
|
+
return handlers.deleteRouteBinding(routeBindingMatch[1]);
|
|
190
|
+
if (pathname === '/api/approvals' && method === 'GET')
|
|
191
|
+
return handlers.getApprovals();
|
|
192
|
+
const approvalActionMatch = pathname.match(/^\/api\/approvals\/([^/]+)\/(claim|approve|deny|cancel)$/);
|
|
193
|
+
if (approvalActionMatch && method === 'POST') {
|
|
194
|
+
return handlers.approvalAction(approvalActionMatch[1], approvalActionMatch[2], req);
|
|
195
|
+
}
|
|
196
|
+
if (pathname === '/api/remote' && method === 'GET')
|
|
197
|
+
return handlers.getRemote();
|
|
198
|
+
if ((pathname === '/api/remote/node-host/contract' || pathname === '/api/remote/device/contract') && method === 'GET') {
|
|
199
|
+
return handlers.getRemoteNodeHostContract();
|
|
200
|
+
}
|
|
201
|
+
if (pathname === '/api/health' && method === 'GET')
|
|
202
|
+
return handlers.getHealth();
|
|
203
|
+
if (pathname === '/api/accounts' && method === 'GET')
|
|
204
|
+
return handlers.getAccounts();
|
|
205
|
+
if (pathname === '/api/providers' && method === 'GET')
|
|
206
|
+
return handlers.getProviders();
|
|
207
|
+
const providerUsageMatch = pathname.match(/^\/api\/providers\/([^/]+)\/usage$/);
|
|
208
|
+
if (providerUsageMatch && method === 'GET')
|
|
209
|
+
return handlers.getProviderUsage(decodeURIComponent(providerUsageMatch[1]));
|
|
210
|
+
const providerMatch = pathname.match(/^\/api\/providers\/([^/]+)$/);
|
|
211
|
+
if (providerMatch && method === 'GET')
|
|
212
|
+
return handlers.getProvider(decodeURIComponent(providerMatch[1]));
|
|
213
|
+
if (pathname === '/api/settings' && method === 'GET')
|
|
214
|
+
return handlers.getSettings();
|
|
215
|
+
if (pathname === '/api/continuity' && method === 'GET')
|
|
216
|
+
return handlers.getContinuity();
|
|
217
|
+
if (pathname === '/api/worktrees' && method === 'GET')
|
|
218
|
+
return handlers.getWorktrees();
|
|
219
|
+
if (pathname === '/api/intelligence' && method === 'GET')
|
|
220
|
+
return handlers.getIntelligence();
|
|
221
|
+
if (pathname === '/api/automation/heartbeat' && method === 'GET')
|
|
222
|
+
return handlers.getAutomationHeartbeat();
|
|
223
|
+
if (pathname === '/api/automation/heartbeat' && method === 'POST')
|
|
224
|
+
return handlers.postAutomationHeartbeat(req);
|
|
225
|
+
if (pathname === '/api/memory/doctor' && method === 'GET')
|
|
226
|
+
return handlers.getMemoryDoctor();
|
|
227
|
+
if (pathname === '/api/memory/vector' && method === 'GET')
|
|
228
|
+
return handlers.getMemoryVectorStats();
|
|
229
|
+
if (pathname === '/api/memory/vector/rebuild' && method === 'POST')
|
|
230
|
+
return handlers.postMemoryVectorRebuild(req);
|
|
231
|
+
if (pathname === '/api/memory/embeddings/default' && method === 'POST')
|
|
232
|
+
return handlers.postMemoryEmbeddingDefault(req);
|
|
233
|
+
if (pathname === '/api/knowledge/status' && method === 'GET')
|
|
234
|
+
return handlers.getKnowledgeStatus();
|
|
235
|
+
if (pathname === '/api/knowledge/sources' && method === 'GET')
|
|
236
|
+
return handlers.getKnowledgeSources(url);
|
|
237
|
+
if (pathname === '/api/knowledge/nodes' && method === 'GET')
|
|
238
|
+
return handlers.getKnowledgeNodes(url);
|
|
239
|
+
if (pathname === '/api/knowledge/issues' && method === 'GET')
|
|
240
|
+
return handlers.getKnowledgeIssues(url);
|
|
241
|
+
if (pathname === '/api/knowledge/connectors' && method === 'GET')
|
|
242
|
+
return handlers.getKnowledgeConnectors();
|
|
243
|
+
if (pathname === '/api/knowledge/extractions' && method === 'GET')
|
|
244
|
+
return handlers.getKnowledgeExtractions(url);
|
|
245
|
+
if (pathname === '/api/knowledge/usage' && method === 'GET')
|
|
246
|
+
return handlers.getKnowledgeUsage(url);
|
|
247
|
+
if (pathname === '/api/knowledge/candidates' && method === 'GET')
|
|
248
|
+
return handlers.getKnowledgeCandidates(url);
|
|
249
|
+
if (pathname === '/api/knowledge/reports' && method === 'GET')
|
|
250
|
+
return handlers.getKnowledgeReports(url);
|
|
251
|
+
if (pathname === '/api/knowledge/jobs' && method === 'GET')
|
|
252
|
+
return handlers.getKnowledgeJobs();
|
|
253
|
+
if (pathname === '/api/knowledge/job-runs' && method === 'GET')
|
|
254
|
+
return handlers.getKnowledgeJobRuns(url);
|
|
255
|
+
if (pathname === '/api/knowledge/schedules' && method === 'GET')
|
|
256
|
+
return handlers.getKnowledgeSchedules(url);
|
|
257
|
+
if (pathname === '/api/knowledge/projections' && method === 'GET')
|
|
258
|
+
return handlers.getKnowledgeProjectionTargets(url);
|
|
259
|
+
if (pathname === '/api/knowledge/graphql/schema' && method === 'GET')
|
|
260
|
+
return handlers.getKnowledgeGraphqlSchema();
|
|
261
|
+
if (pathname === '/api/knowledge/graphql' && (method === 'GET' || method === 'POST'))
|
|
262
|
+
return handlers.executeKnowledgeGraphql(req);
|
|
263
|
+
if (pathname === '/api/knowledge/ingest/url' && method === 'POST')
|
|
264
|
+
return handlers.postKnowledgeIngestUrl(req);
|
|
265
|
+
if (pathname === '/api/knowledge/ingest/artifact' && method === 'POST')
|
|
266
|
+
return handlers.postKnowledgeIngestArtifact(req);
|
|
267
|
+
if (pathname === '/api/knowledge/ingest/bookmarks' && method === 'POST')
|
|
268
|
+
return handlers.postKnowledgeImportBookmarks(req);
|
|
269
|
+
if (pathname === '/api/knowledge/ingest/urls' && method === 'POST')
|
|
270
|
+
return handlers.postKnowledgeImportUrls(req);
|
|
271
|
+
if (pathname === '/api/knowledge/ingest/connector' && method === 'POST')
|
|
272
|
+
return handlers.postKnowledgeIngestConnector(req);
|
|
273
|
+
if (pathname === '/api/knowledge/search' && method === 'POST')
|
|
274
|
+
return handlers.postKnowledgeSearch(req);
|
|
275
|
+
if (pathname === '/api/knowledge/packet' && method === 'POST')
|
|
276
|
+
return handlers.postKnowledgePacket(req);
|
|
277
|
+
if (pathname === '/api/knowledge/lint' && method === 'POST')
|
|
278
|
+
return handlers.postKnowledgeLint(req);
|
|
279
|
+
if (pathname === '/api/knowledge/reindex' && method === 'POST')
|
|
280
|
+
return handlers.postKnowledgeReindex(req);
|
|
281
|
+
if (pathname === '/api/knowledge/schedules' && method === 'POST')
|
|
282
|
+
return handlers.postKnowledgeSaveSchedule(req);
|
|
283
|
+
if (pathname === '/api/knowledge/projections/render' && method === 'POST')
|
|
284
|
+
return handlers.postKnowledgeRenderProjection(req);
|
|
285
|
+
if (pathname === '/api/knowledge/projections/materialize' && method === 'POST')
|
|
286
|
+
return handlers.postKnowledgeMaterializeProjection(req);
|
|
287
|
+
const knowledgeConnectorDoctorMatch = pathname.match(/^\/api\/knowledge\/connectors\/([^/]+)\/doctor$/);
|
|
288
|
+
if (knowledgeConnectorDoctorMatch && method === 'GET')
|
|
289
|
+
return handlers.getKnowledgeConnectorDoctor(decodeURIComponent(knowledgeConnectorDoctorMatch[1]));
|
|
290
|
+
const knowledgeConnectorMatch = pathname.match(/^\/api\/knowledge\/connectors\/([^/]+)$/);
|
|
291
|
+
if (knowledgeConnectorMatch && method === 'GET')
|
|
292
|
+
return handlers.getKnowledgeConnector(decodeURIComponent(knowledgeConnectorMatch[1]));
|
|
293
|
+
const knowledgeExtractionMatch = pathname.match(/^\/api\/knowledge\/extractions\/([^/]+)$/);
|
|
294
|
+
if (knowledgeExtractionMatch && method === 'GET')
|
|
295
|
+
return handlers.getKnowledgeExtraction(decodeURIComponent(knowledgeExtractionMatch[1]));
|
|
296
|
+
const knowledgeCandidateDecideMatch = pathname.match(/^\/api\/knowledge\/candidates\/([^/]+)\/decide$/);
|
|
297
|
+
if (knowledgeCandidateDecideMatch && method === 'POST')
|
|
298
|
+
return handlers.postKnowledgeDecideCandidate(decodeURIComponent(knowledgeCandidateDecideMatch[1]), req);
|
|
299
|
+
const knowledgeCandidateMatch = pathname.match(/^\/api\/knowledge\/candidates\/([^/]+)$/);
|
|
300
|
+
if (knowledgeCandidateMatch && method === 'GET')
|
|
301
|
+
return handlers.getKnowledgeCandidate(decodeURIComponent(knowledgeCandidateMatch[1]));
|
|
302
|
+
const knowledgeReportMatch = pathname.match(/^\/api\/knowledge\/reports\/([^/]+)$/);
|
|
303
|
+
if (knowledgeReportMatch && method === 'GET')
|
|
304
|
+
return handlers.getKnowledgeReport(decodeURIComponent(knowledgeReportMatch[1]));
|
|
305
|
+
const knowledgeSourceExtractionMatch = pathname.match(/^\/api\/knowledge\/sources\/([^/]+)\/extraction$/);
|
|
306
|
+
if (knowledgeSourceExtractionMatch && method === 'GET')
|
|
307
|
+
return handlers.getKnowledgeSourceExtraction(decodeURIComponent(knowledgeSourceExtractionMatch[1]));
|
|
308
|
+
const knowledgeJobRunMatch = pathname.match(/^\/api\/knowledge\/jobs\/([^/]+)\/run$/);
|
|
309
|
+
if (knowledgeJobRunMatch && method === 'POST')
|
|
310
|
+
return handlers.postKnowledgeRunJob(decodeURIComponent(knowledgeJobRunMatch[1]), req);
|
|
311
|
+
const knowledgeJobMatch = pathname.match(/^\/api\/knowledge\/jobs\/([^/]+)$/);
|
|
312
|
+
if (knowledgeJobMatch && method === 'GET')
|
|
313
|
+
return handlers.getKnowledgeJob(decodeURIComponent(knowledgeJobMatch[1]));
|
|
314
|
+
const knowledgeScheduleEnabledMatch = pathname.match(/^\/api\/knowledge\/schedules\/([^/]+)\/enabled$/);
|
|
315
|
+
if (knowledgeScheduleEnabledMatch && method === 'POST')
|
|
316
|
+
return handlers.postKnowledgeSetScheduleEnabled(decodeURIComponent(knowledgeScheduleEnabledMatch[1]), req);
|
|
317
|
+
const knowledgeScheduleMatch = pathname.match(/^\/api\/knowledge\/schedules\/([^/]+)$/);
|
|
318
|
+
if (knowledgeScheduleMatch && method === 'GET')
|
|
319
|
+
return handlers.getKnowledgeSchedule(decodeURIComponent(knowledgeScheduleMatch[1]));
|
|
320
|
+
if (knowledgeScheduleMatch && method === 'DELETE')
|
|
321
|
+
return handlers.deleteKnowledgeSchedule(decodeURIComponent(knowledgeScheduleMatch[1]), req);
|
|
322
|
+
const knowledgeItemMatch = pathname.match(/^\/api\/knowledge\/items\/([^/]+)$/);
|
|
323
|
+
if (knowledgeItemMatch && method === 'GET')
|
|
324
|
+
return handlers.getKnowledgeItem(decodeURIComponent(knowledgeItemMatch[1]));
|
|
325
|
+
if (pathname === '/api/voice' && method === 'GET')
|
|
326
|
+
return handlers.getVoiceStatus();
|
|
327
|
+
if (pathname === '/api/voice/providers' && method === 'GET')
|
|
328
|
+
return handlers.getVoiceProviders();
|
|
329
|
+
if (pathname === '/api/voice/voices' && method === 'GET')
|
|
330
|
+
return handlers.getVoiceVoices(url);
|
|
331
|
+
if (pathname === '/api/voice/tts' && method === 'POST')
|
|
332
|
+
return handlers.postVoiceTts(req);
|
|
333
|
+
if (pathname === '/api/voice/stt' && method === 'POST')
|
|
334
|
+
return handlers.postVoiceStt(req);
|
|
335
|
+
if (pathname === '/api/voice/realtime/session' && method === 'POST')
|
|
336
|
+
return handlers.postVoiceRealtimeSession(req);
|
|
337
|
+
if (pathname === '/api/web-search/providers' && method === 'GET')
|
|
338
|
+
return handlers.getWebSearchProviders();
|
|
339
|
+
if (pathname === '/api/web-search/query' && method === 'POST')
|
|
340
|
+
return handlers.postWebSearch(req);
|
|
341
|
+
if (pathname === '/api/artifacts' && method === 'GET')
|
|
342
|
+
return handlers.getArtifacts();
|
|
343
|
+
if (pathname === '/api/artifacts' && method === 'POST')
|
|
344
|
+
return handlers.postArtifact(req);
|
|
345
|
+
const artifactContentMatch = pathname.match(/^\/api\/artifacts\/([^/]+)\/content$/);
|
|
346
|
+
if (artifactContentMatch && method === 'GET')
|
|
347
|
+
return handlers.getArtifactContent(decodeURIComponent(artifactContentMatch[1]), req);
|
|
348
|
+
const artifactMatch = pathname.match(/^\/api\/artifacts\/([^/]+)$/);
|
|
349
|
+
if (artifactMatch && method === 'GET')
|
|
350
|
+
return handlers.getArtifact(decodeURIComponent(artifactMatch[1]));
|
|
351
|
+
if (pathname === '/api/media/providers' && method === 'GET')
|
|
352
|
+
return handlers.getMediaProviders();
|
|
353
|
+
if (pathname === '/api/media/analyze' && method === 'POST')
|
|
354
|
+
return handlers.postMediaAnalyze(req);
|
|
355
|
+
if (pathname === '/api/media/transform' && method === 'POST')
|
|
356
|
+
return handlers.postMediaTransform(req);
|
|
357
|
+
if (pathname === '/api/media/generate' && method === 'POST')
|
|
358
|
+
return handlers.postMediaGenerate(req);
|
|
359
|
+
if (pathname === '/api/multimodal' && method === 'GET')
|
|
360
|
+
return handlers.getMultimodalStatus();
|
|
361
|
+
if (pathname === '/api/multimodal/providers' && method === 'GET')
|
|
362
|
+
return handlers.getMultimodalProviders();
|
|
363
|
+
if (pathname === '/api/multimodal/analyze' && method === 'POST')
|
|
364
|
+
return handlers.postMultimodalAnalyze(req);
|
|
365
|
+
if (pathname === '/api/multimodal/packet' && method === 'POST')
|
|
366
|
+
return handlers.postMultimodalPacket(req);
|
|
367
|
+
if (pathname === '/api/multimodal/writeback' && method === 'POST')
|
|
368
|
+
return handlers.postMultimodalWriteback(req);
|
|
369
|
+
if (pathname === '/api/local-auth' && method === 'GET')
|
|
370
|
+
return handlers.getLocalAuth();
|
|
371
|
+
if (pathname === '/api/local-auth/users' && method === 'POST')
|
|
372
|
+
return handlers.postLocalAuthUser(req);
|
|
373
|
+
const userMatch = pathname.match(/^\/api\/local-auth\/users\/([^/]+)$/);
|
|
374
|
+
if (userMatch && method === 'DELETE')
|
|
375
|
+
return handlers.deleteLocalAuthUser(decodeURIComponent(userMatch[1]));
|
|
376
|
+
const passwordMatch = pathname.match(/^\/api\/local-auth\/users\/([^/]+)\/password$/);
|
|
377
|
+
if (passwordMatch && method === 'POST')
|
|
378
|
+
return handlers.postLocalAuthPassword(decodeURIComponent(passwordMatch[1]), req);
|
|
379
|
+
const sessionMatch = pathname.match(/^\/api\/local-auth\/sessions\/([^/]+)$/);
|
|
380
|
+
if (sessionMatch && method === 'DELETE')
|
|
381
|
+
return handlers.deleteLocalAuthSession(decodeURIComponent(sessionMatch[1]));
|
|
382
|
+
if (pathname === '/api/local-auth/bootstrap-file' && method === 'DELETE')
|
|
383
|
+
return handlers.deleteBootstrapFile();
|
|
384
|
+
if (pathname === '/api/panels' && method === 'GET')
|
|
385
|
+
return handlers.getPanels();
|
|
386
|
+
if (pathname === '/api/panels/open' && method === 'POST')
|
|
387
|
+
return handlers.postPanelOpen(req);
|
|
388
|
+
if (pathname === '/api/events' && method === 'GET')
|
|
389
|
+
return handlers.getEvents(req);
|
|
390
|
+
if (pathname === '/config' && method === 'GET')
|
|
391
|
+
return handlers.getConfig();
|
|
392
|
+
if (pathname === '/config' && method === 'POST')
|
|
393
|
+
return handlers.postConfig(req);
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { DaemonApiRouteHandlers } from './context.js';
|
|
2
|
+
type JsonBody = Record<string, unknown>;
|
|
3
|
+
type RemotePeerAuth = unknown;
|
|
4
|
+
interface DistributedRuntimeRouteService {
|
|
5
|
+
listPairRequests(): unknown;
|
|
6
|
+
approvePairRequest(requestId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
7
|
+
rejectPairRequest(requestId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
8
|
+
listPeers(): unknown;
|
|
9
|
+
rotatePeerToken(peerId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
10
|
+
revokePeerToken(peerId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
11
|
+
disconnectPeer(peerId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
12
|
+
listWork(): unknown;
|
|
13
|
+
invokePeer(input: Record<string, unknown>): Promise<unknown>;
|
|
14
|
+
cancelWork(workId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
15
|
+
getNodeHostContract(): unknown;
|
|
16
|
+
requestPairing(input: Record<string, unknown>): Promise<unknown>;
|
|
17
|
+
verifyPairRequest(requestId: string, challenge: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
18
|
+
heartbeatPeer(auth: RemotePeerAuth, input: Record<string, unknown>): Promise<unknown>;
|
|
19
|
+
claimWork(auth: RemotePeerAuth, input: Record<string, unknown>): Promise<unknown>;
|
|
20
|
+
completeWork(auth: RemotePeerAuth, workId: string, input: Record<string, unknown>): Promise<unknown | null>;
|
|
21
|
+
}
|
|
22
|
+
interface SessionUserLike {
|
|
23
|
+
readonly username: string;
|
|
24
|
+
}
|
|
25
|
+
interface DaemonRemoteRouteContext {
|
|
26
|
+
readonly authToken?: string | null;
|
|
27
|
+
readonly parseJsonBody: (req: Request) => Promise<JsonBody | Response>;
|
|
28
|
+
readonly requireAdmin: (req: Request) => Response | null;
|
|
29
|
+
readonly requireRemotePeer: (req: Request, scope?: string) => Promise<RemotePeerAuth | Response>;
|
|
30
|
+
readonly requireAuthenticatedSession: (req: Request) => SessionUserLike | null;
|
|
31
|
+
readonly distributedRuntime: DistributedRuntimeRouteService;
|
|
32
|
+
}
|
|
33
|
+
export declare function createDaemonRemoteRouteHandlers(context: DaemonRemoteRouteContext): Pick<DaemonApiRouteHandlers, 'getRemotePairRequests' | 'approveRemotePairRequest' | 'rejectRemotePairRequest' | 'getRemotePeers' | 'rotateRemotePeerToken' | 'revokeRemotePeerToken' | 'disconnectRemotePeer' | 'getRemoteWork' | 'invokeRemotePeer' | 'cancelRemoteWork' | 'getRemoteNodeHostContract'>;
|
|
34
|
+
export declare function handleRemotePairRequest(context: Pick<DaemonRemoteRouteContext, 'parseJsonBody' | 'distributedRuntime'>, req: Request): Promise<Response>;
|
|
35
|
+
export declare function handleRemotePairVerify(context: Pick<DaemonRemoteRouteContext, 'parseJsonBody' | 'distributedRuntime'>, req: Request): Promise<Response>;
|
|
36
|
+
export declare function handleRemotePeerHeartbeat(context: Pick<DaemonRemoteRouteContext, 'parseJsonBody' | 'requireRemotePeer' | 'distributedRuntime'>, req: Request): Promise<Response>;
|
|
37
|
+
export declare function handleRemotePeerWorkPull(context: Pick<DaemonRemoteRouteContext, 'parseJsonBody' | 'requireRemotePeer' | 'distributedRuntime'>, req: Request): Promise<Response>;
|
|
38
|
+
export declare function handleRemotePeerWorkComplete(context: Pick<DaemonRemoteRouteContext, 'parseJsonBody' | 'requireRemotePeer' | 'distributedRuntime'>, workId: string, req: Request): Promise<Response>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=remote-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-routes.d.ts","sourceRoot":"","sources":["../src/remote-routes.ts"],"names":[],"mappings":"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"}
|