@cat-factory/server 0.167.0 → 0.169.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/agents/modelProviderResolver.d.ts +9 -1
- package/dist/agents/modelProviderResolver.d.ts.map +1 -1
- package/dist/agents/modelProviderResolver.js +1 -0
- package/dist/agents/modelProviderResolver.js.map +1 -1
- package/dist/agents/storeAgentContextGate.d.ts +36 -0
- package/dist/agents/storeAgentContextGate.d.ts.map +1 -0
- package/dist/agents/storeAgentContextGate.js +36 -0
- package/dist/agents/storeAgentContextGate.js.map +1 -0
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +2 -1
- package/dist/auth/middleware.js.map +1 -1
- package/dist/http/errorHandler.d.ts.map +1 -1
- package/dist/http/errorHandler.js +6 -0
- package/dist/http/errorHandler.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/accounts/AccountController.d.ts.map +1 -1
- package/dist/modules/accounts/AccountController.js +37 -31
- package/dist/modules/accounts/AccountController.js.map +1 -1
- package/dist/modules/agentRuns/AgentRunController.d.ts.map +1 -1
- package/dist/modules/agentRuns/AgentRunController.js +9 -6
- package/dist/modules/agentRuns/AgentRunController.js.map +1 -1
- package/dist/modules/artifacts/ArtifactController.d.ts.map +1 -1
- package/dist/modules/artifacts/ArtifactController.js +8 -5
- package/dist/modules/artifacts/ArtifactController.js.map +1 -1
- package/dist/modules/artifacts/HarnessArtifactController.d.ts.map +1 -1
- package/dist/modules/artifacts/HarnessArtifactController.js +5 -4
- package/dist/modules/artifacts/HarnessArtifactController.js.map +1 -1
- package/dist/modules/auth/AuthController.d.ts.map +1 -1
- package/dist/modules/auth/AuthController.js +48 -50
- package/dist/modules/auth/AuthController.js.map +1 -1
- package/dist/modules/bootstrap/BootstrapController.d.ts.map +1 -1
- package/dist/modules/bootstrap/BootstrapController.js +12 -9
- package/dist/modules/bootstrap/BootstrapController.js.map +1 -1
- package/dist/modules/brainstorm/BrainstormController.d.ts.map +1 -1
- package/dist/modules/brainstorm/BrainstormController.js +12 -9
- package/dist/modules/brainstorm/BrainstormController.js.map +1 -1
- package/dist/modules/bugHunt/BugHuntController.d.ts.map +1 -1
- package/dist/modules/bugHunt/BugHuntController.js +7 -5
- package/dist/modules/bugHunt/BugHuntController.js.map +1 -1
- package/dist/modules/clarity/ClarityReviewController.d.ts.map +1 -1
- package/dist/modules/clarity/ClarityReviewController.js +12 -9
- package/dist/modules/clarity/ClarityReviewController.js.map +1 -1
- package/dist/modules/docInterview/DocInterviewController.d.ts.map +1 -1
- package/dist/modules/docInterview/DocInterviewController.js +8 -5
- package/dist/modules/docInterview/DocInterviewController.js.map +1 -1
- package/dist/modules/documents/DocumentSourceController.d.ts.map +1 -1
- package/dist/modules/documents/DocumentSourceController.js +17 -15
- package/dist/modules/documents/DocumentSourceController.js.map +1 -1
- package/dist/modules/environments/EnvironmentController.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentController.js +33 -33
- package/dist/modules/environments/EnvironmentController.js.map +1 -1
- package/dist/modules/environments/EnvironmentUserHandlerController.d.ts.map +1 -1
- package/dist/modules/environments/EnvironmentUserHandlerController.js +13 -9
- package/dist/modules/environments/EnvironmentUserHandlerController.js.map +1 -1
- package/dist/modules/fragmentLibrary/FragmentLibraryController.d.ts.map +1 -1
- package/dist/modules/fragmentLibrary/FragmentLibraryController.js +32 -41
- package/dist/modules/fragmentLibrary/FragmentLibraryController.js.map +1 -1
- package/dist/modules/github/GitHubController.d.ts.map +1 -1
- package/dist/modules/github/GitHubController.js +26 -23
- package/dist/modules/github/GitHubController.js.map +1 -1
- package/dist/modules/github/GitHubWebhookController.d.ts.map +1 -1
- package/dist/modules/github/GitHubWebhookController.js +5 -4
- package/dist/modules/github/GitHubWebhookController.js.map +1 -1
- package/dist/modules/gitlab/GitLabController.d.ts.map +1 -1
- package/dist/modules/gitlab/GitLabController.js +7 -4
- package/dist/modules/gitlab/GitLabController.js.map +1 -1
- package/dist/modules/incidentEnrichment/IncidentEnrichmentController.d.ts.map +1 -1
- package/dist/modules/incidentEnrichment/IncidentEnrichmentController.js +7 -9
- package/dist/modules/incidentEnrichment/IncidentEnrichmentController.js.map +1 -1
- package/dist/modules/initiatives/InitiativeController.d.ts.map +1 -1
- package/dist/modules/initiatives/InitiativeController.js +20 -17
- package/dist/modules/initiatives/InitiativeController.js.map +1 -1
- package/dist/modules/kaizen/KaizenController.d.ts.map +1 -1
- package/dist/modules/kaizen/KaizenController.js +6 -3
- package/dist/modules/kaizen/KaizenController.js.map +1 -1
- package/dist/modules/llmProxy/LlmProxyController.d.ts.map +1 -1
- package/dist/modules/llmProxy/LlmProxyController.js +41 -12
- package/dist/modules/llmProxy/LlmProxyController.js.map +1 -1
- package/dist/modules/localModels/LocalModelEndpointController.d.ts.map +1 -1
- package/dist/modules/localModels/LocalModelEndpointController.js +15 -10
- package/dist/modules/localModels/LocalModelEndpointController.js.map +1 -1
- package/dist/modules/localSettings/LocalSettingsController.d.ts.map +1 -1
- package/dist/modules/localSettings/LocalSettingsController.js +6 -8
- package/dist/modules/localSettings/LocalSettingsController.js.map +1 -1
- package/dist/modules/localSettings/MothershipConnectController.d.ts.map +1 -1
- package/dist/modules/localSettings/MothershipConnectController.js +2 -6
- package/dist/modules/localSettings/MothershipConnectController.js.map +1 -1
- package/dist/modules/merge/MergeTrackRecordController.d.ts.map +1 -1
- package/dist/modules/merge/MergeTrackRecordController.js +6 -3
- package/dist/modules/merge/MergeTrackRecordController.js.map +1 -1
- package/dist/modules/merge/RiskPolicyController.d.ts.map +1 -1
- package/dist/modules/merge/RiskPolicyController.js +9 -6
- package/dist/modules/merge/RiskPolicyController.js.map +1 -1
- package/dist/modules/modelPresets/ModelPresetController.d.ts.map +1 -1
- package/dist/modules/modelPresets/ModelPresetController.js +9 -6
- package/dist/modules/modelPresets/ModelPresetController.js.map +1 -1
- package/dist/modules/notificationWebhook/NotificationWebhookController.d.ts.map +1 -1
- package/dist/modules/notificationWebhook/NotificationWebhookController.js +7 -4
- package/dist/modules/notificationWebhook/NotificationWebhookController.js.map +1 -1
- package/dist/modules/notifications/NotificationController.d.ts.map +1 -1
- package/dist/modules/notifications/NotificationController.js +7 -4
- package/dist/modules/notifications/NotificationController.js.map +1 -1
- package/dist/modules/observability/PlatformObservabilityController.d.ts.map +1 -1
- package/dist/modules/observability/PlatformObservabilityController.js +6 -8
- package/dist/modules/observability/PlatformObservabilityController.js.map +1 -1
- package/dist/modules/openrouter/OpenRouterCatalogController.d.ts.map +1 -1
- package/dist/modules/openrouter/OpenRouterCatalogController.js +13 -8
- package/dist/modules/openrouter/OpenRouterCatalogController.js.map +1 -1
- package/dist/modules/packageRegistries/PackageRegistriesController.d.ts.map +1 -1
- package/dist/modules/packageRegistries/PackageRegistriesController.js +7 -9
- package/dist/modules/packageRegistries/PackageRegistriesController.js.map +1 -1
- package/dist/modules/persistence/GitHubDelegationController.d.ts.map +1 -1
- package/dist/modules/persistence/GitHubDelegationController.js +3 -7
- package/dist/modules/persistence/GitHubDelegationController.js.map +1 -1
- package/dist/modules/preflight/PreflightController.d.ts.map +1 -1
- package/dist/modules/preflight/PreflightController.js +5 -7
- package/dist/modules/preflight/PreflightController.js.map +1 -1
- package/dist/modules/preview/PreviewController.d.ts.map +1 -1
- package/dist/modules/preview/PreviewController.js +7 -9
- package/dist/modules/preview/PreviewController.js.map +1 -1
- package/dist/modules/providers/ApiKeyController.d.ts.map +1 -1
- package/dist/modules/providers/ApiKeyController.js +19 -14
- package/dist/modules/providers/ApiKeyController.js.map +1 -1
- package/dist/modules/providers/PersonalSubscriptionController.d.ts.map +1 -1
- package/dist/modules/providers/PersonalSubscriptionController.js +13 -8
- package/dist/modules/providers/PersonalSubscriptionController.js.map +1 -1
- package/dist/modules/providers/UserSecretController.d.ts.map +1 -1
- package/dist/modules/providers/UserSecretController.js +17 -12
- package/dist/modules/providers/UserSecretController.js.map +1 -1
- package/dist/modules/providers/VendorCredentialController.d.ts.map +1 -1
- package/dist/modules/providers/VendorCredentialController.js +8 -10
- package/dist/modules/providers/VendorCredentialController.js.map +1 -1
- package/dist/modules/provisioningLogs/ProvisioningLogController.d.ts.map +1 -1
- package/dist/modules/provisioningLogs/ProvisioningLogController.js +5 -2
- package/dist/modules/provisioningLogs/ProvisioningLogController.js.map +1 -1
- package/dist/modules/publicApi/PublicApiController.js +4 -4
- package/dist/modules/publicApi/PublicApiController.js.map +1 -1
- package/dist/modules/publicApi/PublicApiKeyController.d.ts.map +1 -1
- package/dist/modules/publicApi/PublicApiKeyController.js +7 -4
- package/dist/modules/publicApi/PublicApiKeyController.js.map +1 -1
- package/dist/modules/recurring/RecurringPipelineController.d.ts.map +1 -1
- package/dist/modules/recurring/RecurringPipelineController.js +10 -7
- package/dist/modules/recurring/RecurringPipelineController.js.map +1 -1
- package/dist/modules/recurring/TrackerSettingsController.d.ts.map +1 -1
- package/dist/modules/recurring/TrackerSettingsController.js +6 -3
- package/dist/modules/recurring/TrackerSettingsController.js.map +1 -1
- package/dist/modules/releaseHealth/ReleaseHealthController.d.ts.map +1 -1
- package/dist/modules/releaseHealth/ReleaseHealthController.js +10 -7
- package/dist/modules/releaseHealth/ReleaseHealthController.js.map +1 -1
- package/dist/modules/reports/ReportsController.d.ts.map +1 -1
- package/dist/modules/reports/ReportsController.js +6 -3
- package/dist/modules/reports/ReportsController.js.map +1 -1
- package/dist/modules/requirements/RequirementReviewController.d.ts.map +1 -1
- package/dist/modules/requirements/RequirementReviewController.js +16 -13
- package/dist/modules/requirements/RequirementReviewController.js.map +1 -1
- package/dist/modules/runners/RunnerPoolController.d.ts.map +1 -1
- package/dist/modules/runners/RunnerPoolController.js +10 -7
- package/dist/modules/runners/RunnerPoolController.js.map +1 -1
- package/dist/modules/sandbox/SandboxController.d.ts.map +1 -1
- package/dist/modules/sandbox/SandboxController.js +17 -14
- package/dist/modules/sandbox/SandboxController.js.map +1 -1
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.d.ts.map +1 -1
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.js +6 -3
- package/dist/modules/serviceFragmentDefaults/ServiceFragmentDefaultsController.js.map +1 -1
- package/dist/modules/services/ServiceMountController.d.ts.map +1 -1
- package/dist/modules/services/ServiceMountController.js +9 -6
- package/dist/modules/services/ServiceMountController.js.map +1 -1
- package/dist/modules/settings/WorkspaceSettingsController.d.ts.map +1 -1
- package/dist/modules/settings/WorkspaceSettingsController.js +6 -3
- package/dist/modules/settings/WorkspaceSettingsController.js.map +1 -1
- package/dist/modules/sharedStack/SharedStackController.d.ts.map +1 -1
- package/dist/modules/sharedStack/SharedStackController.js +11 -8
- package/dist/modules/sharedStack/SharedStackController.js.map +1 -1
- package/dist/modules/skillLibrary/SkillLibraryController.d.ts.map +1 -1
- package/dist/modules/skillLibrary/SkillLibraryController.js +19 -19
- package/dist/modules/skillLibrary/SkillLibraryController.js.map +1 -1
- package/dist/modules/slack/SlackController.d.ts.map +1 -1
- package/dist/modules/slack/SlackController.js +16 -13
- package/dist/modules/slack/SlackController.js.map +1 -1
- package/dist/modules/tasks/TaskSourceController.d.ts.map +1 -1
- package/dist/modules/tasks/TaskSourceController.js +26 -24
- package/dist/modules/tasks/TaskSourceController.js.map +1 -1
- package/dist/modules/tasks/TaskWebhookController.d.ts.map +1 -1
- package/dist/modules/tasks/TaskWebhookController.js +4 -4
- package/dist/modules/tasks/TaskWebhookController.js.map +1 -1
- package/dist/modules/testSecrets/TestSecretsController.d.ts.map +1 -1
- package/dist/modules/testSecrets/TestSecretsController.js +7 -9
- package/dist/modules/testSecrets/TestSecretsController.js.map +1 -1
- package/dist/modules/userSettings/UserSettingsController.d.ts.map +1 -1
- package/dist/modules/userSettings/UserSettingsController.js +11 -6
- package/dist/modules/userSettings/UserSettingsController.js.map +1 -1
- package/dist/modules/validation/ValidationConfigController.d.ts.map +1 -1
- package/dist/modules/validation/ValidationConfigController.js +52 -11
- package/dist/modules/validation/ValidationConfigController.js.map +1 -1
- package/dist/modules/vcs/VcsWebhookController.d.ts.map +1 -1
- package/dist/modules/vcs/VcsWebhookController.js +5 -5
- package/dist/modules/vcs/VcsWebhookController.js.map +1 -1
- package/dist/modules/webSearch/WebSearchProxyController.d.ts.map +1 -1
- package/dist/modules/webSearch/WebSearchProxyController.js +3 -3
- package/dist/modules/webSearch/WebSearchProxyController.js.map +1 -1
- package/dist/modules/workspaces/WorkspaceMemberController.d.ts.map +1 -1
- package/dist/modules/workspaces/WorkspaceMemberController.js +9 -6
- package/dist/modules/workspaces/WorkspaceMemberController.js.map +1 -1
- package/dist/persistence/rpc-allowlist.d.ts.map +1 -1
- package/dist/persistence/rpc-allowlist.js +6 -0
- package/dist/persistence/rpc-allowlist.js.map +1 -1
- package/dist/persistence/rpc.d.ts.map +1 -1
- package/dist/persistence/rpc.js +3 -0
- package/dist/persistence/rpc.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MothershipConnectController.d.ts","sourceRoot":"","sources":["../../../src/modules/localSettings/MothershipConnectController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"MothershipConnectController.d.ts","sourceRoot":"","sources":["../../../src/modules/localSettings/MothershipConnectController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAAC,MAAM,CAAC,CAkC1D"}
|
|
@@ -2,6 +2,7 @@ import { connectMothershipContract } from '@cat-factory/contracts';
|
|
|
2
2
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { mintSession } from '../auth/AuthController.js';
|
|
5
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
5
6
|
/**
|
|
6
7
|
* Local-mode mothership login: `POST /local/mothership/connect`.
|
|
7
8
|
*
|
|
@@ -22,12 +23,7 @@ export function mothershipConnectController() {
|
|
|
22
23
|
buildHonoRoute(app, connectMothershipContract, async (c) => {
|
|
23
24
|
const connector = c.get('container').mothershipConnect;
|
|
24
25
|
if (!connector) {
|
|
25
|
-
|
|
26
|
-
error: {
|
|
27
|
-
code: 'unavailable',
|
|
28
|
-
message: 'Mothership connect is only available on a mothership-mode local node',
|
|
29
|
-
},
|
|
30
|
-
}, 503);
|
|
26
|
+
throw new UnavailableError('Mothership connect is only available on a mothership-mode local node');
|
|
31
27
|
}
|
|
32
28
|
const { session } = c.req.valid('json');
|
|
33
29
|
const result = await connector.connect(session);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MothershipConnectController.js","sourceRoot":"","sources":["../../../src/modules/localSettings/MothershipConnectController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"MothershipConnectController.js","sourceRoot":"","sources":["../../../src/modules/localSettings/MothershipConnectController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,cAAc,CAAC,GAAG,EAAE,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAA;QACtD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,gBAAgB,CACxB,sEAAsE,CACvE,CAAA;QACH,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,6FAA6F;YAC7F,yEAAyE;YACzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAA;YAC7D,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAClF,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CACnB,CAAA;QACH,CAAC;QACD,6FAA6F;QAC7F,0FAA0F;QAC1F,yFAAyF;QACzF,yFAAyF;QACzF,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QAC1C,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACxE,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAChF,GAAG,CACJ,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeTrackRecordController.d.ts","sourceRoot":"","sources":["../../../src/modules/merge/MergeTrackRecordController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"MergeTrackRecordController.d.ts","sourceRoot":"","sources":["../../../src/modules/merge/MergeTrackRecordController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAa/C;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAAC,MAAM,CAAC,CA0BzD"}
|
|
@@ -2,11 +2,14 @@ import { listMergeClassRollupsContract, tagMergeReviewEffortContract } from '@ca
|
|
|
2
2
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { param } from '../../http/params.js';
|
|
5
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
5
6
|
/** Resolve the merge track-record module or send a 503, returning null when unconfigured. */
|
|
6
7
|
function requireTrackRecords(c) {
|
|
7
8
|
return c.get('container').mergeTrackRecords ?? null;
|
|
8
9
|
}
|
|
9
|
-
const unavailable = (
|
|
10
|
+
const unavailable = () => {
|
|
11
|
+
throw new UnavailableError('Merge track records are not configured');
|
|
12
|
+
};
|
|
10
13
|
/**
|
|
11
14
|
* The merge track record's read + tag surface: the per-change-class rollups the preset editor
|
|
12
15
|
* renders each class's rule against, and the reviewer-effort tag a human leaves on a merged PR.
|
|
@@ -23,7 +26,7 @@ export function mergeTrackRecordController() {
|
|
|
23
26
|
buildHonoRoute(app, listMergeClassRollupsContract, async (c) => {
|
|
24
27
|
const records = requireTrackRecords(c);
|
|
25
28
|
if (!records)
|
|
26
|
-
return unavailable(
|
|
29
|
+
return unavailable();
|
|
27
30
|
return c.json(await records.service.rollups(param(c, 'workspaceId')), 200);
|
|
28
31
|
});
|
|
29
32
|
// Tag (or clear) the reviewer effort a merged PR actually needed. The standalone route exists
|
|
@@ -32,7 +35,7 @@ export function mergeTrackRecordController() {
|
|
|
32
35
|
buildHonoRoute(app, tagMergeReviewEffortContract, async (c) => {
|
|
33
36
|
const records = requireTrackRecords(c);
|
|
34
37
|
if (!records)
|
|
35
|
-
return unavailable(
|
|
38
|
+
return unavailable();
|
|
36
39
|
const updated = await records.service.tag(param(c, 'workspaceId'), c.req.valid('param').recordId, c.req.valid('json').reviewEffort);
|
|
37
40
|
return c.json(updated, 200);
|
|
38
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeTrackRecordController.js","sourceRoot":"","sources":["../../../src/modules/merge/MergeTrackRecordController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAEpG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"MergeTrackRecordController.js","sourceRoot":"","sources":["../../../src/modules/merge/MergeTrackRecordController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAEpG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,6FAA6F;AAC7F,SAAS,mBAAmB,CAAmB,CAAa;IAC1D,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,WAAW,GAAG,GAAU,EAAE;IAC9B,MAAM,IAAI,gBAAgB,CAAC,wCAAwC,CAAC,CAAA;AACtE,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,4FAA4F;IAC5F,4BAA4B;IAC5B,cAAc,CAAC,GAAG,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7D,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,WAAW,EAAE,CAAA;QAClC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,8FAA8F;IAC9F,oFAAoF;IACpF,gEAAgE;IAChE,cAAc,CAAC,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,WAAW,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CACvC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY,CACjC,CAAA;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskPolicyController.d.ts","sourceRoot":"","sources":["../../../src/modules/merge/RiskPolicyController.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"RiskPolicyController.d.ts","sourceRoot":"","sources":["../../../src/modules/merge/RiskPolicyController.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAc/C;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,CA8CnD"}
|
|
@@ -3,11 +3,14 @@ import { buildHonoRoute } from '@toad-contracts/hono';
|
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { requireWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
5
5
|
import { param } from '../../http/params.js';
|
|
6
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
6
7
|
/** Resolve the merge-preset module or send a 503, returning null when unconfigured. */
|
|
7
8
|
function requireRiskPolicies(c) {
|
|
8
9
|
return c.get('container').riskPolicies ?? null;
|
|
9
10
|
}
|
|
10
|
-
const unavailable = (
|
|
11
|
+
const unavailable = () => {
|
|
12
|
+
throw new UnavailableError('Risk policies are not configured');
|
|
13
|
+
};
|
|
11
14
|
/**
|
|
12
15
|
* CRUD for a workspace's merge threshold presets (the library a task picks its
|
|
13
16
|
* auto-merge policy from). The default preset is seeded lazily on first list and
|
|
@@ -19,34 +22,34 @@ export function riskPolicyController() {
|
|
|
19
22
|
buildHonoRoute(app, listRiskPoliciesContract, async (c) => {
|
|
20
23
|
const presets = requireRiskPolicies(c);
|
|
21
24
|
if (!presets)
|
|
22
|
-
return unavailable(
|
|
25
|
+
return unavailable();
|
|
23
26
|
return c.json(await presets.service.list(param(c, 'workspaceId')), 200);
|
|
24
27
|
});
|
|
25
28
|
buildHonoRoute(app, createRiskPolicyContract, async (c) => {
|
|
26
29
|
const presets = requireRiskPolicies(c);
|
|
27
30
|
if (!presets)
|
|
28
|
-
return unavailable(
|
|
31
|
+
return unavailable();
|
|
29
32
|
const preset = await presets.service.create(param(c, 'workspaceId'), c.req.valid('json'));
|
|
30
33
|
return c.json(preset, 201);
|
|
31
34
|
});
|
|
32
35
|
buildHonoRoute(app, updateRiskPolicyContract, async (c) => {
|
|
33
36
|
const presets = requireRiskPolicies(c);
|
|
34
37
|
if (!presets)
|
|
35
|
-
return unavailable(
|
|
38
|
+
return unavailable();
|
|
36
39
|
const preset = await presets.service.update(param(c, 'workspaceId'), c.req.valid('param').presetId, c.req.valid('json'));
|
|
37
40
|
return c.json(preset, 200);
|
|
38
41
|
});
|
|
39
42
|
buildHonoRoute(app, deleteRiskPolicyContract, async (c) => {
|
|
40
43
|
const presets = requireRiskPolicies(c);
|
|
41
44
|
if (!presets)
|
|
42
|
-
return unavailable(
|
|
45
|
+
return unavailable();
|
|
43
46
|
await presets.service.remove(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
44
47
|
return c.body(null, 204);
|
|
45
48
|
});
|
|
46
49
|
buildHonoRoute(app, reseedRiskPolicyContract, async (c) => {
|
|
47
50
|
const presets = requireRiskPolicies(c);
|
|
48
51
|
if (!presets)
|
|
49
|
-
return unavailable(
|
|
52
|
+
return unavailable();
|
|
50
53
|
const preset = await presets.service.reseed(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
51
54
|
return c.json(preset, 200);
|
|
52
55
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskPolicyController.js","sourceRoot":"","sources":["../../../src/modules/merge/RiskPolicyController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"RiskPolicyController.js","sourceRoot":"","sources":["../../../src/modules/merge/RiskPolicyController.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":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ModelPresetController.d.ts","sourceRoot":"","sources":["../../../src/modules/modelPresets/ModelPresetController.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAc/C;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CA8CpD"}
|
|
@@ -3,11 +3,14 @@ import { buildHonoRoute } from '@toad-contracts/hono';
|
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { requireWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
5
5
|
import { param } from '../../http/params.js';
|
|
6
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
6
7
|
/** Resolve the model-preset module or send a 503, returning null when unconfigured. */
|
|
7
8
|
function requireModelPresets(c) {
|
|
8
9
|
return c.get('container').modelPresets ?? null;
|
|
9
10
|
}
|
|
10
|
-
const unavailable = (
|
|
11
|
+
const unavailable = () => {
|
|
12
|
+
throw new UnavailableError('Model presets are not configured');
|
|
13
|
+
};
|
|
11
14
|
/**
|
|
12
15
|
* CRUD for a workspace's model presets (the library a task picks its model→agent
|
|
13
16
|
* mapping from; each preset is a base model applied to every agent kind plus per-kind
|
|
@@ -20,34 +23,34 @@ export function modelPresetController() {
|
|
|
20
23
|
buildHonoRoute(app, listModelPresetsContract, async (c) => {
|
|
21
24
|
const presets = requireModelPresets(c);
|
|
22
25
|
if (!presets)
|
|
23
|
-
return unavailable(
|
|
26
|
+
return unavailable();
|
|
24
27
|
return c.json(await presets.service.list(param(c, 'workspaceId')), 200);
|
|
25
28
|
});
|
|
26
29
|
buildHonoRoute(app, createModelPresetContract, async (c) => {
|
|
27
30
|
const presets = requireModelPresets(c);
|
|
28
31
|
if (!presets)
|
|
29
|
-
return unavailable(
|
|
32
|
+
return unavailable();
|
|
30
33
|
const preset = await presets.service.create(param(c, 'workspaceId'), c.req.valid('json'));
|
|
31
34
|
return c.json(preset, 201);
|
|
32
35
|
});
|
|
33
36
|
buildHonoRoute(app, updateModelPresetContract, async (c) => {
|
|
34
37
|
const presets = requireModelPresets(c);
|
|
35
38
|
if (!presets)
|
|
36
|
-
return unavailable(
|
|
39
|
+
return unavailable();
|
|
37
40
|
const preset = await presets.service.update(param(c, 'workspaceId'), c.req.valid('param').presetId, c.req.valid('json'));
|
|
38
41
|
return c.json(preset, 200);
|
|
39
42
|
});
|
|
40
43
|
buildHonoRoute(app, deleteModelPresetContract, async (c) => {
|
|
41
44
|
const presets = requireModelPresets(c);
|
|
42
45
|
if (!presets)
|
|
43
|
-
return unavailable(
|
|
46
|
+
return unavailable();
|
|
44
47
|
await presets.service.remove(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
45
48
|
return c.body(null, 204);
|
|
46
49
|
});
|
|
47
50
|
buildHonoRoute(app, reseedModelPresetContract, async (c) => {
|
|
48
51
|
const presets = requireModelPresets(c);
|
|
49
52
|
if (!presets)
|
|
50
|
-
return unavailable(
|
|
53
|
+
return unavailable();
|
|
51
54
|
const preset = await presets.service.reseed(param(c, 'workspaceId'), c.req.valid('param').presetId);
|
|
52
55
|
return c.json(preset, 200);
|
|
53
56
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelPresetController.js","sourceRoot":"","sources":["../../../src/modules/modelPresets/ModelPresetController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
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":"NotificationWebhookController.d.ts","sourceRoot":"","sources":["../../../src/modules/notificationWebhook/NotificationWebhookController.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"NotificationWebhookController.d.ts","sourceRoot":"","sources":["../../../src/modules/notificationWebhook/NotificationWebhookController.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAc/C;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAAC,MAAM,CAAC,CAyB5D"}
|
|
@@ -3,11 +3,14 @@ import { buildHonoRoute } from '@toad-contracts/hono';
|
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { requireWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
5
5
|
import { param } from '../../http/params.js';
|
|
6
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
6
7
|
/** Resolve the webhook service or send a 503, returning null when unconfigured. */
|
|
7
8
|
function requireWebhooks(c) {
|
|
8
9
|
return c.get('container').notificationWebhooks ?? null;
|
|
9
10
|
}
|
|
10
|
-
const unavailable = (
|
|
11
|
+
const unavailable = () => {
|
|
12
|
+
throw new UnavailableError('Notification webhooks are not configured');
|
|
13
|
+
};
|
|
11
14
|
/**
|
|
12
15
|
* Workspace-scoped management of the OUTBOUND notification webhook: the one HTTPS endpoint a
|
|
13
16
|
* workspace registers to receive its notifications by push. This is how a headless integration —
|
|
@@ -25,20 +28,20 @@ export function notificationWebhookController() {
|
|
|
25
28
|
buildHonoRoute(app, getNotificationWebhookContract, async (c) => {
|
|
26
29
|
const webhooks = requireWebhooks(c);
|
|
27
30
|
if (!webhooks)
|
|
28
|
-
return unavailable(
|
|
31
|
+
return unavailable();
|
|
29
32
|
return c.json(await webhooks.get(param(c, 'workspaceId')), 200);
|
|
30
33
|
});
|
|
31
34
|
buildHonoRoute(app, putNotificationWebhookContract, async (c) => {
|
|
32
35
|
const webhooks = requireWebhooks(c);
|
|
33
36
|
if (!webhooks)
|
|
34
|
-
return unavailable(
|
|
37
|
+
return unavailable();
|
|
35
38
|
const saved = await webhooks.put(param(c, 'workspaceId'), c.req.valid('json'));
|
|
36
39
|
return c.json(saved, 200);
|
|
37
40
|
});
|
|
38
41
|
buildHonoRoute(app, deleteNotificationWebhookContract, async (c) => {
|
|
39
42
|
const webhooks = requireWebhooks(c);
|
|
40
43
|
if (!webhooks)
|
|
41
|
-
return unavailable(
|
|
44
|
+
return unavailable();
|
|
42
45
|
await webhooks.remove(param(c, 'workspaceId'));
|
|
43
46
|
return c.body(null, 204);
|
|
44
47
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationWebhookController.js","sourceRoot":"","sources":["../../../src/modules/notificationWebhook/NotificationWebhookController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"NotificationWebhookController.js","sourceRoot":"","sources":["../../../src/modules/notificationWebhook/NotificationWebhookController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,mFAAmF;AACnF,SAAS,eAAe,CAAmB,CAAa;IACtD,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,oBAAoB,IAAI,IAAI,CAAA;AACxD,CAAC;AAED,MAAM,WAAW,GAAG,GAAU,EAAE;IAC9B,MAAM,IAAI,gBAAgB,CAAC,0CAA0C,CAAC,CAAA;AACxE,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC,CAAA;IAE/D,cAAc,CAAC,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO,WAAW,EAAE,CAAA;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO,WAAW,EAAE,CAAA;QACnC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9E,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,iCAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,CAAC,QAAQ;YAAE,OAAO,WAAW,EAAE,CAAA;QACnC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAA;QAC9C,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":"NotificationController.d.ts","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"NotificationController.d.ts","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAe/C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,MAAM,CAAC,CA2DrD"}
|
|
@@ -4,11 +4,14 @@ import { Hono } from 'hono';
|
|
|
4
4
|
import { optionalJsonBody } from '../../http/optionalJsonBody.js';
|
|
5
5
|
import { param } from '../../http/params.js';
|
|
6
6
|
import { notificationActEffect } from './notificationActions.js';
|
|
7
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
7
8
|
/** Resolve the notifications module or send a 503, returning null when unconfigured. */
|
|
8
9
|
function requireNotifications(c) {
|
|
9
10
|
return c.get('container').notifications ?? null;
|
|
10
11
|
}
|
|
11
|
-
const unavailable = (
|
|
12
|
+
const unavailable = () => {
|
|
13
|
+
throw new UnavailableError('Notifications are not configured');
|
|
14
|
+
};
|
|
12
15
|
/**
|
|
13
16
|
* Human-actionable notifications. `act` performs the notification's typed
|
|
14
17
|
* side-effect (merge the PR for a `merge_review` / `pipeline_complete`, retry the
|
|
@@ -24,7 +27,7 @@ export function notificationController() {
|
|
|
24
27
|
buildHonoRoute(app, listNotificationsContract, async (c) => {
|
|
25
28
|
const notifications = requireNotifications(c);
|
|
26
29
|
if (!notifications)
|
|
27
|
-
return unavailable(
|
|
30
|
+
return unavailable();
|
|
28
31
|
return c.json(await notifications.service.listOpen(param(c, 'workspaceId')), 200);
|
|
29
32
|
});
|
|
30
33
|
// Act on a notification: atomically claim it (`open` → `acted`), then run its side-effect
|
|
@@ -37,7 +40,7 @@ export function notificationController() {
|
|
|
37
40
|
buildHonoRoute(app, actNotificationContract, async (c) => {
|
|
38
41
|
const notifications = requireNotifications(c);
|
|
39
42
|
if (!notifications)
|
|
40
|
-
return unavailable(
|
|
43
|
+
return unavailable();
|
|
41
44
|
const workspaceId = param(c, 'workspaceId');
|
|
42
45
|
const id = c.req.valid('param').notificationId;
|
|
43
46
|
const container = c.get('container');
|
|
@@ -52,7 +55,7 @@ export function notificationController() {
|
|
|
52
55
|
buildHonoRoute(app, dismissNotificationContract, async (c) => {
|
|
53
56
|
const notifications = requireNotifications(c);
|
|
54
57
|
if (!notifications)
|
|
55
|
-
return unavailable(
|
|
58
|
+
return unavailable();
|
|
56
59
|
const container = c.get('container');
|
|
57
60
|
const workspaceId = param(c, 'workspaceId');
|
|
58
61
|
const dismissed = await notifications.service.resolve(workspaceId, c.req.valid('param').notificationId, 'dismiss');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationController.js","sourceRoot":"","sources":["../../../src/modules/notifications/NotificationController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;
|
|
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":"PlatformObservabilityController.d.ts","sourceRoot":"","sources":["../../../src/modules/observability/PlatformObservabilityController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"PlatformObservabilityController.d.ts","sourceRoot":"","sources":["../../../src/modules/observability/PlatformObservabilityController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAa/C;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAAC,MAAM,CAAC,CAiB9D"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { getPlatformObservabilityContract } from '@cat-factory/contracts';
|
|
2
2
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
|
+
import { UnavailableError, UnauthorizedError } from '@cat-factory/kernel';
|
|
4
5
|
/** The signed-in user, or null. Generic over the (contract-typed) env, like AccountController. */
|
|
5
6
|
function accountUser(c) {
|
|
6
7
|
const user = c.get('user');
|
|
7
8
|
return user ? { id: user.id, login: user.login, name: user.name } : null;
|
|
8
9
|
}
|
|
9
|
-
const signInRequired = (
|
|
10
|
+
const signInRequired = () => {
|
|
11
|
+
throw new UnauthorizedError('Sign in to view platform observability');
|
|
12
|
+
};
|
|
10
13
|
/**
|
|
11
14
|
* Platform-operator observability: `GET /accounts/:accountId/observability/platform` — the
|
|
12
15
|
* deployment-level aggregate health of an account's runs (outcomes, failure taxonomy,
|
|
@@ -21,15 +24,10 @@ export function platformObservabilityController() {
|
|
|
21
24
|
buildHonoRoute(app, getPlatformObservabilityContract, async (c) => {
|
|
22
25
|
const user = accountUser(c);
|
|
23
26
|
if (!user)
|
|
24
|
-
return signInRequired(
|
|
27
|
+
return signInRequired();
|
|
25
28
|
const container = c.get('container');
|
|
26
29
|
if (!container.platformObservability) {
|
|
27
|
-
|
|
28
|
-
error: {
|
|
29
|
-
code: 'unavailable',
|
|
30
|
-
message: 'Platform observability is not available on this deployment',
|
|
31
|
-
},
|
|
32
|
-
}, 503);
|
|
30
|
+
throw new UnavailableError('Platform observability is not available on this deployment');
|
|
33
31
|
}
|
|
34
32
|
const { accountId } = c.req.valid('param');
|
|
35
33
|
await container.accountService.requireAdmin(accountId, user.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformObservabilityController.js","sourceRoot":"","sources":["../../../src/modules/observability/PlatformObservabilityController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"PlatformObservabilityController.js","sourceRoot":"","sources":["../../../src/modules/observability/PlatformObservabilityController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEzE,kGAAkG;AAClG,SAAS,WAAW,CAAmB,CAAa;IAClD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1E,CAAC;AAED,MAAM,cAAc,GAAG,GAAU,EAAE;IACjC,MAAM,IAAI,iBAAiB,CAAC,wCAAwC,CAAC,CAAA;AACvE,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,cAAc,CAAC,GAAG,EAAE,gCAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO,cAAc,EAAE,CAAA;QAClC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;YACrC,MAAM,IAAI,gBAAgB,CAAC,4DAA4D,CAAC,CAAA;QAC1F,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC1C,MAAM,SAAS,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAA;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,qBAAqB,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAA;IACxF,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenRouterCatalogController.d.ts","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"OpenRouterCatalogController.d.ts","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAiB/C,wBAAgB,2BAA2B,IAAI,IAAI,CAAC,MAAM,CAAC,CA+B1D"}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import { getOpenRouterCatalogContract, refreshOpenRouterCatalogContract, upsertOpenRouterCatalogContract, } from '@cat-factory/contracts';
|
|
2
2
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
|
+
import { UnavailableError, UnauthorizedError } from '@cat-factory/kernel';
|
|
4
5
|
// Per-WORKSPACE OpenRouter dynamic catalog. OpenRouter is a single OpenAI-compatible
|
|
5
6
|
// gateway to 300+ models reached via the workspace's API-key pool; a workspace browses the
|
|
6
7
|
// live catalog (`/refresh`, leasing the pooled OpenRouter key server-side) and enables a
|
|
7
8
|
// subset (`PUT /catalog`). The enabled models surface in the per-workspace model picker and
|
|
8
9
|
// feed the spend budget. Mounted at `/` (workspaceId is a path param); requires a signed-in user.
|
|
9
|
-
const signInRequired = (
|
|
10
|
-
|
|
10
|
+
const signInRequired = () => {
|
|
11
|
+
throw new UnauthorizedError('Sign in to manage the OpenRouter catalog');
|
|
12
|
+
};
|
|
13
|
+
const unavailable = () => {
|
|
14
|
+
throw new UnavailableError('OpenRouter catalog storage is not configured');
|
|
15
|
+
};
|
|
11
16
|
export function openRouterCatalogController() {
|
|
12
17
|
const app = new Hono();
|
|
13
18
|
// The workspace's enabled OpenRouter models (empty when none configured yet).
|
|
14
19
|
buildHonoRoute(app, getOpenRouterCatalogContract, async (c) => {
|
|
15
20
|
const svc = c.get('container').openRouterCatalog;
|
|
16
21
|
if (!svc)
|
|
17
|
-
return unavailable(
|
|
22
|
+
return unavailable();
|
|
18
23
|
if (!c.get('user'))
|
|
19
|
-
return signInRequired(
|
|
24
|
+
return signInRequired();
|
|
20
25
|
return c.json(await svc.get(c.req.valid('param').workspaceId), 200);
|
|
21
26
|
});
|
|
22
27
|
// Replace the workspace's enabled subset (the client sends each model's metadata it read
|
|
@@ -24,9 +29,9 @@ export function openRouterCatalogController() {
|
|
|
24
29
|
buildHonoRoute(app, upsertOpenRouterCatalogContract, async (c) => {
|
|
25
30
|
const svc = c.get('container').openRouterCatalog;
|
|
26
31
|
if (!svc)
|
|
27
|
-
return unavailable(
|
|
32
|
+
return unavailable();
|
|
28
33
|
if (!c.get('user'))
|
|
29
|
-
return signInRequired(
|
|
34
|
+
return signInRequired();
|
|
30
35
|
return c.json(await svc.upsert(c.req.valid('param').workspaceId, c.req.valid('json')), 200);
|
|
31
36
|
});
|
|
32
37
|
// Probe OpenRouter's live `/models` for the browse list (leases the workspace's pooled
|
|
@@ -34,10 +39,10 @@ export function openRouterCatalogController() {
|
|
|
34
39
|
buildHonoRoute(app, refreshOpenRouterCatalogContract, async (c) => {
|
|
35
40
|
const svc = c.get('container').openRouterCatalog;
|
|
36
41
|
if (!svc)
|
|
37
|
-
return unavailable(
|
|
42
|
+
return unavailable();
|
|
38
43
|
const user = c.get('user');
|
|
39
44
|
if (!user)
|
|
40
|
-
return signInRequired(
|
|
45
|
+
return signInRequired();
|
|
41
46
|
return c.json(await svc.refresh(c.req.valid('param').workspaceId, { userId: user.id }), 200);
|
|
42
47
|
});
|
|
43
48
|
return app;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenRouterCatalogController.js","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"OpenRouterCatalogController.js","sourceRoot":"","sources":["../../../src/modules/openrouter/OpenRouterCatalogController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEzE,qFAAqF;AACrF,2FAA2F;AAC3F,yFAAyF;AACzF,4FAA4F;AAC5F,kGAAkG;AAElG,MAAM,cAAc,GAAG,GAAU,EAAE;IACjC,MAAM,IAAI,iBAAiB,CAAC,0CAA0C,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,GAAU,EAAE;IAC9B,MAAM,IAAI,gBAAgB,CAAC,8CAA8C,CAAC,CAAA;AAC5E,CAAC,CAAA;AAED,MAAM,UAAU,2BAA2B;IACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAE9B,8EAA8E;IAC9E,cAAc,CAAC,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5D,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAA;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO,WAAW,EAAE,CAAA;QAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,cAAc,EAAE,CAAA;QAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,yFAAyF;IACzF,qFAAqF;IACrF,cAAc,CAAC,GAAG,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAA;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO,WAAW,EAAE,CAAA;QAC9B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,cAAc,EAAE,CAAA;QAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,uFAAuF;IACvF,0FAA0F;IAC1F,cAAc,CAAC,GAAG,EAAE,gCAAgC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChE,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAA;QAChD,IAAI,CAAC,GAAG;YAAE,OAAO,WAAW,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1B,IAAI,CAAC,IAAI;YAAE,OAAO,cAAc,EAAE,CAAA;QAClC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PackageRegistriesController.d.ts","sourceRoot":"","sources":["../../../src/modules/packageRegistries/PackageRegistriesController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"PackageRegistriesController.d.ts","sourceRoot":"","sources":["../../../src/modules/packageRegistries/PackageRegistriesController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAc/C;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAAC,MAAM,CAAC,CAwB1D"}
|
|
@@ -3,16 +3,14 @@ import { buildHonoRoute } from '@toad-contracts/hono';
|
|
|
3
3
|
import { Hono } from 'hono';
|
|
4
4
|
import { requireWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
5
5
|
import { param } from '../../http/params.js';
|
|
6
|
+
import { UnavailableError } from '@cat-factory/kernel';
|
|
6
7
|
/** Resolve the package-registries module or send a 503, returning null when unconfigured. */
|
|
7
8
|
function requirePackageRegistries(c) {
|
|
8
9
|
return c.get('container').packageRegistries ?? null;
|
|
9
10
|
}
|
|
10
|
-
const unavailable = (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
message: 'The package-registry integration is not configured',
|
|
14
|
-
},
|
|
15
|
-
}, 503);
|
|
11
|
+
const unavailable = () => {
|
|
12
|
+
throw new UnavailableError('The package-registry integration is not configured');
|
|
13
|
+
};
|
|
16
14
|
/**
|
|
17
15
|
* Per-workspace private package-registry entries (npm private orgs, GitHub Packages)
|
|
18
16
|
* that agent containers use to resolve private dependencies. Tokens are write-only —
|
|
@@ -25,19 +23,19 @@ export function packageRegistriesController() {
|
|
|
25
23
|
buildHonoRoute(app, listPackageRegistriesContract, async (c) => {
|
|
26
24
|
const registries = requirePackageRegistries(c);
|
|
27
25
|
if (!registries)
|
|
28
|
-
return unavailable(
|
|
26
|
+
return unavailable();
|
|
29
27
|
return c.json(await registries.service.list(param(c, 'workspaceId')), 200);
|
|
30
28
|
});
|
|
31
29
|
buildHonoRoute(app, addPackageRegistryContract, async (c) => {
|
|
32
30
|
const registries = requirePackageRegistries(c);
|
|
33
31
|
if (!registries)
|
|
34
|
-
return unavailable(
|
|
32
|
+
return unavailable();
|
|
35
33
|
return c.json(await registries.service.add(param(c, 'workspaceId'), c.req.valid('json')), 200);
|
|
36
34
|
});
|
|
37
35
|
buildHonoRoute(app, deletePackageRegistryContract, async (c) => {
|
|
38
36
|
const registries = requirePackageRegistries(c);
|
|
39
37
|
if (!registries)
|
|
40
|
-
return unavailable(
|
|
38
|
+
return unavailable();
|
|
41
39
|
await registries.service.remove(param(c, 'workspaceId'), c.req.valid('param').entryId);
|
|
42
40
|
return c.body(null, 204);
|
|
43
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PackageRegistriesController.js","sourceRoot":"","sources":["../../../src/modules/packageRegistries/PackageRegistriesController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,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,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"PackageRegistriesController.js","sourceRoot":"","sources":["../../../src/modules/packageRegistries/PackageRegistriesController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,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,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,6FAA6F;AAC7F,SAAS,wBAAwB,CAAmB,CAAa;IAC/D,OAAO,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,WAAW,GAAG,GAAU,EAAE;IAC9B,MAAM,IAAI,gBAAgB,CAAC,oDAAoD,CAAC,CAAA;AAClF,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B;IACzC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAU,CAAA;IAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC,CAAA;IAE/D,cAAc,CAAC,GAAG,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7D,MAAM,UAAU,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU;YAAE,OAAO,WAAW,EAAE,CAAA;QACrC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,UAAU,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU;YAAE,OAAO,WAAW,EAAE,CAAA;QACrC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;IAEF,cAAc,CAAC,GAAG,EAAE,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7D,MAAM,UAAU,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU;YAAE,OAAO,WAAW,EAAE,CAAA;QACrC,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;QACtF,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":"GitHubDelegationController.d.ts","sourceRoot":"","sources":["../../../src/modules/persistence/GitHubDelegationController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"GitHubDelegationController.d.ts","sourceRoot":"","sources":["../../../src/modules/persistence/GitHubDelegationController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,gFAAgF;AAChF,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iCAAiC;IAChD,uEAAuE;IACvE,SAAS,CAAC,EAAE,yBAAyB,CAAA;IACrC,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAUD,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,iCAAsC,GAC9C,IAAI,CAAC,MAAM,CAAC,CAmId"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { signerFor, TOKEN_AUDIENCE } from '../../auth/signing.js';
|
|
3
3
|
import { logger } from '../../observability/logger.js';
|
|
4
|
+
import { UnavailableError, RateLimitedError } from '@cat-factory/kernel';
|
|
4
5
|
/**
|
|
5
6
|
* Generous for a legitimate satellite: the client (`DelegatedAppTokenSource`) memoises a
|
|
6
7
|
* minted token for 60s per installation, so steady-state traffic is ~1 mint/min per
|
|
@@ -44,17 +45,12 @@ export function githubDelegationController(options = {}) {
|
|
|
44
45
|
}
|
|
45
46
|
else if (++bucket.count > limit) {
|
|
46
47
|
log.warn('github delegation: mint rate limit exceeded', { limit, windowMs });
|
|
47
|
-
|
|
48
|
+
throw new RateLimitedError('too many token mints, retry shortly');
|
|
48
49
|
}
|
|
49
50
|
const registry = container.repositories;
|
|
50
51
|
const delegation = container.githubTokenDelegation;
|
|
51
52
|
if (!registry || !delegation) {
|
|
52
|
-
|
|
53
|
-
error: {
|
|
54
|
-
code: 'unavailable',
|
|
55
|
-
message: 'GitHub token delegation is not enabled on this deployment',
|
|
56
|
-
},
|
|
57
|
-
}, 503);
|
|
53
|
+
throw new UnavailableError('GitHub token delegation is not enabled on this deployment');
|
|
58
54
|
}
|
|
59
55
|
let body;
|
|
60
56
|
try {
|