cmdbox 0.6.3.2__py3-none-any.whl → 0.6.4.1__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.

Potentially problematic release.


This version of cmdbox might be problematic. Click here for more details.

Files changed (168) hide show
  1. cmdbox/app/app.py +22 -7
  2. cmdbox/app/common.py +9 -6
  3. cmdbox/app/commons/loghandler.py +101 -20
  4. cmdbox/app/commons/redis_client.py +1 -1
  5. cmdbox/app/edge.py +2 -4
  6. cmdbox/app/feature.py +1 -1
  7. cmdbox/app/features/cli/cmdbox_agent_mcp_client.py +175 -0
  8. cmdbox/app/features/cli/cmdbox_agent_mcp_proxy.py +96 -0
  9. cmdbox/app/features/cli/cmdbox_audit_createdb.py +224 -224
  10. cmdbox/app/features/cli/cmdbox_audit_delete.py +4 -4
  11. cmdbox/app/features/cli/cmdbox_audit_search.py +4 -4
  12. cmdbox/app/features/cli/cmdbox_audit_write.py +6 -8
  13. cmdbox/app/features/cli/cmdbox_client_file_copy.py +3 -3
  14. cmdbox/app/features/cli/cmdbox_client_file_download.py +3 -3
  15. cmdbox/app/features/cli/cmdbox_client_file_list.py +3 -3
  16. cmdbox/app/features/cli/cmdbox_client_file_mkdir.py +3 -3
  17. cmdbox/app/features/cli/cmdbox_client_file_move.py +3 -3
  18. cmdbox/app/features/cli/cmdbox_client_file_remove.py +3 -3
  19. cmdbox/app/features/cli/cmdbox_client_file_rmdir.py +3 -3
  20. cmdbox/app/features/cli/cmdbox_client_file_upload.py +3 -3
  21. cmdbox/app/features/cli/cmdbox_client_http.py +7 -6
  22. cmdbox/app/features/cli/cmdbox_client_server_info.py +4 -4
  23. cmdbox/app/features/cli/cmdbox_cmd_list.py +4 -4
  24. cmdbox/app/features/cli/cmdbox_cmd_load.py +5 -5
  25. cmdbox/app/features/cli/cmdbox_edge_config.py +1 -1
  26. cmdbox/app/features/cli/cmdbox_edge_start.py +3 -3
  27. cmdbox/app/features/cli/cmdbox_mcp_client.py +174 -174
  28. cmdbox/app/features/cli/cmdbox_mcp_proxy.py +96 -96
  29. cmdbox/app/features/cli/cmdbox_server_list.py +3 -3
  30. cmdbox/app/features/cli/cmdbox_server_start.py +103 -103
  31. cmdbox/app/features/cli/cmdbox_server_stop.py +6 -6
  32. cmdbox/app/features/cli/cmdbox_tts_install.py +317 -0
  33. cmdbox/app/features/cli/cmdbox_tts_say.py +179 -0
  34. cmdbox/app/features/cli/cmdbox_tts_start.py +329 -0
  35. cmdbox/app/features/cli/cmdbox_tts_stop.py +108 -0
  36. cmdbox/app/features/cli/cmdbox_web_apikey_add.py +91 -91
  37. cmdbox/app/features/cli/cmdbox_web_apikey_del.py +91 -91
  38. cmdbox/app/features/cli/cmdbox_web_gencert.py +7 -7
  39. cmdbox/app/features/cli/cmdbox_web_genpass.py +168 -168
  40. cmdbox/app/features/cli/cmdbox_web_group_add.py +94 -94
  41. cmdbox/app/features/cli/cmdbox_web_group_del.py +87 -87
  42. cmdbox/app/features/cli/cmdbox_web_group_edit.py +94 -94
  43. cmdbox/app/features/cli/cmdbox_web_group_list.py +87 -87
  44. cmdbox/app/features/cli/cmdbox_web_start.py +236 -235
  45. cmdbox/app/features/cli/cmdbox_web_stop.py +72 -72
  46. cmdbox/app/features/cli/cmdbox_web_user_add.py +104 -104
  47. cmdbox/app/features/cli/cmdbox_web_user_del.py +87 -87
  48. cmdbox/app/features/cli/cmdbox_web_user_edit.py +104 -104
  49. cmdbox/app/features/cli/cmdbox_web_user_list.py +87 -87
  50. cmdbox/app/features/web/cmdbox_web_agent.py +16 -4
  51. cmdbox/app/features/web/cmdbox_web_get_cmd_choices.py +10 -2
  52. cmdbox/app/features/web/cmdbox_web_save_cmd.py +1 -0
  53. cmdbox/app/features/web/cmdbox_web_versions_used.py +4 -0
  54. cmdbox/app/filer.py +9 -9
  55. cmdbox/app/mcp.py +19 -8
  56. cmdbox/app/options.py +52 -47
  57. cmdbox/app/server.py +224 -224
  58. cmdbox/app/web.py +39 -17
  59. cmdbox/extensions/features.yml +7 -1
  60. cmdbox/extensions/sample_project/sample/app/features/cli/sample_client_time.py +2 -2
  61. cmdbox/extensions/sample_project/sample/app/features/cli/sample_server_time.py +3 -3
  62. cmdbox/licenses/LICENSE_APScheduler_3_11_0_MIT_License.txt +19 -0
  63. cmdbox/licenses/LICENSE_SQLAlchemy_2_0_43_MIT.txt +19 -0
  64. cmdbox/licenses/LICENSE_Werkzeug_3_1_1_BSD_License.txt +28 -0
  65. cmdbox/licenses/LICENSE_absolufy-imports_0_3_1_MIT_License.txt +21 -0
  66. cmdbox/licenses/LICENSE_anyio_4_10_0_UNKNOWN.txt +20 -0
  67. cmdbox/licenses/{LICENSE_typer_0_16_0_MIT_License.txt → LICENSE_backoff_2_2_1_MIT_License.txt} +1 -1
  68. cmdbox/licenses/LICENSE_certifi_2025_8_3_Mozilla_Public_License_2_0-MPL_2_0.txt +20 -0
  69. cmdbox/licenses/LICENSE_charset-normalizer_3_4_3_MIT.txt +21 -0
  70. cmdbox/licenses/LICENSE_cryptography_45_0_6_Apache-2_0_OR_BSD-3-Clause.txt +3 -0
  71. cmdbox/licenses/LICENSE_cyclopts_3_22_5_Apache_Software_License.txt +201 -0
  72. cmdbox/licenses/LICENSE_fastapi-sso_0_18_0_MIT_License.txt +21 -0
  73. cmdbox/licenses/LICENSE_fastmcp_2_11_3_Apache_Software_License.txt +201 -0
  74. cmdbox/licenses/LICENSE_google-adk_1_9_0_Apache_Software_License.txt +202 -0
  75. cmdbox/licenses/LICENSE_google-genai_1_28_0_Apache_Software_License.txt +202 -0
  76. cmdbox/licenses/LICENSE_google-genai_1_29_0_Apache_Software_License.txt +202 -0
  77. cmdbox/licenses/LICENSE_greenlet_3_2_4_MIT_AND_Python-2_0.txt +30 -0
  78. cmdbox/licenses/LICENSE_isodate_0_7_2_BSD_License.txt +26 -0
  79. cmdbox/licenses/LICENSE_lazy-object-proxy_1_11_0_BSD_License.txt +20 -0
  80. cmdbox/licenses/LICENSE_litellm-enterprise_0_1_19_UNKNOWN.txt +37 -0
  81. cmdbox/licenses/LICENSE_litellm_1_75_5_post1_MIT_License.txt +26 -0
  82. cmdbox/licenses/LICENSE_markdown-it-py_4_0_0_MIT_License.txt +21 -0
  83. cmdbox/licenses/LICENSE_mcp_1_12_4_MIT_License.txt +21 -0
  84. cmdbox/licenses/LICENSE_multidict_6_6_4_Apache_License_2_0.txt +13 -0
  85. cmdbox/licenses/LICENSE_oauthlib_3_3_1_BSD-3-Clause.txt +27 -0
  86. cmdbox/licenses/LICENSE_openai_1_99_9_Apache_Software_License.txt +201 -0
  87. cmdbox/licenses/LICENSE_openapi-core_0_19_5_BSD_License.txt +29 -0
  88. cmdbox/licenses/LICENSE_openapi-schema-validator_0_6_3_BSD_License.txt +29 -0
  89. cmdbox/licenses/LICENSE_openapi-spec-validator_0_7_2_Apache_Software_License.txt +201 -0
  90. cmdbox/licenses/LICENSE_opentelemetry-api_1_36_0_UNKNOWN.txt +201 -0
  91. cmdbox/licenses/LICENSE_opentelemetry-sdk_1_36_0_UNKNOWN.txt +201 -0
  92. cmdbox/licenses/LICENSE_opentelemetry-semantic-conventions_0_57b0_UNKNOWN.txt +201 -0
  93. cmdbox/licenses/LICENSE_orjson_3_11_1_Apache_Software_License-MIT_License.txt +201 -0
  94. cmdbox/licenses/LICENSE_parse_1_20_2_MIT_License.txt +19 -0
  95. cmdbox/licenses/LICENSE_pathable_0_4_4_Apache_Software_License.txt +201 -0
  96. cmdbox/licenses/{LICENSE_pillow_11_2_1_UNKNOWN.txt → LICENSE_pillow_11_3_0_UNKNOWN.txt} +393 -3
  97. cmdbox/licenses/LICENSE_pyperclip_1_9_0_BSD_License.txt +27 -0
  98. cmdbox/licenses/LICENSE_redis_6_4_0_MIT_License.txt +21 -0
  99. cmdbox/licenses/LICENSE_rfc3339-validator_0_1_4_MIT_License.txt +22 -0
  100. cmdbox/licenses/LICENSE_rich-rst_1_3_1_MIT_License.txt +7 -0
  101. cmdbox/licenses/LICENSE_rpds-py_0_27_0_UNKNOWN.txt +19 -0
  102. cmdbox/licenses/{LICENSE_setuptools_65_5_0_MIT_License.txt → LICENSE_setuptools_80_9_0_UNKNOWN.txt} +0 -2
  103. cmdbox/licenses/LICENSE_sphinx-intl_2_3_2_UNKNOWN.txt +25 -0
  104. cmdbox/licenses/LICENSE_tenacity_9_1_2_Apache_Software_License.txt +202 -0
  105. cmdbox/licenses/LICENSE_tiktoken_0_11_0_MIT_License-Copyright-c-2022_OpenAI-Shantanu_Jain-Permission_is_hereby_granted-free_of_charge-to_any_per.txt +21 -0
  106. cmdbox/licenses/LICENSE_tokenizers_0_21_4_Apache_Software_License.txt +1 -0
  107. cmdbox/licenses/LICENSE_voicevox_core_0_16_0_MIT.txt +20 -0
  108. cmdbox/licenses/LICENSE_watchdog_6_0_0_Apache_Software_License.txt +16 -0
  109. cmdbox/licenses/{LICENSE_httptools_0_6_4_MIT_License.txt → LICENSE_wsproto_1_2_0_MIT_License.txt} +3 -3
  110. cmdbox/licenses/files.txt +69 -50
  111. cmdbox/logconf_cmdbox.yml +136 -0
  112. cmdbox/version.py +2 -2
  113. cmdbox/web/agent.html +16 -2
  114. cmdbox/web/assets/cmdbox/agent.js +226 -1
  115. cmdbox/web/assets/cmdbox/common.js +20 -25
  116. cmdbox/web/assets/cmdbox/svgicon.js +18 -0
  117. {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/METADATA +29 -20
  118. {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/RECORD +158 -118
  119. {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/WHEEL +1 -1
  120. cmdbox/config.yml +0 -3
  121. cmdbox/licenses/LICENSE_shellingham_1_5_4_ISC_License-ISCL.txt +0 -13
  122. cmdbox/licenses/LICENSE_watchfiles_1_1_0_MIT_License.txt +0 -21
  123. cmdbox/logconf_audit.yml +0 -43
  124. cmdbox/logconf_client.yml +0 -43
  125. cmdbox/logconf_edge.yml +0 -43
  126. cmdbox/logconf_gui.yml +0 -43
  127. cmdbox/logconf_mcp.yml +0 -43
  128. cmdbox/logconf_server.yml +0 -43
  129. cmdbox/logconf_web.yml +0 -43
  130. /cmdbox/licenses/{LICENSE_Authlib_1_6_0_BSD_License.txt → LICENSE_Authlib_1_6_1_BSD_License.txt} +0 -0
  131. /cmdbox/licenses/{LICENSE_SQLAlchemy_2_0_41_MIT.txt → LICENSE_SQLAlchemy_2_0_42_MIT.txt} +0 -0
  132. /cmdbox/licenses/{LICENSE_aiohttp_3_12_13_Apache-2_0.txt → LICENSE_aiohttp_3_12_15_Apache-2_0_AND_MIT.txt} +0 -0
  133. /cmdbox/licenses/{LICENSE_aiosignal_1_3_2_Apache_Software_License.txt → LICENSE_aiosignal_1_4_0_Apache_Software_License.txt} +0 -0
  134. /cmdbox/licenses/{LICENSE_certifi_2025_6_15_Mozilla_Public_License_2_0-MPL_2_0.txt → LICENSE_certifi_2025_7_14_Mozilla_Public_License_2_0-MPL_2_0.txt} +0 -0
  135. /cmdbox/licenses/{LICENSE_cryptography_45_0_4_Apache-2_0_OR_BSD-3-Clause.txt → LICENSE_cryptography_45_0_5_Apache-2_0_OR_BSD-3-Clause.txt} +0 -0
  136. /cmdbox/licenses/{LICENSE_docstring_parser_0_16_MIT_License.txt → LICENSE_docstring_parser_0_17_0_MIT_License.txt} +0 -0
  137. /cmdbox/licenses/{LICENSE_fastapi_0_115_14_MIT_License.txt → LICENSE_fastapi_0_116_1_MIT_License.txt} +0 -0
  138. /cmdbox/licenses/{LICENSE_fastmcp_2_10_1_Apache_Software_License.txt → LICENSE_fastmcp_2_11_0_Apache_Software_License.txt} +0 -0
  139. /cmdbox/licenses/{LICENSE_fsspec_2025_5_1_BSD_License.txt → LICENSE_fsspec_2025_7_0_BSD_License.txt} +0 -0
  140. /cmdbox/licenses/{LICENSE_google-adk_1_5_0_Apache_Software_License.txt → LICENSE_google-adk_1_10_0_Apache_Software_License.txt} +0 -0
  141. /cmdbox/licenses/{LICENSE_google-api-python-client_2_174_0_Apache_Software_License.txt → LICENSE_google-api-python-client_2_177_0_Apache_Software_License.txt} +0 -0
  142. /cmdbox/licenses/{LICENSE_huggingface-hub_0_33_1_Apache_Software_License.txt → LICENSE_google-api-python-client_2_178_0_Apache_Software_License.txt} +0 -0
  143. /cmdbox/licenses/{LICENSE_google-cloud-aiplatform_1_100_0_Apache_2_0.txt → LICENSE_google-cloud-aiplatform_1_106_0_Apache_2_0.txt} +0 -0
  144. /cmdbox/licenses/{LICENSE_google-cloud-bigquery_3_34_0_Apache_Software_License.txt → LICENSE_google-cloud-aiplatform_1_108_0_Apache_2_0.txt} +0 -0
  145. /cmdbox/licenses/{LICENSE_google-genai_1_23_0_Apache_Software_License.txt → LICENSE_google-cloud-bigquery_3_35_1_Apache_Software_License.txt} +0 -0
  146. /cmdbox/licenses/{LICENSE_grpcio-status_1_73_1_Apache_Software_License.txt → LICENSE_grpcio-status_1_74_0_Apache_Software_License.txt} +0 -0
  147. /cmdbox/licenses/{LICENSE_grpcio_1_73_1_Apache_Software_License.txt → LICENSE_grpcio_1_74_0_Apache_Software_License.txt} +0 -0
  148. /cmdbox/licenses/{LICENSE_opentelemetry-api_1_34_1_Apache_Software_License.txt → LICENSE_huggingface-hub_0_34_3_Apache_Software_License.txt} +0 -0
  149. /cmdbox/licenses/{LICENSE_opentelemetry-sdk_1_34_1_Apache_Software_License.txt → LICENSE_huggingface-hub_0_34_4_Apache_Software_License.txt} +0 -0
  150. /cmdbox/licenses/{LICENSE_opentelemetry-semantic-conventions_0_55b1_Apache_Software_License.txt → LICENSE_jsonschema-path_0_3_4_Apache_Software_License.txt} +0 -0
  151. /cmdbox/licenses/{LICENSE_jsonschema_4_24_0_UNKNOWN.txt → LICENSE_jsonschema_4_25_0_UNKNOWN.txt} +0 -0
  152. /cmdbox/licenses/{LICENSE_litellm_1_73_6_MIT_License.txt → LICENSE_litellm_1_74_12_MIT_License.txt} +0 -0
  153. /cmdbox/licenses/{LICENSE_mcp_1_10_1_MIT_License.txt → LICENSE_mcp_1_12_3_MIT_License.txt} +0 -0
  154. /cmdbox/licenses/{LICENSE_multidict_6_6_2_Apache_License_2_0.txt → LICENSE_multidict_6_6_3_Apache_License_2_0.txt} +0 -0
  155. /cmdbox/licenses/{LICENSE_nh3_0_2_21_MIT.txt → LICENSE_nh3_0_3_0_MIT.txt} +0 -0
  156. /cmdbox/licenses/{LICENSE_numpy_2_3_1_BSD_License.txt → LICENSE_numpy_2_3_2_BSD_License.txt} +0 -0
  157. /cmdbox/licenses/{LICENSE_openai_1_93_0_Apache_Software_License.txt → LICENSE_openai_1_98_0_Apache_Software_License.txt} +0 -0
  158. /cmdbox/licenses/{LICENSE_tokenizers_0_21_2_Apache_Software_License.txt → LICENSE_pywin32_311_Python_Software_Foundation_License.txt} +0 -0
  159. /cmdbox/licenses/{LICENSE_regex_2024_11_6_Apache_Software_License.txt → LICENSE_regex_2025_7_34_UNKNOWN.txt} +0 -0
  160. /cmdbox/licenses/{LICENSE_rich_14_0_0_MIT_License.txt → LICENSE_rich_14_1_0_MIT_License.txt} +0 -0
  161. /cmdbox/licenses/{LICENSE_rpds-py_0_25_1_MIT.txt → LICENSE_rpds-py_0_26_0_MIT.txt} +0 -0
  162. /cmdbox/licenses/{LICENSE_sse-starlette_2_3_6_BSD_License.txt → LICENSE_sse-starlette_3_0_2_UNKNOWN.txt} +0 -0
  163. /cmdbox/licenses/{LICENSE_starlette_0_46_2_BSD_License.txt → LICENSE_starlette_0_47_2_BSD_License.txt} +0 -0
  164. /cmdbox/licenses/{LICENSE_typing_extensions_4_14_0_UNKNOWN.txt → LICENSE_typing_extensions_4_14_1_UNKNOWN.txt} +0 -0
  165. /cmdbox/licenses/{LICENSE_zope_event_5_1_Zope_Public_License.txt → LICENSE_zope_event_5_1_1_Zope_Public_License.txt} +0 -0
  166. {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/entry_points.txt +0 -0
  167. {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info/licenses}/LICENSE +0 -0
  168. {cmdbox-0.6.3.2.dist-info → cmdbox-0.6.4.1.dist-info}/top_level.txt +0 -0
cmdbox/logconf_cmdbox.yml CHANGED
@@ -22,6 +22,30 @@ handlers:
22
22
  omit_repeated_times: false
23
23
  tracebacks_word_wrap: false
24
24
  log_time_format: '[%Y-%m-%d %H:%M]'
25
+ audit:
26
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
27
+ level: INFO
28
+ formatter: fmt
29
+ backupCount: 5
30
+ when : 'D'
31
+ encoding : 'utf-8'
32
+ filename: .logs/cmdbox_audit.log
33
+ client:
34
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
35
+ level: INFO
36
+ formatter: fmt
37
+ backupCount: 5
38
+ when : 'D'
39
+ encoding : 'utf-8'
40
+ filename: .logs/cmdbox_client.log
41
+ cmd:
42
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
43
+ level: INFO
44
+ formatter: fmt
45
+ backupCount: 5
46
+ when : 'D'
47
+ encoding : 'utf-8'
48
+ filename: .logs/cmdbox_cmd.log
25
49
  cmdbox:
26
50
  class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
27
51
  level: INFO
@@ -30,13 +54,125 @@ handlers:
30
54
  when : 'D'
31
55
  encoding : 'utf-8'
32
56
  filename: .logs/cmdbox.log
57
+ edge:
58
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
59
+ level: INFO
60
+ formatter: fmt
61
+ backupCount: 5
62
+ when : 'D'
63
+ encoding : 'utf-8'
64
+ filename: .logs/cmdbox_edge.log
65
+ gui:
66
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
67
+ level: INFO
68
+ formatter: fmt
69
+ backupCount: 5
70
+ when : 'D'
71
+ encoding : 'utf-8'
72
+ filename: .logs/cmdbox_gui.log
73
+ mcp:
74
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
75
+ level: INFO
76
+ formatter: fmt
77
+ backupCount: 5
78
+ when : 'D'
79
+ encoding : 'utf-8'
80
+ filename: .logs/cmdbox_mcp.log
81
+ server:
82
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
83
+ level: INFO
84
+ formatter: fmt
85
+ backupCount: 5
86
+ when : 'D'
87
+ encoding : 'utf-8'
88
+ filename: .logs/cmdbox_server.log
89
+ tts:
90
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
91
+ level: INFO
92
+ formatter: fmt
93
+ backupCount: 5
94
+ when : 'D'
95
+ encoding : 'utf-8'
96
+ filename: .logs/cmdbox_tts.log
97
+ web:
98
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
99
+ level: INFO
100
+ formatter: fmt
101
+ backupCount: 5
102
+ when : 'D'
103
+ encoding : 'utf-8'
104
+ filename: .logs/cmdbox_web.log
105
+ logcl:
106
+ class: logging.handlers.SocketHandler
107
+ level: INFO
108
+ formatter: fmt
109
+ host: 'localhost'
110
+ port: 9020
111
+ logsv:
112
+ class: cmdbox.app.commons.loghandler.TimedRotatingFileHandler
113
+ level: INFO
114
+ formatter: fmt
115
+ backupCount: 5
116
+ when : 'D'
117
+ encoding : 'utf-8'
118
+ filename: .logs/cmdbox_logsv.log
33
119
 
34
120
  loggers:
121
+ audit:
122
+ handlers: [audit, std]
123
+ level: INFO
124
+ qualname: audit
125
+ propagate: false
126
+ client:
127
+ handlers: [client, std]
128
+ level: INFO
129
+ qualname: client
130
+ propagate: false
131
+ cmd:
132
+ handlers: [cmd, std]
133
+ level: INFO
134
+ qualname: cmd
135
+ propagate: false
35
136
  cmdbox:
36
137
  handlers: [cmdbox, std]
37
138
  level: INFO
38
139
  qualname: cmdbox
39
140
  propagate: false
141
+ edge:
142
+ handlers: [edge, std]
143
+ level: INFO
144
+ qualname: edge
145
+ propagate: false
146
+ gui:
147
+ handlers: [gui, std]
148
+ level: INFO
149
+ qualname: gui
150
+ propagate: false
151
+ mcp:
152
+ handlers: [mcp, std]
153
+ level: INFO
154
+ qualname: mcp
155
+ propagate: false
156
+ server:
157
+ handlers: [server, std]
158
+ level: INFO
159
+ qualname: server
160
+ propagate: false
161
+ tts:
162
+ handlers: [tts, std]
163
+ level: INFO
164
+ qualname: tts
165
+ propagate: false
166
+ web:
167
+ handlers: [web, std]
168
+ level: INFO
169
+ qualname: web
170
+ propagate: false
171
+ logsv:
172
+ handlers: [logsv]
173
+ level: INFO
174
+ qualname: logsv
175
+ propagate: false
40
176
 
41
177
  #root:
42
178
  # handlers: [std]
cmdbox/version.py CHANGED
@@ -1,10 +1,10 @@
1
1
  import datetime
2
2
 
3
- dt_now = datetime.datetime(2025, 7, 30)
3
+ dt_now = datetime.datetime(2025, 8, 13)
4
4
  days_ago = (datetime.datetime.now() - dt_now).days
5
5
  __appid__ = 'cmdbox'
6
6
  __title__ = 'cmdbox (Command Development Application)'
7
- __version__ = '0.6.3.2'
7
+ __version__ = '0.6.4.1'
8
8
  __copyright__ = f'Copyright © 2023-{dt_now.strftime("%Y")} hamacom2004jp'
9
9
  __pypiurl__ = 'https://pypi.org/project/cmdbox/'
10
10
  __srcurl__ = 'https://github.com/hamacom2004jp/cmdbox'
cmdbox/web/agent.html CHANGED
@@ -67,6 +67,14 @@
67
67
  </button>
68
68
  <div class="collapse navbar-collapse" id="navbarNavDropdown">
69
69
  <ul class="navbar-nav me-auto">
70
+ <!--li class="nav-item dropdown">
71
+ <a class="nav-link dropdown-toggle" href="#" id="toolMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
72
+ Tool
73
+ </a>
74
+ <ul class="dropdown-menu toolmenu" aria-labelledby="toolMenuLink">
75
+ <li><a class="dropdown-item" href="#" onclick="agent.llmsetting();">LLM Setting</a></li>
76
+ </ul>
77
+ </li-->
70
78
  <li class="nav-item dropdown">
71
79
  <a class="nav-link dropdown-toggle" href="#" id="viewMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
72
80
  View
@@ -141,10 +149,16 @@
141
149
  <div class="w-100 d-flex justify-content-center">
142
150
  <div class="chat-input mt-2" style="width:800px;">
143
151
  <div class="chat-group w-100 p-2">
144
- <textarea id="user_msg" class="form-control d-inline-block align-middle" rows="1" style="width:calc(100% - 60px);border:0px;box-shadow:none;resize:none;field-sizing:content;"></textarea>
145
- <button id="btn_user_msg" class="btn btn_hover" type="button" style="border:0px;" disabled="disabled">
152
+ <button id="btn_say" class="btn btn_hover p-1" type="button" style="border:0px;" disabled="disabled">
153
+ <svg class="bi bi-say" width="24" height="24" fill="currentColor"><use href="#btn_megaphone"></use></svg>
154
+ </button>
155
+ <textarea id="user_msg" class="form-control d-inline-block align-middle" rows="1" style="width:calc(100% - 120px);border:0px;box-shadow:none;resize:none;field-sizing:content;"></textarea>
156
+ <button id="btn_user_msg" class="btn btn_hover p-1" type="button" style="border:0px;" disabled="disabled">
146
157
  <svg class="bi bi-send" width="24" height="24" fill="currentColor"><use href="#btn_send"></use></svg>
147
158
  </button>
159
+ <button id="btn_rec" class="btn btn_hover p-1" type="button" style="border:0px;" disabled="disabled">
160
+ <svg class="bi bi-mic" width="24" height="24" fill="currentColor"><use href="#btn_mic"></use></svg>
161
+ </button>
148
162
  </div>
149
163
  </div>
150
164
  </div>
@@ -28,11 +28,16 @@ agent.format_agent_message = (container, messages, txt, message) => {
28
28
  if (!start || start.length < 0) {
29
29
  // JSON開始部分が無い場合はそのまま表示
30
30
  const msg = message.replace(/\n/g, '<br/>');
31
+ agent.say.say(msg);
31
32
  txt.append(msg);
32
33
  break;
33
34
  }
34
35
  start = message.substring(0, start.index);
35
- if (start) txt.append(start.replace(/\n/g, '<br/>'));
36
+ if (start) {
37
+ const msg = start.replace(/\n/g, '<br/>');
38
+ agent.say.say(msg);
39
+ txt.append(msg);
40
+ }
36
41
  message = message.replace(start+regs_start.source, '');
37
42
 
38
43
  // JSON内容部分を探す
@@ -92,6 +97,83 @@ agent.recursive_json_parse = (jobj) => {
92
97
  }
93
98
  });
94
99
  };
100
+ agent.say = {};
101
+ agent.say.model = 'ずんだもんノーマル';
102
+ agent.say.start = ()=> {
103
+ const opt = cmdbox.get_server_opt(false, $('#filer_form'));
104
+ opt['mode'] = 'tts';
105
+ opt['cmd'] = 'start';
106
+ opt['tts_engine'] = 'voicevox';
107
+ opt['voicevox_model'] = agent.say.model;
108
+ cmdbox.show_loading();
109
+ return cmdbox.sv_exec_cmd(opt).then(res => {
110
+ if (res && res['success']) res = [res];
111
+ cmdbox.hide_loading();
112
+ if (!res[0] || !res[0]['success']) {
113
+ if (res[0] && res[0]['warn']) throw res[0]['warn'];
114
+ else if (res['warn']) throw res['warn'];
115
+ throw res;
116
+ }
117
+ if (res[0]['success']['data']) return res[0]['success']['data'];
118
+ return res[0]['success'];
119
+ });
120
+ };
121
+ agent.say.stop = () => {
122
+ const opt = cmdbox.get_server_opt(false, $('#filer_form'));
123
+ opt['mode'] = 'tts';
124
+ opt['cmd'] = 'stop';
125
+ opt['tts_engine'] = 'voicevox';
126
+ opt['voicevox_model'] = agent.say.model;
127
+ cmdbox.show_loading();
128
+ return cmdbox.sv_exec_cmd(opt).then(res => {
129
+ if (res && res['success']) res = [res];
130
+ cmdbox.hide_loading();
131
+ if (!res[0] || !res[0]['success']) {
132
+ if (res[0] && res[0]['warn']) throw res[0]['warn'];
133
+ else if (res['warn']) throw res['warn'];
134
+ throw res;
135
+ }
136
+ if (res[0]['success']['data']) return res[0]['success']['data'];
137
+ return res[0]['success'];
138
+ });
139
+ };
140
+ agent.say.isStart = () => {
141
+ const btn_say = $('#btn_say');
142
+ return btn_say.hasClass('say_on')
143
+ };
144
+ agent.say.say = (tts_text) => {
145
+ if (!agent.say.isStart()) return;
146
+ const opt = cmdbox.get_server_opt(false, $('#filer_form'));
147
+ opt['mode'] = 'tts';
148
+ opt['cmd'] = 'say';
149
+ opt['tts_engine'] = 'voicevox';
150
+ opt['voicevox_model'] = agent.say.model;
151
+ opt['tts_text'] = tts_text.replace(/<br\s*\/?>/g, '\n'); // <br>タグを改行に変換
152
+ cmdbox.show_loading();
153
+ return cmdbox.sv_exec_cmd(opt).then(async (res) => {
154
+ if (res && res['success']) res = [res];
155
+ cmdbox.hide_loading();
156
+ if (!res[0] || !res[0]['success']) {
157
+ if (res[0] && res[0]['warn']) throw res[0]['warn'];
158
+ throw res;
159
+ }
160
+ if (!res[0]['success']['data']) {
161
+ throw res[0]['success'];
162
+ }
163
+ // 音声データを再生
164
+ const binary_string = window.atob(res[0]['success']['data']);
165
+ const bytesArray = new Uint8Array(binary_string.length);
166
+ for (let i = 0; i < binary_string.length; i++) {
167
+ bytesArray[i] = binary_string.charCodeAt(i);
168
+ }
169
+ const audioContext = new (window.AudioContext || window.webkitAudioContext)();
170
+ const audioBuffer = await audioContext.decodeAudioData(bytesArray.buffer);
171
+ const source = audioContext.createBufferSource();
172
+ source.buffer = audioBuffer;
173
+ source.connect(audioContext.destination);
174
+ source.start(0);
175
+ });
176
+ };
95
177
  agent.init_form = async () => {
96
178
  const container = $('#message_container');
97
179
  const histories = $('#histories');
@@ -109,7 +191,9 @@ agent.init_form = async () => {
109
191
  clearInterval(agent.chat_callback_ping_handler);
110
192
  }
111
193
  messages.attr('data-session_id', session_id);
194
+ const btn_say = $('#btn_say');
112
195
  const btn_user_msg = $('#btn_user_msg');
196
+ const btn_rec = $('#btn_rec');
113
197
  const user_msg = $('#user_msg');
114
198
  let message_id = null;
115
199
  btn_user_msg.prop('disabled', true); // 初期状態で送信ボタンを無効化
@@ -134,6 +218,104 @@ agent.init_form = async () => {
134
218
  // メッセージ一覧を一番下までスクロール
135
219
  container.scrollTop(container.prop('scrollHeight'));
136
220
  });
221
+ // sayボタンのクリックイベント
222
+ btn_say.off('click').on('click', async () => {
223
+ if (agent.say.isStart()) {
224
+ agent.say.stop().then((msg) => {
225
+ //cmdbox.message(msg);
226
+ btn_say.removeClass('say_on');
227
+ btn_say.find('use').attr('href', '#btn_megaphone');
228
+ }).catch((err) => {
229
+ cmdbox.message(err);
230
+ if (err.startsWith('VoiceVox model is not running:')) {
231
+ btn_say.removeClass('say_on');
232
+ btn_say.find('use').attr('href', '#btn_megaphone');
233
+ }
234
+ });
235
+ return;
236
+ }
237
+ agent.say.start().then((msg) => {
238
+ //cmdbox.message(msg);
239
+ agent.say.say(msg);
240
+ btn_say.addClass('say_on');
241
+ btn_say.find('use').attr('href', '#btn_megaphone_fill');
242
+ }).catch((err) => {
243
+ cmdbox.message(err);
244
+ if (err.startsWith('VoiceVox model is already running:')) {
245
+ btn_say.addClass('say_on');
246
+ btn_say.find('use').attr('href', '#btn_megaphone_fill');
247
+ }
248
+ });
249
+ });
250
+ // recボタンのクリックイベント
251
+ btn_rec.off('click').on('click', async () => {
252
+ // 録音を終了
253
+ if (btn_rec.hasClass('rec_on')) {
254
+ btn_rec.removeClass('rec_on');
255
+ btn_rec.find('use').attr('href', '#btn_mic');
256
+ // 録音中を停止
257
+ if (agent.recognition) {
258
+ agent.recognition.stop();
259
+ const transcript = user_msg.val();
260
+ transcript && $('#btn_user_msg').click(); // 録音が終了したら自動的にメッセージを送信
261
+ }
262
+ return;
263
+ }
264
+ // 録音を開始
265
+ const SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition;
266
+ if (!SpeechRecognition) {
267
+ cmdbox.message({'error':'Speech Recognition API is not supported in this browser.'});
268
+ return;
269
+ }
270
+ btn_rec.addClass('rec_on');
271
+ btn_rec.find('use').attr('href', '#btn_mic_fill');
272
+ let finalTranscript = user_msg.val();
273
+ agent.recognition = new SpeechRecognition();
274
+ agent.recognition.lang = 'ja-JP'; // 言語設定
275
+ agent.recognition.interimResults = true; // 中間結果を取得する
276
+ agent.recognition.maxAlternatives = 1; // 最小の候補数
277
+ agent.recognition.continuous = false; // 連続認識を無効にする
278
+ agent.recognition.onresult = (event) => {
279
+ let interimTranscript = '';
280
+ for (let i = event.resultIndex; i < event.results.length; i++) {
281
+ let transcript = event.results[i][0].transcript;
282
+ console.log(`transcript: ${transcript}`);
283
+ if (event.results[i].isFinal) {
284
+ finalTranscript += transcript;
285
+ } else {
286
+ interimTranscript = transcript;
287
+ }
288
+ }
289
+ user_msg.val(finalTranscript + interimTranscript);
290
+ };
291
+ agent.recognition.onerror = (event) => {
292
+ console.error(`Speech Recognition error: ${event.error}`);
293
+ if (event.error === 'no-speech') {
294
+ agent.recognition.restart();
295
+ return; // no-speechエラーは無視して再度認識を開始
296
+ }
297
+ btn_rec.removeClass('rec_on');
298
+ btn_rec.find('use').attr('href', '#btn_mic');
299
+ cmdbox.message({'error':`Speech Recognition error: ${event.error}`});
300
+ };
301
+ agent.recognition.onend = () => {
302
+ // 連続認識を無効にしているので、認識が終了したら再稼働させる。
303
+ console.log(`onend event triggered.`);
304
+ agent.recognition.restart();
305
+ };
306
+ agent.recognition.restart = () => {
307
+ if (btn_rec.hasClass('rec_on')) {
308
+ setTimeout(() => {
309
+ try {
310
+ agent.recognition.start();
311
+ } catch (error) {
312
+ console.error(`Error restarting recognition: ${error}`);
313
+ }
314
+ }, 100);
315
+ }
316
+ };
317
+ agent.recognition.start();
318
+ });
137
319
  // ws接続
138
320
  const protocol = window.location.protocol.endsWith('s:') ? 'wss' : 'ws';
139
321
  const host = window.location.hostname;
@@ -164,7 +346,9 @@ agent.init_form = async () => {
164
346
  ws.send('ping');
165
347
  agent.chat_reconnect_count = 0; // pingが成功したら再接続回数をリセット
166
348
  };
349
+ btn_say.prop('disabled', false);
167
350
  btn_user_msg.prop('disabled', false);
351
+ btn_rec.prop('disabled', false);
168
352
  agent.chat_callback_ping_handler = setInterval(() => {ping();}, ping_interval);
169
353
  };
170
354
  ws.onerror = (e) => {
@@ -311,6 +495,47 @@ agent.delete_session = async (session_id) => {
311
495
  if (res.status != 200) cmdbox.message({'error':`${res.status}: ${res.statusText}`});
312
496
  return await res.json();
313
497
  }
498
+ agent.llmsetting = async () => {
499
+ const user = await cmdbox.user_info();
500
+ if (!user) {
501
+ cmdbox.message('user not found');
502
+ return;
503
+ }
504
+ const llmsetting_modal = $('#llmsetting_modal').length?$('#llmsetting_modal'):$(`<div id="llmsetting_modal" class="modal" tabindex="-1" style="display: none;" aria-hidden="true"/>`);
505
+ llmsetting_modal.html('');
506
+ const daialog = $(`<div class="modal-dialog modal-lg ui-draggable ui-draggable-handle"/>`).appendTo(llmsetting_modal);
507
+ const form = $(`<form id="llmsetting_form" class="modal-content novalidate"/>`).appendTo(daialog);
508
+ const header = $(`<div class="modal-header"/>`).appendTo(form);
509
+ header.append('<h5 class="modal-title">LLM Setting</h5>');
510
+ header.append('<button type="button" class="btn btn_close p-0 m-0" data-bs-dismiss="modal" aria-label="Close" style="margin-left: 0px;">'
511
+ +'<svg class="bi bi-x" width="24" height="24" fill="currentColor"><use href="#btn_x"></use></svg>'
512
+ +'</button>');
513
+ const body = $(`<div class="modal-body"/>`).appendTo(form);
514
+ const row_content = $(`<div class="row row_content"/>`).appendTo(body);
515
+ const appid = $(`.navbar-brand`).text();
516
+ const llmsetting_choices = async () => {
517
+ const res = await fetch('agent/llmsetting');
518
+ if (res.status != 200) cmdbox.message({'error':`${res.status}: ${res.statusText}`});
519
+ return await res.json();
520
+ };
521
+ const llmsetting_rows = await llmsetting_choices();
522
+ row_content.html('');
523
+ // 表示オプションを追加
524
+ llmsetting_rows.filter(row => !row.hide).forEach((row, i) => cmdbox.add_form_func(i, llmsetting_modal, row_content, row, null));
525
+ // 高度なオプションを表示するリンクを追加
526
+ const show_link = $('<div class="text-center card-hover mb-3"><a href="#">[ advanced options ]</a></div>');
527
+ show_link.click(() => row_content.find('.row_content_hide').toggle());
528
+ row_content.append(show_link);
529
+ // 非表示オプションを追加
530
+ llmsetting_rows.filter(row => row.hide).forEach((row, i) => cmdbox.add_form_func(i, llmsetting_modal, row_content, row, null));
531
+ // フッターを追加
532
+ const footer = $(`<div class="modal-footer"/>`).appendTo(form);
533
+ // 閉じるボタンを追加
534
+ const close_btn = $('<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>').appendTo(footer);
535
+ llmsetting_modal.appendTo('body');
536
+ daialog.draggable({cursor:'move',cancel:'.modal-body'});
537
+ llmsetting_modal.modal('show');
538
+ };
314
539
  $(() => {
315
540
  // カラーモード対応
316
541
  cmdbox.change_color_mode();
@@ -262,24 +262,6 @@ cmdbox.editapikey = async () => {
262
262
  daialog.draggable({cursor:'move',cancel:'.modal-body'});
263
263
  editapikey_modal.modal('show');
264
264
  };
265
- cmdbox.agentsetting = async () => {
266
- const user = await cmdbox.user_info();
267
- if (!user) {
268
- cmdbox.message('user not found');
269
- return;
270
- }
271
- const agentsetting_modal = $('#agentsetting_modal').length?$('#agentsetting_modal'):$(`<div id="agentsetting_modal" class="modal" tabindex="-1" style="display: none;" aria-hidden="true"/>`);
272
- agentsetting_modal.html('');
273
- const daialog = $(`<div class="modal-dialog ui-draggable ui-draggable-handle"/>`).appendTo(agentsetting_modal);
274
- const form = $(`<form id="agentsetting_form" class="modal-content novalidate"/>`).appendTo(daialog);
275
- const header = $(`<div class="modal-header"/>`).appendTo(form);
276
- header.append('<h5 class="modal-title">Agent Setting</h5>');
277
- header.append('<button type="button" class="btn btn_close p-0 m-0" data-bs-dismiss="modal" aria-label="Close" style="margin-left: 0px;">'
278
- +'<svg class="bi bi-x" width="24" height="24" fill="currentColor"><use href="#btn_x"></use></svg>'
279
- +'</button>');
280
- const body = $(`<div class="modal-body"/>`).appendTo(form);
281
- const row_content = $(`<div class="row row_content"/>`).appendTo(body);
282
- };
283
265
  /**
284
266
  * 現在のユーザーのパスワード変更
285
267
  */
@@ -409,10 +391,6 @@ $(()=>{
409
391
  const editapikey_item = $(`<li><a class="dropdown-item editapikey-menu-item" href="#" onclick="cmdbox.editapikey();">Edit ApiKey</a></li>`);
410
392
  user_info_menu.find('.dropdown-menu').append(editapikey_item);
411
393
  }
412
- /*if (!user_info_menu.find('.dropdown-menu .agentsetting-menu-item').length) {
413
- const agentsetting_item = $(`<li><a class="dropdown-item agentsetting-menu-item" href="#" onclick="cmdbox.agentsetting();">Agent Setting</a></li>`);
414
- user_info_menu.find('.dropdown-menu').append(agentsetting_item);
415
- }*/
416
394
  if (!user_info_menu.find('.dropdown-menu .signout-menu-item').length) {
417
395
  const parts = location.pathname.split('/');
418
396
  const sitepath = parts[parts.length-1];
@@ -1282,6 +1260,11 @@ cmdbox.add_form_func = (i, cmd_modal, row_content, row, next_elem, lcolsize=12,
1282
1260
  }
1283
1261
  else {
1284
1262
  // 選択肢がある場合
1263
+ let select_html = '<select class="form-select row_content_template_select"></select>';
1264
+ if (row.choice_edit){
1265
+ select_html = `<input type="text" class="form-control row_content_key row_content_template_input">`;
1266
+ select_html+= `<datalist class="row_content_template_select"></datalist>`;
1267
+ }
1285
1268
  if(row.type=='dict') {
1286
1269
  if (Array.isArray(row.choice)) {
1287
1270
  elem = $(`<div class="col-${lcolsize} mb-3">` // row_content_template_dict_choice
@@ -1289,7 +1272,7 @@ cmdbox.add_form_func = (i, cmd_modal, row_content, row, next_elem, lcolsize=12,
1289
1272
  +'<label class="input-group-text row_content_template_title">title</label>'
1290
1273
  +'<input type="text" class="form-control row_content_key row_content_template_input">'
1291
1274
  +'<label class="input-group-text">=</label>'
1292
- +'<select class="form-select row_content_template_select"></select>'
1275
+ + select_html
1293
1276
  +'</div></div>');
1294
1277
  }
1295
1278
  else {
@@ -1298,14 +1281,14 @@ cmdbox.add_form_func = (i, cmd_modal, row_content, row, next_elem, lcolsize=12,
1298
1281
  +'<label class="input-group-text row_content_template_title">title</label>'
1299
1282
  +'<select class="form-select row_content_key row_content_template_select"></select>'
1300
1283
  +'<label class="input-group-text">=</label>'
1301
- +'<select class="form-select row_content_template_select"></select>'
1284
+ + select_html
1302
1285
  +'</div></div>');
1303
1286
  }
1304
1287
  } else {
1305
1288
  elem = $(`<div class="col-${scolsize} mb-3">` // row_content_template_choice
1306
1289
  +'<div class="input-group">'
1307
1290
  +'<label class="input-group-text row_content_template_title">title</label>'
1308
- +'<select class="form-select row_content_template_select"></select>'
1291
+ + select_html
1309
1292
  +'</div></div>');
1310
1293
  }
1311
1294
  if (next_elem) next_elem.after(elem);
@@ -1386,6 +1369,14 @@ cmdbox.add_form_func = (i, cmd_modal, row_content, row, next_elem, lcolsize=12,
1386
1369
  if (row.web=='mask' || row.web=='readonly') {
1387
1370
  input_elem.attr('disabled', 'disabled');
1388
1371
  }
1372
+ // 選択肢編集可能な場合はinputのIDを参考にdatalistのIDを設定
1373
+ if (row.choice_edit) {
1374
+ input_elem.each((i, e) => {
1375
+ const elem = $(e), elem_id = elem.attr('id');
1376
+ elem.next().attr('id', elem_id + '_options');
1377
+ elem.attr('list', elem_id + '_options');
1378
+ });
1379
+ }
1389
1380
  // ファイルタイプの場合はファイラーモーダルを開くボタンを追加
1390
1381
  if(row.type=='file'){
1391
1382
  const btn = $('<button class="btn btn-secondary" type="button">file</button>');
@@ -1456,6 +1447,10 @@ cmdbox.add_form_func = (i, cmd_modal, row_content, row, next_elem, lcolsize=12,
1456
1447
  } else {
1457
1448
  title.addClass('text-decoration-underline');
1458
1449
  }
1450
+ if (row.opt=='help') {
1451
+ elem.find(':input').prop('disabled', true);
1452
+ elem.find('.row_content_template_title').remove();
1453
+ }
1459
1454
  }
1460
1455
  /**
1461
1456
  * コマンド選択肢取得
@@ -118,5 +118,23 @@ init_svgicons = () => {
118
118
  `<symbol id="azure" viewBox="0 0 16 16">`
119
119
  +`<path d="M7.462 0H0v7.19h7.462zM16 0H8.538v7.19H16zM7.462 8.211H0V16h7.462zm8.538 0H8.538V16H16z"/>`
120
120
  +`</symbol>`);
121
+ svgicons.insertAdjacentHTML('beforeend',
122
+ `<symbol id="btn_megaphone" viewBox="0 0 16 16">`
123
+ +`<path d="M13 2.5a1.5 1.5 0 0 1 3 0v11a1.5 1.5 0 0 1-3 0v-.214c-2.162-1.241-4.49-1.843-6.912-2.083l.405 2.712A1 1 0 0 1 5.51 15.1h-.548a1 1 0 0 1-.916-.599l-1.85-3.49-.202-.003A2.014 2.014 0 0 1 0 9V7a2.02 2.02 0 0 1 1.992-2.013 75 75 0 0 0 2.483-.075c3.043-.154 6.148-.849 8.525-2.199zm1 0v11a.5.5 0 0 0 1 0v-11a.5.5 0 0 0-1 0m-1 1.35c-2.344 1.205-5.209 1.842-8 2.033v4.233q.27.015.537.036c2.568.189 5.093.744 7.463 1.993zm-9 6.215v-4.13a95 95 0 0 1-1.992.052A1.02 1.02 0 0 0 1 7v2c0 .55.448 1.002 1.006 1.009A61 61 0 0 1 4 10.065m-.657.975 1.609 3.037.01.024h.548l-.002-.014-.443-2.966a68 68 0 0 0-1.722-.082z"/>`
124
+ +`</symbol>`);
125
+ svgicons.insertAdjacentHTML('beforeend',
126
+ `<symbol id="btn_megaphone_fill" viewBox="0 0 16 16">`
127
+ +`<path d="M13 2.5a1.5 1.5 0 0 1 3 0v11a1.5 1.5 0 0 1-3 0zm-1 .724c-2.067.95-4.539 1.481-7 1.656v6.237a25 25 0 0 1 1.088.085c2.053.204 4.038.668 5.912 1.56zm-8 7.841V4.934c-.68.027-1.399.043-2.008.053A2.02 2.02 0 0 0 0 7v2c0 1.106.896 1.996 1.994 2.009l.496.008a64 64 0 0 1 1.51.048m1.39 1.081q.428.032.85.078l.253 1.69a1 1 0 0 1-.983 1.187h-.548a1 1 0 0 1-.916-.599l-1.314-2.48a66 66 0 0 1 1.692.064q.491.026.966.06"/>`
128
+ +`</symbol>`);
129
+ svgicons.insertAdjacentHTML('beforeend',
130
+ `<symbol id="btn_mic" viewBox="0 0 16 16">`
131
+ +`<path d="M3.5 6.5A.5.5 0 0 1 4 7v1a4 4 0 0 0 8 0V7a.5.5 0 0 1 1 0v1a5 5 0 0 1-4.5 4.975V15h3a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1h3v-2.025A5 5 0 0 1 3 8V7a.5.5 0 0 1 .5-.5"/>`
132
+ +`<path d="M10 8a2 2 0 1 1-4 0V3a2 2 0 1 1 4 0zM8 0a3 3 0 0 0-3 3v5a3 3 0 0 0 6 0V3a3 3 0 0 0-3-3"/>`
133
+ +`</symbol>`);
134
+ svgicons.insertAdjacentHTML('beforeend',
135
+ `<symbol id="btn_mic_fill" viewBox="0 0 16 16">`
136
+ +`<path d="M5 3a3 3 0 0 1 6 0v5a3 3 0 0 1-6 0z"/>`
137
+ +`<path d="M3.5 6.5A.5.5 0 0 1 4 7v1a4 4 0 0 0 8 0V7a.5.5 0 0 1 1 0v1a5 5 0 0 1-4.5 4.975V15h3a.5.5 0 0 1 0 1h-7a.5.5 0 0 1 0-1h3v-2.025A5 5 0 0 1 3 8V7a.5.5 0 0 1 .5-.5"/>`
138
+ +`</symbol>`);
121
139
  };
122
140
  init_svgicons();