Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
234 commits
Select commit Hold shift + click to select a range
cacad42
wip add nested skills
dimaMachina Mar 11, 2026
834728c
wip skills page
dimaMachina Mar 12, 2026
f919ec6
update demo tree
dimaMachina Mar 12, 2026
1293cce
migration
dimaMachina Mar 12, 2026
faea8ef
migration
dimaMachina Mar 12, 2026
0978471
add a changeset
dimaMachina Mar 12, 2026
a688d9f
refactor
dimaMachina Mar 12, 2026
4c4cdbd
refactor
dimaMachina Mar 12, 2026
8c90262
refactor
dimaMachina Mar 12, 2026
392a4fc
refactor
dimaMachina Mar 12, 2026
8c60c3c
add arrows
dimaMachina Mar 12, 2026
cb1c945
add docs
dimaMachina Mar 12, 2026
ee9c975
upd page
dimaMachina Mar 12, 2026
ef1e05a
add text file writer
dimaMachina Mar 12, 2026
ccfa570
cleanup
dimaMachina Mar 12, 2026
01275b4
add tree node component
dimaMachina Mar 12, 2026
3bf3acd
upd
dimaMachina Mar 12, 2026
10e94e1
refactor
dimaMachina Mar 12, 2026
491c2bf
Merge branch 'main' into prd-6236
dimaMachina Mar 17, 2026
ee00dde
skill generator wip test
dimaMachina Mar 17, 2026
f874883
skill generator
dimaMachina Mar 17, 2026
c057ce9
polish skill generator
dimaMachina Mar 17, 2026
0530c0d
skills tests
dimaMachina Mar 17, 2026
3a4b72b
upd
dimaMachina Mar 17, 2026
4ba1ffc
Merge branch 'prd-6192-333' into prd-6236
dimaMachina Mar 17, 2026
7ffd874
upd
dimaMachina Mar 17, 2026
444f5fe
generation.test wip
dimaMachina Mar 17, 2026
9f5dec3
add generation.test
dimaMachina Mar 17, 2026
6e640c5
tree node
dimaMachina Mar 17, 2026
7c6cfbf
skill page
dimaMachina Mar 17, 2026
e9582ed
skill loader
dimaMachina Mar 17, 2026
99660be
skill loader refactor
dimaMachina Mar 17, 2026
7f1deb8
skill loader
dimaMachina Mar 17, 2026
4faa15e
move skills sidebar to layout
dimaMachina Mar 17, 2026
f8f7811
use pure monaco-editor component since we can have different file ext…
dimaMachina Mar 17, 2026
8beb630
add shadcn context menu component
dimaMachina Mar 17, 2026
1d4274e
format context menu
dimaMachina Mar 17, 2026
dd26c41
skills files and edit pages
dimaMachina Mar 17, 2026
c84445e
dry
dimaMachina Mar 17, 2026
2a2827f
update layout
dimaMachina Mar 17, 2026
c29601e
add docs
dimaMachina Mar 17, 2026
2c9cc78
add a changeset
dimaMachina Mar 17, 2026
fae2bb7
redirect to first skill
dimaMachina Mar 17, 2026
201167c
skill files utils
dimaMachina Mar 17, 2026
16edb18
skill selector
dimaMachina Mar 17, 2026
21af464
upd treenode
dimaMachina Mar 17, 2026
1580432
skill files
dimaMachina Mar 17, 2026
ab0282d
skill file editor
dimaMachina Mar 17, 2026
d5ce67a
delete skill confirmation
dimaMachina Mar 17, 2026
47df460
add skill files actions
dimaMachina Mar 17, 2026
64d399f
skills data
dimaMachina Mar 17, 2026
35701af
rm
dimaMachina Mar 17, 2026
640d79b
up skills route
dimaMachina Mar 17, 2026
158b085
upd
dimaMachina Mar 17, 2026
7e67975
upd
dimaMachina Mar 17, 2026
cf1383e
better project error message on dev
dimaMachina Mar 17, 2026
86ef481
types
dimaMachina Mar 17, 2026
62d8def
skill files
dimaMachina Mar 17, 2026
281c7ca
skill loader
dimaMachina Mar 17, 2026
7687e50
format
dimaMachina Mar 17, 2026
b410f66
project test
dimaMachina Mar 17, 2026
358bb93
entities
dimaMachina Mar 17, 2026
071f32b
project full tests
dimaMachina Mar 17, 2026
54de1f5
upd introspect
dimaMachina Mar 17, 2026
487a505
upd cliiii
dimaMachina Mar 17, 2026
1d932b3
nested skills tests
dimaMachina Mar 17, 2026
03987b2
remove edit page
dimaMachina Mar 17, 2026
9e8c78c
remove edit page
dimaMachina Mar 17, 2026
7074df5
update files page
dimaMachina Mar 17, 2026
744889e
upd
dimaMachina Mar 17, 2026
21130e1
upd file editor
dimaMachina Mar 17, 2026
4649df8
add SkillFileInsertSchema
dimaMachina Mar 18, 2026
c2c889b
superRefine
dimaMachina Mar 18, 2026
7c355d2
add transform
dimaMachina Mar 18, 2026
21f2810
rm some cases in superRefine
dimaMachina Mar 18, 2026
9540eed
use pipe
dimaMachina Mar 18, 2026
5aaf1cd
use pipe
dimaMachina Mar 18, 2026
d827cef
upd skill loader
dimaMachina Mar 18, 2026
287b994
validation skills
dimaMachina Mar 18, 2026
e96d775
upd
dimaMachina Mar 18, 2026
4375254
rm
dimaMachina Mar 18, 2026
ce7789e
upd
dimaMachina Mar 18, 2026
8eb3986
data access tests
dimaMachina Mar 18, 2026
21d8d64
skills db changes
dimaMachina Mar 18, 2026
b60b0fd
add
dimaMachina Mar 18, 2026
08088b5
skill files
dimaMachina Mar 18, 2026
37e13eb
upd
dimaMachina Mar 18, 2026
ef424e2
upd
dimaMachina Mar 18, 2026
bca6fc1
upd skill update
dimaMachina Mar 18, 2026
0aa7d7c
SkillUpdateSchema has required files
dimaMachina Mar 18, 2026
ebb09c0
upd skills manage
dimaMachina Mar 18, 2026
25ec4e0
upd
dimaMachina Mar 18, 2026
ebd659b
upd layout and page
dimaMachina Mar 18, 2026
4379732
Merge branch 'main' into prd-6236
dimaMachina Mar 18, 2026
b75fbee
style: auto-format with biome
github-actions[bot] Mar 18, 2026
ce84448
move empty state comp to page
dimaMachina Mar 18, 2026
2426479
upd schemas
dimaMachina Mar 18, 2026
620a43f
update schemas
dimaMachina Mar 18, 2026
2b6abc4
move to with-sidebar
dimaMachina Mar 18, 2026
e7152e4
polish
dimaMachina Mar 18, 2026
c5429d4
upd
dimaMachina Mar 18, 2026
7da634c
upd skill generator
dimaMachina Mar 18, 2026
fc48bd4
Make webhooks docs user friendly (#2752)
Gaurav-Narayan-Varma Mar 18, 2026
3c706f2
Use tag reference for pullfrog action instead of pinned SHA (#2757)
amikofalvy Mar 18, 2026
1182452
ci: provision PR preview environments in Railway (#2681)
vnv-varun Mar 18, 2026
6b369d8
fix(ci): correct Playwright cache restore-key prefix mismatch (#2760)
amikofalvy Mar 18, 2026
4753c9b
fix(ci): replace full git clone with shallow checkout in CI job (#2761)
amikofalvy Mar 18, 2026
4d3f611
format
dimaMachina Mar 18, 2026
84e4b90
Merge branch 'prd-6192-333' into prd-6236
dimaMachina Mar 18, 2026
cf620d3
rm migration
dimaMachina Mar 18, 2026
c9a66c6
Merge branch 'prd-6192-333' into prd-6236
dimaMachina Mar 19, 2026
97fdf7b
add new migrations
dimaMachina Mar 18, 2026
d0928e9
validation for skill is ok
dimaMachina Mar 18, 2026
08ddef8
move empty state to page
dimaMachina Mar 18, 2026
65c5c82
delete skill
dimaMachina Mar 18, 2026
c69831d
delete skill revalidate path
dimaMachina Mar 18, 2026
8f7a155
move skills schemas to own file
dimaMachina Mar 19, 2026
a94a2b2
upd
dimaMachina Mar 19, 2026
35e5ff6
upd
dimaMachina Mar 19, 2026
c383c1d
upd
dimaMachina Mar 19, 2026
93e5513
upd
dimaMachina Mar 19, 2026
c66b6ec
upd
dimaMachina Mar 19, 2026
61e9774
upd
dimaMachina Mar 19, 2026
06dd980
upd
dimaMachina Mar 19, 2026
2d0f520
upd
dimaMachina Mar 19, 2026
8405c23
upd
dimaMachina Mar 19, 2026
545b3ef
upd
dimaMachina Mar 19, 2026
b56f746
more typecheck fixes
dimaMachina Mar 19, 2026
5b867ec
more typecheck fixes
dimaMachina Mar 19, 2026
bbb0b2d
fix
dimaMachina Mar 19, 2026
2735c78
fix isRequired
dimaMachina Mar 19, 2026
82c2bf7
f1x
dimaMachina Mar 19, 2026
5431287
move skill sidebar
dimaMachina Mar 19, 2026
e4abbfa
refactor skill sidebar
dimaMachina Mar 19, 2026
c8cb267
add collapse file tree button
dimaMachina Mar 19, 2026
6cbe1e9
upd
dimaMachina Mar 19, 2026
e87fd5c
upd
dimaMachina Mar 19, 2026
0bfb16d
upd
dimaMachina Mar 19, 2026
69a7433
deleteSkillFile
dimaMachina Mar 19, 2026
dbfe03f
upd
dimaMachina Mar 19, 2026
6ce533c
deleteSkillFile
dimaMachina Mar 19, 2026
76bda40
fileId
dimaMachina Mar 19, 2026
2027327
fileId
dimaMachina Mar 19, 2026
2dc8f81
upd schemas
dimaMachina Mar 19, 2026
d7a91b3
DeleteSkillFileConfirmation
dimaMachina Mar 19, 2026
d17ed3d
updateSkillFile
dimaMachina Mar 19, 2026
49e8629
rm simplematter from sdk
dimaMachina Mar 19, 2026
bb2a66a
Get Skill File
dimaMachina Mar 19, 2026
cd9a686
getSkillFileById
dimaMachina Mar 19, 2026
382e89a
add new skill file page
dimaMachina Mar 19, 2026
c635cd1
update skill file editor
dimaMachina Mar 19, 2026
8b5bce6
format
dimaMachina Mar 19, 2026
fe6fedc
Create Skill File
dimaMachina Mar 20, 2026
b76aeaf
upd
dimaMachina Mar 20, 2026
f51b590
createSkillFileAction
dimaMachina Mar 20, 2026
8e1fa7e
createSkillFileById
dimaMachina Mar 20, 2026
b653e82
fix: Make OpenTelemetry startup idempotent (#2684)
mike-inkeep Mar 19, 2026
7e81757
Fix scheduled trigger invocations being skipped (#2777)
shagun-singh-inkeep Mar 19, 2026
7ed5e6d
adding app id (#2779)
shagun-singh-inkeep Mar 19, 2026
cc08989
Update pullfrog to latest SHA and add daily dependabot group for high…
amikofalvy Mar 19, 2026
0fa612c
ci: seed preview auth in PR previews (#2775)
vnv-varun Mar 20, 2026
ae911bf
Fix scopes placeholder to show correct Nango format (#2784)
omar-inkeep Mar 20, 2026
57578ce
fix(manage-ui): fix URL validation bypass and permission guard in cre…
omar-inkeep Mar 20, 2026
d46d82e
feat(pdf): Support PDF attachments (#2709)
mike-inkeep Mar 20, 2026
8c24240
feat: Composio connected account ID pinning (#2783)
omar-inkeep Mar 20, 2026
b3e4aa2
Version Packages (#2778)
inkeep-internal-ci[bot] Mar 20, 2026
3166324
Add back link to projects sidebar, add org settings link to user drop…
sarah-inkeep Mar 20, 2026
4ebc877
fix: return FileUIPart-compliant file parts from /run conversations e…
amikofalvy Mar 20, 2026
a39ee21
fix: treat load_skill as internal tool to suppress false-positive Sen…
anubra266 Mar 20, 2026
7dbfdaf
fix for fetch trace (#2791)
shagun-singh-inkeep Mar 20, 2026
9d9ad43
Fix empty breadcrumb on `/[tenantId]/profile` page and replace prop-d…
dimaMachina Mar 20, 2026
6846de6
fix(manage-ui): fix user-scoped MCP credential card not refreshing af…
omar-inkeep Mar 20, 2026
c37bec3
reuse `useProjectsQuery` instead of `fetchProjectsAction` in `useEffe…
dimaMachina Mar 20, 2026
7b9e673
upd
dimaMachina Mar 20, 2026
310ecb4
Merge branch 'prd-6192-333' into prd-6236
dimaMachina Mar 20, 2026
b695a58
upd skill file editor
dimaMachina Mar 22, 2026
425cbb2
polish skill editor like in github
dimaMachina Mar 22, 2026
af55bdb
remove canEdit
dimaMachina Mar 22, 2026
8fc81c6
upd
dimaMachina Mar 22, 2026
9ad4137
move skill metadata under collapsible advanced section
dimaMachina Mar 22, 2026
8add5ea
reuse DeleteConfirmation
dimaMachina Mar 22, 2026
4215eaa
upd skill file editor
dimaMachina Mar 22, 2026
1d7ce79
upd skill file editor2
dimaMachina Mar 22, 2026
5d2faa8
add useInitialCollapsedSidebar
dimaMachina Mar 22, 2026
5ff2fdc
add useInitialCollapsedSidebar
dimaMachina Mar 22, 2026
0c91c04
upd skill file editor
dimaMachina Mar 22, 2026
3720d6d
rm
dimaMachina Mar 22, 2026
19a161f
// Avoid including metadata in the frontmatter when it's null
dimaMachina Mar 22, 2026
1c06a46
fetchSkillFile and createSkillFile
dimaMachina Mar 22, 2026
907eb2d
refactor skill breadcrumb
dimaMachina Mar 22, 2026
ef1f1f2
format
dimaMachina Mar 22, 2026
7f40c20
polish
dimaMachina Mar 22, 2026
5bfef51
upd
dimaMachina Mar 22, 2026
3237fe5
skills integration tests
dimaMachina Mar 22, 2026
f0f3401
fix validation tests
dimaMachina Mar 22, 2026
1c7bcbe
update skill form
dimaMachina Mar 22, 2026
6b4f09a
upd api skills in manage ui
dimaMachina Mar 22, 2026
4590131
upd entities
dimaMachina Mar 22, 2026
44c142c
partial
dimaMachina Mar 22, 2026
3607676
fix skill loader test
dimaMachina Mar 22, 2026
0ddc49d
chore: update OpenAPI snapshot
github-actions[bot] Mar 22, 2026
62576ff
polish skill file editor
dimaMachina Mar 22, 2026
bacc80c
upd core skills tests
dimaMachina Mar 22, 2026
e688fcb
upd core skills tests
dimaMachina Mar 22, 2026
3ff87a6
add SkillCreateDataSchema
dimaMachina Mar 22, 2026
ceb4e98
update skills data manage
dimaMachina Mar 22, 2026
e34817d
remove redundant
dimaMachina Mar 22, 2026
36522b0
lint
dimaMachina Mar 22, 2026
fee5b8b
lint
dimaMachina Mar 22, 2026
c58b74f
typecheck
dimaMachina Mar 22, 2026
e038177
typecheck
dimaMachina Mar 22, 2026
362b30a
typecheck
dimaMachina Mar 22, 2026
b201830
knip
dimaMachina Mar 22, 2026
3e53004
lint
dimaMachina Mar 22, 2026
a9cbf7c
rollback skill modals
dimaMachina Mar 22, 2026
f6251e8
make modal opens in skill selector
dimaMachina Mar 22, 2026
766ed10
fix typecheck
dimaMachina Mar 22, 2026
5c7356a
this should fix cypress
dimaMachina Mar 22, 2026
d3f8226
fix sdk tests
dimaMachina Mar 22, 2026
b8bc05b
split permissions call
dimaMachina Mar 22, 2026
c27a7e8
add folder feature
dimaMachina Mar 22, 2026
a32efde
findNodeByPath
dimaMachina Mar 22, 2026
d0d227f
SkillDirectoryBrowser
dimaMachina Mar 22, 2026
fd6fd6a
upd
dimaMachina Mar 22, 2026
a140951
polish
dimaMachina Mar 22, 2026
e920708
fix
dimaMachina Mar 22, 2026
0ff5172
fix edge case metadata validation
dimaMachina Mar 22, 2026
4609838
fix
dimaMachina Mar 22, 2026
798e050
fix cli test
dimaMachina Mar 23, 2026
75f0633
format
dimaMachina Mar 23, 2026
8e5e90f
upd
dimaMachina Mar 23, 2026
a201741
upd
dimaMachina Mar 23, 2026
2feecf2
upd
dimaMachina Mar 23, 2026
a8c893b
chore: update OpenAPI snapshot
github-actions[bot] Mar 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
667 changes: 626 additions & 41 deletions agents-api/__snapshots__/openapi.json

Large diffs are not rendered by default.

415 changes: 415 additions & 0 deletions agents-api/src/__tests__/manage/integration/skills.test.ts

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion agents-api/src/domains/manage/routes/projectFull.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import { HTTPException } from 'hono/http-exception';
import type { ManageAppVariables } from 'src/types/app';
import manageDbClient from '../../../data/db/manageDbClient';
import runDbClient from '../../../data/db/runDbClient';
import { env } from '../../../env';
import { getLogger } from '../../../logger';
import { requireProjectPermission } from '../../../middleware/projectAccess';
import { requirePermission } from '../../../middleware/requirePermission';
Expand Down Expand Up @@ -699,7 +700,10 @@ const updateFullProjectHandler: ManageRouteHandler<typeof updateFullProjectRoute

throw createApiError({
code: 'internal_server_error',
message: 'Failed to update project',
message:
env.ENVIRONMENT === 'development' && error instanceof Error
? error.message
: 'Failed to update project',
});
}
};
Expand Down
272 changes: 264 additions & 8 deletions agents-api/src/domains/manage/routes/skills.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
import { OpenAPIHono } from '@hono/zod-openapi';
import { OpenAPIHono, z } from '@hono/zod-openapi';
import {
commonGetErrorResponses,
createApiError,
createSkill,
createSkillFileById,
deleteSkill,
getSkillById,
deleteSkillFileById,
getSkillByIdWithFiles,
getSkillFileById,
listSkills,
PaginationQueryParamsSchema,
ResourceIdSchema,
SKILL_ENTRY_FILE_PATH,
SkillApiInsertSchema,
SkillApiUpdateSchema,
SkillFileApiInsertSchema,
SkillFileApiUpdateSchema,
SkillFileResponse,
SkillListResponse,
SkillResponse,
SkillWithFilesResponse,
TenantProjectIdParamsSchema,
TenantProjectParamsSchema,
updateSkill,
updateSkillFileById,
} from '@inkeep/agents-core';
import { createProtectedRoute } from '@inkeep/agents-core/middleware';
import { HTTPException } from 'hono/http-exception';
import { requireProjectPermission } from '../../../middleware/projectAccess';
import type { ManageAppVariables } from '../../../types';
import {
Expand All @@ -25,6 +35,9 @@ import {
import { speakeasyOffsetLimitPagination } from '../../../utils/speakeasy';

const app = new OpenAPIHono<{ Variables: ManageAppVariables }>();
const TenantProjectSkillFileParamsSchema = TenantProjectIdParamsSchema.extend({
fileId: ResourceIdSchema,
});

app.openapi(
createProtectedRoute({
Expand Down Expand Up @@ -65,6 +78,116 @@ app.openapi(
}
);

app.openapi(
createProtectedRoute({
method: 'post',
path: '/{id}/files',
summary: 'Create Skill File',
operationId: 'create-skill-file',
tags: ['Skills'],
permission: requireProjectPermission('edit'),
request: {
params: TenantProjectIdParamsSchema,
body: {
content: {
'application/json': {
schema: SkillFileApiInsertSchema,
},
},
},
},
responses: {
201: {
description: 'Skill file created successfully',
content: {
'application/json': {
schema: SkillFileResponse,
},
},
},
...commonGetErrorResponses,
},
}),
async (c) => {
const db = c.get('db');
const { tenantId, projectId, id } = c.req.valid('param');
const body = c.req.valid('json');

try {
const file = await createSkillFileById(db)({
scopes: { tenantId, projectId },
skillId: id,
data: body,
});

if (!file) {
throw createApiError({
code: 'not_found',
message: 'Skill not found',
});
}

return c.json({ data: file }, 201);
} catch (error) {
if (error instanceof HTTPException) {
throw error;
}

if (error instanceof Error) {
throw createApiError({
code: error.message.includes('already exists') ? 'conflict' : 'unprocessable_entity',
message: error.message,
});
}

throw error;
}
}
);

app.openapi(
createProtectedRoute({
method: 'get',
path: '/{id}/files/{fileId}',
summary: 'Get Skill File',
operationId: 'get-skill-file',
tags: ['Skills'],
permission: requireProjectPermission('view'),
request: {
params: TenantProjectSkillFileParamsSchema,
},
responses: {
200: {
description: 'Skill file found',
content: {
'application/json': {
schema: SkillFileResponse,
},
},
},
...commonGetErrorResponses,
},
}),
async (c) => {
const db = c.get('db');
const { tenantId, projectId, id, fileId } = c.req.valid('param');
const file = await getSkillFileById(db)({
scopes: { tenantId, projectId },
skillId: id,
fileId,
});

if (!file) {
throw createApiError({
code: 'not_found',
message: 'Skill file not found',
});
}

return c.json({ data: file });
}
);

app.openapi(
createProtectedRoute({
method: 'get',
Expand All @@ -81,7 +204,7 @@ app.openapi(
description: 'Skill found',
content: {
'application/json': {
schema: SkillResponse,
schema: SkillWithFilesResponse,
},
},
},
Expand All @@ -91,7 +214,7 @@ app.openapi(
async (c) => {
const db = c.get('db');
const { tenantId, projectId, id } = c.req.valid('param');
const skill = await getSkillById(db)({
const skill = await getSkillByIdWithFiles(db)({
scopes: { tenantId, projectId },
skillId: id,
});
Expand Down Expand Up @@ -130,7 +253,7 @@ app.openapi(
description: 'Skill created successfully',
content: {
'application/json': {
schema: SkillResponse,
schema: SkillWithFilesResponse,
},
},
},
Expand Down Expand Up @@ -172,7 +295,7 @@ const updateSkillRouteConfig = {
description: 'Skill updated successfully',
content: {
'application/json': {
schema: SkillResponse,
schema: SkillWithFilesResponse,
},
},
},
Expand All @@ -185,10 +308,14 @@ const updateSkillHandler: ManageRouteHandler<typeof updateSkillRouteConfig> = as
const { tenantId, projectId, id } = c.req.valid('param');
const body = c.req.valid('json');

const data = body.files.some((file) => file.filePath === SKILL_ENTRY_FILE_PATH)
? body
: { files: [] };

const skill = await updateSkill(db)({
scopes: { tenantId, projectId },
skillId: id,
data: body,
data,
});

if (!skill) {
Expand All @@ -205,6 +332,81 @@ openapiRegisterPutPatchRoutesForLegacy(app, updateSkillRouteConfig, updateSkillH
operationId: 'update-skill',
});

app.openapi(
createProtectedRoute({
method: 'patch',
path: '/{id}/files/{fileId}',
summary: 'Update Skill File',
operationId: 'update-skill-file',
tags: ['Skills'],
permission: requireProjectPermission('edit'),
request: {
params: TenantProjectSkillFileParamsSchema,
body: {
content: {
'application/json': {
schema: SkillFileApiUpdateSchema,
},
},
},
},
responses: {
200: {
description: 'Skill file updated successfully',
content: {
'application/json': {
schema: SkillFileResponse,
},
},
},
...commonGetErrorResponses,
},
}),
async (c) => {
const db = c.get('db');
const { tenantId, projectId, id, fileId } = c.req.valid('param');
const body = c.req.valid('json');

try {
const file = await updateSkillFileById(db)({
scopes: { tenantId, projectId },
skillId: id,
fileId,
...body,
});

if (!file) {
throw createApiError({
code: 'not_found',
message: 'Skill file not found',
});
}

return c.json({ data: file });
} catch (error) {
if (error instanceof HTTPException) {
throw error;
}

if (error instanceof z.ZodError) {
throw createApiError({
code: 'unprocessable_entity',
message: 'Invalid skill file payload',
});
}

if (error instanceof Error) {
throw createApiError({
code: 'unprocessable_entity',
message: error.message,
});
}

throw error;
}
}
);

app.openapi(
createProtectedRoute({
method: 'delete',
Expand Down Expand Up @@ -243,4 +445,58 @@ app.openapi(
}
);

app.openapi(
createProtectedRoute({
method: 'delete',
path: '/{id}/files/{fileId}',
summary: 'Delete Skill File',
operationId: 'delete-skill-file',
tags: ['Skills'],
permission: requireProjectPermission('edit'),
request: {
params: TenantProjectSkillFileParamsSchema,
},
responses: {
204: {
description: 'Skill file deleted successfully',
},
...commonGetErrorResponses,
},
}),
async (c) => {
const db = c.get('db');
const { tenantId, projectId, id, fileId } = c.req.valid('param');

try {
const removed = await deleteSkillFileById(db)({
scopes: { tenantId, projectId },
skillId: id,
fileId,
});

if (!removed) {
throw createApiError({
code: 'not_found',
message: 'Skill file not found',
});
}

return c.body(null, 204);
} catch (error) {
if (error instanceof HTTPException) {
throw error;
}

if (error instanceof Error) {
throw createApiError({
code: 'unprocessable_entity',
message: error.message,
});
}

throw error;
}
}
);

export default app;
2 changes: 1 addition & 1 deletion agents-api/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"compilerOptions": {
"typeRoots": ["./node_modules/@types"],
"types": ["vitest/globals"],
"verbatimModuleSyntax": true,
"target": "ES2022",
"module": "ESNext",
Expand Down
Loading