@blokkli/editor 2.0.0-alpha.36 → 2.0.0-alpha.37
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/global/types/blockOptions.d.ts +4 -3
- package/dist/module.d.mts +2 -2
- package/dist/module.json +1 -1
- package/dist/module.mjs +71 -4
- package/dist/modules/agent/index.d.mts +1 -1
- package/dist/modules/agent/index.mjs +236 -6
- package/dist/modules/agent/runtime/app/composables/agentProvider.js +31 -14
- package/dist/modules/agent/runtime/app/composables/defineBlokkliAgentTool.d.ts +2 -20
- package/dist/modules/agent/runtime/app/composables/defineBlokkliAgentTool.js +0 -3
- package/dist/modules/agent/runtime/app/features/agent/Panel/Conversation/Item/Assistant/index.vue +2 -2
- package/dist/modules/agent/runtime/app/features/agent/Panel/Conversation/Item/User/index.vue +1 -2
- package/dist/modules/agent/runtime/app/features/agent/Panel/DebugGallery/index.vue +1 -2
- package/dist/modules/agent/runtime/app/features/agent/Panel/Input/Actions/index.d.vue.ts +1 -0
- package/dist/modules/agent/runtime/app/features/agent/Panel/Input/Actions/index.vue +66 -59
- package/dist/modules/agent/runtime/app/features/agent/Panel/Input/Actions/index.vue.d.ts +1 -0
- package/dist/modules/agent/runtime/app/features/agent/Panel/Input/index.vue +10 -12
- package/dist/modules/agent/runtime/app/features/agent/Panel/Welcome/de.md +2 -2
- package/dist/modules/agent/runtime/app/features/agent/Panel/Welcome/en.md +2 -2
- package/dist/modules/agent/runtime/app/features/agent/Panel/index.vue +1 -5
- package/dist/modules/agent/runtime/app/features/agent/index.vue +89 -37
- package/dist/modules/agent/runtime/app/helpers/index.d.ts +16 -19
- package/dist/modules/agent/runtime/app/helpers/index.js +22 -46
- package/dist/modules/agent/runtime/app/helpers/pageStructure.js +1 -1
- package/dist/modules/agent/runtime/app/tools/add_content_search_paragraph/index.js +5 -9
- package/dist/modules/agent/runtime/app/tools/add_fragment/index.js +2 -6
- package/dist/modules/agent/runtime/app/tools/add_media_paragraph/index.js +2 -6
- package/dist/modules/agent/runtime/app/tools/add_paragraphs/index.js +2 -3
- package/dist/modules/agent/runtime/app/tools/add_reusable_paragraph/index.js +2 -6
- package/dist/modules/agent/runtime/app/tools/add_template/index.js +2 -6
- package/dist/modules/agent/runtime/app/tools/analyze_content/index.d.ts +2 -0
- package/dist/modules/agent/runtime/app/tools/analyze_content/index.js +120 -0
- package/dist/modules/agent/runtime/app/tools/check_readability/index.d.ts +2 -0
- package/dist/modules/agent/runtime/app/tools/check_readability/index.js +57 -0
- package/dist/modules/agent/runtime/app/tools/duplicate_paragraphs/index.js +2 -6
- package/dist/modules/agent/runtime/app/tools/get_all_page_content/index.js +1 -1
- package/dist/modules/agent/runtime/app/tools/get_bundle_info/index.js +2 -1
- package/dist/modules/agent/runtime/app/tools/get_content_fields/index.js +1 -1
- package/dist/modules/agent/runtime/app/tools/get_paragraph_context/index.js +2 -5
- package/dist/modules/agent/runtime/app/tools/get_paragraph_options/index.js +2 -1
- package/dist/modules/agent/runtime/app/tools/get_selected_paragraphs/index.js +2 -3
- package/dist/modules/agent/runtime/app/tools/helpers.d.ts +53 -0
- package/dist/modules/agent/runtime/app/tools/helpers.js +187 -0
- package/dist/modules/agent/runtime/app/tools/move_paragraphs/index.js +2 -6
- package/dist/modules/agent/runtime/app/tools/schemas.d.ts +0 -52
- package/dist/modules/agent/runtime/app/tools/schemas.js +0 -187
- package/dist/modules/agent/runtime/app/tools/search_content/index.js +40 -47
- package/dist/modules/agent/runtime/app/tools/set_paragraph_options/index.js +2 -5
- package/dist/modules/agent/runtime/app/types/index.d.ts +0 -61
- package/dist/modules/agent/runtime/server/Session.d.ts +25 -6
- package/dist/modules/agent/runtime/server/Session.js +109 -30
- package/dist/modules/agent/runtime/server/SessionManager.d.ts +3 -0
- package/dist/modules/agent/runtime/server/SessionManager.js +4 -1
- package/dist/modules/agent/runtime/server/agent.js +3 -2
- package/dist/modules/agent/runtime/server/default-skills/fixReadability.d.ts +2 -0
- package/dist/modules/agent/runtime/server/default-skills/fixReadability.js +69 -0
- package/dist/modules/agent/runtime/server/default-system-prompts/page-context.js +28 -0
- package/dist/modules/agent/runtime/server/server-tools/index.d.ts +10 -2
- package/dist/modules/agent/runtime/server/server-tools/index.js +1 -1
- package/dist/modules/agent/runtime/server/server-tools/load_tools/index.js +1 -1
- package/dist/modules/agent/runtime/shared/types.d.ts +46 -11
- package/dist/modules/agent/runtime/shared/types.js +22 -10
- package/dist/modules/charts/index.d.mts +1 -1
- package/dist/modules/charts/index.mjs +21 -7
- package/dist/modules/charts/runtime/blokkli/skills/charts.js +6 -6
- package/dist/modules/charts/runtime/blokkli/tools/chart_schemas.d.ts +25 -2
- package/dist/modules/charts/runtime/blokkli/tools/chart_schemas.js +39 -1
- package/dist/modules/charts/runtime/blokkli/tools/create_chart/index.js +24 -17
- package/dist/modules/charts/runtime/blokkli/tools/get_chart_data/index.js +11 -19
- package/dist/modules/charts/runtime/blokkli/tools/get_chart_type_options/index.js +2 -4
- package/dist/modules/charts/runtime/blokkli/tools/update_chart/index.js +8 -20
- package/dist/modules/charts/runtime/chartTypes/area.d.ts +6 -1
- package/dist/modules/charts/runtime/chartTypes/bar.d.ts +7 -1
- package/dist/modules/charts/runtime/chartTypes/define.d.ts +1 -1
- package/dist/modules/charts/runtime/chartTypes/donut.d.ts +5 -1
- package/dist/modules/charts/runtime/chartTypes/heatmap.d.ts +3 -1
- package/dist/modules/charts/runtime/chartTypes/index.d.ts +18 -0
- package/dist/modules/charts/runtime/chartTypes/line.d.ts +6 -1
- package/dist/modules/charts/runtime/chartTypes/pie.d.ts +4 -1
- package/dist/modules/charts/runtime/chartTypes/radar.d.ts +6 -1
- package/dist/modules/charts/runtime/chartTypes/radialBar.d.ts +5 -1
- package/dist/modules/charts/runtime/chartTypes/shared.d.ts +20 -5
- package/dist/modules/charts/runtime/chartTypes/types.d.ts +6 -6
- package/dist/modules/charts/runtime/components/ChartRenderer/index.d.vue.ts +145 -2
- package/dist/modules/charts/runtime/components/ChartRenderer/index.vue +2 -2
- package/dist/modules/charts/runtime/components/ChartRenderer/index.vue.d.ts +145 -2
- package/dist/modules/charts/runtime/components/index.d.ts +1 -0
- package/dist/modules/charts/runtime/components/index.js +1 -0
- package/dist/modules/charts/runtime/features/charts/Editor/ChartTypeOptions/index.d.vue.ts +3 -2
- package/dist/modules/charts/runtime/features/charts/Editor/ChartTypeOptions/index.vue.d.ts +3 -2
- package/dist/modules/charts/runtime/features/charts/Editor/CsvImport/index.vue +1 -2
- package/dist/modules/charts/runtime/features/charts/Editor/FootnoteEditor/index.vue +1 -1
- package/dist/modules/charts/runtime/features/charts/Editor/Preview/index.d.vue.ts +2 -0
- package/dist/modules/charts/runtime/features/charts/Editor/Preview/index.vue +35 -13
- package/dist/modules/charts/runtime/features/charts/Editor/Preview/index.vue.d.ts +2 -0
- package/dist/modules/charts/runtime/features/charts/Editor/index.d.vue.ts +1 -0
- package/dist/modules/charts/runtime/features/charts/Editor/index.vue +9 -3
- package/dist/modules/charts/runtime/features/charts/Editor/index.vue.d.ts +1 -0
- package/dist/modules/charts/runtime/features/charts/Editor/useChartEditorState.js +1 -1
- package/dist/modules/charts/runtime/features/charts/index.vue +6 -6
- package/dist/modules/charts/runtime/helpers/index.d.ts +25 -0
- package/dist/modules/charts/runtime/helpers/index.js +63 -0
- package/dist/modules/charts/runtime/types.d.ts +10 -28
- package/dist/modules/charts/runtime/types.js +0 -64
- package/dist/modules/drupal/index.d.mts +1 -1
- package/dist/modules/drupal/runtime/adapter/index.d.ts +3 -1
- package/dist/modules/drupal/runtime/adapter/index.js +4 -4
- package/dist/modules/table-of-contents/index.d.mts +1 -1
- package/dist/runtime/components/BlokkliItem.vue +1 -1
- package/dist/runtime/composables/defineBlokkli.js +1 -1
- package/dist/runtime/editor/components/AnimationCanvas/index.vue +13 -7
- package/dist/runtime/editor/components/Banner/index.d.vue.ts +1 -0
- package/dist/runtime/editor/components/Banner/index.vue +1 -1
- package/dist/runtime/editor/components/Banner/index.vue.d.ts +1 -0
- package/dist/runtime/editor/components/DropdownItem/index.d.vue.ts +1 -0
- package/dist/runtime/editor/components/DropdownItem/index.vue +3 -2
- package/dist/runtime/editor/components/DropdownItem/index.vue.d.ts +1 -0
- package/dist/runtime/editor/components/EditProvider.vue +7 -4
- package/dist/runtime/editor/components/FlexTextarea/index.d.vue.ts +5 -1
- package/dist/runtime/editor/components/FlexTextarea/index.vue +24 -101
- package/dist/runtime/editor/components/FlexTextarea/index.vue.d.ts +5 -1
- package/dist/runtime/editor/components/NestedEditorOverlay/index.vue +28 -9
- package/dist/runtime/editor/components/Popup/index.d.vue.ts +30 -0
- package/dist/runtime/editor/components/Popup/index.vue +82 -0
- package/dist/runtime/editor/components/Popup/index.vue.d.ts +30 -0
- package/dist/runtime/editor/components/Resizable/index.vue +4 -1
- package/dist/runtime/editor/components/Toolbar/index.vue +107 -6
- package/dist/runtime/editor/components/index.d.ts +4 -3
- package/dist/runtime/editor/components/index.js +6 -4
- package/dist/runtime/editor/composables/defineDropAreas.js +3 -3
- package/dist/runtime/editor/composables/defineDropHandler.d.ts +3 -0
- package/dist/runtime/editor/composables/defineDropHandler.js +10 -0
- package/dist/runtime/editor/composables/index.d.ts +1 -0
- package/dist/runtime/editor/composables/index.js +1 -0
- package/dist/runtime/editor/css/output.css +1 -1
- package/dist/runtime/editor/events/index.d.ts +9 -0
- package/dist/runtime/editor/features/add-list/index.vue +58 -1
- package/dist/runtime/editor/features/analyze/Main.d.vue.ts +3 -2
- package/dist/runtime/editor/features/analyze/Main.vue +28 -44
- package/dist/runtime/editor/features/analyze/Main.vue.d.ts +3 -2
- package/dist/runtime/editor/features/analyze/analyzers/readability.js +65 -0
- package/dist/runtime/editor/features/analyze/analyzers/types.d.ts +19 -0
- package/dist/runtime/editor/features/analyze/index.vue +18 -15
- package/dist/runtime/editor/features/clipboard/DropElement/Video.d.vue.ts +8 -0
- package/dist/runtime/editor/features/clipboard/{List/Item → DropElement}/Video.vue +1 -5
- package/dist/runtime/editor/features/clipboard/DropElement/Video.vue.d.ts +8 -0
- package/dist/runtime/editor/features/clipboard/DropElement/helpers.d.ts +1 -0
- package/dist/runtime/editor/features/clipboard/DropElement/helpers.js +14 -0
- package/dist/runtime/editor/features/clipboard/DropElement/index.d.vue.ts +16 -0
- package/dist/runtime/editor/features/clipboard/DropElement/index.vue +97 -0
- package/dist/runtime/editor/features/clipboard/DropElement/index.vue.d.ts +16 -0
- package/dist/runtime/editor/features/clipboard/helpers.d.ts +15 -0
- package/dist/runtime/editor/features/clipboard/helpers.js +62 -0
- package/dist/runtime/editor/features/clipboard/index.vue +585 -337
- package/dist/runtime/editor/features/clipboard/types.d.ts +14 -2
- package/dist/runtime/editor/features/dragging-overlay/DragItems/index.vue +17 -5
- package/dist/runtime/editor/features/dragging-overlay/Renderer/index.vue +2 -2
- package/dist/runtime/editor/features/dragging-overlay/index.vue +125 -219
- package/dist/runtime/editor/features/editable-field/Overlay/Plaintext/index.vue +4 -4
- package/dist/runtime/editor/features/editable-field/Overlay/index.vue +6 -0
- package/dist/runtime/editor/features/library/index.vue +14 -0
- package/dist/runtime/editor/features/media-library/index.vue +32 -1
- package/dist/runtime/editor/features/options/Form/ComplexType/index.d.vue.ts +11 -0
- package/dist/runtime/editor/features/options/Form/ComplexType/index.vue +36 -0
- package/dist/runtime/editor/features/options/Form/ComplexType/index.vue.d.ts +11 -0
- package/dist/runtime/editor/features/options/Form/Item.d.vue.ts +3 -2
- package/dist/runtime/editor/features/options/Form/Item.vue +10 -2
- package/dist/runtime/editor/features/options/Form/Item.vue.d.ts +3 -2
- package/dist/runtime/editor/features/options/Form/index.vue +5 -0
- package/dist/runtime/editor/features/search/index.vue +25 -1
- package/dist/runtime/editor/features/structure/index.vue +25 -1
- package/dist/runtime/editor/features/tour/index.vue +22 -12
- package/dist/runtime/editor/helpers/clipboardData/index.d.ts +11 -0
- package/dist/runtime/editor/helpers/clipboardData/index.js +157 -0
- package/dist/runtime/editor/helpers/options/index.js +5 -0
- package/dist/runtime/editor/icons/svg/stars.svg +5 -1
- package/dist/runtime/editor/plugins/Sidebar/Detached/index.d.vue.ts +1 -1
- package/dist/runtime/editor/plugins/Sidebar/Detached/index.vue.d.ts +1 -1
- package/dist/runtime/editor/plugins/Sidebar/index.d.vue.ts +14 -3
- package/dist/runtime/editor/plugins/Sidebar/index.vue +4 -2
- package/dist/runtime/editor/plugins/Sidebar/index.vue.d.ts +14 -3
- package/dist/runtime/editor/providers/analyze.d.ts +43 -0
- package/dist/runtime/editor/providers/analyze.js +78 -0
- package/dist/runtime/editor/providers/animation.d.ts +4 -0
- package/dist/runtime/editor/providers/animation.js +6 -0
- package/dist/runtime/editor/providers/dragdrop.d.ts +55 -0
- package/dist/runtime/editor/providers/dragdrop.js +37 -0
- package/dist/runtime/editor/providers/storage.js +15 -0
- package/dist/runtime/editor/providers/ui.d.ts +6 -0
- package/dist/runtime/editor/providers/ui.js +19 -0
- package/dist/runtime/editor/translations/de.json +73 -61
- package/dist/runtime/editor/translations/fr.json +67 -55
- package/dist/runtime/editor/translations/gsw_CH.json +71 -59
- package/dist/runtime/editor/translations/it.json +67 -55
- package/dist/runtime/editor/types/app.d.ts +4 -2
- package/dist/runtime/editor/types/draggable.d.ts +1 -0
- package/dist/runtime/editor/types/ui.d.ts +1 -1
- package/dist/runtime/helpers/injections.d.ts +1 -1
- package/dist/runtime/types/blockOptions.d.ts +2 -1
- package/dist/runtime/types/definitions.d.ts +4 -0
- package/dist/shared/{editor.CWQIFIEQ.d.mts → editor.BdBm1Z7C.d.mts} +12 -0
- package/dist/types.d.mts +1 -1
- package/package.json +5 -3
- package/dist/modules/charts/runtime/components/Fragment/BlokkliChart.d.vue.ts +0 -3
- package/dist/modules/charts/runtime/components/Fragment/BlokkliChart.vue +0 -29
- package/dist/modules/charts/runtime/components/Fragment/BlokkliChart.vue.d.ts +0 -3
- package/dist/runtime/editor/features/clipboard/List/Item/File.d.vue.ts +0 -4
- package/dist/runtime/editor/features/clipboard/List/Item/File.vue +0 -60
- package/dist/runtime/editor/features/clipboard/List/Item/File.vue.d.ts +0 -4
- package/dist/runtime/editor/features/clipboard/List/Item/Video.d.vue.ts +0 -4
- package/dist/runtime/editor/features/clipboard/List/Item/Video.vue.d.ts +0 -4
- package/dist/runtime/editor/features/clipboard/List/index.d.vue.ts +0 -11
- package/dist/runtime/editor/features/clipboard/List/index.vue +0 -72
- package/dist/runtime/editor/features/clipboard/List/index.vue.d.ts +0 -11
- package/dist/runtime/editor/features/tour/Popup/index.d.vue.ts +0 -9
- package/dist/runtime/editor/features/tour/Popup/index.vue +0 -34
- package/dist/runtime/editor/features/tour/Popup/index.vue.d.ts +0 -9
- package/dist/runtime/editor/providers/dropArea.d.ts +0 -48
- package/dist/runtime/editor/providers/dropArea.js +0 -22
|
@@ -3,6 +3,9 @@ import { Session } from "./Session.js";
|
|
|
3
3
|
const TOKEN_EXPIRY_SECONDS = 300;
|
|
4
4
|
const SESSION_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
5
5
|
export class SessionManager {
|
|
6
|
+
constructor(toolDefinitions) {
|
|
7
|
+
this.toolDefinitions = toolDefinitions;
|
|
8
|
+
}
|
|
6
9
|
sessions = /* @__PURE__ */ new Map();
|
|
7
10
|
/** Maps used token strings to their embedded timestamp (seconds). */
|
|
8
11
|
usedTokens = /* @__PURE__ */ new Map();
|
|
@@ -11,7 +14,7 @@ export class SessionManager {
|
|
|
11
14
|
this.pruneTokens();
|
|
12
15
|
}, 6e4);
|
|
13
16
|
create(peerId) {
|
|
14
|
-
const session = new Session();
|
|
17
|
+
const session = new Session(this.toolDefinitions);
|
|
15
18
|
this.sessions.set(peerId, { session, lastActivity: Date.now() });
|
|
16
19
|
return session;
|
|
17
20
|
}
|
|
@@ -2,7 +2,8 @@ import { defineWebSocketHandler, useRuntimeConfig } from "#imports";
|
|
|
2
2
|
import { clientMessageSchema } from "../shared/types.js";
|
|
3
3
|
import { SessionManager } from "./SessionManager.js";
|
|
4
4
|
import { send } from "./helpers.js";
|
|
5
|
-
|
|
5
|
+
import { toolDefinitions } from "#blokkli-build/agent-server";
|
|
6
|
+
const sessionManager = new SessionManager(toolDefinitions);
|
|
6
7
|
const config = useRuntimeConfig();
|
|
7
8
|
const authSecret = config.blokkli?.agent?.authSecret || "";
|
|
8
9
|
const apiKey = config.blokkli?.agent?.apiKey || "";
|
|
@@ -69,7 +70,7 @@ export default defineWebSocketHandler({
|
|
|
69
70
|
}
|
|
70
71
|
switch (data.type) {
|
|
71
72
|
case "init":
|
|
72
|
-
session.init(data.
|
|
73
|
+
session.init(data.toolNames, data.pageContext);
|
|
73
74
|
break;
|
|
74
75
|
case "start":
|
|
75
76
|
if (!apiKey) {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { defineBlokkliAgentSkill } from "../skills/index.js";
|
|
2
|
+
export default defineBlokkliAgentSkill({
|
|
3
|
+
name: "fix-readability",
|
|
4
|
+
label: { en: "Fix Readability", de: "Lesbarkeit verbessern" },
|
|
5
|
+
description: "Load this skill when asked to check, fix, or improve readability of texts on the page.",
|
|
6
|
+
getContents: () => `
|
|
7
|
+
# Fix Readability - Iterative Workflow
|
|
8
|
+
|
|
9
|
+
Fixing readability is an **iterative process**. You must verify your rewrites actually improved the scores before moving on.
|
|
10
|
+
|
|
11
|
+
## Step 1: Analyze
|
|
12
|
+
|
|
13
|
+
Call \`get_readability_issues\` to get current issues.
|
|
14
|
+
|
|
15
|
+
The result is an object keyed by paragraph UUID, then by field name:
|
|
16
|
+
\`\`\`
|
|
17
|
+
{
|
|
18
|
+
"<uuid>": {
|
|
19
|
+
"<fieldName>": {
|
|
20
|
+
"fieldValue": "current text",
|
|
21
|
+
"issues": [
|
|
22
|
+
{ "text": "flagged segment", "impact": "critical", "scores": { "lix": 85 } }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
\`\`\`
|
|
28
|
+
|
|
29
|
+
- \`fieldValue\` is the full editable field content.
|
|
30
|
+
- Each issue is a text segment within the field that was flagged, with its own scores.
|
|
31
|
+
- A field can have multiple issues (e.g. a rich text field with several hard-to-read paragraphs).
|
|
32
|
+
|
|
33
|
+
## Step 2: Pre-check with \`check_readability_for_texts\`
|
|
34
|
+
|
|
35
|
+
Before applying a rewrite, use \`check_readability_for_texts\` to verify your rewritten text actually scores better. Pass the proposed new text and check that the scores improved compared to the original.
|
|
36
|
+
|
|
37
|
+
This is cheap and fast \u2014 use it to iterate on your wording before committing a rewrite.
|
|
38
|
+
|
|
39
|
+
## Step 3: Rewrite
|
|
40
|
+
|
|
41
|
+
Use \`batch_rewrite_text\` to apply the improved texts. The UUID and field name from the analyze result map directly to the batch_rewrite_text input:
|
|
42
|
+
\`\`\`
|
|
43
|
+
{ "uuids": { "<uuid>": { "<fieldName>": "improved text" } } }
|
|
44
|
+
\`\`\`
|
|
45
|
+
|
|
46
|
+
When rewriting:
|
|
47
|
+
- Use shorter sentences and simpler words.
|
|
48
|
+
- Keep the original meaning and tone.
|
|
49
|
+
- Focus on fields with "critical" and "serious" impact first.
|
|
50
|
+
|
|
51
|
+
## Step 4: Verify
|
|
52
|
+
|
|
53
|
+
After the rewrites are applied, call \`get_readability_issues\` **again** to check if the issues are resolved.
|
|
54
|
+
|
|
55
|
+
- If issues remain: rewrite again with different wording.
|
|
56
|
+
- If new issues appeared: fix those too.
|
|
57
|
+
- Repeat until no more readability issues are reported.
|
|
58
|
+
|
|
59
|
+
**Do NOT skip the verification step.** A rewrite can easily make readability worse if sentences become longer or more complex.
|
|
60
|
+
|
|
61
|
+
## Important
|
|
62
|
+
|
|
63
|
+
- Always pre-check with \`check_readability_for_texts\` before applying rewrites.
|
|
64
|
+
- Always verify with \`get_readability_issues\` after applying rewrites.
|
|
65
|
+
- Never assume a rewrite fixed the issue.
|
|
66
|
+
- The scores (LIX, CLI, ARI) measure sentence length and word complexity. Lower is easier to read.
|
|
67
|
+
- LIX above 60 is flagged. Above 70 is critical.
|
|
68
|
+
`
|
|
69
|
+
});
|
|
@@ -51,6 +51,34 @@ export default defineBlokkliAgentSystemPrompt({
|
|
|
51
51
|
lines.push(formatContentField(field));
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
if (pageContext.contentSearchTabs?.length) {
|
|
55
|
+
lines.push(
|
|
56
|
+
"",
|
|
57
|
+
"## Content Search Tabs",
|
|
58
|
+
"",
|
|
59
|
+
"Use the `search_content` tool with one of these tab IDs to search for content:",
|
|
60
|
+
""
|
|
61
|
+
);
|
|
62
|
+
for (const tab of pageContext.contentSearchTabs) {
|
|
63
|
+
const typesDescription = tab.types.map((t) => `${t.type} (${t.bundles.join(", ")})`).join(", ");
|
|
64
|
+
lines.push(`- **\`${tab.id}\`** \u2014 ${tab.title}: ${typesDescription}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (pageContext.analyzers?.length) {
|
|
68
|
+
lines.push(
|
|
69
|
+
"",
|
|
70
|
+
"## Available Analyzers",
|
|
71
|
+
"",
|
|
72
|
+
"Use `get_readability_issues` to run all readability analyzers. The following analyzers are available:",
|
|
73
|
+
""
|
|
74
|
+
);
|
|
75
|
+
for (const a of pageContext.analyzers) {
|
|
76
|
+
const parts = [`- **\`${a.id}\`**`];
|
|
77
|
+
if (a.label) parts.push(`\u2014 ${a.label}`);
|
|
78
|
+
if (a.description) parts.push(`: ${a.description}`);
|
|
79
|
+
lines.push(parts.join(""));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
54
82
|
const editModeDescription = getEditModeDescription(pageContext.editMode);
|
|
55
83
|
if (editModeDescription) {
|
|
56
84
|
lines.push("", "## Edit Mode", "", editModeDescription);
|
|
@@ -23,7 +23,10 @@ export type ToolResultEntry = {
|
|
|
23
23
|
export type ToolDefinitionContext = {
|
|
24
24
|
resolvedSkills: ResolvedSkill[];
|
|
25
25
|
plan: ServerPlan | null;
|
|
26
|
-
unloadedLazyTools:
|
|
26
|
+
unloadedLazyTools: {
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
}[];
|
|
27
30
|
};
|
|
28
31
|
/**
|
|
29
32
|
* Context passed to `handle()` — provides access to session state
|
|
@@ -33,7 +36,7 @@ export type ServerToolContext = {
|
|
|
33
36
|
toolUseId: string;
|
|
34
37
|
send: (message: ServerMessage) => void;
|
|
35
38
|
resolvedSkills: ResolvedSkill[];
|
|
36
|
-
|
|
39
|
+
lazyToolNames: string[];
|
|
37
40
|
activatedLazyTools: Set<string>;
|
|
38
41
|
loadedSkills: Set<string>;
|
|
39
42
|
plan: ServerPlan | null;
|
|
@@ -79,6 +82,11 @@ export type ServerSideTool<T extends z.ZodType = z.ZodType> = {
|
|
|
79
82
|
* Identity function for type inference when defining a server-side tool.
|
|
80
83
|
*/
|
|
81
84
|
export declare function defineServerSideTool<T extends z.ZodType>(tool: ServerSideTool<T>): ServerSideTool<T>;
|
|
85
|
+
/**
|
|
86
|
+
* Recursively strip $schema and additionalProperties from a JSON Schema object.
|
|
87
|
+
* These are unnecessary for the LLM and waste context window tokens.
|
|
88
|
+
*/
|
|
89
|
+
export declare function stripSchemaOverhead(obj: unknown): unknown;
|
|
82
90
|
/**
|
|
83
91
|
* Build a ClientToolDefinition from a ServerSideTool for a given context.
|
|
84
92
|
* Returns null when the tool should not be offered this turn.
|
|
@@ -18,7 +18,7 @@ export default defineServerSideTool({
|
|
|
18
18
|
handle(ctx, input) {
|
|
19
19
|
const loaded = [];
|
|
20
20
|
for (const name of input.tools) {
|
|
21
|
-
if (ctx.
|
|
21
|
+
if (ctx.lazyToolNames.includes(name)) {
|
|
22
22
|
ctx.activatedLazyTools.add(name);
|
|
23
23
|
loaded.push(name);
|
|
24
24
|
}
|
|
@@ -113,6 +113,21 @@ export type BlockBundle = {
|
|
|
113
113
|
* Edit mode determines what actions the user is allowed to perform.
|
|
114
114
|
*/
|
|
115
115
|
export type EditMode = 'readonly' | 'editing' | 'translating' | 'review';
|
|
116
|
+
/**
|
|
117
|
+
* Server-side tool metadata extracted at build time.
|
|
118
|
+
* Contains only static properties needed by the server — no execute(), label(),
|
|
119
|
+
* component, or other runtime-only fields.
|
|
120
|
+
*/
|
|
121
|
+
export type ServerToolMetadata = {
|
|
122
|
+
name: string;
|
|
123
|
+
description: string;
|
|
124
|
+
category: 'query' | 'mutation';
|
|
125
|
+
modes: EditMode[];
|
|
126
|
+
paramsSchema: z.ZodType;
|
|
127
|
+
lazy?: boolean;
|
|
128
|
+
volatile?: boolean;
|
|
129
|
+
requiredAdapterMethods?: string[];
|
|
130
|
+
};
|
|
116
131
|
/**
|
|
117
132
|
* Fragment definition for reusable content blocks.
|
|
118
133
|
*/
|
|
@@ -152,6 +167,22 @@ export type PageContext = {
|
|
|
152
167
|
fragments: Fragment[];
|
|
153
168
|
/** Content fields on the page entity itself (e.g., lead text, hero image) */
|
|
154
169
|
entityContentFields: BlockBundleContentField[];
|
|
170
|
+
/** Available content search tabs (for the search_content tool) */
|
|
171
|
+
contentSearchTabs?: {
|
|
172
|
+
id: string;
|
|
173
|
+
title: string;
|
|
174
|
+
types: {
|
|
175
|
+
type: string;
|
|
176
|
+
bundles: string[];
|
|
177
|
+
}[];
|
|
178
|
+
}[];
|
|
179
|
+
/** Available content analyzers (for the get_readability_issues tool) */
|
|
180
|
+
analyzers?: {
|
|
181
|
+
id: string;
|
|
182
|
+
type?: string;
|
|
183
|
+
label?: string;
|
|
184
|
+
description?: string;
|
|
185
|
+
}[];
|
|
155
186
|
};
|
|
156
187
|
/**
|
|
157
188
|
* Classified error categories for AI provider errors.
|
|
@@ -266,17 +297,7 @@ export declare const clientMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
266
297
|
authToken: z.ZodString;
|
|
267
298
|
}, z.core.$strip>, z.ZodObject<{
|
|
268
299
|
type: z.ZodLiteral<"init">;
|
|
269
|
-
|
|
270
|
-
name: z.ZodString;
|
|
271
|
-
description: z.ZodString;
|
|
272
|
-
input_schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
273
|
-
lazy: z.ZodOptional<z.ZodBoolean>;
|
|
274
|
-
category: z.ZodOptional<z.ZodEnum<{
|
|
275
|
-
query: "query";
|
|
276
|
-
mutation: "mutation";
|
|
277
|
-
}>>;
|
|
278
|
-
volatile: z.ZodOptional<z.ZodBoolean>;
|
|
279
|
-
}, z.core.$strip>>;
|
|
300
|
+
toolNames: z.ZodArray<z.ZodString>;
|
|
280
301
|
pageContext: z.ZodObject<{
|
|
281
302
|
title: z.ZodString;
|
|
282
303
|
entityType: z.ZodString;
|
|
@@ -347,6 +368,20 @@ export declare const clientMessageSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
347
368
|
bundles: z.ZodArray<z.ZodString>;
|
|
348
369
|
}, z.core.$strip>>;
|
|
349
370
|
}, z.core.$strip>]>>;
|
|
371
|
+
contentSearchTabs: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
372
|
+
id: z.ZodString;
|
|
373
|
+
title: z.ZodString;
|
|
374
|
+
types: z.ZodArray<z.ZodObject<{
|
|
375
|
+
type: z.ZodString;
|
|
376
|
+
bundles: z.ZodArray<z.ZodString>;
|
|
377
|
+
}, z.core.$strip>>;
|
|
378
|
+
}, z.core.$strip>>>;
|
|
379
|
+
analyzers: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
380
|
+
id: z.ZodString;
|
|
381
|
+
type: z.ZodOptional<z.ZodString>;
|
|
382
|
+
label: z.ZodOptional<z.ZodString>;
|
|
383
|
+
description: z.ZodOptional<z.ZodString>;
|
|
384
|
+
}, z.core.$strip>>>;
|
|
350
385
|
}, z.core.$strip>;
|
|
351
386
|
}, z.core.$strip>, z.ZodObject<{
|
|
352
387
|
type: z.ZodLiteral<"start">;
|
|
@@ -66,7 +66,27 @@ const pageContextSchema = z.object({
|
|
|
66
66
|
isPublished: z.boolean().nullable(),
|
|
67
67
|
editMode: z.enum(["readonly", "editing", "translating", "review"]),
|
|
68
68
|
fragments: z.array(fragmentSchema),
|
|
69
|
-
entityContentFields: z.array(blockBundleContentFieldSchema)
|
|
69
|
+
entityContentFields: z.array(blockBundleContentFieldSchema),
|
|
70
|
+
contentSearchTabs: z.array(
|
|
71
|
+
z.object({
|
|
72
|
+
id: z.string(),
|
|
73
|
+
title: z.string(),
|
|
74
|
+
types: z.array(
|
|
75
|
+
z.object({
|
|
76
|
+
type: z.string(),
|
|
77
|
+
bundles: z.array(z.string())
|
|
78
|
+
})
|
|
79
|
+
)
|
|
80
|
+
})
|
|
81
|
+
).optional(),
|
|
82
|
+
analyzers: z.array(
|
|
83
|
+
z.object({
|
|
84
|
+
id: z.string(),
|
|
85
|
+
type: z.string().optional(),
|
|
86
|
+
label: z.string().optional(),
|
|
87
|
+
description: z.string().optional()
|
|
88
|
+
})
|
|
89
|
+
).optional()
|
|
70
90
|
});
|
|
71
91
|
const pageStructureBlockSchema = z.lazy(
|
|
72
92
|
() => z.object({
|
|
@@ -81,14 +101,6 @@ export const pageStructureSchema = z.object({
|
|
|
81
101
|
fields: z.record(z.string(), z.array(pageStructureBlockSchema)),
|
|
82
102
|
entityContentFields: z.record(z.string(), z.string()).optional()
|
|
83
103
|
});
|
|
84
|
-
const clientToolDefinitionSchema = z.object({
|
|
85
|
-
name: z.string(),
|
|
86
|
-
description: z.string(),
|
|
87
|
-
input_schema: z.record(z.string(), z.unknown()),
|
|
88
|
-
lazy: z.boolean().optional(),
|
|
89
|
-
category: z.enum(["query", "mutation"]).optional(),
|
|
90
|
-
volatile: z.boolean().optional()
|
|
91
|
-
});
|
|
92
104
|
const genericContentBlockSchema = z.discriminatedUnion("type", [
|
|
93
105
|
z.object({ type: z.literal("text"), text: z.string() }),
|
|
94
106
|
z.object({ type: z.literal("skill"), name: z.string(), text: z.string() }),
|
|
@@ -118,7 +130,7 @@ export const clientMessageSchema = z.discriminatedUnion("type", [
|
|
|
118
130
|
z.object({ type: z.literal("authenticate"), authToken: z.string() }),
|
|
119
131
|
z.object({
|
|
120
132
|
type: z.literal("init"),
|
|
121
|
-
|
|
133
|
+
toolNames: z.array(z.string()),
|
|
122
134
|
pageContext: pageContextSchema
|
|
123
135
|
}),
|
|
124
136
|
z.object({
|
|
@@ -17,6 +17,10 @@ import type { ChartColor } from '#blokkli/charts/types'
|
|
|
17
17
|
|
|
18
18
|
export const COLORS: Record<string, ChartColor>
|
|
19
19
|
`;
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
context: "both",
|
|
23
|
+
write: true
|
|
20
24
|
}
|
|
21
25
|
);
|
|
22
26
|
}
|
|
@@ -29,14 +33,24 @@ const index = defineBlokkliModule({
|
|
|
29
33
|
options.blokkliDirs ??= [];
|
|
30
34
|
options.blokkliDirs.push(resolve("./runtime/blokkli"));
|
|
31
35
|
},
|
|
32
|
-
setup(
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
setup({ context, helper, $t }, options) {
|
|
37
|
+
context.features.addFile(resolve("./runtime/features/charts/index.vue"));
|
|
38
|
+
context.addTemplate(chartsConfigTemplate(options));
|
|
39
|
+
helper.addAlias("#blokkli/charts/types", resolve("./runtime/types"));
|
|
40
|
+
helper.addAlias(
|
|
41
|
+
"#blokkli/charts/components",
|
|
42
|
+
resolve("./runtime/components")
|
|
35
43
|
);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
44
|
+
context.registerComplexOptionType({
|
|
45
|
+
id: "chart",
|
|
46
|
+
typeName: "BlokkliChartData",
|
|
47
|
+
typePath: resolve("./runtime/types"),
|
|
48
|
+
editorComponentPath: resolve(
|
|
49
|
+
"./runtime/features/charts/Editor/index.vue"
|
|
50
|
+
),
|
|
51
|
+
editorButtonLabel: $t("chartsEditButton", "Edit chart..."),
|
|
52
|
+
editorIcon: "bk_mdi_area_chart"
|
|
53
|
+
});
|
|
40
54
|
}
|
|
41
55
|
});
|
|
42
56
|
|
|
@@ -2,27 +2,27 @@ import { defineBlokkliAgentSkill } from "#blokkli/agent/server/skills";
|
|
|
2
2
|
export default defineBlokkliAgentSkill({
|
|
3
3
|
name: "charts",
|
|
4
4
|
label: { en: "Working with charts", de: "Arbeiten mit Diagrammen" },
|
|
5
|
-
description: "How charts work in bl\xF6kkli. LOAD THIS when the user asks about charts or when you need to create or update a chart!
|
|
5
|
+
description: "How charts work in bl\xF6kkli. LOAD THIS when the user asks about charts or when you need to create or update a chart!",
|
|
6
6
|
getContents: () => `
|
|
7
7
|
# Charts
|
|
8
8
|
|
|
9
|
-
Charts are
|
|
9
|
+
Charts are NOT a specific block bundle. Instead, charts are a **complex option type**: any block can have a JSON option with \`dataType: 'chart'\`. The chart data is stored as a JSON string in that option. The option key can be anything (e.g. "data", "chart", etc.) \u2014 the tools detect it automatically.
|
|
10
10
|
|
|
11
11
|
## Key concept
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
A "chart block" is any block whose definition has a JSON option with \`dataType: 'chart'\`. The chart tools automatically detect which option holds chart data, so you don't need to know the option key or bundle name.
|
|
14
14
|
|
|
15
15
|
## Available tools
|
|
16
16
|
|
|
17
17
|
- **get_chart_data**: Read the current chart data (type, categories, series, colors, typeOptions). Always call this first when modifying an existing chart!
|
|
18
|
-
- **create_chart**: Create a new chart. Requires chart data (type, categories, series).
|
|
19
|
-
- **update_chart**: Update an existing chart. Pass the
|
|
18
|
+
- **create_chart**: Create a new chart. Requires chart data (type, categories, series). The tool automatically finds which bundle in the target field has a chart option.
|
|
19
|
+
- **update_chart**: Update an existing chart. Pass the block's UUID and only the properties you want to change (title, type, categories, series, categoryColors, footnotes, typeOptions).
|
|
20
20
|
- **get_chart_type_options**: Get available typeOptions for a chart type. Call this to discover which rendering options exist (e.g. stacked, horizontal for bar charts) before setting typeOptions.
|
|
21
21
|
|
|
22
22
|
## Workflow
|
|
23
23
|
|
|
24
24
|
1. To **read** a chart's current state: use get_chart_data with the paragraph UUID.
|
|
25
|
-
2. To **create** a chart: use create_chart with the data.
|
|
25
|
+
2. To **create** a chart: use create_chart with the data. The tool finds the right bundle automatically from the target field's allowed bundles.
|
|
26
26
|
3. To **modify** a chart: first call get_chart_data to see the current state, then use update_chart with only the properties you want to change.
|
|
27
27
|
4. To **change rendering options** (e.g. stacked bars, smooth lines, grid lines): first call get_chart_type_options with the chart type to see available options, then use update_chart with the typeOptions property.
|
|
28
28
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { BlokkliChartData, ChartColor } from '#blokkli/charts/types';
|
|
3
|
+
import type { McpToolContext } from '#blokkli/agent/app/types';
|
|
3
4
|
export declare const chartTypeEnum: z.ZodEnum<{
|
|
4
5
|
bar: "bar";
|
|
5
6
|
line: "line";
|
|
6
|
-
pie: "pie";
|
|
7
7
|
area: "area";
|
|
8
|
+
pie: "pie";
|
|
8
9
|
donut: "donut";
|
|
9
10
|
heatmap: "heatmap";
|
|
10
11
|
radialBar: "radialBar";
|
|
@@ -25,8 +26,8 @@ export declare const chartDataSchema: z.ZodObject<{
|
|
|
25
26
|
type: z.ZodEnum<{
|
|
26
27
|
bar: "bar";
|
|
27
28
|
line: "line";
|
|
28
|
-
pie: "pie";
|
|
29
29
|
area: "area";
|
|
30
|
+
pie: "pie";
|
|
30
31
|
donut: "donut";
|
|
31
32
|
heatmap: "heatmap";
|
|
32
33
|
radialBar: "radialBar";
|
|
@@ -61,3 +62,25 @@ export declare function validateChartData(data: BlokkliChartData, colors: Record
|
|
|
61
62
|
} | {
|
|
62
63
|
data: BlokkliChartData;
|
|
63
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Find the option key for a chart option on a block.
|
|
67
|
+
*
|
|
68
|
+
* Charts are stored as a JSON option with `dataType: 'chart'` on any block.
|
|
69
|
+
* This helper looks up the block's definition and returns the option key.
|
|
70
|
+
*/
|
|
71
|
+
export declare function findChartOptionKey(ctx: McpToolContext, uuid: string): {
|
|
72
|
+
key: string;
|
|
73
|
+
} | {
|
|
74
|
+
error: string;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Find a bundle that has a chart option among a field's allowed bundles.
|
|
78
|
+
*
|
|
79
|
+
* Returns the bundle name and the option key for the chart data.
|
|
80
|
+
*/
|
|
81
|
+
export declare function findChartBundle(ctx: McpToolContext, allowedBundles: string[]): {
|
|
82
|
+
bundle: string;
|
|
83
|
+
key: string;
|
|
84
|
+
} | {
|
|
85
|
+
error: string;
|
|
86
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { getColorIdAtIndex } from "
|
|
2
|
+
import { getColorIdAtIndex } from "../../helpers/index.js";
|
|
3
3
|
import { getChartTypeRuntime, getDefaultTypeOptions } from "../../chartTypes/index.js";
|
|
4
4
|
import { COLORS } from "#blokkli-build/charts-config";
|
|
5
5
|
const SINGLE_SERIES_TYPES = ["pie", "donut", "radialBar"];
|
|
@@ -96,3 +96,41 @@ export function validateChartData(data, colors) {
|
|
|
96
96
|
}
|
|
97
97
|
return { data };
|
|
98
98
|
}
|
|
99
|
+
export function findChartOptionKey(ctx, uuid) {
|
|
100
|
+
const { blocks, definitions, selection } = ctx.app;
|
|
101
|
+
const block = blocks.getBlock(uuid);
|
|
102
|
+
if (!block) return { error: `Paragraph not found: ${uuid}` };
|
|
103
|
+
const bundle = block.library?.reusableBundle || block.bundle;
|
|
104
|
+
const selectionItem = selection.items.value.find((v) => v.uuid === uuid);
|
|
105
|
+
const definition = definitions.getBlockDefinition(
|
|
106
|
+
bundle,
|
|
107
|
+
selectionItem?.fieldListType ?? "default",
|
|
108
|
+
selectionItem?.parentBlockBundle
|
|
109
|
+
);
|
|
110
|
+
if (!definition?.options) {
|
|
111
|
+
return { error: `Paragraph "${uuid}" (${bundle}) has no chart option.` };
|
|
112
|
+
}
|
|
113
|
+
const chartEntry = Object.entries(definition.options).find(
|
|
114
|
+
([_, opt]) => opt.type === "json" && "dataType" in opt && opt.dataType === "chart"
|
|
115
|
+
);
|
|
116
|
+
if (!chartEntry) {
|
|
117
|
+
return { error: `Paragraph "${uuid}" (${bundle}) has no chart option.` };
|
|
118
|
+
}
|
|
119
|
+
return { key: chartEntry[0] };
|
|
120
|
+
}
|
|
121
|
+
export function findChartBundle(ctx, allowedBundles) {
|
|
122
|
+
const { definitions } = ctx.app;
|
|
123
|
+
for (const bundle of allowedBundles) {
|
|
124
|
+
const def = definitions.getDefaultDefinition(bundle);
|
|
125
|
+
if (!def?.options) continue;
|
|
126
|
+
const entry = Object.entries(def.options).find(
|
|
127
|
+
([_, opt]) => opt.type === "json" && "dataType" in opt && opt.dataType === "chart"
|
|
128
|
+
);
|
|
129
|
+
if (entry) {
|
|
130
|
+
return { bundle, key: entry[0] };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
error: `No block type with a chart option is allowed in this field.`
|
|
135
|
+
};
|
|
136
|
+
}
|
|
@@ -3,10 +3,14 @@ import { defineBlokkliAgentTool } from "#blokkli/agent/app/composables";
|
|
|
3
3
|
import {
|
|
4
4
|
mutationResultSchema,
|
|
5
5
|
parentSchema,
|
|
6
|
-
positionSchema
|
|
7
|
-
resolvePosition
|
|
6
|
+
positionSchema
|
|
8
7
|
} from "#blokkli/agent/app/tools/schemas";
|
|
9
|
-
import {
|
|
8
|
+
import { resolvePosition } from "#blokkli/agent/app/tools/helpers";
|
|
9
|
+
import {
|
|
10
|
+
chartDataSchema,
|
|
11
|
+
validateChartData,
|
|
12
|
+
findChartBundle
|
|
13
|
+
} from "../chart_schemas.js";
|
|
10
14
|
import { COLORS } from "#blokkli-build/charts-config";
|
|
11
15
|
const paramsSchema = z.object({
|
|
12
16
|
chart: chartDataSchema,
|
|
@@ -25,24 +29,19 @@ export default defineBlokkliAgentTool({
|
|
|
25
29
|
},
|
|
26
30
|
paramsSchema,
|
|
27
31
|
resultSchema: mutationResultSchema,
|
|
28
|
-
requiredAdapterMethods: ["
|
|
32
|
+
requiredAdapterMethods: ["addNewBlocks"],
|
|
29
33
|
execute(ctx, params) {
|
|
30
|
-
const { fields
|
|
31
|
-
const fragment = definitions.fragmentDefinitions.value.find(
|
|
32
|
-
(f) => f.name === "blokkli_chart"
|
|
33
|
-
);
|
|
34
|
-
if (!fragment) {
|
|
35
|
-
return { error: 'Chart fragment "blokkli_chart" is not available.' };
|
|
36
|
-
}
|
|
34
|
+
const { fields } = ctx.app;
|
|
37
35
|
const field = fields.find(params.parent.uuid, params.parent.field);
|
|
38
36
|
if (!field) {
|
|
39
37
|
return {
|
|
40
38
|
error: `Field not found: ${params.parent.field} on entity ${params.parent.uuid}`
|
|
41
39
|
};
|
|
42
40
|
}
|
|
43
|
-
|
|
41
|
+
const chartBundle = findChartBundle(ctx, field.allowedBundles);
|
|
42
|
+
if ("error" in chartBundle) {
|
|
44
43
|
return {
|
|
45
|
-
error: `
|
|
44
|
+
error: `No block type with a chart option is allowed in field "${params.parent.field}". Allowed bundles: ${field.allowedBundles.length ? field.allowedBundles.join(", ") : "none"}`
|
|
46
45
|
};
|
|
47
46
|
}
|
|
48
47
|
const chartData = {
|
|
@@ -68,18 +67,26 @@ export default defineBlokkliAgentTool({
|
|
|
68
67
|
);
|
|
69
68
|
if ("error" in resolved) return resolved;
|
|
70
69
|
const { $t } = ctx.app;
|
|
70
|
+
const blockUuid = crypto.randomUUID();
|
|
71
71
|
return {
|
|
72
72
|
type: "add",
|
|
73
73
|
label: $t("aiAgentCreateChartDone", "Added chart"),
|
|
74
|
-
apply: (adapter) => adapter.
|
|
75
|
-
|
|
74
|
+
apply: (adapter) => adapter.addNewBlocks({
|
|
75
|
+
blocks: [
|
|
76
|
+
{
|
|
77
|
+
bundle: chartBundle.bundle,
|
|
78
|
+
blockUuid,
|
|
79
|
+
options: {
|
|
80
|
+
[chartBundle.key]: JSON.stringify(result.data)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
],
|
|
76
84
|
host: {
|
|
77
85
|
type: params.parent.type,
|
|
78
86
|
uuid: params.parent.uuid,
|
|
79
87
|
fieldName: params.parent.field
|
|
80
88
|
},
|
|
81
|
-
|
|
82
|
-
options: { data: JSON.stringify(result.data) }
|
|
89
|
+
afterUuid: resolved.afterUuid
|
|
83
90
|
})
|
|
84
91
|
};
|
|
85
92
|
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { defineBlokkliAgentTool } from "#blokkli/agent/app/composables";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
chartTypeEnum,
|
|
5
|
+
chartColorEnum,
|
|
6
|
+
chartSeriesSchema,
|
|
7
|
+
findChartOptionKey
|
|
8
|
+
} from "../chart_schemas.js";
|
|
4
9
|
import { COLORS } from "#blokkli-build/charts-config";
|
|
5
|
-
import { getDefaultChartData } from "
|
|
6
|
-
import { fragmentBlockBundle } from "#blokkli-build/config";
|
|
10
|
+
import { getDefaultChartData } from "../../../helpers/index.js";
|
|
7
11
|
const paramsSchema = z.object({
|
|
8
12
|
uuid: z.string().describe("UUID of the chart paragraph")
|
|
9
13
|
});
|
|
@@ -30,23 +34,11 @@ export default defineBlokkliAgentTool({
|
|
|
30
34
|
paramsSchema,
|
|
31
35
|
resultSchema,
|
|
32
36
|
execute(ctx, params) {
|
|
33
|
-
const {
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
return { error: `Paragraph not found: ${params.uuid}` };
|
|
37
|
-
}
|
|
38
|
-
if (block.bundle !== fragmentBlockBundle) {
|
|
39
|
-
return {
|
|
40
|
-
error: `Paragraph "${params.uuid}" is a "${block.bundle}", not a fragment.`
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
if (block.fragment?.name !== "blokkli_chart") {
|
|
44
|
-
return {
|
|
45
|
-
error: `Fragment "${params.uuid}" is a "${block.fragment?.name}", not a "blokkli_chart".`
|
|
46
|
-
};
|
|
47
|
-
}
|
|
37
|
+
const { state, $t } = ctx.app;
|
|
38
|
+
const chartOption = findChartOptionKey(ctx, params.uuid);
|
|
39
|
+
if ("error" in chartOption) return chartOption;
|
|
48
40
|
const item = state.getFieldListItem(params.uuid);
|
|
49
|
-
const rawData = item?.options?.
|
|
41
|
+
const rawData = item?.options?.[chartOption.key];
|
|
50
42
|
let data;
|
|
51
43
|
if (rawData) {
|
|
52
44
|
try {
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { defineBlokkliAgentTool } from "#blokkli/agent/app/composables";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
buildBlockOptionsMapFromDefinitions
|
|
6
|
-
} from "#blokkli/agent/app/tools/schemas";
|
|
3
|
+
import { blockOptionsMapSchema } from "#blokkli/agent/app/tools/schemas";
|
|
4
|
+
import { buildBlockOptionsMapFromDefinitions } from "#blokkli/agent/app/tools/helpers";
|
|
7
5
|
import { getChartTypeRuntime } from "../../../chartTypes/index.js";
|
|
8
6
|
import { chartTypeEnum } from "../chart_schemas.js";
|
|
9
7
|
const paramsSchema = z.object({
|