local-deep-research 0.4.3__py3-none-any.whl → 0.4.4__py3-none-any.whl

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.
@@ -1 +1 @@
1
- __version__ = "0.4.3"
1
+ __version__ = "0.4.4"
@@ -991,7 +991,7 @@
991
991
  "options": null,
992
992
  "step": null,
993
993
  "type": "SEARCH",
994
- "ui_element": "text",
994
+ "ui_element": "json",
995
995
  "value": [
996
996
  "scientific papers",
997
997
  "academic research",
@@ -1014,7 +1014,7 @@
1014
1014
  "options": null,
1015
1015
  "step": null,
1016
1016
  "type": "SEARCH",
1017
- "ui_element": "text",
1017
+ "ui_element": "json",
1018
1018
  "value": [
1019
1019
  "non-academic topics",
1020
1020
  "consumer products",
@@ -1159,7 +1159,7 @@
1159
1159
  "options": null,
1160
1160
  "step": null,
1161
1161
  "type": "SEARCH",
1162
- "ui_element": "text",
1162
+ "ui_element": "json",
1163
1163
  "value": [
1164
1164
  "intelligent engine selection",
1165
1165
  "adaptable to query type",
@@ -1177,7 +1177,7 @@
1177
1177
  "options": null,
1178
1178
  "step": null,
1179
1179
  "type": "SEARCH",
1180
- "ui_element": "text",
1180
+ "ui_element": "json",
1181
1181
  "value": [
1182
1182
  "slightly slower due to LLM analysis"
1183
1183
  ],
@@ -1375,7 +1375,7 @@
1375
1375
  "options": null,
1376
1376
  "step": null,
1377
1377
  "type": "SEARCH",
1378
- "ui_element": "text",
1378
+ "ui_element": "json",
1379
1379
  "value": [
1380
1380
  "privacy-focused web search",
1381
1381
  "product information",
@@ -1410,7 +1410,7 @@
1410
1410
  "options": null,
1411
1411
  "step": null,
1412
1412
  "type": "SEARCH",
1413
- "ui_element": "text",
1413
+ "ui_element": "json",
1414
1414
  "value": [
1415
1415
  "requires API key with usage limits",
1416
1416
  "smaller index than Google"
@@ -1640,7 +1640,7 @@
1640
1640
  "options": null,
1641
1641
  "step": null,
1642
1642
  "type": "SEARCH",
1643
- "ui_element": "text",
1643
+ "ui_element": "json",
1644
1644
  "value": [
1645
1645
  "code repositories",
1646
1646
  "software documentation",
@@ -1675,7 +1675,7 @@
1675
1675
  "options": null,
1676
1676
  "step": null,
1677
1677
  "type": "SEARCH",
1678
- "ui_element": "text",
1678
+ "ui_element": "json",
1679
1679
  "value": [
1680
1680
  "non-technical content",
1681
1681
  "content outside GitHub",
@@ -1861,7 +1861,7 @@
1861
1861
  "options": null,
1862
1862
  "step": null,
1863
1863
  "type": "SEARCH",
1864
- "ui_element": "text",
1864
+ "ui_element": "json",
1865
1865
  "value": [
1866
1866
  "custom search scope",
1867
1867
  "high-quality results",
@@ -1895,7 +1895,7 @@
1895
1895
  "options": null,
1896
1896
  "step": null,
1897
1897
  "type": "SEARCH",
1898
- "ui_element": "text",
1898
+ "ui_element": "json",
1899
1899
  "value": [
1900
1900
  "requires API key with usage limits",
1901
1901
  "limited to 10,000 queries/day on free tier",
@@ -2025,7 +2025,7 @@
2025
2025
  "options": null,
2026
2026
  "step": null,
2027
2027
  "type": "SEARCH",
2028
- "ui_element": "text",
2028
+ "ui_element": "json",
2029
2029
  "value": [
2030
2030
  "searches all local collections",
2031
2031
  "personal documents",
@@ -2043,7 +2043,7 @@
2043
2043
  "options": null,
2044
2044
  "step": null,
2045
2045
  "type": "SEARCH",
2046
- "ui_element": "text",
2046
+ "ui_element": "json",
2047
2047
  "value": [
2048
2048
  "may return too many results",
2049
2049
  "requires indexing"
@@ -2232,9 +2232,9 @@
2232
2232
  "options": null,
2233
2233
  "step": null,
2234
2234
  "type": "SEARCH",
2235
- "ui_element": "text",
2235
+ "ui_element": "json",
2236
2236
  "value": [
2237
- "@format ${DOCS_DIR}/personal_notes"
2237
+ "/local_collections/personal_notes"
2238
2238
  ],
2239
2239
  "visible": true
2240
2240
  },
@@ -2262,7 +2262,7 @@
2262
2262
  "options": null,
2263
2263
  "step": null,
2264
2264
  "type": "SEARCH",
2265
- "ui_element": "text",
2265
+ "ui_element": "json",
2266
2266
  "value": [
2267
2267
  "personal knowledge",
2268
2268
  "notes",
@@ -2280,7 +2280,7 @@
2280
2280
  "options": null,
2281
2281
  "step": null,
2282
2282
  "type": "SEARCH",
2283
- "ui_element": "text",
2283
+ "ui_element": "json",
2284
2284
  "value": [
2285
2285
  "subjective content",
2286
2286
  "informal information"
@@ -2469,9 +2469,9 @@
2469
2469
  "options": null,
2470
2470
  "step": null,
2471
2471
  "type": "SEARCH",
2472
- "ui_element": "text",
2472
+ "ui_element": "json",
2473
2473
  "value": [
2474
- "@format ${DOCS_DIR}/project_documents"
2474
+ "/local_collections/project_docs/"
2475
2475
  ],
2476
2476
  "visible": true
2477
2477
  },
@@ -2499,7 +2499,7 @@
2499
2499
  "options": null,
2500
2500
  "step": null,
2501
2501
  "type": "SEARCH",
2502
- "ui_element": "text",
2502
+ "ui_element": "json",
2503
2503
  "value": [
2504
2504
  "project documentation",
2505
2505
  "specifications",
@@ -2517,7 +2517,7 @@
2517
2517
  "options": null,
2518
2518
  "step": null,
2519
2519
  "type": "SEARCH",
2520
- "ui_element": "text",
2520
+ "ui_element": "json",
2521
2521
  "value": [
2522
2522
  "no external information",
2523
2523
  "limited to organizational knowledge"
@@ -2730,7 +2730,7 @@
2730
2730
  "options": null,
2731
2731
  "step": null,
2732
2732
  "type": "SEARCH",
2733
- "ui_element": "text",
2733
+ "ui_element": "json",
2734
2734
  "value": [
2735
2735
  "biomedical literature",
2736
2736
  "medical research",
@@ -2751,7 +2751,7 @@
2751
2751
  "options": null,
2752
2752
  "step": null,
2753
2753
  "type": "SEARCH",
2754
- "ui_element": "text",
2754
+ "ui_element": "json",
2755
2755
  "value": [
2756
2756
  "non-medical topics",
2757
2757
  "very recent papers may be missing",
@@ -2941,9 +2941,9 @@
2941
2941
  "options": null,
2942
2942
  "step": null,
2943
2943
  "type": "SEARCH",
2944
- "ui_element": "text",
2944
+ "ui_element": "json",
2945
2945
  "value": [
2946
- "@format ${DOCS_DIR}/research_papers"
2946
+ "/local_collections/research_papers/"
2947
2947
  ],
2948
2948
  "visible": true
2949
2949
  },
@@ -2971,7 +2971,7 @@
2971
2971
  "options": null,
2972
2972
  "step": null,
2973
2973
  "type": "SEARCH",
2974
- "ui_element": "text",
2974
+ "ui_element": "json",
2975
2975
  "value": [
2976
2976
  "academic research",
2977
2977
  "scientific papers",
@@ -2989,7 +2989,7 @@
2989
2989
  "options": null,
2990
2990
  "step": null,
2991
2991
  "type": "SEARCH",
2992
- "ui_element": "text",
2992
+ "ui_element": "json",
2993
2993
  "value": [
2994
2994
  "potentially outdated",
2995
2995
  "limited to collected papers"
@@ -3062,7 +3062,7 @@
3062
3062
  "options": null,
3063
3063
  "step": null,
3064
3064
  "type": "SEARCH",
3065
- "ui_element": "text",
3065
+ "ui_element": "json",
3066
3066
  "value": [
3067
3067
  "general"
3068
3068
  ],
@@ -3231,7 +3231,7 @@
3231
3231
  "options": null,
3232
3232
  "step": null,
3233
3233
  "type": "SEARCH",
3234
- "ui_element": "text",
3234
+ "ui_element": "json",
3235
3235
  "value": [
3236
3236
  "comprehensive general information",
3237
3237
  "current events and news",
@@ -3270,7 +3270,7 @@
3270
3270
  "options": null,
3271
3271
  "step": null,
3272
3272
  "type": "SEARCH",
3273
- "ui_element": "text",
3273
+ "ui_element": "json",
3274
3274
  "value": [
3275
3275
  "requires self-hosting",
3276
3276
  "depends on other search engines",
@@ -3470,7 +3470,7 @@
3470
3470
  "options": null,
3471
3471
  "step": null,
3472
3472
  "type": "SEARCH",
3473
- "ui_element": "text",
3473
+ "ui_element": "json",
3474
3474
  "value": [
3475
3475
  "comprehensive web search",
3476
3476
  "product information",
@@ -3505,7 +3505,7 @@
3505
3505
  "options": null,
3506
3506
  "step": null,
3507
3507
  "type": "SEARCH",
3508
- "ui_element": "text",
3508
+ "ui_element": "json",
3509
3509
  "value": [
3510
3510
  "requires API key with usage limits",
3511
3511
  "not specialized for academic content"
@@ -3662,7 +3662,7 @@
3662
3662
  "options": null,
3663
3663
  "step": null,
3664
3664
  "type": "SEARCH",
3665
- "ui_element": "text",
3665
+ "ui_element": "json",
3666
3666
  "value": [
3667
3667
  "historical web content",
3668
3668
  "archived websites",
@@ -3696,7 +3696,7 @@
3696
3696
  "options": null,
3697
3697
  "step": null,
3698
3698
  "type": "SEARCH",
3699
- "ui_element": "text",
3699
+ "ui_element": "json",
3700
3700
  "value": [
3701
3701
  "limited to previously archived content",
3702
3702
  "may miss recent changes",
@@ -3868,7 +3868,7 @@
3868
3868
  "options": null,
3869
3869
  "step": null,
3870
3870
  "type": "SEARCH",
3871
- "ui_element": "text",
3871
+ "ui_element": "json",
3872
3872
  "value": [
3873
3873
  "factual information",
3874
3874
  "general knowledge",
@@ -3889,7 +3889,7 @@
3889
3889
  "options": null,
3890
3890
  "step": null,
3891
3891
  "type": "SEARCH",
3892
- "ui_element": "text",
3892
+ "ui_element": "json",
3893
3893
  "value": [
3894
3894
  "recent events",
3895
3895
  "specialized academic topics",
@@ -47,6 +47,8 @@ class SettingsManager:
47
47
 
48
48
  _UI_ELEMENT_TO_SETTING_TYPE = {
49
49
  "text": str,
50
+ # SQLAlchemy should already handle JSON parsing.
51
+ "json": lambda x: x,
50
52
  "password": str,
51
53
  "select": str,
52
54
  "number": float,
@@ -70,7 +72,7 @@ class SettingsManager:
70
72
 
71
73
  def __get_typed_setting_value(
72
74
  self, setting: Type[Setting], default: Any = None, check_env: bool = True
73
- ) -> str | float | bool | None:
75
+ ) -> Any:
74
76
  """
75
77
  Extracts the value for a particular setting, ensuring that it has the
76
78
  correct type.
@@ -395,16 +395,28 @@
395
395
  shouldSaveImmediately = true;
396
396
  }
397
397
  }
398
- // Handle range/slider (save on change/input or blur)
399
- else if (input.type === 'range') {
398
+ // Handle range/slider (save on change/input or blur)
399
+ else if (input.type === 'range') {
400
400
  value = input.value;
401
401
  if (eventType === 'change' || eventType === 'input' || eventType === 'blur') {
402
402
  shouldSaveImmediately = true;
403
403
  }
404
- }
404
+ }
405
405
  // Handle other inputs (text, number, textarea) - Save on Enter or Blur
406
406
  else {
407
407
  value = input.value;
408
+
409
+ // Handle JSON.
410
+ if (input.classList.contains('json-content')) {
411
+ try {
412
+ // Validate
413
+ value = JSON.parse(input.value);
414
+ } catch (e) {
415
+ markInvalidInput(input, 'Invalid JSON');
416
+ return;
417
+ }
418
+ }
419
+
408
420
  // Basic validation for number
409
421
  if (input.type === 'number') {
410
422
  try {
@@ -1429,31 +1441,32 @@
1429
1441
  // Generate the appropriate input element based on UI element type
1430
1442
  switch(setting.ui_element) {
1431
1443
  case 'textarea':
1432
- // Check if it's JSON
1433
- let isJson = false;
1434
- let jsonClass = '';
1444
+ inputElement = `
1445
+ <textarea id="${settingId}" name="${setting.key}"
1446
+ class="settings-textarea"
1447
+ ${!setting.editable ? 'disabled' : ''}
1448
+ >${setting.value !== null ? setting.value : ''}</textarea>
1449
+ `;
1450
+ break;
1451
+
1452
+ case 'json':
1453
+ let jsonClass = ' json-content';
1435
1454
 
1436
- if (typeof setting.value === 'string' &&
1437
- (setting.value.startsWith('{') || setting.value.startsWith('['))) {
1438
- isJson = true;
1439
- jsonClass = ' json-content';
1455
+ // Try to format the JSON for better display
1456
+ try {
1457
+ setting.value = JSON.stringify(JSON.parse(setting.value), null, 2);
1458
+ } catch (e) {
1459
+ // If parsing fails, keep the original value
1460
+ console.log('Error formatting JSON:', e);
1461
+ }
1440
1462
 
1441
- // Try to format the JSON for better display
1463
+ // If it's an object (not an array), render individual controls
1464
+ if (setting.value.startsWith('{')) {
1442
1465
  try {
1443
- setting.value = JSON.stringify(JSON.parse(setting.value), null, 2);
1466
+ const jsonObj = JSON.parse(setting.value);
1467
+ return renderExpandedJsonControls(setting, settingId, jsonObj);
1444
1468
  } catch (e) {
1445
- // If parsing fails, keep the original value
1446
- console.log('Error formatting JSON:', e);
1447
- }
1448
-
1449
- // If it's an object (not an array), render individual controls
1450
- if (setting.value.startsWith('{')) {
1451
- try {
1452
- const jsonObj = JSON.parse(setting.value);
1453
- return renderExpandedJsonControls(setting, settingId, jsonObj);
1454
- } catch (e) {
1455
- console.log('Error parsing JSON for controls:', e);
1456
- }
1469
+ console.log('Error parsing JSON for controls:', e);
1457
1470
  }
1458
1471
  }
1459
1472
 
@@ -1581,26 +1594,15 @@
1581
1594
 
1582
1595
  default:
1583
1596
  // Handle llm.model here explicitly if not handled by ui_element
1584
- if (typeof setting.value === 'string' &&
1585
- (setting.value.startsWith('{') || setting.value.startsWith('['))) {
1586
- // Handle JSON objects/arrays rendered as textareas if not expanded
1587
- inputElement = `
1588
- <textarea id="${settingId}" name="${setting.key}"
1589
- class="settings-textarea json-content"
1590
- ${!setting.editable ? 'disabled' : ''}
1591
- >${setting.value}</textarea>
1592
- `;
1593
- } else {
1594
- // Default to text input
1595
- inputElement = `
1596
- <input type="${setting.ui_element === 'password' ? 'password' : 'text'}"
1597
- id="${settingId}" name="${setting.key}"
1598
- class="settings-input form-control"
1599
- value="${setting.value !== null ? setting.value : ''}"
1600
- ${!setting.editable ? 'disabled' : ''}
1601
- >
1602
- `;
1603
- }
1597
+ // Default to text input
1598
+ inputElement = `
1599
+ <input type="${setting.ui_element === 'password' ? 'password' : 'text'}"
1600
+ id="${settingId}" name="${setting.key}"
1601
+ class="settings-input form-control"
1602
+ value="${setting.value !== null ? setting.value : ''}"
1603
+ ${!setting.editable ? 'disabled' : ''}
1604
+ >
1605
+ `;
1604
1606
  break;
1605
1607
  }
1606
1608
 
@@ -1945,6 +1947,22 @@
1945
1947
  }, 1500);
1946
1948
  }
1947
1949
 
1950
+ /**
1951
+ * Validates user-specified JSON data and shows and error if it is not
1952
+ * valid JSON.
1953
+ * @param content The content to validate.
1954
+ * @return True if the content is valid.
1955
+ */
1956
+ function validateJsonContent(content) {
1957
+ try {
1958
+ JSON.parse(content);
1959
+ return true;
1960
+ } catch (e) {
1961
+ showMessage('Setting value must be valid JSON.', 'error', 5000);
1962
+ return false;
1963
+ }
1964
+ }
1965
+
1948
1966
  /**
1949
1967
  * Submit settings data to the API
1950
1968
  * @param {Object} formData - The settings to save
@@ -1962,6 +1980,11 @@
1962
1980
  } else if (sourceElement.classList.contains('json-property-control')) {
1963
1981
  // For JSON property controls, use the property item
1964
1982
  loadingContainer = sourceElement.closest('.json-property-item') || sourceElement;
1983
+ } else if (sourceElement.classList.contains('json-content')) {
1984
+ // For JSON content, validate it before saving.
1985
+ if (!validateJsonContent(sourceElement.value)) {
1986
+ return;
1987
+ }
1965
1988
  } else {
1966
1989
  // For other inputs, use the form-group or settings-item
1967
1990
  loadingContainer = sourceElement.closest('.form-group') ||
@@ -3688,16 +3711,16 @@
3688
3711
 
3689
3712
  return false;
3690
3713
  }
3691
-
3714
+
3692
3715
  if (providerUpper === 'OPENAI_ENDPOINT') {
3693
3716
  if (model.provider && model.provider.toUpperCase() === 'OPENAI_ENDPOINT') {
3694
3717
  return true;
3695
3718
  }
3696
-
3719
+
3697
3720
  if (model.label && model.label.toLowerCase().includes('custom')) {
3698
3721
  return true;
3699
3722
  }
3700
-
3723
+
3701
3724
  return false;
3702
3725
  }
3703
3726
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: local-deep-research
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: AI-powered research assistant with deep, iterative analysis using LLMs and web searches
5
5
  Author-Email: LearningCircuit <185559241+LearningCircuit@users.noreply.github.com>, HashedViking <6432677+HashedViking@users.noreply.github.com>
6
6
  License: MIT License
@@ -74,7 +74,7 @@ Requires-Dist: loguru>=0.7.3
74
74
  Requires-Dist: matplotlib>=3.10.3
75
75
  Requires-Dist: pandas>=2.2.3
76
76
  Requires-Dist: plotly>=6.0.1
77
- Requires-Dist: kaleido==0.1.0
77
+ Requires-Dist: kaleido==0.2.1
78
78
  Description-Content-Type: text/markdown
79
79
 
80
80
  # Local Deep Research
@@ -1,9 +1,9 @@
1
- local_deep_research-0.4.3.dist-info/METADATA,sha256=8xlBwQ1wxZeZkbPKoHikLxTfWk2fkRoGdkCgX4e50l8,17352
2
- local_deep_research-0.4.3.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- local_deep_research-0.4.3.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
4
- local_deep_research-0.4.3.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
1
+ local_deep_research-0.4.4.dist-info/METADATA,sha256=G-D1LQmdEy6WlUoTaWbC9zvK_NYW3w3yR4cV5VP9MTQ,17352
2
+ local_deep_research-0.4.4.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ local_deep_research-0.4.4.dist-info/entry_points.txt,sha256=GcXS501Rjh-P80S8db7hnrQ23mS_Jg27PwpVQVO77as,113
4
+ local_deep_research-0.4.4.dist-info/licenses/LICENSE,sha256=Qg2CaTdu6SWnSqk1_JtgBPp_Da-LdqJDhT1Vt1MUc5s,1072
5
5
  local_deep_research/__init__.py,sha256=BPWOE6L1vBgBshHlyzrrp0gYo6uR3ljiNBFDRK_3aIw,911
6
- local_deep_research/__version__.py,sha256=Nyg0pmk5ea9-SLCAFEIF96ByFx4-TJFtrqYPN-Zn6g4,22
6
+ local_deep_research/__version__.py,sha256=6G_giX6Ucuweo7w5OiftoXmbNLoqiU_soXJoU8aiLmY,22
7
7
  local_deep_research/advanced_search_system/__init__.py,sha256=sGusMj4eFIrhXR6QbOM16UDKB6aI-iS4IFivKWpMlh0,234
8
8
  local_deep_research/advanced_search_system/filters/__init__.py,sha256=2dXrV4skcVHI2Lb3BSL2Ajq0rnLeSw7kc1MbIynMxa4,190
9
9
  local_deep_research/advanced_search_system/filters/base_filter.py,sha256=58Ux0ppXafL8Vy2qbWioUBMqGtK1dgtSF5A68BP8M8Y,1010
@@ -76,7 +76,7 @@ local_deep_research/config/llm_config.py,sha256=31F-nlloP_N30HYZqnJ2sCNMZXlJVB9A
76
76
  local_deep_research/config/search_config.py,sha256=-m4BkHHMvzNkIuZmximmE3T5_H-JU4UZubEc_cDpWH0,2130
77
77
  local_deep_research/defaults/.env.template,sha256=_eVCy4d_XwpGXy8n50CG3wH9xx2oqJCFKS7IbqgInDk,491
78
78
  local_deep_research/defaults/__init__.py,sha256=C_0t0uZmtrVB4rM9NM9Wx8PJU5kFcT-qOHvws5W2iOg,1352
79
- local_deep_research/defaults/default_settings.json,sha256=UTzWrOONlvR6UELT7remAN5qLLMLYvjnQXNMd0cH87w,124256
79
+ local_deep_research/defaults/default_settings.json,sha256=0dfTFkplu7wnLJQYLBf4wKER55EmYbp_rMAJ5kgmUXc,124250
80
80
  local_deep_research/migrate_db.py,sha256=S1h6Bv0OJdRW4BaH7MIMrUXBRV_yqgH2T6LVOZKTQjI,4634
81
81
  local_deep_research/report_generator.py,sha256=-G3KDEbsuU3PdxDfuo5v28DIX7RE1yJCCBU2KgRbNzI,9084
82
82
  local_deep_research/search_system.py,sha256=DCBSLSUyLqPuHrgOuTlDizT_cnWRBICYKH-haMWWoDo,8412
@@ -108,7 +108,7 @@ local_deep_research/web/routes/research_routes.py,sha256=RkuT6VA5BlKzfeFzp3HvoEQ
108
108
  local_deep_research/web/routes/settings_routes.py,sha256=Yt4xVt6XcGPSEFuAkcQ4zlZ2r5dIbV3VNsWIXoGeflw,58606
109
109
  local_deep_research/web/services/research_service.py,sha256=kHdonXtGDTSU2_jBlCP_deqMdydhxA_p7EabsR5kBkE,38812
110
110
  local_deep_research/web/services/resource_service.py,sha256=yKgOC6GEOmHqRoGzwf52e19UaGCCS1DbDbOIXgWGvGc,4378
111
- local_deep_research/web/services/settings_manager.py,sha256=FKW8LKVsBGr_vgWHn1lZZRwiqRQ98ZrNicLOwf6vjPw,19058
111
+ local_deep_research/web/services/settings_manager.py,sha256=PK1L6ShqWmn11o6GIqKt29mO_Qs-_v4nbuCT4_Abn18,19122
112
112
  local_deep_research/web/services/settings_service.py,sha256=-ZG78JR14GuhsaXIF4OQOqfRfrw2QIqYEKwTOFhsuFo,3497
113
113
  local_deep_research/web/services/socket_service.py,sha256=jZGXk6kesBOf4bAdLiT3V4Ofod12pGKTsvxr3ml8ydY,7272
114
114
  local_deep_research/web/static/css/custom_dropdown.css,sha256=-pCx6oazWVgwqFAGq_eZ8OrTKMVQlgkKYCM6w-bACLs,7949
@@ -123,7 +123,7 @@ local_deep_research/web/static/js/components/logpanel.js,sha256=HvBNnpk2alkEQ7_o
123
123
  local_deep_research/web/static/js/components/progress.js,sha256=aTvtyZDQMkjyhqy62icuZuJ7Khyujgust6fpQFcRABk,41570
124
124
  local_deep_research/web/static/js/components/research.js,sha256=11hp74iqRpiOM3qHONF3xGsyNgqOdOBPsZyK0oDFgqY,82906
125
125
  local_deep_research/web/static/js/components/results.js,sha256=7fL18Yn0DwAjuelXvz-UlbDiLCFk-_UEEeqEjaDEVBA,32314
126
- local_deep_research/web/static/js/components/settings.js,sha256=ebOY2cYAlTx2-k1sjWMvCxdibF2vsLBqIV6IHYXob9k,169629
126
+ local_deep_research/web/static/js/components/settings.js,sha256=qnRxnx9LdyOpjIEKfb4mJdES9sLkNKvyzxy4OGUqmGQ,169998
127
127
  local_deep_research/web/static/js/components/settings_sync.js,sha256=LWDZ2EE8ChCxI5TPmPm9F4rOiYIEzEJxSCE1GLXk-2w,3925
128
128
  local_deep_research/web/static/js/main.js,sha256=NHOcEVytPCvF5tz3yPWg8Qu5ghVs5-GWKmpaKB87oi4,8440
129
129
  local_deep_research/web/static/js/research_form.js,sha256=qOZK0z_BE_xx2a1sx5vTjsCTW-ggHES_uj5eunO9Bo8,3632
@@ -174,4 +174,4 @@ local_deep_research/web_search_engines/engines/search_engine_wikipedia.py,sha256
174
174
  local_deep_research/web_search_engines/search_engine_base.py,sha256=TFmkIGgzIkXFsk9jhGn2PYyxveOWzKQLrhpZy5qaggE,10803
175
175
  local_deep_research/web_search_engines/search_engine_factory.py,sha256=73lwSenv7tK7eGIBOPh13hPdn0oZ9FC0EMjZx5YRPg4,11865
176
176
  local_deep_research/web_search_engines/search_engines_config.py,sha256=qfmrTZjjVeMfdZQ9WIAEWKdPPEtZhTAJ5KjCdgsz_ww,5259
177
- local_deep_research-0.4.3.dist-info/RECORD,,
177
+ local_deep_research-0.4.4.dist-info/RECORD,,