ide-assi 0.45.0 → 0.47.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/dist/bundle.cjs.js +28 -2
- package/dist/bundle.esm.js +28 -2
- package/dist/components/ideAi.js +9 -0
- package/dist/components/ideAssi.js +19 -2
- package/dist/components/ideAssiSettings.js +147 -0
- package/package.json +1 -1
- package/src/components/ideAi.js +9 -0
- package/src/components/ideAssi.js +19 -2
- package/src/components/ideAssiSettings.js +147 -0
package/dist/bundle.cjs.js
CHANGED
|
@@ -193387,6 +193387,15 @@ class IdeAi
|
|
|
193387
193387
|
})
|
|
193388
193388
|
});
|
|
193389
193389
|
|
|
193390
|
+
await fetch(`/api/source/generateJsFile`, {
|
|
193391
|
+
method: "POST",
|
|
193392
|
+
headers: { "Content-Type": "application/json" },
|
|
193393
|
+
body: JSON.stringify({
|
|
193394
|
+
fileNm: res.js + "x",
|
|
193395
|
+
contents: source.js,
|
|
193396
|
+
})
|
|
193397
|
+
});
|
|
193398
|
+
|
|
193390
193399
|
return await response4.json();
|
|
193391
193400
|
}
|
|
193392
193401
|
|
|
@@ -193396,6 +193405,7 @@ class IdeAi
|
|
|
193396
193405
|
|
|
193397
193406
|
class IdeAssi extends HTMLElement
|
|
193398
193407
|
{
|
|
193408
|
+
settings;
|
|
193399
193409
|
#ai;
|
|
193400
193410
|
#ing = false;
|
|
193401
193411
|
|
|
@@ -193417,6 +193427,8 @@ class IdeAssi extends HTMLElement
|
|
|
193417
193427
|
</style>
|
|
193418
193428
|
|
|
193419
193429
|
<div class="wrapper">
|
|
193430
|
+
<ide-assi-settings></ide-assi-settings>
|
|
193431
|
+
|
|
193420
193432
|
<div class="container">
|
|
193421
193433
|
<div class="head">
|
|
193422
193434
|
<div class="logo"></div>
|
|
@@ -193444,13 +193456,14 @@ class IdeAssi extends HTMLElement
|
|
|
193444
193456
|
|
|
193445
193457
|
|
|
193446
193458
|
#init = (info) => {
|
|
193447
|
-
|
|
193459
|
+
this.settings = this.shadowRoot.querySelector("nx-ai-settings");
|
|
193460
|
+
|
|
193448
193461
|
this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
|
|
193449
193462
|
|
|
193450
193463
|
this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
193451
193464
|
this.shadowRoot.querySelector(".collapse-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
193452
193465
|
|
|
193453
|
-
|
|
193466
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
|
|
193454
193467
|
};
|
|
193455
193468
|
|
|
193456
193469
|
|
|
@@ -193544,6 +193557,19 @@ export default Home;
|
|
|
193544
193557
|
#toggleCollapseHandler = () => {
|
|
193545
193558
|
this.classList.toggle("collapse");
|
|
193546
193559
|
};
|
|
193560
|
+
|
|
193561
|
+
#menuClickHandler = (e) => {
|
|
193562
|
+
|
|
193563
|
+
// 모든 `.menu-icon`에서 `active` 클래스 제거
|
|
193564
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.classList.remove("active"));
|
|
193565
|
+
|
|
193566
|
+
// 클릭한 `.menu-icon`에 `active` 클래스 추가
|
|
193567
|
+
const clickedIcon = e.target.closest(".menu-icon");
|
|
193568
|
+
if (clickedIcon) clickedIcon.classList.add("active");
|
|
193569
|
+
|
|
193570
|
+
// `.menu-setting`이 클릭되었는지 확인 후 `nx-ai-settings` 토글
|
|
193571
|
+
this.settings.classList.toggle("expand", !!e.target.closest(".menu-setting"));
|
|
193572
|
+
};
|
|
193547
193573
|
}
|
|
193548
193574
|
|
|
193549
193575
|
customElements.define("ide-assi", IdeAssi);
|
package/dist/bundle.esm.js
CHANGED
|
@@ -193383,6 +193383,15 @@ class IdeAi
|
|
|
193383
193383
|
})
|
|
193384
193384
|
});
|
|
193385
193385
|
|
|
193386
|
+
await fetch(`/api/source/generateJsFile`, {
|
|
193387
|
+
method: "POST",
|
|
193388
|
+
headers: { "Content-Type": "application/json" },
|
|
193389
|
+
body: JSON.stringify({
|
|
193390
|
+
fileNm: res.js + "x",
|
|
193391
|
+
contents: source.js,
|
|
193392
|
+
})
|
|
193393
|
+
});
|
|
193394
|
+
|
|
193386
193395
|
return await response4.json();
|
|
193387
193396
|
}
|
|
193388
193397
|
|
|
@@ -193392,6 +193401,7 @@ class IdeAi
|
|
|
193392
193401
|
|
|
193393
193402
|
class IdeAssi extends HTMLElement
|
|
193394
193403
|
{
|
|
193404
|
+
settings;
|
|
193395
193405
|
#ai;
|
|
193396
193406
|
#ing = false;
|
|
193397
193407
|
|
|
@@ -193413,6 +193423,8 @@ class IdeAssi extends HTMLElement
|
|
|
193413
193423
|
</style>
|
|
193414
193424
|
|
|
193415
193425
|
<div class="wrapper">
|
|
193426
|
+
<ide-assi-settings></ide-assi-settings>
|
|
193427
|
+
|
|
193416
193428
|
<div class="container">
|
|
193417
193429
|
<div class="head">
|
|
193418
193430
|
<div class="logo"></div>
|
|
@@ -193440,13 +193452,14 @@ class IdeAssi extends HTMLElement
|
|
|
193440
193452
|
|
|
193441
193453
|
|
|
193442
193454
|
#init = (info) => {
|
|
193443
|
-
|
|
193455
|
+
this.settings = this.shadowRoot.querySelector("nx-ai-settings");
|
|
193456
|
+
|
|
193444
193457
|
this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
|
|
193445
193458
|
|
|
193446
193459
|
this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
193447
193460
|
this.shadowRoot.querySelector(".collapse-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
193448
193461
|
|
|
193449
|
-
|
|
193462
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
|
|
193450
193463
|
};
|
|
193451
193464
|
|
|
193452
193465
|
|
|
@@ -193540,6 +193553,19 @@ export default Home;
|
|
|
193540
193553
|
#toggleCollapseHandler = () => {
|
|
193541
193554
|
this.classList.toggle("collapse");
|
|
193542
193555
|
};
|
|
193556
|
+
|
|
193557
|
+
#menuClickHandler = (e) => {
|
|
193558
|
+
|
|
193559
|
+
// 모든 `.menu-icon`에서 `active` 클래스 제거
|
|
193560
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.classList.remove("active"));
|
|
193561
|
+
|
|
193562
|
+
// 클릭한 `.menu-icon`에 `active` 클래스 추가
|
|
193563
|
+
const clickedIcon = e.target.closest(".menu-icon");
|
|
193564
|
+
if (clickedIcon) clickedIcon.classList.add("active");
|
|
193565
|
+
|
|
193566
|
+
// `.menu-setting`이 클릭되었는지 확인 후 `nx-ai-settings` 토글
|
|
193567
|
+
this.settings.classList.toggle("expand", !!e.target.closest(".menu-setting"));
|
|
193568
|
+
};
|
|
193543
193569
|
}
|
|
193544
193570
|
|
|
193545
193571
|
customElements.define("ide-assi", IdeAssi);
|
package/dist/components/ideAi.js
CHANGED
|
@@ -130,6 +130,15 @@ export class IdeAi
|
|
|
130
130
|
})
|
|
131
131
|
});
|
|
132
132
|
|
|
133
|
+
const response6 = await fetch(`/api/source/generateJsFile`, {
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: { "Content-Type": "application/json" },
|
|
136
|
+
body: JSON.stringify({
|
|
137
|
+
fileNm: res.js + "x",
|
|
138
|
+
contents: source.js,
|
|
139
|
+
})
|
|
140
|
+
});
|
|
141
|
+
|
|
133
142
|
return await response4.json();
|
|
134
143
|
}
|
|
135
144
|
|
|
@@ -3,6 +3,7 @@ import { IdeAi } from "./ideAi.js";
|
|
|
3
3
|
|
|
4
4
|
export class IdeAssi extends HTMLElement
|
|
5
5
|
{
|
|
6
|
+
settings;
|
|
6
7
|
#ai;
|
|
7
8
|
#ing = false;
|
|
8
9
|
|
|
@@ -24,6 +25,8 @@ export class IdeAssi extends HTMLElement
|
|
|
24
25
|
</style>
|
|
25
26
|
|
|
26
27
|
<div class="wrapper">
|
|
28
|
+
<ide-assi-settings></ide-assi-settings>
|
|
29
|
+
|
|
27
30
|
<div class="container">
|
|
28
31
|
<div class="head">
|
|
29
32
|
<div class="logo"></div>
|
|
@@ -51,13 +54,14 @@ export class IdeAssi extends HTMLElement
|
|
|
51
54
|
|
|
52
55
|
|
|
53
56
|
#init = (info) => {
|
|
54
|
-
|
|
57
|
+
this.settings = this.shadowRoot.querySelector("nx-ai-settings");
|
|
58
|
+
|
|
55
59
|
this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
|
|
56
60
|
|
|
57
61
|
this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
58
62
|
this.shadowRoot.querySelector(".collapse-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
|
|
61
65
|
};
|
|
62
66
|
|
|
63
67
|
|
|
@@ -151,6 +155,19 @@ export default Home;
|
|
|
151
155
|
#toggleCollapseHandler = () => {
|
|
152
156
|
this.classList.toggle("collapse");
|
|
153
157
|
};
|
|
158
|
+
|
|
159
|
+
#menuClickHandler = (e) => {
|
|
160
|
+
|
|
161
|
+
// 모든 `.menu-icon`에서 `active` 클래스 제거
|
|
162
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.classList.remove("active"));
|
|
163
|
+
|
|
164
|
+
// 클릭한 `.menu-icon`에 `active` 클래스 추가
|
|
165
|
+
const clickedIcon = e.target.closest(".menu-icon");
|
|
166
|
+
if (clickedIcon) clickedIcon.classList.add("active");
|
|
167
|
+
|
|
168
|
+
// `.menu-setting`이 클릭되었는지 확인 후 `nx-ai-settings` 토글
|
|
169
|
+
this.settings.classList.toggle("expand", !!e.target.closest(".menu-setting"));
|
|
170
|
+
};
|
|
154
171
|
}
|
|
155
172
|
|
|
156
173
|
customElements.define("ide-assi", IdeAssi);
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import ninegrid from "ninegrid2";
|
|
2
|
+
|
|
3
|
+
class ideAssiSettings extends HTMLElement
|
|
4
|
+
{
|
|
5
|
+
constructor() {
|
|
6
|
+
console.log("construct");
|
|
7
|
+
|
|
8
|
+
super();
|
|
9
|
+
this.attachShadow({ mode: 'open' });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
get geminiApiKey() { return this.shadowRoot.querySelector("#geminiApiKey").value; };
|
|
13
|
+
set geminiApiKey(v) { this.shadowRoot.querySelector("#geminiApiKey").value = v; };
|
|
14
|
+
|
|
15
|
+
get openaiApiKey() { return this.shadowRoot.querySelector("#openaiApiKey").value };
|
|
16
|
+
set openaiApiKey(v) { this.shadowRoot.querySelector("#openaiApiKey").value = v; };
|
|
17
|
+
|
|
18
|
+
get ollamaUrl() { return this.shadowRoot.querySelector("#ollamaUrl").value; };
|
|
19
|
+
set ollamaUrl(v) { this.shadowRoot.querySelector("#ollamaUrl").value = v; };
|
|
20
|
+
|
|
21
|
+
get qdrantUrl() { return this.shadowRoot.querySelector("#qdrantUrl").value; };
|
|
22
|
+
set qdrantUrl(v) { this.shadowRoot.querySelector("#qdrantUrl").value = v; };
|
|
23
|
+
|
|
24
|
+
get server() {
|
|
25
|
+
return this.shadowRoot.querySelector('input[name="server"]:checked')?.value;
|
|
26
|
+
};
|
|
27
|
+
set server(v) {
|
|
28
|
+
const elem = this.shadowRoot.querySelector(`input[name="server"][value="${v}"]`);
|
|
29
|
+
if (elem) elem.checked = true;
|
|
30
|
+
|
|
31
|
+
this.shadowRoot.querySelectorAll('input[name="server"]').forEach(el => {
|
|
32
|
+
el.dispatchEvent(new Event("change"));
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
get model() {
|
|
37
|
+
return this.shadowRoot.querySelector(`#${this.server}Model`)?.value;
|
|
38
|
+
};
|
|
39
|
+
set model(v) {
|
|
40
|
+
const elem = this.shadowRoot.querySelector(`#${this.server}Model`);
|
|
41
|
+
if (elem) {
|
|
42
|
+
elem.value = v;
|
|
43
|
+
elem.dispatchEvent(new Event("change"));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
this.dispatchEvent(new CustomEvent("setting-change", {
|
|
48
|
+
detail: { server: this.server, model: this.model }
|
|
49
|
+
})); */
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
connectedCallback() {
|
|
53
|
+
|
|
54
|
+
this.shadowRoot.innerHTML = `
|
|
55
|
+
<style>
|
|
56
|
+
@import "https://cdn.jsdelivr.net/npm/ninegrid@${ninegrid.version}/dist/css/ai.css";
|
|
57
|
+
${ninegrid.getCustomPath(this,"ai.css")}
|
|
58
|
+
</style>
|
|
59
|
+
|
|
60
|
+
<div class="line subject">
|
|
61
|
+
<label for="server">Server:</label>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="line contents">
|
|
64
|
+
<label><input name="server" type="radio" value="gemini" checked>Gemini</label>
|
|
65
|
+
<label><input name="server" type="radio" value="openai">Open AI</label>
|
|
66
|
+
<label><input name="server" type="radio" value="ollama">Ollama</label>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="line gemini-bak" style="display:none;">
|
|
69
|
+
<label>API Key: <input id="geminiApiKey" value=""/></label>
|
|
70
|
+
</div>
|
|
71
|
+
<div class="line openai-bak" style="display:none;">
|
|
72
|
+
<label>API Key: <input id="openaiApiKey" value=""/></label>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="line subject ollama">
|
|
75
|
+
<label for="ollamaUrl">Server Url:</label>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="line contents ollama">
|
|
78
|
+
<input type="text" id="ollamaUrl" value="http://localhost:11434"/></label>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="line subject ollama">
|
|
81
|
+
<label for="ollamaModel">Model:</label>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="line contents ollama">
|
|
84
|
+
<select id="ollamaModel">
|
|
85
|
+
<option value="phi4:14b">phi4:14b</option>
|
|
86
|
+
<option value="llama3.1:8b">llama3.1:8b</option>
|
|
87
|
+
<option value="mistral:7b">mistral:7b</option>
|
|
88
|
+
</select>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="line subject gemini">
|
|
91
|
+
<label for="geminiModel">Model:</label>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="line contents gemini">
|
|
94
|
+
<select id="geminiModel">
|
|
95
|
+
<option value="gemini-2.5-flash-preview-04-17">gemini-2.5-flash-preview-04-17</option>
|
|
96
|
+
<option value="gemini-pro">gemini-pro</option>
|
|
97
|
+
</select>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="line subject openai">
|
|
100
|
+
<label for="openaiModel">Model:</label>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="line contents openai">
|
|
103
|
+
<select id="openaiModel">
|
|
104
|
+
<option value="gpt-4">gpt-4</option>
|
|
105
|
+
<option value="gpt-4o">gpt-4o</option>
|
|
106
|
+
<option value="gpt-3.5-turbo">gpt-3.5-turbo</option>
|
|
107
|
+
</select>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div class="line subject qdrant">
|
|
111
|
+
<label for="qdrantUrl">Qdrant Url:</label>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="line contents qdrant">
|
|
114
|
+
<input type="text" id="qdrantUrl" value="http://localhost:6333"/>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="line subject analyze">
|
|
118
|
+
<input id="chkAnalyze" type="checkbox" checked> <input id="txtAnalyze" type="number" value="100"><label>건 미만인 경우 데이타 분석 요청</label>
|
|
119
|
+
</div>
|
|
120
|
+
`;
|
|
121
|
+
|
|
122
|
+
this.#init();
|
|
123
|
+
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
this.server = "gemini";
|
|
126
|
+
}, 0);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
#init = () => {
|
|
132
|
+
|
|
133
|
+
this.shadowRoot.querySelectorAll('input[name="server"]').forEach((radio) => {
|
|
134
|
+
radio.addEventListener("change", () => {
|
|
135
|
+
const server = this.shadowRoot.querySelector('input[name="server"]:checked').value;
|
|
136
|
+
|
|
137
|
+
["gemini","openai","ollama"].forEach(v => {
|
|
138
|
+
this.shadowRoot.querySelectorAll('.' + v).forEach((elem) => {
|
|
139
|
+
elem.style.display = (server === v) ? "flex" : "none";
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
customElements.define("ide-assi-settings", ideAssiSettings);
|
package/package.json
CHANGED
package/src/components/ideAi.js
CHANGED
|
@@ -130,6 +130,15 @@ export class IdeAi
|
|
|
130
130
|
})
|
|
131
131
|
});
|
|
132
132
|
|
|
133
|
+
const response6 = await fetch(`/api/source/generateJsFile`, {
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: { "Content-Type": "application/json" },
|
|
136
|
+
body: JSON.stringify({
|
|
137
|
+
fileNm: res.js + "x",
|
|
138
|
+
contents: source.js,
|
|
139
|
+
})
|
|
140
|
+
});
|
|
141
|
+
|
|
133
142
|
return await response4.json();
|
|
134
143
|
}
|
|
135
144
|
|
|
@@ -3,6 +3,7 @@ import { IdeAi } from "./ideAi.js";
|
|
|
3
3
|
|
|
4
4
|
export class IdeAssi extends HTMLElement
|
|
5
5
|
{
|
|
6
|
+
settings;
|
|
6
7
|
#ai;
|
|
7
8
|
#ing = false;
|
|
8
9
|
|
|
@@ -24,6 +25,8 @@ export class IdeAssi extends HTMLElement
|
|
|
24
25
|
</style>
|
|
25
26
|
|
|
26
27
|
<div class="wrapper">
|
|
28
|
+
<ide-assi-settings></ide-assi-settings>
|
|
29
|
+
|
|
27
30
|
<div class="container">
|
|
28
31
|
<div class="head">
|
|
29
32
|
<div class="logo"></div>
|
|
@@ -51,13 +54,14 @@ export class IdeAssi extends HTMLElement
|
|
|
51
54
|
|
|
52
55
|
|
|
53
56
|
#init = (info) => {
|
|
54
|
-
|
|
57
|
+
this.settings = this.shadowRoot.querySelector("nx-ai-settings");
|
|
58
|
+
|
|
55
59
|
this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
|
|
56
60
|
|
|
57
61
|
this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
58
62
|
this.shadowRoot.querySelector(".collapse-icon").addEventListener("click", this.#toggleCollapseHandler);
|
|
59
63
|
|
|
60
|
-
|
|
64
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
|
|
61
65
|
};
|
|
62
66
|
|
|
63
67
|
|
|
@@ -151,6 +155,19 @@ export default Home;
|
|
|
151
155
|
#toggleCollapseHandler = () => {
|
|
152
156
|
this.classList.toggle("collapse");
|
|
153
157
|
};
|
|
158
|
+
|
|
159
|
+
#menuClickHandler = (e) => {
|
|
160
|
+
|
|
161
|
+
// 모든 `.menu-icon`에서 `active` 클래스 제거
|
|
162
|
+
this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.classList.remove("active"));
|
|
163
|
+
|
|
164
|
+
// 클릭한 `.menu-icon`에 `active` 클래스 추가
|
|
165
|
+
const clickedIcon = e.target.closest(".menu-icon");
|
|
166
|
+
if (clickedIcon) clickedIcon.classList.add("active");
|
|
167
|
+
|
|
168
|
+
// `.menu-setting`이 클릭되었는지 확인 후 `nx-ai-settings` 토글
|
|
169
|
+
this.settings.classList.toggle("expand", !!e.target.closest(".menu-setting"));
|
|
170
|
+
};
|
|
154
171
|
}
|
|
155
172
|
|
|
156
173
|
customElements.define("ide-assi", IdeAssi);
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import ninegrid from "ninegrid2";
|
|
2
|
+
|
|
3
|
+
class ideAssiSettings extends HTMLElement
|
|
4
|
+
{
|
|
5
|
+
constructor() {
|
|
6
|
+
console.log("construct");
|
|
7
|
+
|
|
8
|
+
super();
|
|
9
|
+
this.attachShadow({ mode: 'open' });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
get geminiApiKey() { return this.shadowRoot.querySelector("#geminiApiKey").value; };
|
|
13
|
+
set geminiApiKey(v) { this.shadowRoot.querySelector("#geminiApiKey").value = v; };
|
|
14
|
+
|
|
15
|
+
get openaiApiKey() { return this.shadowRoot.querySelector("#openaiApiKey").value };
|
|
16
|
+
set openaiApiKey(v) { this.shadowRoot.querySelector("#openaiApiKey").value = v; };
|
|
17
|
+
|
|
18
|
+
get ollamaUrl() { return this.shadowRoot.querySelector("#ollamaUrl").value; };
|
|
19
|
+
set ollamaUrl(v) { this.shadowRoot.querySelector("#ollamaUrl").value = v; };
|
|
20
|
+
|
|
21
|
+
get qdrantUrl() { return this.shadowRoot.querySelector("#qdrantUrl").value; };
|
|
22
|
+
set qdrantUrl(v) { this.shadowRoot.querySelector("#qdrantUrl").value = v; };
|
|
23
|
+
|
|
24
|
+
get server() {
|
|
25
|
+
return this.shadowRoot.querySelector('input[name="server"]:checked')?.value;
|
|
26
|
+
};
|
|
27
|
+
set server(v) {
|
|
28
|
+
const elem = this.shadowRoot.querySelector(`input[name="server"][value="${v}"]`);
|
|
29
|
+
if (elem) elem.checked = true;
|
|
30
|
+
|
|
31
|
+
this.shadowRoot.querySelectorAll('input[name="server"]').forEach(el => {
|
|
32
|
+
el.dispatchEvent(new Event("change"));
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
get model() {
|
|
37
|
+
return this.shadowRoot.querySelector(`#${this.server}Model`)?.value;
|
|
38
|
+
};
|
|
39
|
+
set model(v) {
|
|
40
|
+
const elem = this.shadowRoot.querySelector(`#${this.server}Model`);
|
|
41
|
+
if (elem) {
|
|
42
|
+
elem.value = v;
|
|
43
|
+
elem.dispatchEvent(new Event("change"));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
this.dispatchEvent(new CustomEvent("setting-change", {
|
|
48
|
+
detail: { server: this.server, model: this.model }
|
|
49
|
+
})); */
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
connectedCallback() {
|
|
53
|
+
|
|
54
|
+
this.shadowRoot.innerHTML = `
|
|
55
|
+
<style>
|
|
56
|
+
@import "https://cdn.jsdelivr.net/npm/ninegrid@${ninegrid.version}/dist/css/ai.css";
|
|
57
|
+
${ninegrid.getCustomPath(this,"ai.css")}
|
|
58
|
+
</style>
|
|
59
|
+
|
|
60
|
+
<div class="line subject">
|
|
61
|
+
<label for="server">Server:</label>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="line contents">
|
|
64
|
+
<label><input name="server" type="radio" value="gemini" checked>Gemini</label>
|
|
65
|
+
<label><input name="server" type="radio" value="openai">Open AI</label>
|
|
66
|
+
<label><input name="server" type="radio" value="ollama">Ollama</label>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="line gemini-bak" style="display:none;">
|
|
69
|
+
<label>API Key: <input id="geminiApiKey" value=""/></label>
|
|
70
|
+
</div>
|
|
71
|
+
<div class="line openai-bak" style="display:none;">
|
|
72
|
+
<label>API Key: <input id="openaiApiKey" value=""/></label>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="line subject ollama">
|
|
75
|
+
<label for="ollamaUrl">Server Url:</label>
|
|
76
|
+
</div>
|
|
77
|
+
<div class="line contents ollama">
|
|
78
|
+
<input type="text" id="ollamaUrl" value="http://localhost:11434"/></label>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="line subject ollama">
|
|
81
|
+
<label for="ollamaModel">Model:</label>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="line contents ollama">
|
|
84
|
+
<select id="ollamaModel">
|
|
85
|
+
<option value="phi4:14b">phi4:14b</option>
|
|
86
|
+
<option value="llama3.1:8b">llama3.1:8b</option>
|
|
87
|
+
<option value="mistral:7b">mistral:7b</option>
|
|
88
|
+
</select>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="line subject gemini">
|
|
91
|
+
<label for="geminiModel">Model:</label>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="line contents gemini">
|
|
94
|
+
<select id="geminiModel">
|
|
95
|
+
<option value="gemini-2.5-flash-preview-04-17">gemini-2.5-flash-preview-04-17</option>
|
|
96
|
+
<option value="gemini-pro">gemini-pro</option>
|
|
97
|
+
</select>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="line subject openai">
|
|
100
|
+
<label for="openaiModel">Model:</label>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="line contents openai">
|
|
103
|
+
<select id="openaiModel">
|
|
104
|
+
<option value="gpt-4">gpt-4</option>
|
|
105
|
+
<option value="gpt-4o">gpt-4o</option>
|
|
106
|
+
<option value="gpt-3.5-turbo">gpt-3.5-turbo</option>
|
|
107
|
+
</select>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div class="line subject qdrant">
|
|
111
|
+
<label for="qdrantUrl">Qdrant Url:</label>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="line contents qdrant">
|
|
114
|
+
<input type="text" id="qdrantUrl" value="http://localhost:6333"/>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="line subject analyze">
|
|
118
|
+
<input id="chkAnalyze" type="checkbox" checked> <input id="txtAnalyze" type="number" value="100"><label>건 미만인 경우 데이타 분석 요청</label>
|
|
119
|
+
</div>
|
|
120
|
+
`;
|
|
121
|
+
|
|
122
|
+
this.#init();
|
|
123
|
+
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
this.server = "gemini";
|
|
126
|
+
}, 0);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
#init = () => {
|
|
132
|
+
|
|
133
|
+
this.shadowRoot.querySelectorAll('input[name="server"]').forEach((radio) => {
|
|
134
|
+
radio.addEventListener("change", () => {
|
|
135
|
+
const server = this.shadowRoot.querySelector('input[name="server"]:checked').value;
|
|
136
|
+
|
|
137
|
+
["gemini","openai","ollama"].forEach(v => {
|
|
138
|
+
this.shadowRoot.querySelectorAll('.' + v).forEach((elem) => {
|
|
139
|
+
elem.style.display = (server === v) ? "flex" : "none";
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
customElements.define("ide-assi-settings", ideAssiSettings);
|