@k2b/cloud 0.43.0 → 0.45.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/package.json +11 -2
- package/src/_internal/app-access-request.ts +13 -0
- package/src/_internal/app-access-resources.ts +141 -0
- package/src/_internal/app-event-catalog.ts +40 -0
- package/src/_internal/app-event-schemas.ts +127 -0
- package/src/_internal/application-package.ts +40 -0
- package/src/_internal/built-in-app-ids.json +27 -0
- package/src/_internal/capabilities.ts +158 -12
- package/src/_internal/capability-origin.ts +4 -0
- package/src/_internal/capability-streams.ts +7 -5
- package/src/_internal/define-app.ts +57 -6
- package/src/_internal/object-store-area.ts +9 -0
- package/src/_internal/object-store-config.ts +101 -0
- package/src/_internal/object-store-key.ts +14 -0
- package/src/_internal/process-identity.ts +7 -2
- package/src/_internal/registry-validation.ts +11 -1
- package/src/_internal/registry.ts +8 -1
- package/src/_internal/runtime-context.ts +8 -1
- package/src/access/AppAccessEditor.tsx +2 -0
- package/src/access/GroupCoverage.tsx +20 -5
- package/src/access/PermissionEditor.tsx +20 -5
- package/src/access/PrincipalAvatar.tsx +30 -21
- package/src/access/PrincipalPicker.tsx +14 -4
- package/src/access/ResourceApiKeys.tsx +3 -4
- package/src/access/app-access-messages.ts +6 -0
- package/src/access/messages.ts +4 -4
- package/src/account/EntitySearch.tsx +12 -0
- package/src/account/ProfilePictureDialog.tsx +699 -0
- package/src/account/profile-picture-messages.ts +269 -0
- package/src/account/ui.ts +7 -0
- package/src/ai/admin.ts +3 -0
- package/src/ai/app-frame.ts +12 -0
- package/src/ai/application-tasks.ts +101 -0
- package/src/ai/assistant-models.ts +126 -64
- package/src/ai/capabilities.ts +19 -4
- package/src/ai/chart-block.ts +63 -30
- package/src/ai/chat/chart-block.tsx +12 -3
- package/src/ai/chat/composer-adapter.ts +8 -7
- package/src/ai/chat/message-actions.tsx +1 -1
- package/src/ai/chat/message-utils.ts +2 -2
- package/src/ai/chat/presentation.tsx +22 -1
- package/src/ai/chat-quotas.ts +5 -4
- package/src/ai/chat-tasks.ts +2 -2
- package/src/ai/client/controller.ts +11 -10
- package/src/ai/client/projection.ts +3 -3
- package/src/ai/compaction.ts +3 -3
- package/src/ai/credentials.ts +13 -114
- package/src/ai/default-tool-contracts.ts +4 -3
- package/src/ai/dictation-runtime.ts +10 -6
- package/src/ai/enrich.ts +2 -2
- package/src/ai/executor.ts +40 -25
- package/src/ai/http.ts +17 -29
- package/src/ai/index.ts +12 -5
- package/src/ai/inference-calls.ts +5 -4
- package/src/ai/maintenance.ts +1 -1
- package/src/ai/memory-learning-runs.ts +5 -5
- package/src/ai/memory-learning.ts +3 -3
- package/src/ai/message-queue.ts +1 -2
- package/src/ai/migrate.ts +75 -42
- package/src/ai/model-access-migrate.ts +3 -17
- package/src/ai/model-access.ts +44 -85
- package/src/ai/model-card.tsx +134 -0
- package/src/ai/model-catalog.ts +359 -0
- package/src/ai/model-chooser-messages.ts +88 -0
- package/src/ai/model-chooser.tsx +577 -0
- package/src/ai/model-delete.ts +234 -0
- package/src/ai/model-fixture.ts +39 -0
- package/src/ai/model-icon.tsx +36 -0
- package/src/ai/model-overview.ts +53 -0
- package/src/ai/model-usage.ts +45 -0
- package/src/ai/openai-api-messages.ts +0 -4
- package/src/ai/openai-api.ts +26 -9
- package/src/ai/personal-agent.ts +1 -1
- package/src/ai/prefs.ts +12 -10
- package/src/ai/project-tool.ts +4 -4
- package/src/ai/projects-authorization.ts +53 -0
- package/src/ai/projects-routes.ts +58 -47
- package/src/ai/projects.ts +110 -88
- package/src/ai/protocol.ts +2 -2
- package/src/ai/provider-connections.ts +161 -0
- package/src/ai/provider-errors.ts +55 -6
- package/src/ai/provider-fetch.ts +4 -0
- package/src/ai/provider.ts +1 -1
- package/src/ai/quota-limits.ts +36 -0
- package/src/ai/quota-provider.ts +4 -2
- package/src/ai/quota-report.ts +7 -4
- package/src/ai/quotas.ts +19 -8
- package/src/ai/recent-resources.ts +9 -3
- package/src/ai/request-headers.ts +14 -87
- package/src/ai/resource-refs.ts +6 -2
- package/src/ai/routes.ts +47 -48
- package/src/ai/runtime.ts +50 -22
- package/src/ai/settings.ts +93 -580
- package/src/ai/skill-tool.ts +4 -4
- package/src/ai/skills-routes.ts +27 -26
- package/src/ai/skills.ts +120 -81
- package/src/ai/store.ts +45 -23
- package/src/ai/stream.ts +1 -1
- package/src/ai/structured-runs.ts +2 -2
- package/src/ai/structured.ts +21 -44
- package/src/ai/task-contracts.ts +25 -5
- package/src/ai/task-execution.ts +15 -6
- package/src/ai/task-model.ts +9 -0
- package/src/ai/transcription.ts +27 -22
- package/src/ai/types.ts +50 -62
- package/src/ai/ui.tsx +13 -0
- package/src/ai/usage.ts +8 -8
- package/src/ai/validate.ts +8 -7
- package/src/ai/view-block.ts +2 -2
- package/src/api/accounts-entities.ts +22 -3
- package/src/api/admin-ai-quotas.ts +34 -56
- package/src/api/admin-ai-skills.ts +4 -1
- package/src/api/admin-ai-usage.ts +1 -1
- package/src/api/admin-ai.ts +173 -0
- package/src/api/admin-core-settings.ts +68 -244
- package/src/api/app-approval.ts +3 -1
- package/src/api/app-event-delivery.ts +51 -0
- package/src/api/app-events.ts +123 -0
- package/src/api/app-resource-access.ts +48 -0
- package/src/api/auth/account-mismatch.ts +24 -0
- package/src/api/auth.ts +35 -5
- package/src/api/capabilities.ts +28 -4
- package/src/api/index.ts +7 -1
- package/src/api/mcp.ts +175 -2
- package/src/api/me.ts +6 -4
- package/src/api/pwa-phone.ts +75 -26
- package/src/api/pwa.ts +34 -8
- package/src/api/resource-links.ts +83 -6
- package/src/api/resource-resolve.ts +50 -0
- package/src/api/search/schemas.ts +3 -1
- package/src/api/search.ts +9 -7
- package/src/app-pwa/contracts.ts +4 -0
- package/src/app-pwa/core-query-error.ts +20 -0
- package/src/app-pwa/index.ts +1 -0
- package/src/app-pwa/service.ts +91 -0
- package/src/app-pwa/transport.ts +22 -0
- package/src/approvals/messages.ts +2 -2
- package/src/browser/cloud-id.ts +86 -0
- package/src/browser/resource-clipboard.ts +4 -0
- package/src/browser/resource-links.ts +52 -0
- package/src/browser/session.ts +39 -0
- package/src/browser/shared-text-history-validation.ts +151 -0
- package/src/browser/shared-text-history.ts +464 -0
- package/src/browser/shared-text-offline-authorized.ts +29 -0
- package/src/browser/shared-text-offline.ts +351 -0
- package/src/browser/shared-text-provider.ts +714 -0
- package/src/browser/shared-text-table-contract.ts +150 -0
- package/src/browser/shared-text.ts +19 -0
- package/src/capabilities/server-invoke.ts +2 -11
- package/src/capabilities/testing.ts +5 -2
- package/src/cli/access.ts +6 -5
- package/src/cli/admin/ai-models.ts +199 -0
- package/src/cli/admin/ai-quotas.ts +6 -102
- package/src/cli/admin/ai-usage.ts +4 -4
- package/src/cli/admin/app-credentials.ts +5 -3
- package/src/cli/admin/index.ts +5 -2
- package/src/cli/apps.ts +89 -26
- package/src/cli/capabilities.ts +22 -1
- package/src/cli/events.ts +320 -0
- package/src/config/env.ts +40 -0
- package/src/contracts/app-access.ts +26 -2
- package/src/contracts/app-details.ts +89 -0
- package/src/contracts/app-events.ts +51 -0
- package/src/contracts/app.ts +21 -5
- package/src/contracts/capabilities.ts +143 -3
- package/src/contracts/index.ts +2 -0
- package/src/contracts/notification-types.ts +36 -9
- package/src/contracts/pwa.ts +17 -1
- package/src/contracts/registry.ts +6 -0
- package/src/contracts/resource-clipboard.ts +35 -0
- package/src/contracts/resource-pages.ts +140 -0
- package/src/contracts/resource-resolution.ts +13 -0
- package/src/contracts/shared.ts +6 -1
- package/src/contracts/user-notifications.ts +2 -0
- package/src/events/app-event-delivery.ts +100 -0
- package/src/events/app-events.testing.ts +65 -0
- package/src/events/app-events.ts +134 -0
- package/src/events/core-user-created.ts +24 -0
- package/src/events/index.ts +9 -0
- package/src/events/testing.ts +2 -0
- package/src/index.ts +1 -1
- package/src/server/api/respond.ts +17 -4
- package/src/server/index.ts +2 -0
- package/src/server/middleware/app-access.ts +1 -1
- package/src/server/middleware/auth.ts +21 -7
- package/src/server/middleware/index.ts +1 -0
- package/src/server/middleware/invocation.ts +2 -0
- package/src/server/public-storage.ts +106 -0
- package/src/server/services/access.ts +31 -10
- package/src/server/services/index.ts +1 -0
- package/src/services/accounts/app.ts +36 -13
- package/src/services/accounts/entities.ts +43 -19
- package/src/services/accounts/group-sql.ts +23 -0
- package/src/services/accounts/groups.ts +19 -14
- package/src/services/accounts/identities.ts +70 -11
- package/src/services/accounts/identity-reconciliation.ts +3 -1
- package/src/services/accounts/local-groups.ts +69 -4
- package/src/services/accounts/users.ts +45 -14
- package/src/services/app-access.ts +25 -7
- package/src/services/app-details.ts +224 -0
- package/src/services/app-discovery.ts +2 -1
- package/src/services/app-event-shapes.ts +139 -0
- package/src/services/app-events/accept.ts +116 -0
- package/src/services/app-events/admin.ts +250 -0
- package/src/services/app-events/declarations.ts +187 -0
- package/src/services/app-events/deliver.ts +218 -0
- package/src/services/app-events.ts +92 -0
- package/src/services/config-conflict.ts +11 -0
- package/src/services/core-user-events.ts +1 -0
- package/src/services/freeipa-config.ts +9 -0
- package/src/services/geo/ledger.ts +28 -10
- package/src/services/geo/service.ts +43 -24
- package/src/services/identity/core-origin.ts +12 -0
- package/src/services/identity/invocation-actor.ts +20 -2
- package/src/services/identity/invocation-authority.ts +4 -0
- package/src/services/identity/invocation-token.ts +238 -56
- package/src/services/identity/issue-invocation.ts +6 -1
- package/src/services/image-metadata.ts +65 -1
- package/src/services/index.ts +13 -1
- package/src/services/ipa/sync.ts +6 -2
- package/src/services/ipa/users.ts +4 -1
- package/src/services/mandates/index.ts +2 -2
- package/src/services/mandates/policy.ts +20 -12
- package/src/services/notifications/browser.ts +4 -0
- package/src/services/notifications/catalog.ts +5 -2
- package/src/services/notifications/platform.ts +7 -2
- package/src/services/notifications/user.ts +18 -7
- package/src/services/oauth-tokens.ts +28 -2
- package/src/services/object-store.ts +217 -0
- package/src/services/providers/local/users.ts +5 -0
- package/src/services/pwa-devices.ts +147 -37
- package/src/services/session/index.ts +26 -3
- package/src/services/settings/core-settings.ts +71 -43
- package/src/services/settings/index.ts +8 -0
- package/src/services/settings/versions.ts +26 -0
- package/src/shared/ai-models.ts +274 -0
- package/src/shared/ai-quotas.ts +2 -2
- package/src/shared/ai-usage.ts +2 -2
- package/src/shared/email-html.ts +1 -0
- package/src/shared/index.ts +2 -0
- package/src/shared/markdown/extensions/katex.ts +8 -1
- package/src/shared/markdown/extensions/tables.ts +14 -1
- package/src/shared/markdown/index.ts +22 -11
- package/src/shared-text/anchors.ts +29 -0
- package/src/shared-text/awareness.ts +87 -0
- package/src/shared-text/changes.ts +27 -0
- package/src/shared-text/documents.ts +433 -65
- package/src/shared-text/events.ts +12 -2
- package/src/shared-text/index.ts +16 -1
- package/src/shared-text/log.ts +24 -5
- package/src/shared-text/snapshots.ts +69 -23
- package/src/shared-text/structural-history.ts +377 -0
- package/src/shared-text/table-actions.ts +432 -0
- package/src/shared-text/text-diff.ts +75 -0
- package/src/shared-text/types.ts +24 -5
- package/src/ssr/AdminArea.tsx +131 -0
- package/src/ssr/AdminLayout.tsx +9 -3
- package/src/ssr/AdminSidebar.tsx +7 -7
- package/src/ssr/AppAccessDenied.tsx +2 -0
- package/src/ssr/AppBadge.tsx +14 -0
- package/src/ssr/AppLaunchpadPanel.tsx +2 -2
- package/src/ssr/CloudShell.island.tsx +44 -7
- package/src/ssr/Layout.tsx +9 -7
- package/src/ssr/MobileProfileActions.tsx +2 -2
- package/src/ssr/ProfilePreferences.tsx +2 -1
- package/src/ssr/PwaLayout.tsx +16 -1
- package/src/ssr/PwaPartCount.island.tsx +23 -0
- package/src/ssr/SettingsSaveOutcome.tsx +58 -0
- package/src/ssr/SettingsSaveStatus.island.tsx +16 -0
- package/src/ssr/__snapshots__/Layout.unchanged.render.test.tsx.snap +3 -3
- package/src/ssr/admin-active-link.ts +16 -0
- package/src/ssr/admin-navigation.ts +26 -31
- package/src/ssr/app-badges.ts +31 -7
- package/src/ssr/app-launchpad.tsx +6 -1
- package/src/ssr/index.ts +8 -0
- package/src/ssr/page-trail-runtime.ts +3 -1
- package/src/ssr/platform-messages.ts +11 -1
- package/src/ssr/profile-actions.ts +3 -6
- package/src/ssr/pwa-messages.ts +2 -2
- package/src/ssr/rail-navigation.ts +5 -1
- package/src/ssr/settings-draft.ts +153 -0
- package/src/ssr/shell-data.tsx +3 -1
- package/src/styles/global.css +1 -0
- package/src/styles/profile-picture.css +270 -0
- package/src/styles/utilities-navigation.css +6 -0
- package/src/workflows/ai/policy.ts +49 -0
- package/src/workflows/ai/runtime.ts +131 -21
- package/src/workflows/ai/store.ts +283 -35
- package/src/workflows/ai/types.ts +8 -2
- package/src/workflows/ai-actions.ts +148 -120
- package/src/workflows/authoring.ts +31 -0
- package/src/workflows/contracts.ts +1 -0
- package/src/workflows/definition.ts +2 -0
- package/src/workflows/editor.ts +15 -0
- package/src/workflows/index.ts +2 -1
- package/src/workflows/language/compiler.ts +34 -3
- package/src/workflows/language/expressions.ts +3 -2
- package/src/workflows/runtime/executor.ts +134 -34
- package/src/workflows/runtime/index.ts +2 -0
- package/src/workflows/runtime/ports.ts +5 -1
- package/src/workflows/store/actions.ts +1 -1
- package/src/workflows/store/definitions.ts +5 -0
- package/src/workflows/store/runs.ts +5 -3
- package/src/workflows/store/worker.ts +7 -2
- package/src/ai/model-pricing.ts +0 -43
- package/src/ai/model-request-settings.ts +0 -98
- package/src/ai/settings-messages.ts +0 -129
- package/src/shared/ai-model-request-settings.ts +0 -21
package/src/ai/skill-tool.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type { AccessSubject } from "../server";
|
|
3
2
|
import type { RequestAuthority } from "../server/middleware/auth";
|
|
4
3
|
import { AI_SKILL_FILE_MOUNT } from "./file-mount";
|
|
4
|
+
import type { AiResourceContext } from "./projects-authorization";
|
|
5
5
|
import { AI_SHORT_ID_PATTERN } from "./short-id";
|
|
6
6
|
import { type AiSkillCatalogEntry, mergeAiSkillCatalog, rankAiSkillCatalog, searchAiSkillCatalog } from "./skill-catalog";
|
|
7
7
|
import { AI_SKILL_NAME_MAX_CHARS, AI_SKILL_NAME_PATTERN } from "./skill-format";
|
|
@@ -12,7 +12,7 @@ import { defineAiTool } from "./tools";
|
|
|
12
12
|
export async function loadSelectedAiSkills(
|
|
13
13
|
ids: readonly string[],
|
|
14
14
|
turnId: string,
|
|
15
|
-
subject:
|
|
15
|
+
subject: AiResourceContext | null,
|
|
16
16
|
allowed: boolean,
|
|
17
17
|
authority: RequestAuthority | null = null,
|
|
18
18
|
) {
|
|
@@ -58,7 +58,7 @@ export const CloudAiLoadSkillOutputSchema = z.object({
|
|
|
58
58
|
files: z.array(z.string()),
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
export const createCloudAiLoadSkillTool = (subject:
|
|
61
|
+
export const createCloudAiLoadSkillTool = (subject: AiResourceContext, authority: RequestAuthority | null = null) =>
|
|
62
62
|
defineAiTool({
|
|
63
63
|
name: "load_skill",
|
|
64
64
|
description:
|
|
@@ -92,7 +92,7 @@ export const CloudAiSearchSkillsOutputSchema = z.object({
|
|
|
92
92
|
});
|
|
93
93
|
|
|
94
94
|
export const createCloudAiSearchSkillsTool = (
|
|
95
|
-
subject:
|
|
95
|
+
subject: AiResourceContext | null,
|
|
96
96
|
localSkills: readonly AiSkillCatalogEntry[] = [],
|
|
97
97
|
authority: RequestAuthority | null = null,
|
|
98
98
|
) =>
|
package/src/ai/skills-routes.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Hono, type MiddlewareHandler } from "hono";
|
|
1
|
+
import { type Context, Hono, type MiddlewareHandler } from "hono";
|
|
2
2
|
import { HTTPException } from "hono/http-exception";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { getApp } from "../_internal/registry";
|
|
@@ -10,6 +10,7 @@ import { appAccessAuthority, canUseApp } from "../services/app-access";
|
|
|
10
10
|
import { recordAppAccessDenied } from "../services/app-access-metrics";
|
|
11
11
|
import { localizedAppName } from "../ssr/runtime";
|
|
12
12
|
import { aiProjects } from "./projects";
|
|
13
|
+
import { AiResourceCredentialError } from "./projects-authorization";
|
|
13
14
|
import {
|
|
14
15
|
AI_SKILL_DESCRIPTION_MAX_CHARS,
|
|
15
16
|
AI_SKILL_EXTRA_FRONTMATTER_MAX_CHARS,
|
|
@@ -61,6 +62,11 @@ const publicSkill = (c: RouteContext, skill: AiSkill): AiSkill => ({ ...skill, i
|
|
|
61
62
|
const isUniqueViolation = (error: unknown): boolean =>
|
|
62
63
|
typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "23505";
|
|
63
64
|
|
|
65
|
+
const resourceSubject = (c: Context<AuthContext>) => ({
|
|
66
|
+
actor: c.get("actor"),
|
|
67
|
+
accessSubject: c.get("accessSubject"),
|
|
68
|
+
});
|
|
69
|
+
|
|
64
70
|
type AiSkillsRouteDependencies = {
|
|
65
71
|
limit?: MiddlewareHandler<AuthContext>;
|
|
66
72
|
authenticate?: MiddlewareHandler<AuthContext>;
|
|
@@ -85,6 +91,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
85
91
|
// The list combines skills from separate grants; the writer of one can rename it next to another skill's text.
|
|
86
92
|
.use("*", noTransform())
|
|
87
93
|
.onError((error, c) => {
|
|
94
|
+
if (error instanceof AiResourceCredentialError) return respond(c, fail(err.forbidden(error.message)));
|
|
88
95
|
if (error instanceof AiSkillAppForbiddenError) return respond(c, fail(err.forbidden(error.message)));
|
|
89
96
|
if (error instanceof HTTPException) return error.getResponse();
|
|
90
97
|
throw error;
|
|
@@ -100,7 +107,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
100
107
|
.refine(({ q, name }) => q === undefined || name === undefined, "Use either q or name, not both."),
|
|
101
108
|
),
|
|
102
109
|
async (c) => {
|
|
103
|
-
const subject = c
|
|
110
|
+
const subject = resourceSubject(c);
|
|
104
111
|
const { q, name } = c.req.valid("query");
|
|
105
112
|
const skills =
|
|
106
113
|
name !== undefined
|
|
@@ -112,7 +119,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
112
119
|
},
|
|
113
120
|
)
|
|
114
121
|
.get("/:skillId", async (c) => {
|
|
115
|
-
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
122
|
+
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "read", appAccessAuthority(c));
|
|
116
123
|
return skill ? respond(c, ok({ skill: publicSkill(c, skill) })) : respond(c, fail(err.notFound("Skill")));
|
|
117
124
|
})
|
|
118
125
|
.use("*", requireCoreAccess)
|
|
@@ -128,7 +135,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
128
135
|
}),
|
|
129
136
|
),
|
|
130
137
|
async (c) => {
|
|
131
|
-
const subject = c
|
|
138
|
+
const subject = resourceSubject(c),
|
|
132
139
|
query = c.req.valid("query");
|
|
133
140
|
const project = await aiProjects.getByShortId(c.req.param("projectId")!, subject, query.available === "true" ? "admin" : "read");
|
|
134
141
|
const result = project
|
|
@@ -145,7 +152,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
145
152
|
},
|
|
146
153
|
)
|
|
147
154
|
.get("/:skillId/projects", async (c) => {
|
|
148
|
-
const subject = c
|
|
155
|
+
const subject = resourceSubject(c);
|
|
149
156
|
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, subject, "admin", appAccessAuthority(c));
|
|
150
157
|
const projects = skill ? await aiSkills.linkedProjects(skill.id, subject, appAccessAuthority(c)) : null;
|
|
151
158
|
return projects
|
|
@@ -153,7 +160,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
153
160
|
: respond(c, fail(err.notFound("Skill")));
|
|
154
161
|
})
|
|
155
162
|
.put("/:skillId/projects/:projectId", v("json", z.object({ linked: z.boolean() }).strict()), async (c) => {
|
|
156
|
-
const subject = c
|
|
163
|
+
const subject = resourceSubject(c);
|
|
157
164
|
const [skill, project] = await Promise.all([
|
|
158
165
|
aiSkills.getByShortId(c.req.param("skillId")!, subject, "admin", appAccessAuthority(c)),
|
|
159
166
|
aiProjects.getByShortId(c.req.param("projectId")!, subject, "admin"),
|
|
@@ -164,7 +171,7 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
164
171
|
: respond(c, fail(err.notFound("Skill or Project")));
|
|
165
172
|
})
|
|
166
173
|
.post("/", dependencies.authenticate ?? auth.requireRole("authenticated"), v("json", SkillFieldsSchema), async (c) => {
|
|
167
|
-
const subject = c
|
|
174
|
+
const subject = resourceSubject(c);
|
|
168
175
|
if (!subject) return respond(c, fail(err.forbidden("Skills require an authenticated access subject.")));
|
|
169
176
|
try {
|
|
170
177
|
return respond(
|
|
@@ -179,10 +186,10 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
179
186
|
}
|
|
180
187
|
})
|
|
181
188
|
.put("/:skillId", v("json", UpdateSkillSchema), async (c) => {
|
|
182
|
-
const existing = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
189
|
+
const existing = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "write", appAccessAuthority(c));
|
|
183
190
|
if (!existing) return respond(c, fail(err.notFound("Skill")));
|
|
184
191
|
try {
|
|
185
|
-
const skill = await aiSkills.update(existing.id, c
|
|
192
|
+
const skill = await aiSkills.update(existing.id, resourceSubject(c), c.req.valid("json"), appAccessAuthority(c));
|
|
186
193
|
return skill ? respond(c, ok({ skill: publicSkill(c, skill) })) : respond(c, fail(err.notFound("Skill")));
|
|
187
194
|
} catch (error) {
|
|
188
195
|
if (isUniqueViolation(error)) return respond(c, fail(err.conflict("A skill with this name already exists.")));
|
|
@@ -192,37 +199,37 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
192
199
|
}
|
|
193
200
|
})
|
|
194
201
|
.delete("/:skillId", async (c) => {
|
|
195
|
-
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
196
|
-
return skill && (await aiSkills.delete(skill.id, c
|
|
202
|
+
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "admin", appAccessAuthority(c));
|
|
203
|
+
return skill && (await aiSkills.delete(skill.id, resourceSubject(c), appAccessAuthority(c)))
|
|
197
204
|
? respond(c, ok({ deleted: true }))
|
|
198
205
|
: respond(c, fail(err.notFound("Skill")));
|
|
199
206
|
})
|
|
200
207
|
.put("/:skillId/enabled", dependencies.authenticate ?? auth.requireRole("authenticated"), v("json", SkillEnabledSchema), async (c) => {
|
|
201
|
-
const subject = c
|
|
208
|
+
const subject = resourceSubject(c);
|
|
202
209
|
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, subject, "read", appAccessAuthority(c));
|
|
203
210
|
const enabled = skill ? await aiSkills.setEnabled(skill.id, subject, c.req.valid("json").enabled, appAccessAuthority(c)) : null;
|
|
204
211
|
return enabled === null ? respond(c, fail(err.notFound("Skill"))) : respond(c, ok({ enabled }));
|
|
205
212
|
})
|
|
206
213
|
.get("/:skillId/access", async (c) => {
|
|
207
|
-
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
208
|
-
const access = skill ? await aiSkills.listAccess(skill.id, c
|
|
214
|
+
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "admin", appAccessAuthority(c));
|
|
215
|
+
const access = skill ? await aiSkills.listAccess(skill.id, resourceSubject(c), appAccessAuthority(c)) : null;
|
|
209
216
|
return access ? respond(c, ok({ access })) : respond(c, fail(err.notFound("Skill")));
|
|
210
217
|
})
|
|
211
218
|
.post("/:skillId/access", v("json", SkillAccessSchema), async (c) => {
|
|
212
|
-
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
219
|
+
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "admin", appAccessAuthority(c));
|
|
213
220
|
const access = skill
|
|
214
|
-
? await aiSkills.grantAccess(skill.id, c
|
|
221
|
+
? await aiSkills.grantAccess(skill.id, resourceSubject(c), c.req.valid("json"), undefined, appAccessAuthority(c))
|
|
215
222
|
: null;
|
|
216
223
|
return access ? respond(c, ok({ access }), 201) : respond(c, fail(err.notFound("Skill")));
|
|
217
224
|
})
|
|
218
225
|
.patch("/:skillId/access/:accessId", v("json", SkillAccessUpdateSchema), async (c) => {
|
|
219
|
-
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
226
|
+
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "admin", appAccessAuthority(c));
|
|
220
227
|
try {
|
|
221
228
|
return skill &&
|
|
222
229
|
(await aiSkills.updateAccess(
|
|
223
230
|
skill.id,
|
|
224
231
|
c.req.param("accessId")!,
|
|
225
|
-
c
|
|
232
|
+
resourceSubject(c),
|
|
226
233
|
c.req.valid("json").permission,
|
|
227
234
|
undefined,
|
|
228
235
|
appAccessAuthority(c),
|
|
@@ -235,16 +242,10 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
235
242
|
}
|
|
236
243
|
})
|
|
237
244
|
.delete("/:skillId/access/:accessId", async (c) => {
|
|
238
|
-
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c
|
|
245
|
+
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, resourceSubject(c), "admin", appAccessAuthority(c));
|
|
239
246
|
try {
|
|
240
247
|
return skill &&
|
|
241
|
-
(await aiSkills.revokeAccess(
|
|
242
|
-
skill.id,
|
|
243
|
-
c.req.param("accessId")!,
|
|
244
|
-
c.get("accessSubject") ?? null,
|
|
245
|
-
undefined,
|
|
246
|
-
appAccessAuthority(c),
|
|
247
|
-
))
|
|
248
|
+
(await aiSkills.revokeAccess(skill.id, c.req.param("accessId")!, resourceSubject(c), undefined, appAccessAuthority(c)))
|
|
248
249
|
? respond(c, ok({ deleted: true }))
|
|
249
250
|
: respond(c, fail(err.notFound("Access entry")));
|
|
250
251
|
} catch (error) {
|