@cat-factory/server 0.30.0 → 0.32.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.
Files changed (166) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +2 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/config/types.d.ts +1 -15
  5. package/dist/config/types.d.ts.map +1 -1
  6. package/dist/github/FetchGitHubClient.d.ts +15 -1
  7. package/dist/github/FetchGitHubClient.d.ts.map +1 -1
  8. package/dist/github/FetchGitHubClient.js +128 -7
  9. package/dist/github/FetchGitHubClient.js.map +1 -1
  10. package/dist/github/GitHubPullRequestReviewProvider.d.ts +25 -0
  11. package/dist/github/GitHubPullRequestReviewProvider.d.ts.map +1 -0
  12. package/dist/github/GitHubPullRequestReviewProvider.js +170 -0
  13. package/dist/github/GitHubPullRequestReviewProvider.js.map +1 -0
  14. package/dist/http/errorHandler.d.ts.map +1 -1
  15. package/dist/http/errorHandler.js +20 -0
  16. package/dist/http/errorHandler.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/modules/accounts/AccountController.d.ts +4 -0
  22. package/dist/modules/accounts/AccountController.d.ts.map +1 -1
  23. package/dist/modules/accounts/AccountController.js +78 -58
  24. package/dist/modules/accounts/AccountController.js.map +1 -1
  25. package/dist/modules/agentRuns/AgentRunController.d.ts.map +1 -1
  26. package/dist/modules/agentRuns/AgentRunController.js +8 -6
  27. package/dist/modules/agentRuns/AgentRunController.js.map +1 -1
  28. package/dist/modules/auth/AuthController.d.ts.map +1 -1
  29. package/dist/modules/auth/AuthController.js +23 -23
  30. package/dist/modules/auth/AuthController.js.map +1 -1
  31. package/dist/modules/board/BoardController.d.ts.map +1 -1
  32. package/dist/modules/board/BoardController.js +26 -26
  33. package/dist/modules/board/BoardController.js.map +1 -1
  34. package/dist/modules/bootstrap/BootstrapController.d.ts.map +1 -1
  35. package/dist/modules/bootstrap/BootstrapController.js +15 -15
  36. package/dist/modules/bootstrap/BootstrapController.js.map +1 -1
  37. package/dist/modules/brainstorm/BrainstormController.d.ts +3 -2
  38. package/dist/modules/brainstorm/BrainstormController.d.ts.map +1 -1
  39. package/dist/modules/brainstorm/BrainstormController.js +36 -52
  40. package/dist/modules/brainstorm/BrainstormController.js.map +1 -1
  41. package/dist/modules/clarity/ClarityReviewController.d.ts.map +1 -1
  42. package/dist/modules/clarity/ClarityReviewController.js +27 -25
  43. package/dist/modules/clarity/ClarityReviewController.js.map +1 -1
  44. package/dist/modules/consensus/ConsensusController.d.ts.map +1 -1
  45. package/dist/modules/consensus/ConsensusController.js +6 -4
  46. package/dist/modules/consensus/ConsensusController.js.map +1 -1
  47. package/dist/modules/documents/DocumentSourceController.d.ts.map +1 -1
  48. package/dist/modules/documents/DocumentSourceController.js +17 -17
  49. package/dist/modules/documents/DocumentSourceController.js.map +1 -1
  50. package/dist/modules/environments/EnvironmentController.d.ts.map +1 -1
  51. package/dist/modules/environments/EnvironmentController.js +24 -24
  52. package/dist/modules/environments/EnvironmentController.js.map +1 -1
  53. package/dist/modules/execution/ExecutionController.d.ts.map +1 -1
  54. package/dist/modules/execution/ExecutionController.js +57 -45
  55. package/dist/modules/execution/ExecutionController.js.map +1 -1
  56. package/dist/modules/followUp/FollowUpController.d.ts.map +1 -1
  57. package/dist/modules/followUp/FollowUpController.js +21 -17
  58. package/dist/modules/followUp/FollowUpController.js.map +1 -1
  59. package/dist/modules/fragmentLibrary/FragmentLibraryController.d.ts.map +1 -1
  60. package/dist/modules/fragmentLibrary/FragmentLibraryController.js +26 -26
  61. package/dist/modules/fragmentLibrary/FragmentLibraryController.js.map +1 -1
  62. package/dist/modules/github/GitHubController.d.ts.map +1 -1
  63. package/dist/modules/github/GitHubController.js +44 -44
  64. package/dist/modules/github/GitHubController.js.map +1 -1
  65. package/dist/modules/humanReview/HumanReviewController.d.ts +11 -0
  66. package/dist/modules/humanReview/HumanReviewController.d.ts.map +1 -0
  67. package/dist/modules/humanReview/HumanReviewController.js +22 -0
  68. package/dist/modules/humanReview/HumanReviewController.js.map +1 -0
  69. package/dist/modules/humanTest/HumanTestController.d.ts.map +1 -1
  70. package/dist/modules/humanTest/HumanTestController.js +17 -17
  71. package/dist/modules/humanTest/HumanTestController.js.map +1 -1
  72. package/dist/modules/incidentEnrichment/IncidentEnrichmentController.d.ts.map +1 -1
  73. package/dist/modules/incidentEnrichment/IncidentEnrichmentController.js +7 -7
  74. package/dist/modules/incidentEnrichment/IncidentEnrichmentController.js.map +1 -1
  75. package/dist/modules/kaizen/KaizenController.d.ts.map +1 -1
  76. package/dist/modules/kaizen/KaizenController.js +7 -5
  77. package/dist/modules/kaizen/KaizenController.js.map +1 -1
  78. package/dist/modules/localModels/LocalModelEndpointController.d.ts.map +1 -1
  79. package/dist/modules/localModels/LocalModelEndpointController.js +10 -11
  80. package/dist/modules/localModels/LocalModelEndpointController.js.map +1 -1
  81. package/dist/modules/localSettings/LocalSettingsController.d.ts.map +1 -1
  82. package/dist/modules/localSettings/LocalSettingsController.js +6 -6
  83. package/dist/modules/localSettings/LocalSettingsController.js.map +1 -1
  84. package/dist/modules/merge/MergePresetController.d.ts.map +1 -1
  85. package/dist/modules/merge/MergePresetController.js +10 -10
  86. package/dist/modules/merge/MergePresetController.js.map +1 -1
  87. package/dist/modules/modelPresets/ModelPresetController.d.ts.map +1 -1
  88. package/dist/modules/modelPresets/ModelPresetController.js +10 -10
  89. package/dist/modules/modelPresets/ModelPresetController.js.map +1 -1
  90. package/dist/modules/models/ModelController.d.ts.map +1 -1
  91. package/dist/modules/models/ModelController.js +6 -4
  92. package/dist/modules/models/ModelController.js.map +1 -1
  93. package/dist/modules/notifications/NotificationController.d.ts.map +1 -1
  94. package/dist/modules/notifications/NotificationController.js +11 -9
  95. package/dist/modules/notifications/NotificationController.js.map +1 -1
  96. package/dist/modules/openrouter/OpenRouterCatalogController.d.ts.map +1 -1
  97. package/dist/modules/openrouter/OpenRouterCatalogController.js +9 -10
  98. package/dist/modules/openrouter/OpenRouterCatalogController.js.map +1 -1
  99. package/dist/modules/pipelines/PipelineController.d.ts.map +1 -1
  100. package/dist/modules/pipelines/PipelineController.js +17 -15
  101. package/dist/modules/pipelines/PipelineController.js.map +1 -1
  102. package/dist/modules/promptFragments/PromptFragmentController.d.ts.map +1 -1
  103. package/dist/modules/promptFragments/PromptFragmentController.js +4 -2
  104. package/dist/modules/promptFragments/PromptFragmentController.js.map +1 -1
  105. package/dist/modules/providers/ApiKeyController.d.ts.map +1 -1
  106. package/dist/modules/providers/ApiKeyController.js +12 -12
  107. package/dist/modules/providers/ApiKeyController.js.map +1 -1
  108. package/dist/modules/providers/PersonalSubscriptionController.d.ts.map +1 -1
  109. package/dist/modules/providers/PersonalSubscriptionController.js +7 -8
  110. package/dist/modules/providers/PersonalSubscriptionController.js.map +1 -1
  111. package/dist/modules/providers/UserSecretController.d.ts.map +1 -1
  112. package/dist/modules/providers/UserSecretController.js +14 -15
  113. package/dist/modules/providers/UserSecretController.js.map +1 -1
  114. package/dist/modules/providers/VendorCredentialController.d.ts.map +1 -1
  115. package/dist/modules/providers/VendorCredentialController.js +7 -7
  116. package/dist/modules/providers/VendorCredentialController.js.map +1 -1
  117. package/dist/modules/providers/personalCredentialGate.d.ts +2 -2
  118. package/dist/modules/providers/personalCredentialGate.d.ts.map +1 -1
  119. package/dist/modules/providers/personalCredentialGate.js.map +1 -1
  120. package/dist/modules/provisioningLogs/ProvisioningLogController.d.ts.map +1 -1
  121. package/dist/modules/provisioningLogs/ProvisioningLogController.js +4 -3
  122. package/dist/modules/provisioningLogs/ProvisioningLogController.js.map +1 -1
  123. package/dist/modules/recurring/RecurringPipelineController.d.ts.map +1 -1
  124. package/dist/modules/recurring/RecurringPipelineController.js +15 -15
  125. package/dist/modules/recurring/RecurringPipelineController.js.map +1 -1
  126. package/dist/modules/recurring/TrackerSettingsController.d.ts.map +1 -1
  127. package/dist/modules/recurring/TrackerSettingsController.js +6 -6
  128. package/dist/modules/recurring/TrackerSettingsController.js.map +1 -1
  129. package/dist/modules/releaseHealth/ReleaseHealthController.d.ts.map +1 -1
  130. package/dist/modules/releaseHealth/ReleaseHealthController.js +14 -14
  131. package/dist/modules/releaseHealth/ReleaseHealthController.js.map +1 -1
  132. package/dist/modules/requirements/RequirementReviewController.d.ts.map +1 -1
  133. package/dist/modules/requirements/RequirementReviewController.js +43 -38
  134. package/dist/modules/requirements/RequirementReviewController.js.map +1 -1
  135. package/dist/modules/runners/RunnerPoolController.d.ts.map +1 -1
  136. package/dist/modules/runners/RunnerPoolController.js +12 -12
  137. package/dist/modules/runners/RunnerPoolController.js.map +1 -1
  138. package/dist/modules/sandbox/SandboxController.d.ts.map +1 -1
  139. package/dist/modules/sandbox/SandboxController.js +35 -26
  140. package/dist/modules/sandbox/SandboxController.js.map +1 -1
  141. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.d.ts.map +1 -1
  142. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.js +6 -6
  143. package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.js.map +1 -1
  144. package/dist/modules/serviceSpec/ServiceSpecController.d.ts.map +1 -1
  145. package/dist/modules/serviceSpec/ServiceSpecController.js +9 -8
  146. package/dist/modules/serviceSpec/ServiceSpecController.js.map +1 -1
  147. package/dist/modules/services/ServiceMountController.d.ts.map +1 -1
  148. package/dist/modules/services/ServiceMountController.js +14 -14
  149. package/dist/modules/services/ServiceMountController.js.map +1 -1
  150. package/dist/modules/settings/WorkspaceSettingsController.d.ts.map +1 -1
  151. package/dist/modules/settings/WorkspaceSettingsController.js +6 -6
  152. package/dist/modules/settings/WorkspaceSettingsController.js.map +1 -1
  153. package/dist/modules/slack/SlackController.d.ts.map +1 -1
  154. package/dist/modules/slack/SlackController.js +18 -18
  155. package/dist/modules/slack/SlackController.js.map +1 -1
  156. package/dist/modules/tasks/TaskSourceController.d.ts.map +1 -1
  157. package/dist/modules/tasks/TaskSourceController.js +19 -19
  158. package/dist/modules/tasks/TaskSourceController.js.map +1 -1
  159. package/dist/modules/workspaces/WorkspaceController.d.ts.map +1 -1
  160. package/dist/modules/workspaces/WorkspaceController.js +11 -11
  161. package/dist/modules/workspaces/WorkspaceController.js.map +1 -1
  162. package/package.json +11 -9
  163. package/dist/http/validation.d.ts +0 -21
  164. package/dist/http/validation.d.ts.map +0 -1
  165. package/dist/http/validation.js +0 -21
  166. package/dist/http/validation.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"IncidentEnrichmentController.d.ts","sourceRoot":"","sources":["../../../src/modules/incidentEnrichment/IncidentEnrichmentController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAoB/C;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAAC,MAAM,CAAC,CAuB3D"}
