@nextclaw/server 0.20.4 → 0.21.0

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/dist/index.js CHANGED
@@ -2156,6 +2156,81 @@ var AppPackagesRoutesController = class {
2156
2156
  return this.handleError(c, error);
2157
2157
  }
2158
2158
  };
2159
+ inspectDependencies = async (c) => {
2160
+ try {
2161
+ return c.json(ok(await this.manager.inspectDependencies(c.req.param("appId"))));
2162
+ } catch (error) {
2163
+ return this.handleError(c, error);
2164
+ }
2165
+ };
2166
+ verifyDependencies = async (c) => {
2167
+ try {
2168
+ return c.json(ok(await this.manager.verifyDependencies(c.req.param("appId"))));
2169
+ } catch (error) {
2170
+ return this.handleError(c, error);
2171
+ }
2172
+ };
2173
+ setupDependencies = async (c) => {
2174
+ try {
2175
+ return c.json(ok(await this.manager.setupDependencies(c.req.param("appId"))));
2176
+ } catch (error) {
2177
+ return this.handleError(c, error);
2178
+ }
2179
+ };
2180
+ bindDependency = async (c) => {
2181
+ const body = await readJson(c.req.raw);
2182
+ const input = body.ok ? readDependencyBinding(body.data, true) : void 0;
2183
+ if (!input) return c.json(err("INVALID_APP_PACKAGE_DEPENDENCY", "binding fields are required"), 400);
2184
+ try {
2185
+ return c.json(ok(await this.manager.bindDependency(c.req.param("appId"), input)));
2186
+ } catch (error) {
2187
+ return this.handleError(c, error);
2188
+ }
2189
+ };
2190
+ unbindDependency = async (c) => {
2191
+ const body = await readJson(c.req.raw);
2192
+ const input = body.ok ? readDependencyBinding(body.data, false) : void 0;
2193
+ if (!input) return c.json(err("INVALID_APP_PACKAGE_DEPENDENCY", "binding fields are required"), 400);
2194
+ try {
2195
+ return c.json(ok(await this.manager.unbindDependency(c.req.param("appId"), input)));
2196
+ } catch (error) {
2197
+ return this.handleError(c, error);
2198
+ }
2199
+ };
2200
+ inspectSecrets = async (c) => {
2201
+ try {
2202
+ return c.json(ok(await this.manager.inspectSecrets(c.req.param("appId"))));
2203
+ } catch (error) {
2204
+ return this.handleError(c, error);
2205
+ }
2206
+ };
2207
+ verifySecrets = async (c) => {
2208
+ try {
2209
+ return c.json(ok(await this.manager.verifySecrets(c.req.param("appId"))));
2210
+ } catch (error) {
2211
+ return this.handleError(c, error);
2212
+ }
2213
+ };
2214
+ bindSecret = async (c) => {
2215
+ const body = await readJson(c.req.raw);
2216
+ const input = body.ok ? readSecretBinding(body.data) : void 0;
2217
+ if (!input) return c.json(err("INVALID_APP_SECRET_BINDING", "slotId, source, and id are required"), 400);
2218
+ try {
2219
+ return c.json(ok(await this.manager.bindSecret(c.req.param("appId"), input)));
2220
+ } catch (error) {
2221
+ return this.handleError(c, error);
2222
+ }
2223
+ };
2224
+ unbindSecret = async (c) => {
2225
+ const body = await readJson(c.req.raw);
2226
+ const slotId = body.ok && isRecord$3(body.data) && typeof body.data.slotId === "string" ? body.data.slotId.trim() : "";
2227
+ if (!slotId) return c.json(err("INVALID_APP_SECRET_BINDING", "slotId is required"), 400);
2228
+ try {
2229
+ return c.json(ok(await this.manager.unbindSecret(c.req.param("appId"), slotId)));
2230
+ } catch (error) {
2231
+ return this.handleError(c, error);
2232
+ }
2233
+ };
2159
2234
  install = async (c) => {
2160
2235
  const body = await readJson(c.req.raw);
2161
2236
  if (!body.ok || !isRecord$3(body.data) || typeof body.data.source !== "string") return c.json(err("INVALID_APP_PACKAGE_INSTALL", "source is required"), 400);
@@ -2211,12 +2286,36 @@ var AppPackagesRoutesController = class {
2211
2286
  };
2212
2287
  handleError = (c, error) => {
2213
2288
  if (isAppPackageError(error)) {
2214
- const status = error.code === "APP_PACKAGE_NOT_FOUND" ? 404 : error.code === "APP_PACKAGE_CONFLICT" ? 409 : 400;
2289
+ const status = error.code === "APP_PACKAGE_NOT_FOUND" ? 404 : error.code === "APP_PACKAGE_CONFLICT" || error.code === "APP_PACKAGE_NOT_READY" || error.code === "SECRET_BINDING_MISSING" || error.code === "SECRET_RESOLUTION_FAILED" ? 409 : 400;
2215
2290
  return c.json(err(error.code, error.message), status);
2216
2291
  }
2217
2292
  return c.json(err("APP_PACKAGE_OPERATION_FAILED", error instanceof Error ? error.message : String(error)), 400);
2218
2293
  };
2219
2294
  };
