@cat-factory/server 0.167.0 → 0.170.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/app.d.ts.map +1 -1
- package/dist/app.js +5 -0
- package/dist/app.js.map +1 -1
- 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 +6 -3
- 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/publicApi/PublicDebugController.d.ts +4 -0
- package/dist/modules/publicApi/PublicDebugController.d.ts.map +1 -0
- package/dist/modules/publicApi/PublicDebugController.js +241 -0
- package/dist/modules/publicApi/PublicDebugController.js.map +1 -0
- 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 +16 -1
- 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
|
@@ -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 shared-stacks module or send a 503, returning null when unconfigured. */
|
|
7
8
|
function requireSharedStacks(c) {
|
|
8
9
|
return c.get('container').sharedStacks ?? null;
|
|
9
10
|
}
|
|
10
|
-
const unavailable = (
|
|
11
|
+
const unavailable = () => {
|
|
12
|
+
throw new UnavailableError('Shared stacks are not configured');
|
|
13
|
+
};
|
|
11
14
|
/**
|
|
12
15
|
* CRUD + lifecycle for a workspace's shared stacks (long-lived compose infra a consumer
|
|
13
16
|
* environment attaches to over an external network). CRUD works on every facade; the
|
|
@@ -21,48 +24,48 @@ export function sharedStackController() {
|
|
|
21
24
|
buildHonoRoute(app, listSharedStacksContract, async (c) => {
|
|
22
25
|
const stacks = requireSharedStacks(c);
|
|
23
26
|
if (!stacks)
|
|
24
|
-
return unavailable(
|
|
27
|
+
return unavailable();
|
|
25
28
|
return c.json(await stacks.service.list(param(c, 'workspaceId')), 200);
|
|
26
29
|
});
|
|
27
30
|
buildHonoRoute(app, createSharedStackContract, async (c) => {
|
|
28
31
|
const stacks = requireSharedStacks(c);
|
|
29
32
|
if (!stacks)
|
|
30
|
-
return unavailable(
|
|
33
|
+
return unavailable();
|
|
31
34
|
const stack = await stacks.service.create(param(c, 'workspaceId'), c.req.valid('json'));
|
|
32
35
|
return c.json(stack, 201);
|
|
33
36
|
});
|
|
34
37
|
buildHonoRoute(app, detectSharedStackContract, async (c) => {
|
|
35
38
|
const stacks = requireSharedStacks(c);
|
|
36
39
|
if (!stacks)
|
|
37
|
-
return unavailable(
|
|
40
|
+
return unavailable();
|
|
38
41
|
const recommendation = await stacks.service.detect(param(c, 'workspaceId'), c.req.valid('json'));
|
|
39
42
|
return c.json(recommendation, 200);
|
|
40
43
|
});
|
|
41
44
|
buildHonoRoute(app, updateSharedStackContract, async (c) => {
|
|
42
45
|
const stacks = requireSharedStacks(c);
|
|
43
46
|
if (!stacks)
|
|
44
|
-
return unavailable(
|
|
47
|
+
return unavailable();
|
|
45
48
|
const stack = await stacks.service.update(param(c, 'workspaceId'), c.req.valid('param').stackId, c.req.valid('json'));
|
|
46
49
|
return c.json(stack, 200);
|
|
47
50
|
});
|
|
48
51
|
buildHonoRoute(app, deleteSharedStackContract, async (c) => {
|
|
49
52
|
const stacks = requireSharedStacks(c);
|
|
50
53
|
if (!stacks)
|
|
51
|
-
return unavailable(
|
|
54
|
+
return unavailable();
|
|
52
55
|
await stacks.service.remove(param(c, 'workspaceId'), c.req.valid('param').stackId);
|
|
53
56
|
return c.body(null, 204);
|
|
54
57
|
});
|
|
55
58
|
buildHonoRoute(app, ensureSharedStackUpContract, async (c) => {
|
|
56
59
|
const stacks = requireSharedStacks(c);
|
|
57
60
|
if (!stacks)
|
|
58
|
-
return unavailable(
|
|
61
|
+
return unavailable();
|
|
59
62
|
const stack = await stacks.service.ensureUp(param(c, 'workspaceId'), c.req.valid('param').stackId);
|
|
60
63
|
return c.json(stack, 200);
|
|
61
64
|
});
|
|
62
65
|
buildHonoRoute(app, teardownSharedStackContract, async (c) => {
|
|
63
66
|
const stacks = requireSharedStacks(c);
|
|
64
67
|
if (!stacks)
|
|
65
|
-
return unavailable(
|
|
68
|
+
return unavailable();
|
|
66
69
|
const stack = await stacks.service.teardown(param(c, 'workspaceId'), c.req.valid('param').stackId);
|
|
67
70
|
return c.json(stack, 200);
|
|
68
71
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedStackController.js","sourceRoot":"","sources":["../../../src/modules/sharedStack/SharedStackController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,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,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"SharedStackController.js","sourceRoot":"","sources":["../../../src/modules/sharedStack/SharedStackController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillLibraryController.d.ts","sourceRoot":"","sources":["../../../src/modules/skillLibrary/SkillLibraryController.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"SkillLibraryController.d.ts","sourceRoot":"","sources":["../../../src/modules/skillLibrary/SkillLibraryController.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAiB/C;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAAC,MAAM,CAAC,CAwDrD"}
|
|
@@ -2,17 +2,17 @@ import { linkSkillSourceContract, listAccountSkillsContract, listSkillSourcesCon
|
|
|
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, UnauthorizedError } from '@cat-factory/kernel';
|
|
5
6
|
/** Resolve the skill-library module or send a 503 when unconfigured. */
|
|
6
7
|
function requireLibrary(c) {
|
|
7
8
|
return c.get('container').skillLibrary ?? null;
|
|
8
9
|
}
|
|
9
|
-
const unavailable = (
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}, 503);
|
|
10
|
+
const unavailable = () => {
|
|
11
|
+
throw new UnavailableError('The Claude Skills library is not configured');
|
|
12
|
+
};
|
|
13
|
+
const sourcesUnavailable = () => {
|
|
14
|
+
throw new UnavailableError('Repo-sourced skills require the GitHub integration to be configured');
|
|
15
|
+
};
|
|
16
16
|
/**
|
|
17
17
|
* The repo-sourced Claude Skills library API (docs/initiatives/repo-skills.md).
|
|
18
18
|
* Skills live in ONE tier (the account, shared across its workspaces), so — unlike
|
|
@@ -31,50 +31,50 @@ export function skillLibraryController() {
|
|
|
31
31
|
buildHonoRoute(app, listAccountSkillsContract, async (c) => {
|
|
32
32
|
const lib = requireLibrary(c);
|
|
33
33
|
if (!lib)
|
|
34
|
-
return unavailable(
|
|
34
|
+
return unavailable();
|
|
35
35
|
return c.json(await lib.catalogService.list(accountId(c)), 200);
|
|
36
36
|
});
|
|
37
37
|
// ---- repo sources -------------------------------------------------------
|
|
38
38
|
buildHonoRoute(app, listSkillSourcesContract, async (c) => {
|
|
39
39
|
const lib = requireLibrary(c);
|
|
40
40
|
if (!lib)
|
|
41
|
-
return unavailable(
|
|
41
|
+
return unavailable();
|
|
42
42
|
if (!lib.sourceService)
|
|
43
|
-
return sourcesUnavailable(
|
|
43
|
+
return sourcesUnavailable();
|
|
44
44
|
return c.json(await lib.sourceService.list(accountId(c)), 200);
|
|
45
45
|
});
|
|
46
46
|
buildHonoRoute(app, linkSkillSourceContract, async (c) => {
|
|
47
47
|
const lib = requireLibrary(c);
|
|
48
48
|
if (!lib)
|
|
49
|
-
return unavailable(
|
|
49
|
+
return unavailable();
|
|
50
50
|
if (!lib.sourceService)
|
|
51
|
-
return sourcesUnavailable(
|
|
51
|
+
return sourcesUnavailable();
|
|
52
52
|
const source = await lib.sourceService.link(accountId(c), c.req.valid('json'));
|
|
53
53
|
return c.json(source, 201);
|
|
54
54
|
});
|
|
55
55
|
buildHonoRoute(app, unlinkSkillSourceContract, async (c) => {
|
|
56
56
|
const lib = requireLibrary(c);
|
|
57
57
|
if (!lib)
|
|
58
|
-
return unavailable(
|
|
58
|
+
return unavailable();
|
|
59
59
|
if (!lib.sourceService)
|
|
60
|
-
return sourcesUnavailable(
|
|
60
|
+
return sourcesUnavailable();
|
|
61
61
|
await lib.sourceService.unlink(accountId(c), c.req.valid('param').id);
|
|
62
62
|
return c.body(null, 204);
|
|
63
63
|
});
|
|
64
64
|
buildHonoRoute(app, skillSourceStatusContract, async (c) => {
|
|
65
65
|
const lib = requireLibrary(c);
|
|
66
66
|
if (!lib)
|
|
67
|
-
return unavailable(
|
|
67
|
+
return unavailable();
|
|
68
68
|
if (!lib.sourceService)
|
|
69
|
-
return sourcesUnavailable(
|
|
69
|
+
return sourcesUnavailable();
|
|
70
70
|
return c.json(await lib.sourceService.status(accountId(c), c.req.valid('param').id), 200);
|
|
71
71
|
});
|
|
72
72
|
buildHonoRoute(app, syncSkillSourceContract, async (c) => {
|
|
73
73
|
const lib = requireLibrary(c);
|
|
74
74
|
if (!lib)
|
|
75
|
-
return unavailable(
|
|
75
|
+
return unavailable();
|
|
76
76
|
if (!lib.sourceService)
|
|
77
|
-
return sourcesUnavailable(
|
|
77
|
+
return sourcesUnavailable();
|
|
78
78
|
return c.json(await lib.sourceService.sync(accountId(c), c.req.valid('param').id), 200);
|
|
79
79
|
});
|
|
80
80
|
return app;
|
|
@@ -83,7 +83,7 @@ export function skillLibraryController() {
|
|
|
83
83
|
async function accountGuard(c, next) {
|
|
84
84
|
const user = c.get('user');
|
|
85
85
|
if (!user) {
|
|
86
|
-
|
|
86
|
+
throw new UnauthorizedError('Sign in to manage the skill library');
|
|
87
87
|
}
|
|
88
88
|
// requireMember throws NotFoundError (→ 404) when the user isn't a member.
|
|
89
89
|
await c.get('container').accountService.requireMember(param(c, 'accountId'), user.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillLibraryController.js","sourceRoot":"","sources":["../../../src/modules/skillLibrary/SkillLibraryController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,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,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"SkillLibraryController.js","sourceRoot":"","sources":["../../../src/modules/skillLibrary/SkillLibraryController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlackController.d.ts","sourceRoot":"","sources":["../../../src/modules/slack/SlackController.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"SlackController.d.ts","sourceRoot":"","sources":["../../../src/modules/slack/SlackController.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAqB/C;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,CAmG9C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,CAwBnD"}
|
|
@@ -4,6 +4,7 @@ import { Hono } from 'hono';
|
|
|
4
4
|
import { StateSigner } from '../../github/state.js';
|
|
5
5
|
import { requireWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
6
6
|
import { param } from '../../http/params.js';
|
|
7
|
+
import { UnavailableError, UnauthorizedError } from '@cat-factory/kernel';
|
|
7
8
|
// The bot scopes the "Add to Slack" flow requests: post messages + read channels
|
|
8
9
|
// (public + private) so the routing picker can list them. `chat:write.public` lets
|
|
9
10
|
// the bot post to PUBLIC channels it hasn't been explicitly invited to — without it
|
|
@@ -14,7 +15,9 @@ const SLACK_BOT_SCOPES = ['chat:write', 'chat:write.public', 'channels:read', 'g
|
|
|
14
15
|
function requireSlack(c) {
|
|
15
16
|
return c.get('container').slack ?? null;
|
|
16
17
|
}
|
|
17
|
-
const unavailable = (
|
|
18
|
+
const unavailable = () => {
|
|
19
|
+
throw new UnavailableError('Slack integration is not configured');
|
|
20
|
+
};
|
|
18
21
|
/**
|
|
19
22
|
* Workspace-scoped Slack endpoints: per-account connection management (manual
|
|
20
23
|
* bot-token paste + the OAuth "Add to Slack" URL), per-workspace notification
|
|
@@ -29,7 +32,7 @@ export function slackController() {
|
|
|
29
32
|
buildHonoRoute(app, getSlackConnectionContract, async (c) => {
|
|
30
33
|
const slack = requireSlack(c);
|
|
31
34
|
if (!slack)
|
|
32
|
-
return unavailable(
|
|
35
|
+
return unavailable();
|
|
33
36
|
const connection = await slack.connectionService.getConnection(param(c, 'workspaceId'));
|
|
34
37
|
const oauthEnabled = await slack.connectionService.oauthEnabled(param(c, 'workspaceId'));
|
|
35
38
|
return c.json({ connection, oauthEnabled }, 200);
|
|
@@ -40,10 +43,10 @@ export function slackController() {
|
|
|
40
43
|
buildHonoRoute(app, getSlackInstallUrlContract, async (c) => {
|
|
41
44
|
const slack = requireSlack(c);
|
|
42
45
|
if (!slack)
|
|
43
|
-
return unavailable(
|
|
46
|
+
return unavailable();
|
|
44
47
|
const workspaceId = param(c, 'workspaceId');
|
|
45
48
|
if (!(await slack.connectionService.oauthEnabled(workspaceId))) {
|
|
46
|
-
|
|
49
|
+
throw new UnavailableError('Slack OAuth is not configured');
|
|
47
50
|
}
|
|
48
51
|
const signer = new StateSigner(c.get('container').config.auth.sessionSecret);
|
|
49
52
|
const state = await signer.sign({
|
|
@@ -58,14 +61,14 @@ export function slackController() {
|
|
|
58
61
|
buildHonoRoute(app, connectSlackContract, async (c) => {
|
|
59
62
|
const slack = requireSlack(c);
|
|
60
63
|
if (!slack)
|
|
61
|
-
return unavailable(
|
|
64
|
+
return unavailable();
|
|
62
65
|
const connection = await slack.connectionService.connectWithToken(param(c, 'workspaceId'), c.req.valid('json').token);
|
|
63
66
|
return c.json(connection, 201);
|
|
64
67
|
});
|
|
65
68
|
buildHonoRoute(app, disconnectSlackContract, async (c) => {
|
|
66
69
|
const slack = requireSlack(c);
|
|
67
70
|
if (!slack)
|
|
68
|
-
return unavailable(
|
|
71
|
+
return unavailable();
|
|
69
72
|
await slack.connectionService.disconnect(param(c, 'workspaceId'));
|
|
70
73
|
return c.body(null, 204);
|
|
71
74
|
});
|
|
@@ -73,7 +76,7 @@ export function slackController() {
|
|
|
73
76
|
buildHonoRoute(app, listSlackChannelsContract, async (c) => {
|
|
74
77
|
const slack = requireSlack(c);
|
|
75
78
|
if (!slack)
|
|
76
|
-
return unavailable(
|
|
79
|
+
return unavailable();
|
|
77
80
|
const channels = await slack.connectionService.listChannels(param(c, 'workspaceId'));
|
|
78
81
|
return c.json({ channels }, 200);
|
|
79
82
|
});
|
|
@@ -81,14 +84,14 @@ export function slackController() {
|
|
|
81
84
|
buildHonoRoute(app, getSlackSettingsContract, async (c) => {
|
|
82
85
|
const slack = requireSlack(c);
|
|
83
86
|
if (!slack)
|
|
84
|
-
return unavailable(
|
|
87
|
+
return unavailable();
|
|
85
88
|
const settings = await slack.settingsService.get(param(c, 'workspaceId'));
|
|
86
89
|
return c.json(settings, 200);
|
|
87
90
|
});
|
|
88
91
|
buildHonoRoute(app, updateSlackSettingsContract, async (c) => {
|
|
89
92
|
const slack = requireSlack(c);
|
|
90
93
|
if (!slack)
|
|
91
|
-
return unavailable(
|
|
94
|
+
return unavailable();
|
|
92
95
|
const settings = await slack.settingsService.update(param(c, 'workspaceId'), c.req.valid('json'));
|
|
93
96
|
return c.json(settings, 200);
|
|
94
97
|
});
|
|
@@ -96,14 +99,14 @@ export function slackController() {
|
|
|
96
99
|
buildHonoRoute(app, getSlackMemberMappingContract, async (c) => {
|
|
97
100
|
const slack = requireSlack(c);
|
|
98
101
|
if (!slack)
|
|
99
|
-
return unavailable(
|
|
102
|
+
return unavailable();
|
|
100
103
|
const entries = await slack.memberMappingService.get(param(c, 'workspaceId'));
|
|
101
104
|
return c.json({ entries }, 200);
|
|
102
105
|
});
|
|
103
106
|
buildHonoRoute(app, updateSlackMemberMappingContract, async (c) => {
|
|
104
107
|
const slack = requireSlack(c);
|
|
105
108
|
if (!slack)
|
|
106
|
-
return unavailable(
|
|
109
|
+
return unavailable();
|
|
107
110
|
const entries = await slack.memberMappingService.update(param(c, 'workspaceId'), c.req.valid('json').entries);
|
|
108
111
|
return c.json({ entries }, 200);
|
|
109
112
|
});
|
|
@@ -120,7 +123,7 @@ export function slackOAuthController() {
|
|
|
120
123
|
const container = c.get('container');
|
|
121
124
|
const slack = container.slack;
|
|
122
125
|
if (!slack)
|
|
123
|
-
return unavailable(
|
|
126
|
+
return unavailable();
|
|
124
127
|
const code = c.req.query('code');
|
|
125
128
|
if (!code) {
|
|
126
129
|
return c.json({ error: { code: 'validation', message: 'Missing code' } }, 400);
|
|
@@ -128,7 +131,7 @@ export function slackOAuthController() {
|
|
|
128
131
|
const signer = new StateSigner(container.config.auth.sessionSecret);
|
|
129
132
|
const state = await signer.verify(c.req.query('state') ?? null);
|
|
130
133
|
if (!state) {
|
|
131
|
-
|
|
134
|
+
throw new UnauthorizedError('Invalid or expired state');
|
|
132
135
|
}
|
|
133
136
|
await slack.connectionService.connectViaOAuth(state.workspaceId, code);
|
|
134
137
|
// Land back on the app (reuse the GitHub setup redirect target as the app URL).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlackController.js","sourceRoot":"","sources":["../../../src/modules/slack/SlackController.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,GAC5B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"SlackController.js","sourceRoot":"","sources":["../../../src/modules/slack/SlackController.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskSourceController.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskSourceController.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"TaskSourceController.d.ts","sourceRoot":"","sources":["../../../src/modules/tasks/TaskSourceController.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAW3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAuF/C;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAAC,MAAM,CAAC,CAqPnD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAAC,MAAM,CAAC,CAgCpD"}
|
|
@@ -2,7 +2,7 @@ import { clearTaskSourceWebhookContract, configureTaskSourceWebhookContract, con
|
|
|
2
2
|
import * as v from 'valibot';
|
|
3
3
|
import { buildHonoRoute } from '@toad-contracts/hono';
|
|
4
4
|
import { Hono } from 'hono';
|
|
5
|
-
import { ValidationError } from '@cat-factory/kernel';
|
|
5
|
+
import { ValidationError, UnavailableError, UnauthorizedError, } from '@cat-factory/kernel';
|
|
6
6
|
import { LinearOAuth } from '../../auth/LinearOAuth.js';
|
|
7
7
|
import { StateSigner } from '../../github/state.js';
|
|
8
8
|
import { requireWorkspacePermission } from '../../http/workspaceAccess.js';
|
|
@@ -11,7 +11,9 @@ import { param } from '../../http/params.js';
|
|
|
11
11
|
function requireTasks(c) {
|
|
12
12
|
return c.get('container').tasks ?? null;
|
|
13
13
|
}
|
|
14
|
-
const unavailable = (
|
|
14
|
+
const unavailable = () => {
|
|
15
|
+
throw new UnavailableError('Task-source integration is not configured');
|
|
16
|
+
};
|
|
15
17
|
/** Read + validate the `:source` path param as a known source kind. */
|
|
16
18
|
function sourceParam(c) {
|
|
17
19
|
const source = param(c, 'source');
|
|
@@ -95,7 +97,7 @@ export function taskSourceController() {
|
|
|
95
97
|
buildHonoRoute(app, listTaskSourcesContract, async (c) => {
|
|
96
98
|
const tasks = requireTasks(c);
|
|
97
99
|
if (!tasks)
|
|
98
|
-
return unavailable(
|
|
100
|
+
return unavailable();
|
|
99
101
|
const sources = await tasks.connectionService.listSourceStates(param(c, 'workspaceId'));
|
|
100
102
|
return c.json({ sources }, 200);
|
|
101
103
|
});
|
|
@@ -106,7 +108,7 @@ export function taskSourceController() {
|
|
|
106
108
|
buildHonoRoute(app, setTaskSourceEnabledContract, async (c) => {
|
|
107
109
|
const tasks = requireTasks(c);
|
|
108
110
|
if (!tasks)
|
|
109
|
-
return unavailable(
|
|
111
|
+
return unavailable();
|
|
110
112
|
await tasks.connectionService.setEnabled(param(c, 'workspaceId'), sourceParam(c), c.req.valid('json').enabled);
|
|
111
113
|
return c.body(null, 204);
|
|
112
114
|
});
|
|
@@ -114,21 +116,21 @@ export function taskSourceController() {
|
|
|
114
116
|
buildHonoRoute(app, listTaskConnectionsContract, async (c) => {
|
|
115
117
|
const tasks = requireTasks(c);
|
|
116
118
|
if (!tasks)
|
|
117
|
-
return unavailable(
|
|
119
|
+
return unavailable();
|
|
118
120
|
const connections = await tasks.connectionService.listConnections(param(c, 'workspaceId'));
|
|
119
121
|
return c.json({ connections }, 200);
|
|
120
122
|
});
|
|
121
123
|
buildHonoRoute(app, connectTaskSourceContract, async (c) => {
|
|
122
124
|
const tasks = requireTasks(c);
|
|
123
125
|
if (!tasks)
|
|
124
|
-
return unavailable(
|
|
126
|
+
return unavailable();
|
|
125
127
|
const connection = await tasks.connectionService.connect(param(c, 'workspaceId'), sourceParam(c), c.req.valid('json').credentials);
|
|
126
128
|
return c.json(connection, 201);
|
|
127
129
|
});
|
|
128
130
|
buildHonoRoute(app, disconnectTaskSourceContract, async (c) => {
|
|
129
131
|
const tasks = requireTasks(c);
|
|
130
132
|
if (!tasks)
|
|
131
|
-
return unavailable(
|
|
133
|
+
return unavailable();
|
|
132
134
|
await tasks.connectionService.disconnect(param(c, 'workspaceId'), sourceParam(c));
|
|
133
135
|
return c.body(null, 204);
|
|
134
136
|
});
|
|
@@ -140,7 +142,7 @@ export function taskSourceController() {
|
|
|
140
142
|
buildHonoRoute(app, diagnoseTaskSourceContract, async (c) => {
|
|
141
143
|
const tasks = requireTasks(c);
|
|
142
144
|
if (!tasks)
|
|
143
|
-
return unavailable(
|
|
145
|
+
return unavailable();
|
|
144
146
|
const diagnostic = await tasks.connectionService.diagnose(param(c, 'workspaceId'), sourceParam(c));
|
|
145
147
|
return c.json(diagnostic, 200);
|
|
146
148
|
});
|
|
@@ -153,7 +155,7 @@ export function taskSourceController() {
|
|
|
153
155
|
buildHonoRoute(app, getTaskSourceWebhookContract, async (c) => {
|
|
154
156
|
const tasks = requireTasks(c);
|
|
155
157
|
if (!tasks)
|
|
156
|
-
return unavailable(
|
|
158
|
+
return unavailable();
|
|
157
159
|
const state = await tasks.connectionService.getWebhookState(param(c, 'workspaceId'), sourceParam(c));
|
|
158
160
|
return c.json(state, 200);
|
|
159
161
|
});
|
|
@@ -162,7 +164,7 @@ export function taskSourceController() {
|
|
|
162
164
|
buildHonoRoute(app, configureTaskSourceWebhookContract, async (c) => {
|
|
163
165
|
const tasks = requireTasks(c);
|
|
164
166
|
if (!tasks)
|
|
165
|
-
return unavailable(
|
|
167
|
+
return unavailable();
|
|
166
168
|
const minted = await tasks.connectionService.mintWebhookSecret(param(c, 'workspaceId'), sourceParam(c), c.req.valid('json'));
|
|
167
169
|
return c.json(minted, 201);
|
|
168
170
|
});
|
|
@@ -171,7 +173,7 @@ export function taskSourceController() {
|
|
|
171
173
|
buildHonoRoute(app, updateTaskSourceWebhookContract, async (c) => {
|
|
172
174
|
const tasks = requireTasks(c);
|
|
173
175
|
if (!tasks)
|
|
174
|
-
return unavailable(
|
|
176
|
+
return unavailable();
|
|
175
177
|
const state = await tasks.connectionService.updateWebhookReplyAllow(param(c, 'workspaceId'), sourceParam(c), c.req.valid('json').replyAllow);
|
|
176
178
|
return c.json(state, 200);
|
|
177
179
|
});
|
|
@@ -180,7 +182,7 @@ export function taskSourceController() {
|
|
|
180
182
|
buildHonoRoute(app, clearTaskSourceWebhookContract, async (c) => {
|
|
181
183
|
const tasks = requireTasks(c);
|
|
182
184
|
if (!tasks)
|
|
183
|
-
return unavailable(
|
|
185
|
+
return unavailable();
|
|
184
186
|
await tasks.connectionService.clearWebhookSecret(param(c, 'workspaceId'), sourceParam(c));
|
|
185
187
|
return c.body(null, 204);
|
|
186
188
|
});
|
|
@@ -190,7 +192,7 @@ export function taskSourceController() {
|
|
|
190
192
|
buildHonoRoute(app, listLinearTeamsContract, async (c) => {
|
|
191
193
|
const tasks = requireTasks(c);
|
|
192
194
|
if (!tasks)
|
|
193
|
-
return unavailable(
|
|
195
|
+
return unavailable();
|
|
194
196
|
const teams = await tasks.connectionService.listLinearTeams(param(c, 'workspaceId'));
|
|
195
197
|
return c.json({ teams }, 200);
|
|
196
198
|
});
|
|
@@ -200,13 +202,13 @@ export function taskSourceController() {
|
|
|
200
202
|
buildHonoRoute(app, getLinearInstallUrlContract, async (c) => {
|
|
201
203
|
const tasks = requireTasks(c);
|
|
202
204
|
if (!tasks)
|
|
203
|
-
return unavailable(
|
|
205
|
+
return unavailable();
|
|
204
206
|
const workspaceId = param(c, 'workspaceId');
|
|
205
207
|
// OAuth app creds live in per-account deployment settings (sealed in the DB), resolved
|
|
206
208
|
// dynamically — not env. Absent ⇒ OAuth isn't offered (manual API-key paste still works).
|
|
207
209
|
const oauth = await tasks.connectionService.resolveLinearOAuthConfig(workspaceId);
|
|
208
210
|
if (!oauth) {
|
|
209
|
-
|
|
211
|
+
throw new UnavailableError('Linear OAuth is not configured');
|
|
210
212
|
}
|
|
211
213
|
const signer = new StateSigner(c.get('container').config.auth.sessionSecret);
|
|
212
214
|
const state = await signer.sign({
|
|
@@ -224,14 +226,14 @@ export function taskSourceController() {
|
|
|
224
226
|
buildHonoRoute(app, listTasksContract, async (c) => {
|
|
225
227
|
const tasks = requireTasks(c);
|
|
226
228
|
if (!tasks)
|
|
227
|
-
return unavailable(
|
|
229
|
+
return unavailable();
|
|
228
230
|
const scope = await resolveListScope(c, c.req.valid('query').blockId);
|
|
229
231
|
return c.json(await tasks.importService.listTasks(param(c, 'workspaceId'), scope), 200);
|
|
230
232
|
});
|
|
231
233
|
buildHonoRoute(app, importTaskContract, async (c) => {
|
|
232
234
|
const tasks = requireTasks(c);
|
|
233
235
|
if (!tasks)
|
|
234
|
-
return unavailable(
|
|
236
|
+
return unavailable();
|
|
235
237
|
const task = await tasks.importService.import(param(c, 'workspaceId'), sourceParam(c), c.req.valid('json').ref);
|
|
236
238
|
return c.json(task, 201);
|
|
237
239
|
});
|
|
@@ -240,7 +242,7 @@ export function taskSourceController() {
|
|
|
240
242
|
buildHonoRoute(app, searchTasksContract, async (c) => {
|
|
241
243
|
const tasks = requireTasks(c);
|
|
242
244
|
if (!tasks)
|
|
243
|
-
return unavailable(
|
|
245
|
+
return unavailable();
|
|
244
246
|
const source = sourceParam(c);
|
|
245
247
|
const { query, blockId } = c.req.valid('json');
|
|
246
248
|
const scope = await resolveSearchScope(c, source, blockId);
|
|
@@ -252,7 +254,7 @@ export function taskSourceController() {
|
|
|
252
254
|
buildHonoRoute(app, linkTaskContract, async (c) => {
|
|
253
255
|
const tasks = requireTasks(c);
|
|
254
256
|
if (!tasks)
|
|
255
|
-
return unavailable(
|
|
257
|
+
return unavailable();
|
|
256
258
|
const { source, externalId, blockId } = c.req.valid('json');
|
|
257
259
|
const task = await tasks.linkService.linkToBlock(param(c, 'workspaceId'), blockId, source, externalId);
|
|
258
260
|
return c.json(task, 201);
|
|
@@ -262,7 +264,7 @@ export function taskSourceController() {
|
|
|
262
264
|
buildHonoRoute(app, createTaskFromIssueContract, async (c) => {
|
|
263
265
|
const tasks = requireTasks(c);
|
|
264
266
|
if (!tasks)
|
|
265
|
-
return unavailable(
|
|
267
|
+
return unavailable();
|
|
266
268
|
const { source, externalId, containerId } = c.req.valid('json');
|
|
267
269
|
const result = await tasks.linkService.createTaskFromIssue(param(c, 'workspaceId'), containerId, source, externalId, c.get('user')?.id ?? null);
|
|
268
270
|
return c.json(result, 201);
|
|
@@ -273,7 +275,7 @@ export function taskSourceController() {
|
|
|
273
275
|
buildHonoRoute(app, spawnEpicContract, async (c) => {
|
|
274
276
|
const tasks = requireTasks(c);
|
|
275
277
|
if (!tasks)
|
|
276
|
-
return unavailable(
|
|
278
|
+
return unavailable();
|
|
277
279
|
const { ref, containerId, position } = c.req.valid('json');
|
|
278
280
|
const result = await tasks.linkService.spawnEpic(param(c, 'workspaceId'), sourceParam(c), ref, containerId, c.get('user')?.id ?? null, position);
|
|
279
281
|
return c.json(result, 201);
|
|
@@ -293,7 +295,7 @@ export function linearOAuthController() {
|
|
|
293
295
|
const container = c.get('container');
|
|
294
296
|
const tasks = container.tasks;
|
|
295
297
|
if (!tasks)
|
|
296
|
-
return unavailable(
|
|
298
|
+
return unavailable();
|
|
297
299
|
const code = c.req.query('code');
|
|
298
300
|
if (!code) {
|
|
299
301
|
return c.json({ error: { code: 'validation', message: 'Missing code' } }, 400);
|
|
@@ -301,13 +303,13 @@ export function linearOAuthController() {
|
|
|
301
303
|
const signer = new StateSigner(container.config.auth.sessionSecret);
|
|
302
304
|
const state = await signer.verify(c.req.query('state') ?? null);
|
|
303
305
|
if (!state) {
|
|
304
|
-
|
|
306
|
+
throw new UnauthorizedError('Invalid or expired state');
|
|
305
307
|
}
|
|
306
308
|
// Resolve the account's OAuth creds (per-account deployment settings, not env). The
|
|
307
309
|
// redirect_uri must match the install-url + the registered app, so reuse the stored one.
|
|
308
310
|
const oauth = await tasks.connectionService.resolveLinearOAuthConfig(state.workspaceId);
|
|
309
311
|
if (!oauth)
|
|
310
|
-
return unavailable(
|
|
312
|
+
return unavailable();
|
|
311
313
|
const token = await new LinearOAuth({
|
|
312
314
|
clientId: oauth.clientId,
|
|
313
315
|
clientSecret: oauth.clientSecret,
|