nowaikit-utils 1.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.
@@ -0,0 +1 @@
1
+ Replace with proper branded PNGs at 16x16, 48x48, 128x128
Binary file
Binary file
Binary file
package/icons/icon.svg ADDED
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#00F0C0"/>
5
+ <stop offset="50%" stop-color="#00D4AA"/>
6
+ <stop offset="100%" stop-color="#0F4C81"/>
7
+ </linearGradient>
8
+ </defs>
9
+ <circle cx="256" cy="256" r="256" fill="url(#bg)"/>
10
+ <g transform="translate(256,256) scale(9.13) translate(-22,-23)">
11
+ <path d="M5 39V7l15 27V7" stroke="#fff" stroke-width="5.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
12
+ <path d="M34 4l2 7 6 2-6 2-2 7-2-7-6-2 6-2z" fill="#fff" opacity="0.9"/>
13
+ <line x1="34" y1="19" x2="34" y2="28.5" stroke="#fff" stroke-width="1.8" opacity="0.5"/>
14
+ <circle cx="34" cy="34" r="4.5" fill="#fff" opacity="0.8"/>
15
+ </g>
16
+ </svg>
package/manifest.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "NowAIKit Utils",
4
+ "version": "1.0.0",
5
+ "description": "The essential ServiceNow browser toolkit — AI assistant, technical names, script sync with VS Code, quick navigation, field inspector, syntax highlighting, and more.",
6
+ "author": "AartiQ",
7
+ "permissions": [
8
+ "activeTab",
9
+ "storage",
10
+ "contextMenus",
11
+ "clipboardWrite",
12
+ "cookies",
13
+ "sidePanel"
14
+ ],
15
+ "side_panel": {
16
+ "default_path": "popup/popup.html"
17
+ },
18
+ "host_permissions": [
19
+ "https://*.service-now.com/*",
20
+ "https://*.servicenow.com/*"
21
+ ],
22
+ "action": {
23
+ "default_popup": "popup/popup.html",
24
+ "default_icon": {
25
+ "16": "icons/icon-16.png",
26
+ "48": "icons/icon-48.png",
27
+ "128": "icons/icon-128.png"
28
+ }
29
+ },
30
+ "icons": {
31
+ "16": "icons/icon-16.png",
32
+ "48": "icons/icon-48.png",
33
+ "128": "icons/icon-128.png"
34
+ },
35
+ "background": {
36
+ "service_worker": "background/service-worker.js"
37
+ },
38
+ "content_scripts": [
39
+ {
40
+ "matches": ["https://*.service-now.com/*", "https://*.servicenow.com/*"],
41
+ "js": ["content/integration-bridge.js", "content/ai-sidebar.js", "content/code-templates.js", "content/main-panel.js"],
42
+ "run_at": "document_idle",
43
+ "all_frames": false
44
+ },
45
+ {
46
+ "matches": ["https://*.service-now.com/*", "https://*.servicenow.com/*"],
47
+ "css": ["content/styles.css"],
48
+ "js": ["content/content.js"],
49
+ "run_at": "document_idle",
50
+ "all_frames": true
51
+ }
52
+ ],
53
+ "options_page": "options/options.html",
54
+ "content_security_policy": {
55
+ "extension_pages": "script-src 'self'; object-src 'self'"
56
+ },
57
+ "web_accessible_resources": [
58
+ {
59
+ "resources": ["icons/*", "ai-window.html"],
60
+ "matches": ["https://*.service-now.com/*", "https://*.servicenow.com/*"]
61
+ }
62
+ ]
63
+ }
@@ -0,0 +1,434 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>NowAIKit Utils — Settings</title>
6
+ <style>
7
+ :root {
8
+ --teal: #00D4AA;
9
+ --navy: #0F4C81;
10
+ --bg: #0B1020;
11
+ --card: #111828;
12
+ --border: #1e2a3e;
13
+ --text: #e0e5ec;
14
+ --text-dim: #6b7a90;
15
+ }
16
+
17
+ body {
18
+ background: var(--bg);
19
+ color: var(--text);
20
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
21
+ padding: 40px;
22
+ max-width: 600px;
23
+ margin: 0 auto;
24
+ }
25
+
26
+ h1 {
27
+ font-size: 24px;
28
+ background: linear-gradient(135deg, var(--teal), var(--navy));
29
+ -webkit-background-clip: text;
30
+ -webkit-text-fill-color: transparent;
31
+ margin-bottom: 8px;
32
+ }
33
+
34
+ .subtitle {
35
+ color: var(--text-dim);
36
+ font-size: 14px;
37
+ margin-bottom: 32px;
38
+ }
39
+
40
+ .card {
41
+ background: var(--card);
42
+ border: 1px solid var(--border);
43
+ border-radius: 12px;
44
+ padding: 20px;
45
+ margin-bottom: 20px;
46
+ }
47
+
48
+ .card h2 {
49
+ font-size: 14px;
50
+ color: var(--teal);
51
+ text-transform: uppercase;
52
+ letter-spacing: 0.5px;
53
+ margin-bottom: 16px;
54
+ }
55
+
56
+ .setting-row {
57
+ display: flex;
58
+ justify-content: space-between;
59
+ align-items: center;
60
+ padding: 10px 0;
61
+ border-bottom: 1px solid var(--border);
62
+ }
63
+
64
+ .setting-row:last-child {
65
+ border-bottom: none;
66
+ }
67
+
68
+ .setting-info h3 {
69
+ font-size: 14px;
70
+ font-weight: 500;
71
+ margin-bottom: 2px;
72
+ }
73
+
74
+ .setting-info p {
75
+ font-size: 12px;
76
+ color: var(--text-dim);
77
+ }
78
+
79
+ .toggle {
80
+ position: relative;
81
+ width: 44px;
82
+ height: 24px;
83
+ flex-shrink: 0;
84
+ }
85
+
86
+ .toggle input { opacity: 0; width: 0; height: 0; }
87
+
88
+ .toggle-slider {
89
+ position: absolute;
90
+ inset: 0;
91
+ background: #2a3548;
92
+ border-radius: 12px;
93
+ cursor: pointer;
94
+ transition: background 0.2s;
95
+ }
96
+
97
+ .toggle-slider::before {
98
+ content: '';
99
+ position: absolute;
100
+ width: 20px;
101
+ height: 20px;
102
+ left: 2px;
103
+ top: 2px;
104
+ background: #fff;
105
+ border-radius: 50%;
106
+ transition: transform 0.2s;
107
+ }
108
+
109
+ .toggle input:checked + .toggle-slider {
110
+ background: var(--teal);
111
+ }
112
+
113
+ .toggle input:checked + .toggle-slider::before {
114
+ transform: translateX(20px);
115
+ }
116
+
117
+ .saved {
118
+ position: fixed;
119
+ bottom: 20px;
120
+ right: 20px;
121
+ background: var(--teal);
122
+ color: #000;
123
+ padding: 8px 16px;
124
+ border-radius: 8px;
125
+ font-size: 13px;
126
+ font-weight: 600;
127
+ opacity: 0;
128
+ transform: translateY(10px);
129
+ transition: all 0.3s;
130
+ }
131
+
132
+ .saved.show {
133
+ opacity: 1;
134
+ transform: translateY(0);
135
+ }
136
+ </style>
137
+ </head>
138
+ <body>
139
+ <div style="display:flex;align-items:center;gap:12px;margin-bottom:8px;">
140
+ <svg width="36" height="36" viewBox="0 0 512 512"><defs><linearGradient id="hdrGrad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#00F0C0"/><stop offset="50%" stop-color="#00D4AA"/><stop offset="100%" stop-color="#0F4C81"/></linearGradient></defs><rect width="512" height="512" rx="128" fill="url(#hdrGrad)"/><g transform="translate(256,256) scale(9.13) translate(-22,-23)"><path d="M5 39V7l15 27V7" stroke="#fff" stroke-width="5.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M34 4l2 7 6 2-6 2-2 7-2-7-6-2 6-2z" fill="#fff" opacity="0.9"/><line x1="34" y1="19" x2="34" y2="28.5" stroke="#fff" stroke-width="1.8" opacity="0.5"/><circle cx="34" cy="34" r="4.5" fill="#fff" opacity="0.8"/></g></svg>
141
+ <h1>NowAIKit Utils</h1>
142
+ </div>
143
+ <p class="subtitle">Configure your ServiceNow browser toolkit</p>
144
+
145
+ <div class="card">
146
+ <h2>Display Features</h2>
147
+ <div class="setting-row">
148
+ <div class="setting-info">
149
+ <h3>Technical Field Names</h3>
150
+ <p>Show the API field name next to each form label</p>
151
+ </div>
152
+ <label class="toggle"><input type="checkbox" data-key="showTechnicalNames"><span class="toggle-slider"></span></label>
153
+ </div>
154
+ <div class="setting-row">
155
+ <div class="setting-info">
156
+ <h3>Update Set Banner</h3>
157
+ <p>Show the current update set at the top of the page</p>
158
+ </div>
159
+ <label class="toggle"><input type="checkbox" data-key="showUpdateSetBanner"><span class="toggle-slider"></span></label>
160
+ </div>
161
+ <div class="setting-row">
162
+ <div class="setting-info">
163
+ <h3>Field Type Tooltips</h3>
164
+ <p>Show field type information on hover</p>
165
+ </div>
166
+ <label class="toggle"><input type="checkbox" data-key="showFieldTypes"><span class="toggle-slider"></span></label>
167
+ </div>
168
+ </div>
169
+
170
+ <div class="card">
171
+ <h2>Productivity Features</h2>
172
+ <div class="setting-row">
173
+ <div class="setting-info">
174
+ <h3>Quick Navigation</h3>
175
+ <p><span class="mod-key">Ctrl</span>+Shift+K to open quick navigation bar</p>
176
+ </div>
177
+ <label class="toggle"><input type="checkbox" data-key="enableQuickNav"><span class="toggle-slider"></span></label>
178
+ </div>
179
+ <div class="setting-row">
180
+ <div class="setting-info">
181
+ <h3>Field Copy Buttons</h3>
182
+ <p>Show copy buttons on form field values</p>
183
+ </div>
184
+ <label class="toggle"><input type="checkbox" data-key="enableFieldCopy"><span class="toggle-slider"></span></label>
185
+ </div>
186
+ <div class="setting-row">
187
+ <div class="setting-info">
188
+ <h3>Node Switcher</h3>
189
+ <p>Quickly switch between application nodes</p>
190
+ </div>
191
+ <label class="toggle"><input type="checkbox" data-key="enableNodeSwitcher"><span class="toggle-slider"></span></label>
192
+ </div>
193
+ <div class="setting-row">
194
+ <div class="setting-info">
195
+ <h3>Script Highlighting</h3>
196
+ <p>Enhanced syntax highlighting in script fields</p>
197
+ </div>
198
+ <label class="toggle"><input type="checkbox" data-key="enableScriptHighlight"><span class="toggle-slider"></span></label>
199
+ </div>
200
+ </div>
201
+
202
+ <div class="card">
203
+ <h2>AI Assistant</h2>
204
+ <div class="setting-row">
205
+ <div class="setting-info">
206
+ <h3>AI Sidebar</h3>
207
+ <p>In-browser AI assistant for ServiceNow (<span class="mod-key">Ctrl</span>+Shift+A). Uses your own API key.</p>
208
+ </div>
209
+ <label class="toggle"><input type="checkbox" data-key="enableAISidebar"><span class="toggle-slider"></span></label>
210
+ </div>
211
+ </div>
212
+
213
+ <div class="card" id="aiSettingsCard">
214
+ <h2>AI Configuration</h2>
215
+ <div class="setting-row" style="flex-direction:column;align-items:stretch;gap:8px;">
216
+ <div class="setting-info">
217
+ <h3>Provider</h3>
218
+ <p>Select your LLM provider</p>
219
+ </div>
220
+ <select id="aiProvider" style="background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px;font-size:13px;width:100%;">
221
+ <option value="openai">OpenAI (GPT-5.4)</option>
222
+ <option value="anthropic">Anthropic (Claude)</option>
223
+ <option value="google">Google (Gemini)</option>
224
+ <option value="openrouter">OpenRouter (Any Model)</option>
225
+ <option value="ollama">Ollama (Local)</option>
226
+ </select>
227
+ </div>
228
+ <div class="setting-row" style="flex-direction:column;align-items:stretch;gap:8px;">
229
+ <div class="setting-info">
230
+ <h3>API Key</h3>
231
+ <p>Your key stays local — never sent anywhere except the provider API</p>
232
+ </div>
233
+ <input type="password" id="aiApiKey" placeholder="Enter API key..." style="background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px;font-size:13px;width:100%;" />
234
+ <a href="#" id="aiKeyLink" style="color:var(--teal);font-size:12px;text-decoration:underline;margin-top:2px;cursor:pointer;">Get your API key &rarr;</a>
235
+ </div>
236
+ <div class="setting-row" style="flex-direction:column;align-items:stretch;gap:8px;">
237
+ <div class="setting-info">
238
+ <h3>Model</h3>
239
+ <p>Select the model for your provider</p>
240
+ </div>
241
+ <select id="aiModel" style="background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px;font-size:13px;width:100%;">
242
+ <option value="gpt-5.4">GPT-5.4</option>
243
+ <option value="gpt-5.4-mini">GPT-5.4 Mini</option>
244
+ <option value="gpt-5.4-nano">GPT-5.4 Nano</option>
245
+ </select>
246
+ </div>
247
+ <div class="setting-row" style="flex-direction:column;align-items:stretch;gap:8px;" id="ollamaUrlRow">
248
+ <div class="setting-info">
249
+ <h3>Ollama URL</h3>
250
+ <p>Base URL for local Ollama server</p>
251
+ </div>
252
+ <input type="text" id="aiOllamaUrl" placeholder="http://localhost:11434" style="background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px;font-size:13px;width:100%;" />
253
+ </div>
254
+ </div>
255
+
256
+ <div class="card">
257
+ <h2>Integration (Product Suite)</h2>
258
+ <div class="setting-row">
259
+ <div class="setting-info">
260
+ <h3>Auto-Connect to Builder</h3>
261
+ <p>Automatically connect to NowAIKit Builder (VS Code) when it's running</p>
262
+ </div>
263
+ <label class="toggle"><input type="checkbox" data-key="enableBridgeAutoConnect"><span class="toggle-slider"></span></label>
264
+ </div>
265
+ <div class="setting-row" style="flex-direction:column;align-items:stretch;gap:8px;">
266
+ <div class="setting-info">
267
+ <h3>Builder Sync Port</h3>
268
+ <p>WebSocket port for connecting to NowAIKit Builder (default: 8765)</p>
269
+ </div>
270
+ <input type="number" id="bridgePort" value="8765" min="1024" max="65535" style="background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px;font-size:13px;width:120px;" />
271
+ </div>
272
+ <div class="setting-row">
273
+ <div class="setting-info">
274
+ <h3>Script Sync</h3>
275
+ <p>Two-way script sync between browser and VS Code</p>
276
+ </div>
277
+ <label class="toggle"><input type="checkbox" data-key="enableScriptSync"><span class="toggle-slider"></span></label>
278
+ </div>
279
+ </div>
280
+
281
+ <div id="savedNotice" class="saved">Settings saved</div>
282
+
283
+ <script>
284
+ // Detect OS and update modifier key labels
285
+ const isMac = /Mac|iPod|iPhone|iPad/.test(navigator.platform || navigator.userAgent);
286
+ if (isMac) {
287
+ document.querySelectorAll('.mod-key').forEach(function(el) {
288
+ el.textContent = '\u2318'; // ⌘ symbol
289
+ });
290
+ }
291
+
292
+ const defaults = {
293
+ showTechnicalNames: false,
294
+ showUpdateSetBanner: false,
295
+ showFieldTypes: false,
296
+ enableQuickNav: false,
297
+ enableFieldCopy: false,
298
+ enableNodeSwitcher: false,
299
+ enableScriptHighlight: false,
300
+ enableAISidebar: false,
301
+ };
302
+
303
+ function showSaved() {
304
+ const notice = document.getElementById('savedNotice');
305
+ notice.classList.add('show');
306
+ setTimeout(() => notice.classList.remove('show'), 1500);
307
+ }
308
+
309
+ // Load settings (toggles)
310
+ chrome.storage.sync.get(defaults, (settings) => {
311
+ document.querySelectorAll('[data-key]').forEach((input) => {
312
+ input.checked = settings[input.dataset.key] ?? false;
313
+ });
314
+ });
315
+
316
+ // Save toggle changes
317
+ document.querySelectorAll('[data-key]').forEach((input) => {
318
+ input.addEventListener('change', () => {
319
+ chrome.storage.sync.set({ [input.dataset.key]: input.checked });
320
+ showSaved();
321
+ });
322
+ });
323
+
324
+ // AI config fields — stored in chrome.storage.local for security
325
+ const aiProvider = document.getElementById('aiProvider');
326
+ const aiApiKey = document.getElementById('aiApiKey');
327
+ const aiModel = document.getElementById('aiModel');
328
+ const aiOllamaUrl = document.getElementById('aiOllamaUrl');
329
+ const ollamaUrlRow = document.getElementById('ollamaUrlRow');
330
+ const aiKeyLink = document.getElementById('aiKeyLink');
331
+
332
+ // Model lists per provider
333
+ const providerModels = {
334
+ openai: [
335
+ { value: 'gpt-5.4', label: 'GPT-5.4' },
336
+ { value: 'gpt-5.4-mini', label: 'GPT-5.4 Mini' },
337
+ { value: 'gpt-5.4-nano', label: 'GPT-5.4 Nano' },
338
+ ],
339
+ anthropic: [
340
+ { value: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6' },
341
+ { value: 'claude-opus-4-6', label: 'Claude Opus 4.6' },
342
+ { value: 'claude-haiku-4-5-20251001', label: 'Claude Haiku 4.5' },
343
+ ],
344
+ google: [
345
+ { value: 'gemini-3.1-pro-preview', label: 'Gemini 3.1 Pro' },
346
+ { value: 'gemini-3-flash-preview', label: 'Gemini 3 Flash' },
347
+ { value: 'gemini-2.5-flash', label: 'Gemini 2.5 Flash' },
348
+ { value: 'gemini-2.5-pro', label: 'Gemini 2.5 Pro' },
349
+ ],
350
+ openrouter: [
351
+ { value: 'openai/gpt-5.4', label: 'GPT-5.4' },
352
+ { value: 'anthropic/claude-sonnet-4-6', label: 'Claude Sonnet 4.6' },
353
+ { value: 'anthropic/claude-opus-4-6', label: 'Claude Opus 4.6' },
354
+ { value: 'google/gemini-3.1-pro-preview', label: 'Gemini 3.1 Pro' },
355
+ { value: 'deepseek/deepseek-v3.2', label: 'DeepSeek V3.2' },
356
+ ],
357
+ ollama: [
358
+ { value: 'qwen3', label: 'Qwen 3' },
359
+ { value: 'qwen3.5', label: 'Qwen 3.5' },
360
+ { value: 'deepseek-r1', label: 'DeepSeek R1' },
361
+ { value: 'llama3.3', label: 'Llama 3.3' },
362
+ ],
363
+ };
364
+
365
+ // API key generation links
366
+ const keyLinks = {
367
+ openai: 'https://platform.openai.com/api-keys',
368
+ anthropic: 'https://console.anthropic.com/settings/keys',
369
+ google: 'https://aistudio.google.com/apikey',
370
+ openrouter: 'https://openrouter.ai/keys',
371
+ ollama: '',
372
+ };
373
+
374
+ function updateOptionsModelList(provider, savedModel) {
375
+ const models = providerModels[provider] || providerModels.openai;
376
+ aiModel.innerHTML = models.map(m => '<option value="' + m.value + '">' + m.label + '</option>').join('');
377
+ if (savedModel && models.some(m => m.value === savedModel)) {
378
+ aiModel.value = savedModel;
379
+ }
380
+ ollamaUrlRow.style.display = provider === 'ollama' ? 'flex' : 'none';
381
+ // Update API key link
382
+ const url = keyLinks[provider] || '';
383
+ if (url) {
384
+ aiKeyLink.style.display = 'inline';
385
+ aiKeyLink.onclick = (e) => { e.preventDefault(); window.open(url, '_blank'); };
386
+ } else {
387
+ aiKeyLink.style.display = 'none';
388
+ }
389
+ }
390
+
391
+ // Load AI settings
392
+ chrome.storage.local.get({ aiProvider: 'openai', aiApiKey: '', aiModel: 'gpt-5.4', aiOllamaUrl: 'http://localhost:11434' }, (s) => {
393
+ aiProvider.value = s.aiProvider;
394
+ aiApiKey.value = s.aiApiKey;
395
+ aiOllamaUrl.value = s.aiOllamaUrl;
396
+ updateOptionsModelList(s.aiProvider, s.aiModel);
397
+ });
398
+
399
+ aiProvider.addEventListener('change', () => {
400
+ chrome.storage.local.set({ aiProvider: aiProvider.value });
401
+ updateOptionsModelList(aiProvider.value);
402
+ showSaved();
403
+ });
404
+
405
+ aiApiKey.addEventListener('change', () => {
406
+ chrome.storage.local.set({ aiApiKey: aiApiKey.value });
407
+ showSaved();
408
+ });
409
+
410
+ aiModel.addEventListener('change', () => {
411
+ chrome.storage.local.set({ aiModel: aiModel.value });
412
+ showSaved();
413
+ });
414
+
415
+ aiOllamaUrl.addEventListener('change', () => {
416
+ chrome.storage.local.set({ aiOllamaUrl: aiOllamaUrl.value });
417
+ showSaved();
418
+ });
419
+
420
+ // Bridge port
421
+ const bridgePortInput = document.getElementById('bridgePort');
422
+ chrome.storage.local.get({ bridgePort: 8765 }, (s) => {
423
+ bridgePortInput.value = s.bridgePort;
424
+ });
425
+ bridgePortInput.addEventListener('change', () => {
426
+ const port = parseInt(bridgePortInput.value, 10);
427
+ if (port >= 1024 && port <= 65535) {
428
+ chrome.storage.local.set({ bridgePort: port });
429
+ showSaved();
430
+ }
431
+ });
432
+ </script>
433
+ </body>
434
+ </html>
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "nowaikit-utils",
3
+ "version": "1.1.0",
4
+ "description": "The most comprehensive ServiceNow browser extension — AI Assistant, 22 code templates, 12 slash commands, node switcher, script sync with VS Code, multi-instance management, and enterprise-grade security.",
5
+ "author": "AartiQ <dev@nowaikit.com>",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/aartiq/nowaikit-utils-browser.git"
10
+ },
11
+ "homepage": "https://nowaikit.com/products/utils",
12
+ "bugs": {
13
+ "url": "https://github.com/aartiq/nowaikit-utils-browser/issues"
14
+ },
15
+ "keywords": [
16
+ "servicenow",
17
+ "chrome-extension",
18
+ "browser-extension",
19
+ "ai-assistant",
20
+ "byok",
21
+ "code-templates",
22
+ "gliderecord",
23
+ "glidequery",
24
+ "node-switcher",
25
+ "script-sync",
26
+ "vscode",
27
+ "nowaikit",
28
+ "mcp",
29
+ "productivity"
30
+ ],
31
+ "bin": {
32
+ "nowaikit-utils": "./cli.mjs"
33
+ },
34
+ "files": [
35
+ "cli.mjs",
36
+ "manifest.json",
37
+ "background/",
38
+ "content/",
39
+ "popup/",
40
+ "options/",
41
+ "icons/",
42
+ "ai-window.html",
43
+ "LICENSE",
44
+ "README.md"
45
+ ],
46
+ "engines": {
47
+ "node": ">=16.0.0"
48
+ }
49
+ }