2295
+ function readDependencyBinding(value, requireProvider) {
2296
+ if (!isRecord$3(value) || typeof value.componentId !== "string" || !value.componentId.trim() || !["capability", "resource"].includes(String(value.requirementKind)) || typeof value.requirementId !== "string" || !value.requirementId.trim() || requireProvider && (typeof value.providerId !== "string" || !value.providerId.trim())) return;
2297
+ return {
2298
+ componentId: value.componentId,
2299
+ requirementKind: value.requirementKind,
2300
+ requirementId: value.requirementId,
2301
+ ...requireProvider ? { providerId: value.providerId } : {}
2302
+ };
2303
+ }
2304
+ function readSecretBinding(value) {
2305
+ if (!isRecord$3(value) || typeof value.slotId !== "string" || !value.slotId.trim() || ![
2306
+ "env",
2307
+ "file",
2308
+ "exec"
2309
+ ].includes(String(value.source)) || typeof value.id !== "string" || !value.id.trim() || value.provider !== void 0 && (typeof value.provider !== "string" || !value.provider.trim())) return;
2310
+ return {
2311
+ slotId: value.slotId.trim(),
2312
+ binding: {
2313
+ source: value.source,
2314
+ provider: typeof value.provider === "string" ? value.provider.trim() : void 0,
2315
+ id: value.id.trim()
2316
+ }
2317
+ };
2318
+ }
2220
2319
  //#endregion
2221
2320
  //#region src/features/app-data/controllers/app-data.controller.ts
2222
2321
  var AppDataRoutesController = class {
@@ -6741,8 +6840,17 @@ function statusForServiceAppError(code) {
6741
6840
  case "AUTHORIZATION_REQUIRED": return 401;
6742
6841
  case "SERVICE_APP_ACTION_NOT_DECLARED": return 403;
6743
6842
  case "SERVICE_APP_ACTION_NOT_FOUND":
6744
- case "SERVICE_APP_NOT_FOUND": return 404;
6745
- case "SERVICE_APP_RUNTIME_FAILED": return 502;
6843
+ case "SERVICE_APP_NOT_FOUND":
6844
+ case "SERVICE_APP_JOB_NOT_FOUND":
6845
+ case "SERVICE_APP_RESIDENT_EVENT_NOT_FOUND": return 404;
6846
+ case "SERVICE_APP_RUNTIME_FAILED":
6847
+ case "WASI_ABI_VERSION_MISMATCH":
6848
+ case "WASI_COMPONENT_FAILED":
6849
+ case "WASI_COMPONENT_TRAP":
6850
+ case "WASI_GUEST_EXPORT_MISSING": return 502;
6851
+ case "WASI_CAPABILITY_DENIED": return 403;
6852
+ case "WASI_INPUT_SCHEMA_MISMATCH": return 422;
6853
+ case "STREAM_CURSOR_EXPIRED": return 422;
6746
6854
  default: return 400;
6747
6855
  }
6748
6856
  }
@@ -6760,6 +6868,39 @@ var ServiceAppsRoutesController = class {
6760
6868
  return this.handleServiceAppError(c, error);
6761
6869
  }
6762
6870
  };