1
+ {"version":3,"file":"IncidentEnrichmentController.d.ts","sourceRoot":"","sources":["../../../src/modules/incidentEnrichment/IncidentEnrichmentController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAqB/C;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAAC,MAAM,CAAC,CAuB3D"}
@@ -1,7 +1,7 @@
1
- import { upsertIncidentEnrichmentSchema } from '@cat-factory/contracts';
1
+ import { deleteIncidentEnrichmentContract, getIncidentEnrichmentContract, setIncidentEnrichmentContract, } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
2
3
  import { Hono } from 'hono';
3
4
  import { param } from '../../http/params.js';
4
- import { jsonBody } from '../../http/validation.js';
5
5
  /** Resolve the incident-enrichment module or send a 503, returning null when unconfigured. */
6
6
  function requireIncidentEnrichment(c) {
7
7
  return c.get('container').incidentEnrichmentSettings ?? null;
@@ -19,19 +19,19 @@ const unavailable = (c) => c.json({
19
19
  */
20
20
  export function incidentEnrichmentController() {
21
21
  const app = new Hono();
22
- app.get('/incident-enrichment', async (c) => {
22
+ buildHonoRoute(app, getIncidentEnrichmentContract, async (c) => {
23
23
  const ie = requireIncidentEnrichment(c);
24
24
  if (!ie)
25
25
  return unavailable(c);
26
- return c.json(await ie.service.getConnection(param(c, 'workspaceId')));
26
+ return c.json(await ie.service.getConnection(param(c, 'workspaceId')), 200);
27
27
  });
28
- app.put('/incident-enrichment', jsonBody(upsertIncidentEnrichmentSchema), async (c) => {
28
+ buildHonoRoute(app, setIncidentEnrichmentContract, async (c) => {
29
29
  const ie = requireIncidentEnrichment(c);
30
30
  if (!ie)
31
31
  return unavailable(c);
32
- return c.json(await ie.service.setConnection(param(c, 'workspaceId'), c.req.valid('json')));
32
+ return c.json(await ie.service.setConnection(param(c, 'workspaceId'), c.req.valid('json')), 200);
33
33
  });
34
- app.delete('/incident-enrichment', async (c) => {
34
+ buildHonoRoute(app, deleteIncidentEnrichmentContract, async (c) => {
35
35
  const ie = requireIncidentEnrichment(c);
36
36
  if (!ie)
37
37
  return unavailable(c);
@@ -1 +1 @@
1
- {"version":3,"file":"IncidentEnrichmentController.js","sourceRoot":"","sources":["../../../src/modules/incidentEnrichment/IncidentEnrichmentController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,8FAA8F;AAC9F,SAAS,yBAAyB,CAAC,CAAkB;IACnD,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,0BAA0B,IAAI,IAAI,CAAA;AAC9D,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAE,EAAE,CACzC,CAAC,CAAC,IAAI,CACJ;IACE,KAAK,EAAE;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,uDAAuD;KACjE;CACF,EACD,GAAG,CACJ,CAAA;AAEH;;;;GAIG;AACH,MAAM,UAAU,4BAA4B;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,EAAE,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC,8BAA8B,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpF,MAAM,EAAE,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,EAAE,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"IncidentEnrichmentController.js","sourceRoot":"","sources":["../../../src/modules/incidentEnrichment/IncidentEnrichmentController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C,8FAA8F;AAC9F,SAAS,yBAAyB,CAChC,CAAa;IAEb,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,0BAA0B,IAAI,IAAI,CAAA;AAC9D,CAAC;AAED,MAAM,WAAW,GAAG,CAAmB,CAAa,EAAE,EAAE,CACtD,CAAC,CAAC,IAAI,CACJ;IACE,KAAK,EAAE;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,uDAAuD;KACjE;CACF,EACD,GAAG,CACJ,CAAA;AAEH;;;;GAIG;AACH,MAAM,UAAU,4BAA4B;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,cAAc,CAAC,GAAG,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7D,MAAM,EAAE,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7D,MAAM,EAAE,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAC9B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,gCAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChE,MAAM,EAAE,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QAC1D,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"KaizenController.d.ts","sourceRoot":"","sources":["../../../src/modules/kaizen/KaizenController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,CAuB/C"}
1
+ {"version":3,"file":"KaizenController.d.ts","sourceRoot":"","sources":["../../../src/modules/kaizen/KaizenController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,CAuB/C"}
@@ -1,3 +1,5 @@
1
+ import { getKaizenOverviewContract, getKaizenRunGradingsContract } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
1
3
  import { Hono } from 'hono';
2
4
  import { param } from '../../http/params.js';
3
5
  /** Resolve the Kaizen module or send a 503, returning null when unconfigured. */
@@ -15,20 +17,20 @@ const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Kaiz
15
17
  export function kaizenController() {
16
18
  const app = new Hono();
17
19
  // The Kaizen screen: recent grading history + the verified-combo library.
18
- app.get('/kaizen', async (c) => {
20
+ buildHonoRoute(app, getKaizenOverviewContract, async (c) => {
19
21
  const kaizen = requireKaizen(c);
20
22
  if (!kaizen)
21
23
  return unavailable(c);
22
24
  const overview = await kaizen.service.getOverview(param(c, 'workspaceId'));
23
- return c.json(overview);
25
+ return c.json(overview, 200);
24
26
  });
25
27
  // The gradings recorded for one run (the run-window status surface).
26
- app.get('/executions/:executionId/kaizen', async (c) => {
28
+ buildHonoRoute(app, getKaizenRunGradingsContract, async (c) => {
27
29
  const kaizen = requireKaizen(c);
28
30
  if (!kaizen)
29
31
  return unavailable(c);
30
- const gradings = await kaizen.service.listForExecution(param(c, 'workspaceId'), param(c, 'executionId'));
31
- return c.json({ gradings });
32
+ const gradings = await kaizen.service.listForExecution(param(c, 'workspaceId'), c.req.valid('param').executionId);
33
+ return c.json({ gradings }, 200);
32
34
  });
33
35
  return app;
34
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"KaizenController.js","sourceRoot":"","sources":["../../../src/modules/kaizen/KaizenController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C,iFAAiF;AACjF,SAAS,aAAa,CAAC,CAAkB;IACvC,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,IAAI,CAAA;AAC1C,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAE,EAAE,CACzC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AAEtF;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,0EAA0E;IAC1E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QAC1E,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,qEAAqE;IACrE,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,CACpD,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CACxB,CAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"KaizenController.js","sourceRoot":"","sources":["../../../src/modules/kaizen/KaizenController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAEhG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE5C,iFAAiF;AACjF,SAAS,aAAa,CAAmB,CAAa;IACpD,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,IAAI,CAAA;AAC1C,CAAC;AAED,MAAM,WAAW,GAAG,CAAmB,CAAa,EAAE,EAAE,CACtD,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AAEtF;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,0EAA0E;IAC1E,cAAc,CAAC,GAAG,EAAE,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QAC1E,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,qEAAqE;IACrE,cAAc,CAAC,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,CACpD,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,CACjC,CAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalModelEndpointController.d.ts","sourceRoot":"","sources":["../../../src/modules/localModels/LocalModelEndpointController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAkB/C,wBAAgB,4BAA4B,IAAI,IAAI,CAAC,MAAM,CAAC,CA8C3D"}
1
+ {"version":3,"file":"LocalModelEndpointController.d.ts","sourceRoot":"","sources":["../../../src/modules/localModels/LocalModelEndpointController.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAgB/C,wBAAgB,4BAA4B,IAAI,IAAI,CAAC,MAAM,CAAC,CA0C3D"}
@@ -1,8 +1,7 @@
1
- import { localRunnerSchema, testLocalModelEndpointSchema, upsertLocalModelEndpointSchema, } from '@cat-factory/contracts';
1
+ import { listLocalModelEndpointsContract, localRunnerSchema, removeLocalModelEndpointContract, testLocalModelEndpointContract, upsertLocalModelEndpointContract, } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
2
3
  import * as v from 'valibot';
3
4
  import { Hono } from 'hono';
4
- import { param } from '../../http/params.js';
5
- import { jsonBody } from '../../http/validation.js';
6
5
  // Per-USER locally-run model endpoints (Ollama / LM Studio / llama.cpp / vLLM / custom
7
6
  // OpenAI-compatible runners). A runner lives on the user's own machine, so endpoints are
8
7
  // scoped to the signed-in user — mounted at the root (not under a workspace) and require
@@ -11,47 +10,47 @@ const signInRequired = (c) => c.json({ error: { code: 'unauthorized', message: '
11
10
  const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Local model runner storage is not configured' } }, 503);
12
11
  export function localModelEndpointController() {
13
12
  const app = new Hono();
14
- app.get('/local-model-endpoints', async (c) => {
13
+ buildHonoRoute(app, listLocalModelEndpointsContract, async (c) => {
15
14
  const local = c.get('container').localModelEndpoints;
16
15
  if (!local)
17
16
  return unavailable(c);
18
17
  const user = c.get('user');
19
18
  if (!user)
20
19
  return signInRequired(c);
21
- return c.json({ endpoints: await local.list(user.id) });
20
+ return c.json({ endpoints: await local.list(user.id) }, 200);
22
21
  });
23
- app.put('/local-model-endpoints/:provider', jsonBody(upsertLocalModelEndpointSchema), async (c) => {
22
+ buildHonoRoute(app, upsertLocalModelEndpointContract, async (c) => {
24
23
  const local = c.get('container').localModelEndpoints;
25
24
  if (!local)
26
25
  return unavailable(c);
27
26
  const user = c.get('user');
28
27
  if (!user)
29
28
  return signInRequired(c);
30
- const provider = v.parse(localRunnerSchema, param(c, 'provider'));
29
+ const provider = v.parse(localRunnerSchema, c.req.valid('param').provider);
31
30
  const body = c.req.valid('json');
32
31
  const endpoint = await local.upsert(user.id, { ...body, provider });
33
32
  return c.json(endpoint, 201);
34
33
  });
35
- app.delete('/local-model-endpoints/:provider', async (c) => {
34
+ buildHonoRoute(app, removeLocalModelEndpointContract, async (c) => {
36
35
  const local = c.get('container').localModelEndpoints;
37
36
  if (!local)
38
37
  return unavailable(c);
39
38
  const user = c.get('user');
40
39
  if (!user)
41
40
  return signInRequired(c);
42
- const provider = v.parse(localRunnerSchema, param(c, 'provider'));
41
+ const provider = v.parse(localRunnerSchema, c.req.valid('param').provider);
43
42
  await local.remove(user.id, provider);
44
43
  return c.body(null, 204);
45
44
  });
46
45
  // Probe a runner's `/models` server-side so the UI can validate the URL + list models.
47
- app.post('/local-model-endpoints/test', jsonBody(testLocalModelEndpointSchema), async (c) => {
46
+ buildHonoRoute(app, testLocalModelEndpointContract, async (c) => {
48
47
  const local = c.get('container').localModelEndpoints;
49
48
  if (!local)
50
49
  return unavailable(c);
51
50
  const user = c.get('user');
52
51
  if (!user)
53
52
  return signInRequired(c);
54
- return c.json(await local.testConnection(c.req.valid('json')));
53
+ return c.json(await local.testConnection(c.req.valid('json')), 200);
55
54
  });
56
55
  return app;
57
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LocalModelEndpointController.js","sourceRoot":"","sources":["../../../src/modules/localModels/LocalModelEndpointController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LocalModelEndpointController.js","sourceRoot":"","sources":["../../../src/modules/localModels/LocalModelEndpointController.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalSettingsController.d.ts","sourceRoot":"","sources":["../../../src/modules/localSettings/LocalSettingsController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAAC,MAAM,CAAC,CA2BtD"}
1
+ {"version":3,"file":"LocalSettingsController.d.ts","sourceRoot":"","sources":["../../../src/modules/localSettings/LocalSettingsController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAAC,MAAM,CAAC,CA2BtD"}
@@ -1,6 +1,6 @@
1
- import { updateLocalSettingsSchema } from '@cat-factory/contracts';
1
+ import { getLocalSettingsContract, updateLocalSettingsContract } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
2
3
  import { Hono } from 'hono';
3
- import { jsonBody } from '../../http/validation.js';
4
4
  /**
5
5
  * Local-mode operational settings (warm-container-pool sizing + per-repo checkout reuse),
6
6
  * a per-deployment singleton that replaced the old `LOCAL_POOL_*` / `HARNESS_*` env vars.
@@ -18,17 +18,17 @@ export function localSettingsController() {
18
18
  message: 'Local-mode settings are only available on the local-mode service',
19
19
  },
20
20
  }, 503);
21
- app.get('/local-settings', async (c) => {
21
+ buildHonoRoute(app, getLocalSettingsContract, async (c) => {
22
22
  const container = c.get('container');
23
23
  if (!container.localSettings)
24
24
  return unavailable(c);
25
- return c.json(await container.localSettings.service.read());
25
+ return c.json(await container.localSettings.service.read(), 200);
26
26
  });
27
- app.put('/local-settings', jsonBody(updateLocalSettingsSchema), async (c) => {
27
+ buildHonoRoute(app, updateLocalSettingsContract, async (c) => {
28
28
  const container = c.get('container');
29
29
  if (!container.localSettings)
30
30
  return unavailable(c);
31
- return c.json(await container.localSettings.service.write(c.req.valid('json')));
31
+ return c.json(await container.localSettings.service.write(c.req.valid('json')), 200);
32
32
  });
33
33
  return app;
34
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LocalSettingsController.js","sourceRoot":"","sources":["../../../src/modules/localSettings/LocalSettingsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,MAAM,WAAW,GAAG,CAAC,CAAkB,EAAE,EAAE,CACzC,CAAC,CAAC,IAAI,CACJ;QACE,KAAK,EAAE;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,kEAAkE;SAC5E;KACF,EACD,GAAG,CACJ,CAAA;IAEH,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,aAAa;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1E,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,aAAa;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACjF,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"LocalSettingsController.js","sourceRoot":"","sources":["../../../src/modules/localSettings/LocalSettingsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAI3B;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,MAAM,WAAW,GAAG,CAAmB,CAAa,EAAE,EAAE,CACtD,CAAC,CAAC,IAAI,CACJ;QACE,KAAK,EAAE;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,kEAAkE;SAC5E;KACF,EACD,GAAG,CACJ,CAAA;IAEH,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,aAAa;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,aAAa;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAA;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MergePresetController.d.ts","sourceRoot":"","sources":["../../../src/modules/merge/MergePresetController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAY/C;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CAmCpD"}
1
+ {"version":3,"file":"MergePresetController.d.ts","sourceRoot":"","sources":["../../../src/modules/merge/MergePresetController.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CAmCpD"}
@@ -1,7 +1,7 @@
1
- import { createMergePresetSchema, updateMergePresetSchema } from '@cat-factory/contracts';
1
+ import { createMergePresetContract, deleteMergePresetContract, listMergePresetsContract, updateMergePresetContract, } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
2
3
  import { Hono } from 'hono';
3
4
  import { param } from '../../http/params.js';
4
- import { jsonBody } from '../../http/validation.js';
5
5
  /** Resolve the merge-preset module or send a 503, returning null when unconfigured. */
6
6
  function requireMergePresets(c) {
7
7
  return c.get('container').mergePresets ?? null;
@@ -14,31 +14,31 @@ const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Merg
14
14
  */
15
15
  export function mergePresetController() {
16
16
  const app = new Hono();
17
- app.get('/merge-presets', async (c) => {
17
+ buildHonoRoute(app, listMergePresetsContract, async (c) => {
18
18
  const presets = requireMergePresets(c);
19
19
  if (!presets)
20
20
  return unavailable(c);
21
- return c.json(await presets.service.list(param(c, 'workspaceId')));
21
+ return c.json(await presets.service.list(param(c, 'workspaceId')), 200);
22
22
  });
23
- app.post('/merge-presets', jsonBody(createMergePresetSchema), async (c) => {
23
+ buildHonoRoute(app, createMergePresetContract, async (c) => {
24
24
  const presets = requireMergePresets(c);
25
25
  if (!presets)
26
26
  return unavailable(c);
27
27
  const preset = await presets.service.create(param(c, 'workspaceId'), c.req.valid('json'));
28
28
  return c.json(preset, 201);
29
29
  });
30
- app.patch('/merge-presets/:presetId', jsonBody(updateMergePresetSchema), async (c) => {
30
+ buildHonoRoute(app, updateMergePresetContract, async (c) => {
31
31
  const presets = requireMergePresets(c);
32
32
  if (!presets)
33
33
  return unavailable(c);
34
- const preset = await presets.service.update(param(c, 'workspaceId'), param(c, 'presetId'), c.req.valid('json'));
35
- return c.json(preset);
34
+ const preset = await presets.service.update(param(c, 'workspaceId'), c.req.valid('param').presetId, c.req.valid('json'));
35
+ return c.json(preset, 200);
36
36
  });
37
- app.delete('/merge-presets/:presetId', async (c) => {
37
+ buildHonoRoute(app, deleteMergePresetContract, async (c) => {
38
38
  const presets = requireMergePresets(c);
39
39
  if (!presets)
40
40
  return unavailable(c);
41
- await presets.service.remove(param(c, 'workspaceId'), param(c, 'presetId'));
41
+ await presets.service.remove(param(c, 'workspaceId'), c.req.valid('param').presetId);
42
42
  return c.body(null, 204);
43
43
  });
44
44
  return app;
@@ -1 +1 @@
1
- {"version":3,"file":"MergePresetController.js","sourceRoot":"","sources":["../../../src/modules/merge/MergePresetController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MergePresetController.js","sourceRoot":"","sources":["../../../src/modules/merge/MergePresetController.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ModelPresetController.d.ts","sourceRoot":"","sources":["../../../src/modules/modelPresets/ModelPresetController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAY/C;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CAmCpD"}
1
+ {"version":3,"file":"ModelPresetController.d.ts","sourceRoot":"","sources":["../../../src/modules/modelPresets/ModelPresetController.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CAmCpD"}
@@ -1,7 +1,7 @@
1
- import { createModelPresetSchema, updateModelPresetSchema } from '@cat-factory/contracts';
1
+ import { createModelPresetContract, deleteModelPresetContract, listModelPresetsContract, updateModelPresetContract, } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
2
3
  import { Hono } from 'hono';
3
4
  import { param } from '../../http/params.js';
4
- import { jsonBody } from '../../http/validation.js';
5
5
  /** Resolve the model-preset module or send a 503, returning null when unconfigured. */
6
6
  function requireModelPresets(c) {
7
7
  return c.get('container').modelPresets ?? null;
@@ -15,31 +15,31 @@ const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Mode
15
15
  */
16
16
  export function modelPresetController() {
17
17
  const app = new Hono();
18
- app.get('/model-presets', async (c) => {
18
+ buildHonoRoute(app, listModelPresetsContract, async (c) => {
19
19
  const presets = requireModelPresets(c);
20
20
  if (!presets)
21
21
  return unavailable(c);
22
- return c.json(await presets.service.list(param(c, 'workspaceId')));
22
+ return c.json(await presets.service.list(param(c, 'workspaceId')), 200);
23
23
  });
24
- app.post('/model-presets', jsonBody(createModelPresetSchema), async (c) => {
24
+ buildHonoRoute(app, createModelPresetContract, async (c) => {
25
25
  const presets = requireModelPresets(c);
26
26
  if (!presets)
27
27
  return unavailable(c);
28
28
  const preset = await presets.service.create(param(c, 'workspaceId'), c.req.valid('json'));
29
29
  return c.json(preset, 201);
30
30
  });
31
- app.patch('/model-presets/:presetId', jsonBody(updateModelPresetSchema), async (c) => {
31
+ buildHonoRoute(app, updateModelPresetContract, async (c) => {
32
32
  const presets = requireModelPresets(c);
33
33
  if (!presets)
34
34
  return unavailable(c);
35
- const preset = await presets.service.update(param(c, 'workspaceId'), param(c, 'presetId'), c.req.valid('json'));
36
- return c.json(preset);
35
+ const preset = await presets.service.update(param(c, 'workspaceId'), c.req.valid('param').presetId, c.req.valid('json'));
36
+ return c.json(preset, 200);
37
37
  });
38
- app.delete('/model-presets/:presetId', async (c) => {
38
+ buildHonoRoute(app, deleteModelPresetContract, async (c) => {
39
39
  const presets = requireModelPresets(c);
40
40
  if (!presets)
41
41
  return unavailable(c);
42
- await presets.service.remove(param(c, 'workspaceId'), param(c, 'presetId'));
42
+ await presets.service.remove(param(c, 'workspaceId'), c.req.valid('param').presetId);
43
43
  return c.body(null, 204);
44
44
  });
45
45
  return app;
@@ -1 +1 @@
1
- {"version":3,"file":"ModelPresetController.js","sourceRoot":"","sources":["../../../src/modules/modelPresets/ModelPresetController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ModelPresetController.js","sourceRoot":"","sources":["../../../src/modules/modelPresets/ModelPresetController.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ModelController.d.ts","sourceRoot":"","sources":["../../../src/modules/models/ModelController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,CAwC9C"}
1
+ {"version":3,"file":"ModelController.d.ts","sourceRoot":"","sources":["../../../src/modules/models/ModelController.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,CAyC9C"}
@@ -1,5 +1,7 @@
1
+ import { listModelsContract, listWorkspaceModelsContract } from '@cat-factory/contracts';
1
2
  import { effectiveCatalogWith, localSelectableModels, openRouterSelectableModels, } from '@cat-factory/kernel';
2
3
  import { modelCostResolver, withDynamicPrices } from '@cat-factory/spend';
4
+ import { buildHonoRoute } from '@toad-contracts/hono';
3
5
  import { Hono } from 'hono';
4
6
  import { param } from '../../http/params.js';
5
7
  import { resolveWorkspaceCapabilities } from '../../agents/providerCapabilities.js';
@@ -15,13 +17,13 @@ export function modelController() {
15
17
  // Deployment-level catalog (no workspace context): deployment-wide selectability
16
18
  // only (no per-workspace direct keys / subscriptions). The picker uses the
17
19
  // per-workspace route below; this stays for contexts without a workspace.
18
- app.get('/models', (c) => {
20
+ buildHonoRoute(app, listModelsContract, (c) => {
19
21
  c.header('Cache-Control', 'public, max-age=60');
20
- return c.json(c.get('container').config.models);
22
+ return c.json(c.get('container').config.models, 200);
21
23
  });
22
24
  // Per-workspace catalog: selectability reflects this workspace's (+ its account's +
23
25
  // the caller's) configured API keys and subscription tokens.
24
- app.get('/workspaces/:workspaceId/models', async (c) => {
26
+ buildHonoRoute(app, listWorkspaceModelsContract, async (c) => {
25
27
  const container = c.get('container');
26
28
  const workspaceId = param(c, 'workspaceId');
27
29
  const userId = c.get('user')?.id;
@@ -37,7 +39,7 @@ export function modelController() {
37
39
  ? await container.openRouterCatalog.capabilitiesFor(workspaceId)
38
40
  : [];
39
41
  const costFor = modelCostResolver(withDynamicPrices(container.config.spend, openRouter));
40
- return c.json(effectiveCatalogWith([...localSelectableModels(local), ...openRouterSelectableModels(openRouter)], caps, costFor));
42
+ return c.json(effectiveCatalogWith([...localSelectableModels(local), ...openRouterSelectableModels(openRouter)], caps, costFor), 200);
41
43
  });
42
44
  return app;
43
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ModelController.js","sourceRoot":"","sources":["../../../src/modules/models/ModelController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAA;AAEnF;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,iFAAiF;IACjF,2EAA2E;IAC3E,0EAA0E;IAC1E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACvB,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAA;QAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,oFAAoF;IACpF,6DAA6D;IAC7D,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,4BAA4B,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QAC/E,qFAAqF;QACrF,kFAAkF;QAClF,MAAM,KAAK,GACT,MAAM,IAAI,SAAS,CAAC,mBAAmB;YACrC,CAAC,CAAC,MAAM,SAAS,CAAC,mBAAmB,CAAC,eAAe,CAAC,MAAM,CAAC;YAC7D,CAAC,CAAC,EAAE,CAAA;QACR,sFAAsF;QACtF,wFAAwF;QACxF,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB;YAC5C,CAAC,CAAC,MAAM,SAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC;YAChE,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,OAAO,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;QACxF,OAAO,CAAC,CAAC,IAAI,CACX,oBAAoB,CAClB,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,EAAE,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC,EAC5E,IAAI,EACJ,OAAO,CACR,CACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"ModelController.js","sourceRoot":"","sources":["../../../src/modules/models/ModelController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACxF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAA;AAEnF;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,iFAAiF;IACjF,2EAA2E;IAC3E,0EAA0E;IAC1E,cAAc,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5C,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAA;QAC/C,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,oFAAoF;IACpF,6DAA6D;IAC7D,cAAc,CAAC,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;QAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,4BAA4B,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QAC/E,qFAAqF;QACrF,kFAAkF;QAClF,MAAM,KAAK,GACT,MAAM,IAAI,SAAS,CAAC,mBAAmB;YACrC,CAAC,CAAC,MAAM,SAAS,CAAC,mBAAmB,CAAC,eAAe,CAAC,MAAM,CAAC;YAC7D,CAAC,CAAC,EAAE,CAAA;QACR,sFAAsF;QACtF,wFAAwF;QACxF,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB;YAC5C,CAAC,CAAC,MAAM,SAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC;YAChE,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,OAAO,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;QACxF,OAAO,CAAC,CAAC,IAAI,CACX,oBAAoB,CAClB,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,EAAE,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC,EAC5E,IAAI,EACJ,OAAO,CACR,EACD,GAAG,CACJ,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationController.d.ts","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAK3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,MAAM,CAAC,CAyDrD"}
1
+ {"version":3,"file":"NotificationController.d.ts","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAW/C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,MAAM,CAAC,CA0DrD"}
@@ -1,5 +1,7 @@
1
- import { Hono } from 'hono';
1
+ import { actNotificationContract, dismissNotificationContract, listNotificationsContract, } from '@cat-factory/contracts';
2
2
  import { NotFoundError } from '@cat-factory/kernel';
3
+ import { buildHonoRoute } from '@toad-contracts/hono';
4
+ import { Hono } from 'hono';
3
5
  import { runWithInitiator } from '../../github/runInitiatorContext.js';
4
6
  import { param } from '../../http/params.js';
5
7
  /** Resolve the notifications module or send a 503, returning null when unconfigured. */
@@ -19,24 +21,24 @@ const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'Noti
19
21
  export function notificationController() {
20
22
  const app = new Hono();
21
23
  // Open notifications for the board inbox (the snapshot also carries these).
22
- app.get('/notifications', async (c) => {
24
+ buildHonoRoute(app, listNotificationsContract, async (c) => {
23
25
  const notifications = requireNotifications(c);
24
26
  if (!notifications)
25
27
  return unavailable(c);
26
- return c.json(await notifications.service.listOpen(param(c, 'workspaceId')));
28
+ return c.json(await notifications.service.listOpen(param(c, 'workspaceId')), 200);
27
29
  });
28
30
  // Act on a notification: run its side-effect, then mark it acted.
29
- app.post('/notifications/:notificationId/act', async (c) => {
31
+ buildHonoRoute(app, actNotificationContract, async (c) => {
30
32
  const notifications = requireNotifications(c);
31
33
  if (!notifications)
32
34
  return unavailable(c);
33
35
  const workspaceId = param(c, 'workspaceId');
34
- const id = param(c, 'notificationId');
36
+ const id = c.req.valid('param').notificationId;
35
37
  const notification = await notifications.service.get(workspaceId, id);
36
38
  if (!notification)
37
39
  throw new NotFoundError('Notification', id);
38
40
  if (notification.status !== 'open')
39
- return c.json(notification);
41
+ return c.json(notification, 200);
40
42
  const container = c.get('container');
41
43
  switch (notification.type) {
42
44
  case 'merge_review':
@@ -55,14 +57,14 @@ export function notificationController() {
55
57
  }
56
58
  break;
57
59
  }
58
- return c.json(await notifications.service.resolve(workspaceId, id, 'act'));
60
+ return c.json(await notifications.service.resolve(workspaceId, id, 'act'), 200);
59
61
  });
60
62
  // Dismiss a notification without acting on it.
61
- app.post('/notifications/:notificationId/dismiss', async (c) => {
63
+ buildHonoRoute(app, dismissNotificationContract, async (c) => {
62
64
  const notifications = requireNotifications(c);
63
65
  if (!notifications)
64
66
  return unavailable(c);
65
- return c.json(await notifications.service.resolve(param(c, 'workspaceId'), param(c, 'notificationId'), 'dismiss'));
67
+ return c.json(await notifications.service.resolve(param(c, 'workspaceId'), c.req.valid('param').notificationId, 'dismiss'), 200);
66
68
  });
67
69
  return app;
68
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationController.js","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotificationController.js","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OpenRouterCatalogController.d.ts","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAsB/C,wBAAgB,2BAA2B,IAAI,IAAI,CAAC,MAAM,CAAC,CAmC1D"}
1
+ {"version":3,"file":"OpenRouterCatalogController.d.ts","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAoB/C,wBAAgB,2BAA2B,IAAI,IAAI,CAAC,MAAM,CAAC,CA+B1D"}
@@ -1,45 +1,44 @@
1
- import { upsertOpenRouterCatalogSchema } from '@cat-factory/contracts';
1
+ import { getOpenRouterCatalogContract, refreshOpenRouterCatalogContract, upsertOpenRouterCatalogContract, } from '@cat-factory/contracts';
2
+ import { buildHonoRoute } from '@toad-contracts/hono';
2
3
  import { Hono } from 'hono';
3
- import { param } from '../../http/params.js';
4
- import { jsonBody } from '../../http/validation.js';
5
4
  // Per-WORKSPACE OpenRouter dynamic catalog. OpenRouter is a single OpenAI-compatible
6
5
  // gateway to 300+ models reached via the workspace's API-key pool; a workspace browses the
7
6
  // live catalog (`/refresh`, leasing the pooled OpenRouter key server-side) and enables a
8
7
  // subset (`PUT /catalog`). The enabled models surface in the per-workspace model picker and
9
- // feed the spend budget. Mounted under a workspace; requires a signed-in user.
8
+ // feed the spend budget. Mounted at `/` (workspaceId is a path param); requires a signed-in user.
10
9
  const signInRequired = (c) => c.json({ error: { code: 'unauthorized', message: 'Sign in to manage the OpenRouter catalog' } }, 401);
11
10
  const unavailable = (c) => c.json({ error: { code: 'unavailable', message: 'OpenRouter catalog storage is not configured' } }, 503);
12
11
  export function openRouterCatalogController() {
13
12
  const app = new Hono();
14
13
  // The workspace's enabled OpenRouter models (empty when none configured yet).
15
- app.get('/workspaces/:workspaceId/openrouter/catalog', async (c) => {
14
+ buildHonoRoute(app, getOpenRouterCatalogContract, async (c) => {
16
15
  const svc = c.get('container').openRouterCatalog;
17
16
  if (!svc)
18
17
  return unavailable(c);
19
18
  if (!c.get('user'))
20
19
  return signInRequired(c);
21
- return c.json(await svc.get(param(c, 'workspaceId')));
20
+ return c.json(await svc.get(c.req.valid('param').workspaceId), 200);
22
21
  });
23
22
  // Replace the workspace's enabled subset (the client sends each model's metadata it read
24
23
  // from the browse list, so the server + spend table get accurate context + pricing).
25
- app.put('/workspaces/:workspaceId/openrouter/catalog', jsonBody(upsertOpenRouterCatalogSchema), async (c) => {
24
+ buildHonoRoute(app, upsertOpenRouterCatalogContract, async (c) => {
26
25
  const svc = c.get('container').openRouterCatalog;
27
26
  if (!svc)
28
27
  return unavailable(c);
29
28
  if (!c.get('user'))
30
29
  return signInRequired(c);
31
- return c.json(await svc.upsert(param(c, 'workspaceId'), c.req.valid('json')));
30
+ return c.json(await svc.upsert(c.req.valid('param').workspaceId, c.req.valid('json')), 200);
32
31
  });
33
32
  // Probe OpenRouter's live `/models` for the browse list (leases the workspace's pooled
34
33
  // OpenRouter key server-side). Never throws — failures come back as { reachable: false }.
35
- app.post('/workspaces/:workspaceId/openrouter/refresh', async (c) => {
34
+ buildHonoRoute(app, refreshOpenRouterCatalogContract, async (c) => {
36
35
  const svc = c.get('container').openRouterCatalog;
37
36
  if (!svc)
38
37
  return unavailable(c);
39
38
  const user = c.get('user');
40
39
  if (!user)
41
40
  return signInRequired(c);
42
- return c.json(await svc.refresh(param(c, 'workspaceId'), { userId: user.id }));
41
+ return c.json(await svc.refresh(c.req.valid('param').workspaceId, { userId: user.id }), 200);
43
42
  });
44
43
  return app;
45
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OpenRouterCatalogController.js","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenRouterCatalogController.js","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"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"}