ide-assi 0.46.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.
@@ -193405,6 +193405,7 @@ class IdeAi
193405
193405
 
193406
193406
  class IdeAssi extends HTMLElement
193407
193407
  {
193408
+ settings;
193408
193409
  #ai;
193409
193410
  #ing = false;
193410
193411
 
@@ -193426,6 +193427,8 @@ class IdeAssi extends HTMLElement
193426
193427
  </style>
193427
193428
 
193428
193429
  <div class="wrapper">
193430
+ <ide-assi-settings></ide-assi-settings>
193431
+
193429
193432
  <div class="container">
193430
193433
  <div class="head">
193431
193434
  <div class="logo"></div>
@@ -193453,13 +193456,14 @@ class IdeAssi extends HTMLElement
193453
193456
 
193454
193457
 
193455
193458
  #init = (info) => {
193456
-
193459
+ this.settings = this.shadowRoot.querySelector("nx-ai-settings");
193460
+
193457
193461
  this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
193458
193462
 
193459
193463
  this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
193460
193464
  this.shadowRoot.querySelector(".collapse-icon").addEventListener("click", this.#toggleCollapseHandler);
193461
193465
 
193462
- //this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
193466
+ this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
193463
193467
  };
193464
193468
 
193465
193469
 
@@ -193553,6 +193557,19 @@ export default Home;
193553
193557
  #toggleCollapseHandler = () => {
193554
193558
  this.classList.toggle("collapse");
193555
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
+ };
193556
193573
  }
193557
193574
 
193558
193575
  customElements.define("ide-assi", IdeAssi);
@@ -193401,6 +193401,7 @@ class IdeAi
193401
193401
 
193402
193402
  class IdeAssi extends HTMLElement
193403
193403
  {
193404
+ settings;
193404
193405
  #ai;
193405
193406
  #ing = false;
193406
193407
 
@@ -193422,6 +193423,8 @@ class IdeAssi extends HTMLElement
193422
193423
  </style>
193423
193424
 
193424
193425
  <div class="wrapper">
193426
+ <ide-assi-settings></ide-assi-settings>
193427
+
193425
193428
  <div class="container">
193426
193429
  <div class="head">
193427
193430
  <div class="logo"></div>
@@ -193449,13 +193452,14 @@ class IdeAssi extends HTMLElement
193449
193452
 
193450
193453
 
193451
193454
  #init = (info) => {
193452
-
193455
+ this.settings = this.shadowRoot.querySelector("nx-ai-settings");
193456
+
193453
193457
  this.shadowRoot.querySelector("textarea").addEventListener("keydown", this.#keydownHandler);
193454
193458
 
193455
193459
  this.shadowRoot.querySelector(".expand-icon").addEventListener("click", this.#toggleCollapseHandler);
193456
193460
  this.shadowRoot.querySelector(".collapse-icon").addEventListener("click", this.#toggleCollapseHandler);
193457
193461
 
193458
- //this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
193462
+ this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
193459
193463
  };
193460
193464
 
193461
193465
 
@@ -193549,6 +193553,19 @@ export default Home;
193549
193553
  #toggleCollapseHandler = () => {
193550
193554
  this.classList.toggle("collapse");
193551
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
+ };
193552
193569
  }
193553
193570
 
193554
193571
  customElements.define("ide-assi", IdeAssi);
@@ -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
- //this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ide-assi",
3
3
  "type": "module",
4
- "version": "0.46.0",
4
+ "version": "0.47.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "exports": {
@@ -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
- //this.shadowRoot.querySelectorAll(".menu-icon").forEach(el => el.addEventListener("click", this.#menuClickHandler));
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);