6871
+ inspectServiceAppAiCapabilities = async (c) => {
6872
+ try {
6873
+ return c.json(ok(await this.params.serviceAppManager.inspectServiceAppAiCapabilities(c.req.param("appId"))));
6874
+ } catch (error) {
6875
+ return this.handleServiceAppError(c, error);
6876
+ }
6877
+ };
6878
+ verifyServiceAppAiCapabilities = async (c) => {
6879
+ try {
6880
+ return c.json(ok(await this.params.serviceAppManager.verifyServiceAppAiCapabilities(c.req.param("appId"))));
6881
+ } catch (error) {
6882
+ return this.handleServiceAppError(c, error);
6883
+ }
6884
+ };
6885
+ bindServiceAppAiCapability = async (c) => {
6886
+ const body = await readJson(c.req.raw);
6887
+ if (!body.ok || body.data?.kind !== "model" && body.data?.kind !== "agent" || typeof body.data.slotId !== "string" || typeof body.data.targetId !== "string") return c.json(err("INVALID_SERVICE_APP_AI_BINDING", "kind, slotId, and targetId are required."), 400);
6888
+ try {
6889
+ const result = body.data.kind === "model" ? await this.params.serviceAppManager.bindServiceAppModelSlot(c.req.param("appId"), body.data.slotId, body.data.targetId) : await this.params.serviceAppManager.bindServiceAppAgentSlot(c.req.param("appId"), body.data.slotId, body.data.targetId);
6890
+ return c.json(ok(result));
6891
+ } catch (error) {
6892
+ return this.handleServiceAppError(c, error);
6893
+ }
6894
+ };
6895
+ unbindServiceAppAiCapability = async (c) => {
6896
+ const body = await readJson(c.req.raw);
6897
+ if (!body.ok || body.data?.kind !== "model" && body.data?.kind !== "agent" || typeof body.data.slotId !== "string") return c.json(err("INVALID_SERVICE_APP_AI_BINDING", "kind and slotId are required."), 400);
6898
+ try {
6899
+ return c.json(ok(await this.params.serviceAppManager.unbindServiceAppAiSlot(c.req.param("appId"), body.data.kind, body.data.slotId)));
6900
+ } catch (error) {
6901
+ return this.handleServiceAppError(c, error);
6902
+ }
6903
+ };
6763
6904
  listServiceActions = async (c) => {
6764
6905
  try {
6765
6906
  const bridgeSession = this.readOptionalBridgeSession(c);
@@ -6797,6 +6938,121 @@ var ServiceAppsRoutesController = class {
6797
6938
  return this.handleServiceAppError(c, error);
6798
6939
  }
6799
6940
  };
6941
+ invokeInstalledServiceAction = async (c) => {
6942
+ const body = await readJson(c.req.raw);
6943
+ if (!body.ok || body.data?.input !== void 0 && !isRecord$3(body.data.input)) return c.json(err("INVALID_SERVICE_ACTION_REQUEST", "invalid service action request"), 400);
6944
+ try {
6945
+ return c.json(ok(await this.params.serviceAppManager.invokeInstalledServiceAction(c.req.param("appId"), c.req.param("actionName"), isRecord$3(body.data?.input) ? body.data.input : {})));
6946
+ } catch (error) {
6947
+ return this.handleServiceAppError(c, error);
6948
+ }
6949
+ };
6950
+ /**
6951
+ * Agent tool providers call the same manager method. This explicit endpoint
6952
+ * is the non-LLM integration/diagnostic surface: it still requires a real
6953
+ * configured Agent and its explicit Service Action grant, so it cannot
6954
+ * impersonate either a Panel bridge or an arbitrary Agent.
6955
+ */
6956
+ invokeAgentServiceAction = async (c) => {
6957
+ const body = await readJson(c.req.raw);
6958
+ if (!body.ok || body.data?.input !== void 0 && !isRecord$3(body.data.input)) return c.json(err("INVALID_SERVICE_ACTION_REQUEST", "invalid service action request"), 400);
6959
+ try {
6960
+ return c.json(ok(await this.params.serviceAppManager.invokeServiceAction(c.req.param("actionId"), {
6961
+ caller: {
6962
+ surface: "agent",
6963
+ agentId: c.req.param("agentId")
6964
+ },
6965
+ input: isRecord$3(body.data?.input) ? body.data.input : {}
6966
+ })));
6967
+ } catch (error) {
6968
+ return this.handleServiceAppError(c, error);
6969
+ }
6970
+ };
6971
+ listVerificationRecords = async (c) => {
6972
+ try {
6973
+ return c.json(ok(await this.params.serviceAppManager.listVerificationRecords({
6974
+ acceptanceId: this.readOptionalQuery(c, "acceptanceId"),
6975
+ appId: this.readOptionalQuery(c, "appId"),
6976
+ limit: this.readLimit(c)
6977
+ })));
6978
+ } catch (error) {
6979
+ return this.handleServiceAppError(c, error);
6980
+ }
6981
+ };
6982
+ /** Stable read-only projection of the single portable-runtime acceptance registry. */
6983
+ getPortableRuntimeAcceptanceContract = async (c) => {
6984
+ try {
6985
+ return c.json(ok(this.params.portableRuntimeAcceptance.contract(this.readLocale(c))));
6986
+ } catch (error) {
6987
+ return this.handleServiceAppError(c, error);
6988
+ }
6989
+ };
6990
+ getPortableRuntimeAcceptanceStatus = async (c) => {
6991
+ try {
6992
+ return c.json(ok(await this.params.portableRuntimeAcceptance.status({
6993
+ appId: this.readOptionalQuery(c, "appId"),
6994
+ locale: this.readLocale(c)
6995
+ })));
6996
+ } catch (error) {
6997
+ return this.handleServiceAppError(c, error);
6998
+ }
6999
+ };
7000
+ exportPortableRuntimeAcceptance = async (c) => {
7001
+ try {
7002
+ return c.json(ok(await this.params.portableRuntimeAcceptance.export({
7003
+ appId: this.readOptionalQuery(c, "appId"),
7004
+ locale: this.readLocale(c)
7005
+ })));
7006
+ } catch (error) {
7007
+ return this.handleServiceAppError(c, error);
7008
+ }
7009
+ };
7010
+ listServiceAppJobs = async (c) => {
7011
+ try {
7012
+ return c.json(ok(await this.params.serviceAppManager.listServiceAppJobs(c.req.param("appId"))));
7013
+ } catch (error) {
7014
+ return this.handleServiceAppError(c, error);
7015
+ }
7016
+ };
7017
+ getServiceAppJob = async (c) => {
7018
+ try {
7019
+ return c.json(ok(await this.params.serviceAppManager.getServiceAppJob(c.req.param("appId"), c.req.param("jobId"))));
7020
+ } catch (error) {
7021
+ return this.handleServiceAppError(c, error);
7022
+ }
7023
+ };
7024
+ /** Cursor replay only; a disconnected client never changes Job execution. */
7025
+ watchServiceAppJob = async (c) => {
7026
+ const afterSequence = this.readAfterSequence(c);
7027
+ if (afterSequence === null) return c.json(err("INVALID_JOB_CURSOR", "afterSequence must be a non-negative integer"), 400);
7028
+ try {
7029
+ return c.json(ok(await this.params.serviceAppManager.watchServiceAppJob(c.req.param("appId"), c.req.param("jobId"), afterSequence)));
7030
+ } catch (error) {
7031
+ return this.handleServiceAppError(c, error);
7032
+ }
7033
+ };
7034
+ cancelServiceAppJob = async (c) => {
7035
+ try {
7036
+ return c.json(ok(await this.params.serviceAppManager.cancelServiceAppJob(c.req.param("appId"), c.req.param("jobId"))));
7037
+ } catch (error) {
7038
+ return this.handleServiceAppError(c, error);
7039
+ }
7040
+ };
7041
+ /** Inspect durable Resident delivery facts; payload stays private to the instance journal. */
7042
+ listResidentInbox = async (c) => {
7043
+ try {
7044
+ return c.json(ok(await this.params.serviceAppManager.listResidentInbox(c.req.param("appId"), { deadLettersOnly: c.req.query("deadLetters") === "true" })));
7045
+ } catch (error) {
7046
+ return this.handleServiceAppError(c, error);
7047
+ }
7048
+ };
7049
+ replayResidentDeadLetter = async (c) => {
7050
+ try {
7051
+ return c.json(ok(await this.params.serviceAppManager.replayResidentDeadLetter(c.req.param("appId"), c.req.param("eventId"))));
7052
+ } catch (error) {
7053
+ return this.handleServiceAppError(c, error);
7054
+ }
7055
+ };
6800
7056
  grantServiceAction = async (c) => {
6801
7057
  try {
6802
7058
  const bridgeSession = this.requireBridgeSession(c);
@@ -6898,8 +7154,24 @@ var ServiceAppsRoutesController = class {
6898
7154
  };
6899
7155
  return null;
6900
7156
  };
7157
+ readOptionalQuery = (c, key) => {
7158
+ return c.req.query(key)?.trim() || void 0;
7159
+ };
7160
+ readLocale = (c) => c.req.query("locale") === "en" ? "en" : "zh-CN";
7161
+ readLimit = (c) => {
7162
+ const raw = c.req.query("limit");
7163
+ if (!raw) return void 0;
7164
+ const value = Number(raw);
7165
+ return Number.isInteger(value) && value > 0 ? value : void 0;
7166
+ };
7167
+ readAfterSequence = (c) => {
7168
+ const raw = c.req.query("afterSequence");
7169
+ if (raw === void 0 || raw === "") return void 0;
7170
+ const value = Number(raw);
7171
+ return Number.isInteger(value) && value >= 0 ? value : null;
7172
+ };
6901
7173
  handleServiceAppError = (c, error) => {
6902
- if (isServiceAppError(error)) return c.json(err(error.code, error.message), statusForServiceAppError(error.code));
7174
+ if (isServiceAppError(error)) return c.json(err(error.code, error.message, error.details), statusForServiceAppError(error.code));
6903
7175
  if (isPanelAppError(error)) return c.json(err(error.code, error.message), 404);
6904
7176
  if (error instanceof Error && error.message === "panel app bridge session is required") return c.json(err("PANEL_APP_BRIDGE_SESSION_REQUIRED", error.message), 401);
6905
7177
  return c.json(err("SERVICE_APP_REQUEST_FAILED", "The Service App request failed. Please retry."), 500);
@@ -6994,7 +7266,8 @@ function createUiRouteControllers(options, authService, marketplaceBaseUrls, ser
6994
7266
  projects: new ProjectsRoutesController(kernel.projectManager),
6995
7267
  serviceApps: new ServiceAppsRoutesController({
6996
7268
  panelAppManager: kernel.panelAppManager,
6997
- serviceAppManager: kernel.serviceAppManager
7269
+ serviceAppManager: kernel.serviceAppManager,
7270
+ portableRuntimeAcceptance: kernel.portableRuntimeAcceptance
6998
7271
  }),
6999
7272
  serverPath: new ServerPathRoutesController(serverPathWatchService),
7000
7273
  remote: remoteAccess ? new RemoteRoutesController(remoteAccess) : null,
@@ -7303,6 +7576,51 @@ var UiRouteRegistry = class {
7303
7576
  "/api/app-packages/:appId",
7304
7577
  appPackages.get
7305
7578
  ],
7579
+ [
7580
+ "get",
7581
+ "/api/app-packages/:appId/dependencies",
7582
+ appPackages.inspectDependencies
7583
+ ],
7584
+ [
7585
+ "get",
7586
+ "/api/app-packages/:appId/dependencies/verify",
7587
+ appPackages.verifyDependencies
7588
+ ],
7589
+ [
7590
+ "post",
7591
+ "/api/app-packages/:appId/dependencies/setup",
7592
+ appPackages.setupDependencies
7593
+ ],
7594
+ [
7595
+ "post",
7596
+ "/api/app-packages/:appId/dependencies/bind",
7597
+ appPackages.bindDependency
7598
+ ],
7599
+ [
7600
+ "post",
7601
+ "/api/app-packages/:appId/dependencies/unbind",
7602
+ appPackages.unbindDependency
7603
+ ],
7604
+ [
7605
+ "get",
7606
+ "/api/app-packages/:appId/secrets",
7607
+ appPackages.inspectSecrets
7608
+ ],
7609
+ [
7610
+ "post",
7611
+ "/api/app-packages/:appId/secrets/verify",
7612
+ appPackages.verifySecrets
7613
+ ],
7614
+ [
7615
+ "post",
7616
+ "/api/app-packages/:appId/secrets/bind",
7617
+ appPackages.bindSecret
7618
+ ],
7619
+ [
7620
+ "post",
7621
+ "/api/app-packages/:appId/secrets/unbind",
7622
+ appPackages.unbindSecret
7623
+ ],
7306
7624
  [
7307
7625
  "post",
7308
7626
  "/api/app-packages/:appId/enable",
@@ -7443,6 +7761,26 @@ var UiRouteRegistry = class {
7443
7761
  "/api/service-apps",
7444
7762
  serviceApps.listServiceApps
7445
7763
  ],
7764
+ [
7765
+ "get",
7766
+ "/api/service-apps/:appId/ai-capabilities",
7767
+ serviceApps.inspectServiceAppAiCapabilities
7768
+ ],
7769
+ [
7770
+ "post",
7771
+ "/api/service-apps/:appId/ai-capabilities/verify",
7772
+ serviceApps.verifyServiceAppAiCapabilities
7773
+ ],
7774
+ [
7775
+ "post",
7776
+ "/api/service-apps/:appId/ai-capabilities/bind",
7777
+ serviceApps.bindServiceAppAiCapability
7778
+ ],
7779
+ [
7780
+ "post",
7781
+ "/api/service-apps/:appId/ai-capabilities/unbind",
7782
+ serviceApps.unbindServiceAppAiCapability
7783
+ ],
7446
7784
  [
7447
7785
  "post",
7448
7786
  "/api/service-apps/:appId/restart",
@@ -7453,6 +7791,36 @@ var UiRouteRegistry = class {
7453
7791
  "/api/service-apps/:appId/actions/discover",
7454
7792
  serviceApps.discoverServiceAppActions
7455
7793
  ],
7794
+ [
7795
+ "get",
7796
+ "/api/service-apps/:appId/jobs",
7797
+ serviceApps.listServiceAppJobs
7798
+ ],
7799
+ [
7800
+ "get",
7801
+ "/api/service-apps/:appId/jobs/:jobId",
7802
+ serviceApps.getServiceAppJob
7803
+ ],
7804
+ [
7805
+ "get",
7806
+ "/api/service-apps/:appId/jobs/:jobId/watch",
7807
+ serviceApps.watchServiceAppJob
7808
+ ],
7809
+ [
7810
+ "post",
7811
+ "/api/service-apps/:appId/jobs/:jobId/cancel",
7812
+ serviceApps.cancelServiceAppJob
7813
+ ],
7814
+ [
7815
+ "get",
7816
+ "/api/service-apps/:appId/resident-inbox",
7817
+ serviceApps.listResidentInbox
7818
+ ],
7819
+ [
7820
+ "post",
7821
+ "/api/service-apps/:appId/resident-inbox/:eventId/replay",
7822
+ serviceApps.replayResidentDeadLetter
7823
+ ],
7456
7824
  [
7457
7825
  "get",
7458
7826
  "/api/service-apps/:appId",
@@ -7473,6 +7841,31 @@ var UiRouteRegistry = class {
7473
7841
  "/api/service-actions/:actionId/invoke",
7474
7842
  serviceApps.invokeServiceAction
7475
7843
  ],
7844
+ [
7845
+ "post",
7846
+ "/api/service-apps/:appId/actions/:actionName/invoke",
7847
+ serviceApps.invokeInstalledServiceAction
7848
+ ],
7849
+ [
7850
+ "get",
7851
+ "/api/runtime-verification-records",
7852
+ serviceApps.listVerificationRecords
7853
+ ],
7854
+ [
7855
+ "get",
7856
+ "/api/portable-runtime/acceptance/contract",
7857
+ serviceApps.getPortableRuntimeAcceptanceContract
7858
+ ],
7859
+ [
7860
+ "get",
7861
+ "/api/portable-runtime/acceptance/status",
7862
+ serviceApps.getPortableRuntimeAcceptanceStatus
7863
+ ],
7864
+ [
7865
+ "get",
7866
+ "/api/portable-runtime/acceptance/export",
7867
+ serviceApps.exportPortableRuntimeAcceptance
7868
+ ],
7476
7869
  [
7477
7870
  "post",
7478
7871
  "/api/service-actions/:actionId/grant",
@@ -7498,6 +7891,11 @@ var UiRouteRegistry = class {
7498
7891
  "/api/agents/:agentId/service-action-grants",
7499
7892
  serviceApps.grantAgentServiceActions
7500
7893
  ],
7894
+ [
7895
+ "post",
7896
+ "/api/agents/:agentId/service-actions/:actionId/invoke",
7897
+ serviceApps.invokeAgentServiceAction
7898
+ ],
7501
7899
  [
7502
7900
  "delete",
7503
7901
  "/api/service-action-grants/:actionId",