@gui-chat-plugin/edit-html 0.1.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/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # @gui-chat-plugin/edit-html
2
+
3
+ [![npm version](https://badge.fury.io/js/%40gui-chat-plugin%2Fedit-html.svg)](https://www.npmjs.com/package/@gui-chat-plugin/edit-html)
4
+
5
+ An edit HTML plugin for [MulmoChat](https://github.com/receptron/MulmoChat).
6
+
7
+ ## Overview
8
+
9
+ This plugin allows users to edit an existing HTML page by describing the desired modifications. It sends the current HTML and modification prompt to an LLM (Claude or Gemini) to generate the updated HTML.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ yarn add @gui-chat-plugin/edit-html
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ### Vue Implementation (for MulmoChat)
20
+
21
+ ```typescript
22
+ // In src/tools/index.ts
23
+ import EditHtmlPlugin from "@gui-chat-plugin/edit-html/vue";
24
+
25
+ const pluginList = [
26
+ // ... other plugins
27
+ EditHtmlPlugin,
28
+ ];
29
+
30
+ // In src/main.ts
31
+ import "@gui-chat-plugin/edit-html/style.css";
32
+ ```
33
+
34
+ ### Core Only (Framework-agnostic)
35
+
36
+ ```typescript
37
+ import { pluginCore, TOOL_NAME } from "@gui-chat-plugin/edit-html";
38
+ ```
39
+
40
+ ## Package Exports
41
+
42
+ | Export | Description |
43
+ |--------|-------------|
44
+ | `@gui-chat-plugin/edit-html` | Core (framework-agnostic) |
45
+ | `@gui-chat-plugin/edit-html/vue` | Vue implementation |
46
+ | `@gui-chat-plugin/edit-html/style.css` | Tailwind CSS styles |
47
+
48
+ ## Requirements
49
+
50
+ This plugin requires an Anthropic API key or Google API key configured in MulmoChat.
51
+
52
+ ## Test Prompts
53
+
54
+ First generate an HTML page, then:
55
+
56
+ 1. "Change the background color to blue"
57
+ 2. "Add a navigation menu at the top"
58
+ 3. "Make the font larger"
59
+ 4. "Add a footer with contact information"
60
+
61
+ ## Development
62
+
63
+ ```bash
64
+ yarn install
65
+ yarn dev # Start dev server
66
+ yarn build # Build
67
+ yarn typecheck # Type check
68
+ yarn lint # Lint
69
+ ```
70
+
71
+ ## License
72
+
73
+ MIT
@@ -0,0 +1,20 @@
1
+ /**
2
+ * EditHtml Plugin Tool Definition
3
+ */
4
+ export declare const TOOL_NAME = "editHtml";
5
+ export declare const TOOL_DEFINITION: {
6
+ type: "function";
7
+ name: string;
8
+ description: string;
9
+ parameters: {
10
+ type: "object";
11
+ properties: {
12
+ prompt: {
13
+ type: string;
14
+ description: string;
15
+ };
16
+ };
17
+ required: string[];
18
+ };
19
+ };
20
+ export declare const SYSTEM_PROMPT = "";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * EditHtml Plugin - Core (Framework-agnostic)
3
+ */
4
+ export type { EditHtmlArgs, HtmlToolData, HtmlLibraryType } from "./types";
5
+ export { HTML_LIBRARIES, LIBRARY_DESCRIPTIONS } from "./types";
6
+ export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT } from "./definition";
7
+ export { executeEditHtml, pluginCore } from "./plugin";
@@ -0,0 +1,11 @@
1
+ /**
2
+ * EditHtml Plugin Core (Framework-agnostic)
3
+ */
4
+ import type { ToolPluginCore, ToolContext, ToolResult } from "gui-chat-protocol";
5
+ import type { EditHtmlArgs, HtmlToolData } from "./types";
6
+ export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT } from "./definition";
7
+ /**
8
+ * Execute the editHtml function
9
+ */
10
+ export declare const executeEditHtml: (context: ToolContext, args: EditHtmlArgs) => Promise<ToolResult<HtmlToolData>>;
11
+ export declare const pluginCore: ToolPluginCore<HtmlToolData, unknown, EditHtmlArgs>;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * EditHtml Plugin Types
3
+ */
4
+ export declare const HTML_LIBRARIES: readonly ["tailwind", "d3.js", "three.js", "p5.js", "mermaid"];
5
+ export type HtmlLibraryType = (typeof HTML_LIBRARIES)[number];
6
+ export declare const LIBRARY_DESCRIPTIONS: Record<HtmlLibraryType, string>;
7
+ export interface HtmlToolData {
8
+ html: string;
9
+ type: HtmlLibraryType;
10
+ }
11
+ export interface EditHtmlArgs {
12
+ prompt: string;
13
+ }
package/dist/core.cjs ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=["tailwind","d3.js","three.js","p5.js","mermaid"],u={tailwind:"Tailwind CSS for utility-first styling","d3.js":"D3.js for data-driven visualizations and interactive charts","three.js":"Three.js for 3D graphics and WebGL rendering","p5.js":"p5.js for creative coding, animations, and generative art",mermaid:"Mermaid for diagrams and flowcharts from text definitions"},r="editHtml",s={type:"function",name:r,description:"Edit the currently selected HTML page by sending a detailed modification prompt to another LLM (Claude). This tool modifies the existing HTML based on your description while preserving the existing structure and functionality where possible.",parameters:{type:"object",properties:{prompt:{type:"string",description:"Detailed description of the modifications to make to the HTML page. Be specific about what changes are needed - layout adjustments, style updates, new functionality, content changes, etc. The more detailed your prompt, the better the modifications will match your requirements."}},required:["prompt"]}},o="",d=async(t,c)=>{const{prompt:i}=c,n=t.currentResult?.data,a=n?.html;if(!a)return{message:"No HTML page is currently selected to edit",instructions:"Tell the user that they need to select an HTML page first before editing it."};if(!t.app?.generateHtml)return{message:"generateHtml function not available",instructions:"Acknowledge that the HTML editing failed."};try{const e=await t.app.generateHtml({prompt:i,html:a});return e.success&&e.html?{data:{html:e.html,type:n?.type||"tailwind"},title:i.slice(0,50),message:"HTML editing succeeded",instructions:"Acknowledge that the HTML was modified and has been already presented to the user.",updating:!0}:(console.error(`ERR:1
2
+ no HTML data`,e),{message:e.error||"HTML editing failed",instructions:"Acknowledge that the HTML editing failed."})}catch(e){return console.error(`ERR: exception
3
+ HTML editing failed`,e),{message:"HTML editing failed",jsonData:e,instructions:"Acknowledge that the HTML editing failed."}}},g={toolDefinition:s,execute:d,generatingMessage:"Editing HTML...",isEnabled:t=>!!t?.hasAnthropicApiKey||!!t?.hasGoogleApiKey,systemPrompt:o,backends:["textLLM"]};exports.HTML_LIBRARIES=l;exports.LIBRARY_DESCRIPTIONS=u;exports.SYSTEM_PROMPT=o;exports.TOOL_DEFINITION=s;exports.TOOL_NAME=r;exports.executeEditHtml=d;exports.pluginCore=g;
package/dist/core.js ADDED
@@ -0,0 +1,83 @@
1
+ const l = [
2
+ "tailwind",
3
+ "d3.js",
4
+ "three.js",
5
+ "p5.js",
6
+ "mermaid"
7
+ ], p = {
8
+ tailwind: "Tailwind CSS for utility-first styling",
9
+ "d3.js": "D3.js for data-driven visualizations and interactive charts",
10
+ "three.js": "Three.js for 3D graphics and WebGL rendering",
11
+ "p5.js": "p5.js for creative coding, animations, and generative art",
12
+ mermaid: "Mermaid for diagrams and flowcharts from text definitions"
13
+ }, s = "editHtml", o = {
14
+ type: "function",
15
+ name: s,
16
+ description: "Edit the currently selected HTML page by sending a detailed modification prompt to another LLM (Claude). This tool modifies the existing HTML based on your description while preserving the existing structure and functionality where possible.",
17
+ parameters: {
18
+ type: "object",
19
+ properties: {
20
+ prompt: {
21
+ type: "string",
22
+ description: "Detailed description of the modifications to make to the HTML page. Be specific about what changes are needed - layout adjustments, style updates, new functionality, content changes, etc. The more detailed your prompt, the better the modifications will match your requirements."
23
+ }
24
+ },
25
+ required: ["prompt"]
26
+ }
27
+ }, d = "", c = async (t, r) => {
28
+ const { prompt: i } = r, n = t.currentResult?.data, a = n?.html;
29
+ if (!a)
30
+ return {
31
+ message: "No HTML page is currently selected to edit",
32
+ instructions: "Tell the user that they need to select an HTML page first before editing it."
33
+ };
34
+ if (!t.app?.generateHtml)
35
+ return {
36
+ message: "generateHtml function not available",
37
+ instructions: "Acknowledge that the HTML editing failed."
38
+ };
39
+ try {
40
+ const e = await t.app.generateHtml({
41
+ prompt: i,
42
+ html: a
43
+ });
44
+ return e.success && e.html ? {
45
+ data: {
46
+ html: e.html,
47
+ type: n?.type || "tailwind"
48
+ },
49
+ title: i.slice(0, 50),
50
+ message: "HTML editing succeeded",
51
+ instructions: "Acknowledge that the HTML was modified and has been already presented to the user.",
52
+ updating: !0
53
+ // Update the existing result instead of creating a new one
54
+ } : (console.error(`ERR:1
55
+ no HTML data`, e), {
56
+ message: e.error || "HTML editing failed",
57
+ instructions: "Acknowledge that the HTML editing failed."
58
+ });
59
+ } catch (e) {
60
+ return console.error(`ERR: exception
61
+ HTML editing failed`, e), {
62
+ message: "HTML editing failed",
63
+ jsonData: e,
64
+ instructions: "Acknowledge that the HTML editing failed."
65
+ };
66
+ }
67
+ }, g = {
68
+ toolDefinition: o,
69
+ execute: c,
70
+ generatingMessage: "Editing HTML...",
71
+ isEnabled: (t) => !!t?.hasAnthropicApiKey || !!t?.hasGoogleApiKey,
72
+ systemPrompt: d,
73
+ backends: ["textLLM"]
74
+ };
75
+ export {
76
+ l as HTML_LIBRARIES,
77
+ p as LIBRARY_DESCRIPTIONS,
78
+ d as SYSTEM_PROMPT,
79
+ o as TOOL_DEFINITION,
80
+ s as TOOL_NAME,
81
+ c as executeEditHtml,
82
+ g as pluginCore
83
+ };
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./core.cjs");exports.HTML_LIBRARIES=e.HTML_LIBRARIES;exports.LIBRARY_DESCRIPTIONS=e.LIBRARY_DESCRIPTIONS;exports.SYSTEM_PROMPT=e.SYSTEM_PROMPT;exports.TOOL_DEFINITION=e.TOOL_DEFINITION;exports.TOOL_NAME=e.TOOL_NAME;exports.executeEditHtml=e.executeEditHtml;exports.pluginCore=e.pluginCore;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * EditHtml Plugin
3
+ *
4
+ * Main entry point - re-exports core module.
5
+ */
6
+ export * from "./core";
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import { HTML_LIBRARIES as T, LIBRARY_DESCRIPTIONS as E, SYSTEM_PROMPT as R, TOOL_DEFINITION as e, TOOL_NAME as L, executeEditHtml as S, pluginCore as _ } from "./core.js";
2
+ export {
3
+ T as HTML_LIBRARIES,
4
+ E as LIBRARY_DESCRIPTIONS,
5
+ R as SYSTEM_PROMPT,
6
+ e as TOOL_DEFINITION,
7
+ L as TOOL_NAME,
8
+ S as executeEditHtml,
9
+ _ as pluginCore
10
+ };
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-blue-50:oklch(97% .014 254.604);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-900:oklch(37.9% .146 265.522);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mt-1{margin-top:calc(var(--spacing)*1)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.contents{display:contents}.flex{display:flex}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.flex-1{flex:1}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.border-0{border-style:var(--tw-border-style);border-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-gray-200{border-color:var(--color-gray-200)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-white{background-color:var(--color-white)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-3{padding-block:calc(var(--spacing)*3)}.text-center{text-align:center}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-blue-600{color:var(--color-blue-600)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-white{color:var(--color-white)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}}@media(prefers-color-scheme:dark){.dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark\:text-blue-300{color:var(--color-blue-300)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-white{color:var(--color-white)}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
@@ -0,0 +1,8 @@
1
+ import type { ToolResult } from "gui-chat-protocol/vue";
2
+ import type { HtmlToolData } from "../core/types";
3
+ type __VLS_Props = {
4
+ result: ToolResult<HtmlToolData>;
5
+ };
6
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import type { ToolResult } from "gui-chat-protocol/vue";
2
+ import type { HtmlToolData } from "../core/types";
3
+ type __VLS_Props = {
4
+ selectedResult: ToolResult<HtmlToolData>;
5
+ };
6
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * EditHtml Plugin - Vue Implementation
3
+ */
4
+ import "../style.css";
5
+ import type { ToolPlugin } from "gui-chat-protocol/vue";
6
+ import type { EditHtmlArgs, HtmlToolData } from "../core/types";
7
+ import View from "./View.vue";
8
+ import Preview from "./Preview.vue";
9
+ export declare const plugin: ToolPlugin<HtmlToolData, unknown, EditHtmlArgs>;
10
+ export type { EditHtmlArgs, HtmlToolData, HtmlLibraryType } from "../core/types";
11
+ export { HTML_LIBRARIES, LIBRARY_DESCRIPTIONS } from "../core/types";
12
+ export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT, executeEditHtml, pluginCore, } from "../core/plugin";
13
+ export { View, Preview };
14
+ declare const _default: {
15
+ plugin: ToolPlugin<HtmlToolData, unknown, EditHtmlArgs, import("gui-chat-protocol/vue").InputHandler, Record<string, unknown>>;
16
+ };
17
+ export default _default;
package/dist/vue.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("./core.cjs"),e=require("vue"),b={class:"w-full h-full overflow-hidden bg-white flex flex-col"},_={key:0,class:"flex-1 flex items-center justify-center"},g={class:"flex items-center justify-between px-4 py-3 border-b border-gray-200 bg-gray-50"},x={class:"text-xl font-semibold text-gray-800"},f=["srcdoc"],d=e.defineComponent({__name:"View",props:{selectedResult:{}},setup(s){const o=s,a=()=>{console.log("HTML iframe loaded successfully")},i=()=>{const n=o.selectedResult.data?.html;if(!n)return;const t=new Blob([n],{type:"text/html"}),r=URL.createObjectURL(t),c=document.createElement("a");c.href=r;const p=o.selectedResult.title?`${o.selectedResult.title.replace(/[^a-z0-9]/gi,"_").toLowerCase()}.html`:"page.html";c.download=p,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(r)};return(n,t)=>(e.openBlock(),e.createElementBlock("div",b,[s.selectedResult.data?.html?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",g,[e.createElementVNode("h1",x,e.toDisplayString(s.selectedResult.title||"HTML Page"),1),e.createElementVNode("button",{onClick:i,class:"flex items-center gap-2 px-3 py-1.5 bg-blue-500 hover:bg-blue-600 text-white rounded text-sm transition-colors"}," ⬇ HTML ")]),e.createElementVNode("iframe",{srcdoc:s.selectedResult.data.html,class:"flex-1 w-full border-0",sandbox:"allow-scripts allow-same-origin",onLoad:a},null,40,f)],64)):(e.openBlock(),e.createElementBlock("div",_,[...t[0]||(t[0]=[e.createElementVNode("div",{class:"text-gray-500"},"No HTML content available",-1)])]))]))}}),y={class:"text-center p-4 bg-blue-50 dark:bg-blue-900 rounded"},h={class:"text-blue-600 dark:text-blue-300 font-medium"},E={class:"text-sm text-gray-800 dark:text-gray-200 mt-1 font-medium truncate"},L={class:"text-xs text-gray-600 dark:text-gray-400 mt-1"},u=e.defineComponent({__name:"Preview",props:{result:{}},setup(s){const o=s,a=e.computed(()=>o.result.title||"HTML Page"),i=e.computed(()=>{const t=o.result.data?.type;return t?{tailwind:"Tailwind CSS","d3.js":"D3.js","three.js":"Three.js",mermaid:"Mermaid","p5.js":"p5.js"}[t]:""}),n=e.computed(()=>{const t=o.result.data?.type;return t?{tailwind:"🎨","d3.js":"📊","three.js":"🎮",mermaid:"📋","p5.js":"🎨"}[t]:"🌐"});return(t,r)=>(e.openBlock(),e.createElementBlock("div",y,[e.createElementVNode("div",h,e.toDisplayString(n.value)+" HTML ",1),e.createElementVNode("div",E,e.toDisplayString(a.value),1),e.createElementVNode("div",L,e.toDisplayString(i.value),1)]))}}),m={...l.pluginCore,viewComponent:d,previewComponent:u},T={plugin:m};exports.HTML_LIBRARIES=l.HTML_LIBRARIES;exports.LIBRARY_DESCRIPTIONS=l.LIBRARY_DESCRIPTIONS;exports.SYSTEM_PROMPT=l.SYSTEM_PROMPT;exports.TOOL_DEFINITION=l.TOOL_DEFINITION;exports.TOOL_NAME=l.TOOL_NAME;exports.executeEditHtml=l.executeEditHtml;exports.pluginCore=l.pluginCore;exports.Preview=u;exports.View=d;exports.default=T;exports.plugin=m;
package/dist/vue.js ADDED
@@ -0,0 +1,91 @@
1
+ import { pluginCore as x } from "./core.js";
2
+ import { HTML_LIBRARIES as S, LIBRARY_DESCRIPTIONS as P, SYSTEM_PROMPT as N, TOOL_DEFINITION as $, TOOL_NAME as B, executeEditHtml as D } from "./core.js";
3
+ import { defineComponent as p, createElementBlock as a, openBlock as c, createElementVNode as t, Fragment as f, toDisplayString as i, computed as m } from "vue";
4
+ const h = { class: "w-full h-full overflow-hidden bg-white flex flex-col" }, _ = {
5
+ key: 0,
6
+ class: "flex-1 flex items-center justify-center"
7
+ }, y = { class: "flex items-center justify-between px-4 py-3 border-b border-gray-200 bg-gray-50" }, g = { class: "text-xl font-semibold text-gray-800" }, w = ["srcdoc"], v = /* @__PURE__ */ p({
8
+ __name: "View",
9
+ props: {
10
+ selectedResult: {}
11
+ },
12
+ setup(l) {
13
+ const s = l, d = () => {
14
+ console.log("HTML iframe loaded successfully");
15
+ }, u = () => {
16
+ const o = s.selectedResult.data?.html;
17
+ if (!o) return;
18
+ const e = new Blob([o], { type: "text/html" }), n = URL.createObjectURL(e), r = document.createElement("a");
19
+ r.href = n;
20
+ const b = s.selectedResult.title ? `${s.selectedResult.title.replace(/[^a-z0-9]/gi, "_").toLowerCase()}.html` : "page.html";
21
+ r.download = b, document.body.appendChild(r), r.click(), document.body.removeChild(r), URL.revokeObjectURL(n);
22
+ };
23
+ return (o, e) => (c(), a("div", h, [
24
+ l.selectedResult.data?.html ? (c(), a(f, { key: 1 }, [
25
+ t("div", y, [
26
+ t("h1", g, i(l.selectedResult.title || "HTML Page"), 1),
27
+ t("button", {
28
+ onClick: u,
29
+ class: "flex items-center gap-2 px-3 py-1.5 bg-blue-500 hover:bg-blue-600 text-white rounded text-sm transition-colors"
30
+ }, " ⬇ HTML ")
31
+ ]),
32
+ t("iframe", {
33
+ srcdoc: l.selectedResult.data.html,
34
+ class: "flex-1 w-full border-0",
35
+ sandbox: "allow-scripts allow-same-origin",
36
+ onLoad: d
37
+ }, null, 40, w)
38
+ ], 64)) : (c(), a("div", _, [...e[0] || (e[0] = [
39
+ t("div", { class: "text-gray-500" }, "No HTML content available", -1)
40
+ ])]))
41
+ ]));
42
+ }
43
+ }), L = { class: "text-center p-4 bg-blue-50 dark:bg-blue-900 rounded" }, R = { class: "text-blue-600 dark:text-blue-300 font-medium" }, T = { class: "text-sm text-gray-800 dark:text-gray-200 mt-1 font-medium truncate" }, j = { class: "text-xs text-gray-600 dark:text-gray-400 mt-1" }, k = /* @__PURE__ */ p({
44
+ __name: "Preview",
45
+ props: {
46
+ result: {}
47
+ },
48
+ setup(l) {
49
+ const s = l, d = m(() => s.result.title || "HTML Page"), u = m(() => {
50
+ const e = s.result.data?.type;
51
+ return e ? {
52
+ tailwind: "Tailwind CSS",
53
+ "d3.js": "D3.js",
54
+ "three.js": "Three.js",
55
+ mermaid: "Mermaid",
56
+ "p5.js": "p5.js"
57
+ }[e] : "";
58
+ }), o = m(() => {
59
+ const e = s.result.data?.type;
60
+ return e ? {
61
+ tailwind: "🎨",
62
+ "d3.js": "📊",
63
+ "three.js": "🎮",
64
+ mermaid: "📋",
65
+ "p5.js": "🎨"
66
+ }[e] : "🌐";
67
+ });
68
+ return (e, n) => (c(), a("div", L, [
69
+ t("div", R, i(o.value) + " HTML ", 1),
70
+ t("div", T, i(d.value), 1),
71
+ t("div", j, i(u.value), 1)
72
+ ]));
73
+ }
74
+ }), M = {
75
+ ...x,
76
+ viewComponent: v,
77
+ previewComponent: k
78
+ }, E = { plugin: M };
79
+ export {
80
+ S as HTML_LIBRARIES,
81
+ P as LIBRARY_DESCRIPTIONS,
82
+ k as Preview,
83
+ N as SYSTEM_PROMPT,
84
+ $ as TOOL_DEFINITION,
85
+ B as TOOL_NAME,
86
+ v as View,
87
+ E as default,
88
+ D as executeEditHtml,
89
+ M as plugin,
90
+ x as pluginCore
91
+ };
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@gui-chat-plugin/edit-html",
3
+ "version": "0.1.0",
4
+ "description": "Edit HTML plugin for GUIChat",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./core": {
16
+ "types": "./dist/core/index.d.ts",
17
+ "import": "./dist/core.js",
18
+ "require": "./dist/core.cjs"
19
+ },
20
+ "./vue": {
21
+ "types": "./dist/vue/index.d.ts",
22
+ "import": "./dist/vue.js",
23
+ "require": "./dist/vue.cjs"
24
+ },
25
+ "./style.css": "./dist/style.css"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "dev": "vite",
32
+ "build": "vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly",
33
+ "typecheck": "vue-tsc --noEmit",
34
+ "lint": "eslint src demo"
35
+ },
36
+ "peerDependencies": {
37
+ "gui-chat-protocol": "^0.0.1",
38
+ "vue": "^3.5.0"
39
+ },
40
+ "devDependencies": {
41
+ "@tailwindcss/vite": "^4.1.18",
42
+ "@typescript-eslint/eslint-plugin": "^8.53.0",
43
+ "@typescript-eslint/parser": "^8.53.0",
44
+ "@vitejs/plugin-vue": "^6.0.3",
45
+ "eslint": "^9.39.2",
46
+ "eslint-plugin-vue": "^10.6.2",
47
+ "globals": "^17.0.0",
48
+ "gui-chat-protocol": "^0.0.1",
49
+ "tailwindcss": "^4.1.18",
50
+ "typescript": "~5.9.3",
51
+ "vite": "^7.3.1",
52
+ "vue": "^3.5.27",
53
+ "vue-eslint-parser": "^10.2.0",
54
+ "vue-tsc": "^3.2.2"
55
+ },
56
+ "keywords": [
57
+ "guichat",
58
+ "plugin",
59
+ "html",
60
+ "edit"
61
+ ],
62
+ "license": "MIT"
63
+ }