@k2b/cloud 0.29.0 → 0.30.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 +5 -3
- package/src/_internal/app-roles.ts +14 -0
- package/src/_internal/capabilities.ts +111 -3
- package/src/_internal/capability-sentences.ts +413 -0
- package/src/_internal/define-app.ts +10 -1
- package/src/_internal/registry-validation.ts +5 -0
- package/src/access/PermissionEditor.tsx +43 -24
- package/src/ai/app-skill-store.ts +298 -0
- package/src/ai/app-skills.ts +105 -0
- package/src/ai/browser.ts +10 -0
- package/src/ai/capabilities.ts +68 -9
- package/src/ai/chart-block.ts +380 -0
- package/src/ai/chat/action-sentences.ts +49 -0
- package/src/ai/chat/blocks.tsx +203 -185
- package/src/ai/chat/chart-block.tsx +79 -0
- package/src/ai/chat/live-turn.browser-harness.tsx +5 -1
- package/src/ai/chat/message-utils.ts +3 -0
- package/src/ai/chat/messages.ts +12 -26
- package/src/ai/chat/tool-disclosure.tsx +21 -14
- package/src/ai/chat/tool-groups.ts +64 -37
- package/src/ai/chat/tool-names.ts +2 -0
- package/src/ai/chat/turn-layout.ts +4 -4
- package/src/ai/chat/turn-view.tsx +141 -69
- package/src/ai/code-runtime-tools.ts +59 -44
- package/src/ai/default-tool-contracts.ts +198 -0
- package/src/ai/default-tools.ts +25 -1
- package/src/ai/executor.ts +19 -21
- package/src/ai/index.ts +9 -1
- package/src/ai/migrate.ts +59 -12
- package/src/ai/protocol.ts +9 -4
- package/src/ai/runtime-tools.ts +1 -0
- package/src/ai/skill-content.ts +54 -0
- package/src/ai/skills-routes.ts +22 -13
- package/src/ai/skills.ts +177 -231
- package/src/ai/store.ts +20 -13
- package/src/ai/tool-sentences.ts +38 -0
- package/src/ai/types.ts +10 -2
- package/src/api/admin-ai-skills.ts +35 -16
- package/src/api/admin-outgoing-mail.ts +18 -0
- package/src/api/fanout.ts +128 -0
- package/src/api/help.ts +8 -3
- package/src/api/mcp.ts +4 -1
- package/src/api/search.ts +31 -106
- package/src/api/widgets.ts +259 -100
- package/src/browser/CloudResourceSearch.browser-harness.tsx +1 -1
- package/src/browser/ndjson.ts +34 -0
- package/src/browser/reload.ts +46 -0
- package/src/browser/search-stream.ts +4 -26
- package/src/browser/widgets.ts +28 -0
- package/src/capabilities/server.ts +20 -2
- package/src/cli/access.ts +48 -14
- package/src/cli/admin/ai-skills.ts +59 -39
- package/src/cli/admin/outgoing-mail.ts +30 -2
- package/src/contracts/announcement-cookie.ts +62 -0
- package/src/contracts/announcements.ts +14 -52
- package/src/contracts/capabilities.ts +24 -0
- package/src/contracts/outgoing-mail.ts +56 -11
- package/src/contracts/pwa-paths.ts +7 -2
- package/src/contracts/pwa.ts +2 -7
- package/src/contracts/registry.ts +1 -0
- package/src/contracts/shared.ts +5 -0
- package/src/contracts/widgets.ts +20 -0
- package/src/index.ts +1 -0
- package/src/server/help.ts +8 -1
- package/src/services/accounts/users.ts +15 -0
- package/src/services/help/index.ts +18 -5
- package/src/services/help/types.ts +3 -2
- package/src/services/identity/constants.ts +2 -0
- package/src/services/identity/key-ring.ts +123 -42
- package/src/services/identity/runtime-config.ts +13 -2
- package/src/services/outbox.ts +24 -9
- package/src/services/outgoing-mail/index.ts +33 -5
- package/src/services/outgoing-mail/messages.ts +60 -19
- package/src/services/outgoing-mail/store.ts +63 -4
- package/src/shared/network-address.ts +1 -0
- package/src/ssr/AppLaunchpadPanel.tsx +12 -3
- package/src/ssr/GlobalAnnouncements.island.tsx +2 -2
- package/src/ssr/GlobalSearchDialog.tsx +1 -43
- package/src/ssr/GlobalSearchTrigger.island.tsx +12 -3
- package/src/ssr/LayoutHelpTrigger.island.tsx +1 -1
- package/src/ssr/PwaRuntime.island.tsx +1 -1
- package/src/ssr/app-navigation.ts +5 -7
- package/src/ssr/global-search-host.tsx +55 -0
- package/src/ssr/help.ts +3 -3
- package/src/ssr/rail-context.ts +4 -3
- package/src/ssr/runtime.ts +14 -1
- package/src/styles/effects.css +142 -0
- package/src/styles/utilities-markdown-table.css +5 -1
- package/src/ai/code-mode-skill.ts +0 -114
- package/src/ai/data-analysis-skill.ts +0 -10
- package/src/ai/grids-skill.ts +0 -158
- package/src/ai/skill-seeds.ts +0 -560
package/src/ai/skills-routes.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Hono, type MiddlewareHandler } from "hono";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
import { AuthenticatedPrincipalSchema } from "../contracts/shared";
|
|
4
5
|
import { type AuthContext, auth, err, fail, ok, rateLimit, respond, v } from "../server";
|
|
6
|
+
import { localizedAppName } from "../ssr/runtime";
|
|
5
7
|
import { aiProjects } from "./projects";
|
|
6
8
|
import {
|
|
7
9
|
AI_SKILL_DESCRIPTION_MAX_CHARS,
|
|
@@ -12,9 +14,9 @@ import {
|
|
|
12
14
|
AI_SKILL_REFERENCE_MAX_CHARS,
|
|
13
15
|
AI_SKILL_REFERENCE_MAX_ITEMS,
|
|
14
16
|
} from "./skill-format";
|
|
15
|
-
import { getBuiltinAiSkillTemplate } from "./skill-seeds";
|
|
16
17
|
import {
|
|
17
18
|
type AiSkill,
|
|
19
|
+
AiSkillAppForbiddenError,
|
|
18
20
|
AiSkillInputError,
|
|
19
21
|
AiSkillLastAdminError,
|
|
20
22
|
AiSkillRevisionConflictError,
|
|
@@ -43,8 +45,13 @@ const SkillAccessSchema = z.object({ principal: AuthenticatedPrincipalSchema, pe
|
|
|
43
45
|
const SkillAccessUpdateSchema = z.object({ permission: z.enum(["read", "write", "admin"]) });
|
|
44
46
|
const SkillEnabledSchema = z.object({ enabled: z.boolean() });
|
|
45
47
|
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
+
type RouteContext = Parameters<typeof localizedAppName>[0];
|
|
49
|
+
const publicSource = (c: RouteContext, source: AiSkillSummary["source"]): AiSkillSummary["source"] =>
|
|
50
|
+
source ? { ...source, appName: localizedAppName(c, source.appId, source.appName) } : null;
|
|
51
|
+
const publicSummary =
|
|
52
|
+
(c: RouteContext) =>
|
|
53
|
+
(skill: AiSkillSummary): AiSkillSummary => ({ ...skill, id: skill.shortId, source: publicSource(c, skill.source) });
|
|
54
|
+
const publicSkill = (c: RouteContext, skill: AiSkill): AiSkill => ({ ...skill, id: skill.shortId, source: publicSource(c, skill.source) });
|
|
48
55
|
|
|
49
56
|
const isUniqueViolation = (error: unknown): boolean =>
|
|
50
57
|
typeof error === "object" && error !== null && "code" in error && (error as { code?: unknown }).code === "23505";
|
|
@@ -56,13 +63,18 @@ type AiSkillsRouteDependencies = {
|
|
|
56
63
|
|
|
57
64
|
const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
58
65
|
new Hono<AuthContext>()
|
|
66
|
+
.onError((error, c) => {
|
|
67
|
+
if (error instanceof AiSkillAppForbiddenError) return respond(c, fail(err.forbidden(error.message)));
|
|
68
|
+
if (error instanceof HTTPException) return error.getResponse();
|
|
69
|
+
throw error;
|
|
70
|
+
})
|
|
59
71
|
.use(dependencies.limit ?? rateLimit())
|
|
60
72
|
.use("*", dependencies.authenticate ?? auth.requireRole("authenticated"))
|
|
61
73
|
.get("/", v("query", z.object({ q: z.string().trim().max(200).optional() })), async (c) => {
|
|
62
74
|
const subject = c.get("accessSubject") ?? null;
|
|
63
75
|
const { q } = c.req.valid("query");
|
|
64
76
|
const skills = q === undefined ? await aiSkills.list(subject) : (await aiSkills.search(subject, q)).skills;
|
|
65
|
-
return respond(c, ok({ skills: skills.map(publicSummary) }));
|
|
77
|
+
return respond(c, ok({ skills: skills.map(publicSummary(c)) }));
|
|
66
78
|
})
|
|
67
79
|
.get(
|
|
68
80
|
"/project-links/:projectId",
|
|
@@ -81,7 +93,9 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
81
93
|
const result = project
|
|
82
94
|
? await aiSkills.projectSkills(project.id, subject, { query: query.q, page: query.page, available: query.available === "true" })
|
|
83
95
|
: null;
|
|
84
|
-
return result
|
|
96
|
+
return result
|
|
97
|
+
? respond(c, ok({ ...result, items: result.items.map(publicSummary(c)) }))
|
|
98
|
+
: respond(c, fail(err.notFound("Project")));
|
|
85
99
|
},
|
|
86
100
|
)
|
|
87
101
|
.get("/:skillId/projects", async (c) => {
|
|
@@ -103,16 +117,11 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
103
117
|
? respond(c, ok({ linked }))
|
|
104
118
|
: respond(c, fail(err.notFound("Skill or Project")));
|
|
105
119
|
})
|
|
106
|
-
.get("/templates/:name", dependencies.authenticate ?? auth.requireRole("authenticated"), (c) => {
|
|
107
|
-
if (!c.get("accessSubject")) return respond(c, fail(err.forbidden("Skill templates require an authenticated access subject.")));
|
|
108
|
-
const template = getBuiltinAiSkillTemplate(c.req.param("name"));
|
|
109
|
-
return template ? respond(c, ok({ template })) : respond(c, fail(err.notFound("Skill template")));
|
|
110
|
-
})
|
|
111
120
|
.post("/", dependencies.authenticate ?? auth.requireRole("authenticated"), v("json", SkillFieldsSchema), async (c) => {
|
|
112
121
|
const subject = c.get("accessSubject");
|
|
113
122
|
if (!subject) return respond(c, fail(err.forbidden("Skills require an authenticated access subject.")));
|
|
114
123
|
try {
|
|
115
|
-
return respond(c, ok({ skill: publicSkill(await aiSkills.create({ subject, ...c.req.valid("json") })) }), 201);
|
|
124
|
+
return respond(c, ok({ skill: publicSkill(c, await aiSkills.create({ subject, ...c.req.valid("json") })) }), 201);
|
|
116
125
|
} catch (error) {
|
|
117
126
|
if (isUniqueViolation(error)) return respond(c, fail(err.conflict("A skill with this name already exists.")));
|
|
118
127
|
if (error instanceof AiSkillInputError) return respond(c, fail(err.badInput(error.message)));
|
|
@@ -121,14 +130,14 @@ const buildAiSkillsRoutes = (dependencies: AiSkillsRouteDependencies = {}) =>
|
|
|
121
130
|
})
|
|
122
131
|
.get("/:skillId", async (c) => {
|
|
123
132
|
const skill = await aiSkills.getByShortId(c.req.param("skillId")!, c.get("accessSubject") ?? null);
|
|
124
|
-
return skill ? respond(c, ok({ skill: publicSkill(skill) })) : respond(c, fail(err.notFound("Skill")));
|
|
133
|
+
return skill ? respond(c, ok({ skill: publicSkill(c, skill) })) : respond(c, fail(err.notFound("Skill")));
|
|
125
134
|
})
|
|
126
135
|
.put("/:skillId", v("json", UpdateSkillSchema), async (c) => {
|
|
127
136
|
const existing = await aiSkills.getByShortId(c.req.param("skillId")!, c.get("accessSubject") ?? null, "write");
|
|
128
137
|
if (!existing) return respond(c, fail(err.notFound("Skill")));
|
|
129
138
|
try {
|
|
130
139
|
const skill = await aiSkills.update(existing.id, c.get("accessSubject") ?? null, c.req.valid("json"));
|
|
131
|
-
return skill ? respond(c, ok({ skill: publicSkill(skill) })) : respond(c, fail(err.notFound("Skill")));
|
|
140
|
+
return skill ? respond(c, ok({ skill: publicSkill(c, skill) })) : respond(c, fail(err.notFound("Skill")));
|
|
132
141
|
} catch (error) {
|
|
133
142
|
if (isUniqueViolation(error)) return respond(c, fail(err.conflict("A skill with this name already exists.")));
|
|
134
143
|
if (error instanceof AiSkillRevisionConflictError) return respond(c, fail(err.conflict(error.message)));
|