@duckmind/deepquark-darwin-arm64 0.9.78 → 0.9.81

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.
Files changed (240) hide show
  1. package/.deepquark/skills/bundled/data-storytelling/SKILL.md +453 -0
  2. package/.deepquark/skills/bundled/docx/LICENSE.txt +30 -0
  3. package/.deepquark/skills/bundled/docx/SKILL.md +481 -0
  4. package/.deepquark/skills/bundled/docx/scripts/__init__.py +1 -0
  5. package/.deepquark/skills/bundled/docx/scripts/accept_changes.py +135 -0
  6. package/.deepquark/skills/bundled/docx/scripts/comment.py +318 -0
  7. package/.deepquark/skills/bundled/docx/scripts/office/helpers/__init__.py +0 -0
  8. package/.deepquark/skills/bundled/docx/scripts/office/helpers/merge_runs.py +199 -0
  9. package/.deepquark/skills/bundled/docx/scripts/office/helpers/simplify_redlines.py +197 -0
  10. package/.deepquark/skills/bundled/docx/scripts/office/pack.py +159 -0
  11. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  12. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  13. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  14. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  15. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  16. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  17. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  18. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  19. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  20. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  21. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  22. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  23. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  24. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  25. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  26. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  27. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  28. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  29. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  30. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  31. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  32. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  33. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  34. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  35. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  36. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  37. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  38. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  39. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  40. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  41. package/.deepquark/skills/bundled/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  42. package/.deepquark/skills/bundled/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  43. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  44. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  45. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  46. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  47. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  48. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  49. package/.deepquark/skills/bundled/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  50. package/.deepquark/skills/bundled/docx/scripts/office/soffice.py +183 -0
  51. package/.deepquark/skills/bundled/docx/scripts/office/unpack.py +132 -0
  52. package/.deepquark/skills/bundled/docx/scripts/office/validate.py +111 -0
  53. package/.deepquark/skills/bundled/docx/scripts/office/validators/__init__.py +15 -0
  54. package/.deepquark/skills/bundled/docx/scripts/office/validators/base.py +847 -0
  55. package/.deepquark/skills/bundled/docx/scripts/office/validators/docx.py +446 -0
  56. package/.deepquark/skills/bundled/docx/scripts/office/validators/pptx.py +275 -0
  57. package/.deepquark/skills/bundled/docx/scripts/office/validators/redlining.py +247 -0
  58. package/.deepquark/skills/bundled/docx/scripts/templates/comments.xml +3 -0
  59. package/.deepquark/skills/bundled/docx/scripts/templates/commentsExtended.xml +3 -0
  60. package/.deepquark/skills/bundled/docx/scripts/templates/commentsExtensible.xml +3 -0
  61. package/.deepquark/skills/bundled/docx/scripts/templates/commentsIds.xml +3 -0
  62. package/.deepquark/skills/bundled/docx/scripts/templates/people.xml +3 -0
  63. package/.deepquark/skills/bundled/drawio-architect/SKILL.md +300 -0
  64. package/.deepquark/skills/bundled/drawio-architect/references/architecture-patterns.md +236 -0
  65. package/.deepquark/skills/bundled/drawio-architect/references/branding.md +180 -0
  66. package/.deepquark/skills/bundled/drawio-architect/references/cloud-icons.md +493 -0
  67. package/.deepquark/skills/bundled/drawio-architect/references/style-guide.md +268 -0
  68. package/.deepquark/skills/bundled/duckmind-deep-research/ARCHITECTURE_REVIEW.md +495 -0
  69. package/.deepquark/skills/bundled/duckmind-deep-research/AUTONOMY_VERIFICATION.md +420 -0
  70. package/.deepquark/skills/bundled/duckmind-deep-research/COMPETITIVE_ANALYSIS.md +179 -0
  71. package/.deepquark/skills/bundled/duckmind-deep-research/CONTEXT_OPTIMIZATION.md +293 -0
  72. package/.deepquark/skills/bundled/duckmind-deep-research/QUICK_START.md +167 -0
  73. package/.deepquark/skills/bundled/duckmind-deep-research/README.md +259 -0
  74. package/.deepquark/skills/bundled/duckmind-deep-research/SKILL.md +754 -0
  75. package/.deepquark/skills/bundled/duckmind-deep-research/WORD_PRECISION_AUDIT.md +476 -0
  76. package/.deepquark/skills/bundled/duckmind-deep-research/reference/methodology.md +384 -0
  77. package/.deepquark/skills/bundled/duckmind-deep-research/requirements.txt +10 -0
  78. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/citation_manager.py +177 -0
  79. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/md_to_html.py +330 -0
  80. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/research_engine.py +578 -0
  81. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/source_evaluator.py +292 -0
  82. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/validate_report.py +354 -0
  83. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/verify_citations.py +430 -0
  84. package/.deepquark/skills/bundled/duckmind-deep-research/scripts/verify_html.py +220 -0
  85. package/.deepquark/skills/bundled/duckmind-deep-research/templates/mckinsey_report_template.html +443 -0
  86. package/.deepquark/skills/bundled/duckmind-deep-research/templates/report_template.md +414 -0
  87. package/.deepquark/skills/bundled/duckmind-deep-research/tests/fixtures/invalid_report.md +27 -0
  88. package/.deepquark/skills/bundled/duckmind-deep-research/tests/fixtures/valid_report.md +114 -0
  89. package/.deepquark/skills/bundled/duckmind-multimodal/SKILL.md +171 -0
  90. package/.deepquark/skills/bundled/duckmind-multimodal/references/image-generation.md +131 -0
  91. package/.deepquark/skills/bundled/duckmind-multimodal/references/pdf-processing.md +120 -0
  92. package/.deepquark/skills/bundled/duckmind-transcribe/SKILL.md +70 -0
  93. package/.deepquark/skills/bundled/duckmind-transcribe/scripts/transcribe.sh +134 -0
  94. package/.deepquark/skills/bundled/excel-analysis/SKILL.md +247 -0
  95. package/.deepquark/skills/bundled/ge-payroll/SKILL.md +153 -0
  96. package/.deepquark/skills/bundled/ge-payroll/evals/evals.json +23 -0
  97. package/.deepquark/skills/bundled/ge-payroll/references/pain-points-improvements.md +106 -0
  98. package/.deepquark/skills/bundled/ge-payroll/references/process-detail.md +217 -0
  99. package/.deepquark/skills/bundled/ge-payroll/references/raci-stakeholders.md +85 -0
  100. package/.deepquark/skills/bundled/ge-payroll/references/timeline-mandays.md +64 -0
  101. package/.deepquark/skills/bundled/pdf/LICENSE.txt +30 -0
  102. package/.deepquark/skills/bundled/pdf/SKILL.md +314 -0
  103. package/.deepquark/skills/bundled/pdf/forms.md +294 -0
  104. package/.deepquark/skills/bundled/pdf/reference.md +612 -0
  105. package/.deepquark/skills/bundled/pdf/scripts/check_bounding_boxes.py +65 -0
  106. package/.deepquark/skills/bundled/pdf/scripts/check_fillable_fields.py +11 -0
  107. package/.deepquark/skills/bundled/pdf/scripts/convert_pdf_to_images.py +33 -0
  108. package/.deepquark/skills/bundled/pdf/scripts/create_validation_image.py +37 -0
  109. package/.deepquark/skills/bundled/pdf/scripts/extract_form_field_info.py +122 -0
  110. package/.deepquark/skills/bundled/pdf/scripts/extract_form_structure.py +115 -0
  111. package/.deepquark/skills/bundled/pdf/scripts/fill_fillable_fields.py +98 -0
  112. package/.deepquark/skills/bundled/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  113. package/.deepquark/skills/bundled/perplexity-search/SKILL.md +447 -0
  114. package/.deepquark/skills/bundled/perplexity-search/assets/.env.example +16 -0
  115. package/.deepquark/skills/bundled/perplexity-search/references/model_comparison.md +386 -0
  116. package/.deepquark/skills/bundled/perplexity-search/references/openrouter_setup.md +454 -0
  117. package/.deepquark/skills/bundled/perplexity-search/references/search_strategies.md +258 -0
  118. package/.deepquark/skills/bundled/perplexity-search/scripts/perplexity_search.py +277 -0
  119. package/.deepquark/skills/bundled/perplexity-search/scripts/setup_env.py +171 -0
  120. package/.deepquark/skills/bundled/pptx/LICENSE.txt +30 -0
  121. package/.deepquark/skills/bundled/pptx/SKILL.md +232 -0
  122. package/.deepquark/skills/bundled/pptx/editing.md +205 -0
  123. package/.deepquark/skills/bundled/pptx/pptxgenjs.md +420 -0
  124. package/.deepquark/skills/bundled/pptx/scripts/__init__.py +0 -0
  125. package/.deepquark/skills/bundled/pptx/scripts/add_slide.py +195 -0
  126. package/.deepquark/skills/bundled/pptx/scripts/clean.py +286 -0
  127. package/.deepquark/skills/bundled/pptx/scripts/office/helpers/__init__.py +0 -0
  128. package/.deepquark/skills/bundled/pptx/scripts/office/helpers/merge_runs.py +199 -0
  129. package/.deepquark/skills/bundled/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
  130. package/.deepquark/skills/bundled/pptx/scripts/office/pack.py +159 -0
  131. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  132. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  133. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  134. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  135. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  136. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  137. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  138. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  139. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  140. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  141. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  142. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  143. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  144. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  145. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  146. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  147. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  148. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  149. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  150. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  151. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  152. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  153. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  154. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  155. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  156. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  157. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  158. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  159. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  160. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  161. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  162. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  163. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  164. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  165. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  166. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  167. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  168. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  169. package/.deepquark/skills/bundled/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  170. package/.deepquark/skills/bundled/pptx/scripts/office/soffice.py +183 -0
  171. package/.deepquark/skills/bundled/pptx/scripts/office/unpack.py +132 -0
  172. package/.deepquark/skills/bundled/pptx/scripts/office/validate.py +111 -0
  173. package/.deepquark/skills/bundled/pptx/scripts/office/validators/__init__.py +15 -0
  174. package/.deepquark/skills/bundled/pptx/scripts/office/validators/base.py +847 -0
  175. package/.deepquark/skills/bundled/pptx/scripts/office/validators/docx.py +446 -0
  176. package/.deepquark/skills/bundled/pptx/scripts/office/validators/pptx.py +275 -0
  177. package/.deepquark/skills/bundled/pptx/scripts/office/validators/redlining.py +247 -0
  178. package/.deepquark/skills/bundled/pptx/scripts/thumbnail.py +289 -0
  179. package/.deepquark/skills/bundled/text-to-pdf-automation/SKILL.md +91 -0
  180. package/.deepquark/skills/bundled/web-fetch/SKILL.md +56 -0
  181. package/.deepquark/skills/bundled/web-fetch/scripts/fetch.sh +54 -0
  182. package/.deepquark/skills/bundled/xlsx/LICENSE.txt +30 -0
  183. package/.deepquark/skills/bundled/xlsx/SKILL.md +292 -0
  184. package/.deepquark/skills/bundled/xlsx/scripts/office/helpers/__init__.py +0 -0
  185. package/.deepquark/skills/bundled/xlsx/scripts/office/helpers/merge_runs.py +199 -0
  186. package/.deepquark/skills/bundled/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
  187. package/.deepquark/skills/bundled/xlsx/scripts/office/pack.py +159 -0
  188. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  189. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  190. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  191. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  192. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  193. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  194. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  195. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  196. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  197. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  198. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  199. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  200. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  201. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  202. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  203. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  204. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  205. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  206. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  207. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  208. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  209. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  210. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  211. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  212. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  213. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  214. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  215. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  216. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  217. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  218. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  219. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  220. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  221. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  222. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  223. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  224. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  225. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  226. package/.deepquark/skills/bundled/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  227. package/.deepquark/skills/bundled/xlsx/scripts/office/soffice.py +183 -0
  228. package/.deepquark/skills/bundled/xlsx/scripts/office/unpack.py +132 -0
  229. package/.deepquark/skills/bundled/xlsx/scripts/office/validate.py +111 -0
  230. package/.deepquark/skills/bundled/xlsx/scripts/office/validators/__init__.py +15 -0
  231. package/.deepquark/skills/bundled/xlsx/scripts/office/validators/base.py +847 -0
  232. package/.deepquark/skills/bundled/xlsx/scripts/office/validators/docx.py +446 -0
  233. package/.deepquark/skills/bundled/xlsx/scripts/office/validators/pptx.py +275 -0
  234. package/.deepquark/skills/bundled/xlsx/scripts/office/validators/redlining.py +247 -0
  235. package/.deepquark/skills/bundled/xlsx/scripts/recalc.py +184 -0
  236. package/.deepquark/skills/bundled/youtube-downloader/SKILL.md +99 -0
  237. package/.deepquark/skills/bundled/youtube-downloader/scripts/download_video.py +145 -0
  238. package/.deepquark/skills/bundled/youtube-transcribe-skill/SKILL.md +116 -0
  239. package/bin/deepquark +0 -0
  240. package/package.json +4 -3
@@ -0,0 +1,171 @@
1
+ ---
2
+ name: duckmind-multimodal
3
+ description: >
4
+ How to use DuckMind's multimodal API to send images, PDFs, audio, video, and generate images.
5
+ Use this skill whenever the user wants to interact with the DuckMind API for any multimodal task,
6
+ including: sending images to vision models, generating images from text prompts, processing PDF documents,
7
+ sending or receiving audio, or analyzing video content. Also trigger when the user mentions DuckMind
8
+ in combination with any media type, asks about DuckMind's image generation, PDF parsing, audio
9
+ transcription, or video analysis capabilities. Trigger even if the user just says "DuckMind" with
10
+ a file processing context, or asks how to send files/media to DuckMind models.
11
+ ---
12
+
13
+ # DuckMind Multimodal API
14
+
15
+ This skill covers how to use DuckMind's unified `/api/v1/chat/completions` endpoint for multimodal inputs and outputs: images, PDFs, audio, and video.
16
+
17
+ ## Authentication
18
+
19
+ Before making any API call, retrieve the DuckMind API key from DeepQuark's auth store:
20
+
21
+ ```bash
22
+ # With jq (preferred)
23
+ DUCKMIND_API_KEY=$(jq -r '.duckmind.key' ~/.local/share/deepquark/auth.json)
24
+
25
+ # With python3 (fallback)
26
+ DUCKMIND_API_KEY=$(python3 -c "import json; d=json.load(open('$HOME/.local/share/deepquark/auth.json')); print(d['duckmind']['key'])")
27
+ ```
28
+
29
+ Use `$DUCKMIND_API_KEY` (bash) or the extracted string as the Bearer token in all requests. Never hardcode the key.
30
+
31
+ ## Quick Reference: Content Types
32
+
33
+ | Modality | Content Type | URL Support | Base64 Support |
34
+ |-----------------|-----------------|-------------|----------------|
35
+ | Image (input) | `image_url` | Yes | Yes |
36
+ | Image (output) | Set `modalities`| N/A | Returned as b64|
37
+ | PDF | `file` | Yes | Yes |
38
+ | Audio (input) | `input_audio` | No | Yes (required) |
39
+ | Audio (output) | Set `modalities`| N/A | Streamed as b64|
40
+ | Video | `video_url` | Provider-specific | Yes |
41
+
42
+ ## Image Inputs
43
+
44
+ Send images to vision-capable models. Place text prompt first, then images. Supports `image/png`, `image/jpeg`, `image/webp`, `image/gif`.
45
+
46
+ **Via URL:**
47
+ ```js
48
+ content: [
49
+ { type: "text", text: "What's in this image?" },
50
+ { type: "image_url", image_url: { url: "https://example.com/photo.jpg" } }
51
+ ]
52
+ ```
53
+
54
+ **Via Base64:**
55
+ ```js
56
+ const base64 = `data:image/jpeg;base64,${Buffer.from(fs.readFileSync(path)).toString("base64")}`;
57
+ // Then use: { type: "image_url", image_url: { url: base64 } }
58
+ ```
59
+
60
+ Multiple images can be sent as separate entries in the content array.
61
+
62
+ ## Image Generation
63
+
64
+ Models with `"image"` in `output_modalities` can generate images. Set the `modalities` parameter:
65
+
66
+ - Text + image models (e.g. Gemini): `modalities: ["image", "text"]`
67
+ - Image-only models (e.g. Flux): `modalities: ["image"]`
68
+
69
+ ```js
70
+ const result = await fetch("https://openrouter.ai/api/v1/chat/completions", {
71
+ method: "POST",
72
+ headers: { Authorization: `Bearer ${DUCKMIND_API_KEY}`, "Content-Type": "application/json" },
73
+ body: JSON.stringify({
74
+ model: "google/gemini-2.5-flash-image-preview",
75
+ messages: [{ role: "user", content: "Generate a sunset over mountains" }],
76
+ modalities: ["image", "text"],
77
+ stream: false,
78
+ }),
79
+ });
80
+ ```
81
+
82
+ Response contains `choices[0].message.images[]` with base64 data URLs.
83
+
84
+ **Image config options** (via `image_config` parameter):
85
+ - `aspect_ratio`: "1:1" (default), "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"
86
+ - Extended (Gemini 3.1 Flash only): "1:4", "4:1", "1:8", "8:1"
87
+ - `image_size`: "1K" (default), "2K", "4K", "0.5K" (Gemini 3.1 Flash only)
88
+ - `font_inputs`: Sourceful models only — custom font rendering, max 2, +$0.03 each
89
+ - `super_resolution_references`: Sourceful models only — enhance low-quality elements, max 4, +$0.20 each
90
+
91
+ For full details on image config options, see `references/image-generation.md`.
92
+
93
+ ## PDF Processing
94
+
95
+ Use the `file` content type. Works on **any** DuckMind model — native models get direct passthrough, others get parsed content.
96
+
97
+ ```js
98
+ content: [
99
+ { type: "text", text: "Summarize this document." },
100
+ {
101
+ type: "file",
102
+ file: { filename: "doc.pdf", file_data: "https://example.com/doc.pdf" }
103
+ // Or for base64: file_data: "data:application/pdf;base64,..."
104
+ }
105
+ ]
106
+ ```
107
+
108
+ **PDF Engines** (via `plugins` parameter):
109
+ - `"native"` — model's built-in file processing (charged as input tokens)
110
+ - `"pdf-text"` — free, best for well-structured text PDFs
111
+ - `"mistral-ocr"` — $2/1000 pages, best for scanned docs or PDFs with images
112
+
113
+ Default: native if supported, otherwise `mistral-ocr`.
114
+
115
+ ```js
116
+ plugins: [{ id: "file-parser", pdf: { engine: "pdf-text" } }]
117
+ ```
118
+
119
+ **Skip re-parsing costs**: Store `annotations` from the response and include them in follow-up requests. See `references/pdf-processing.md` for the full annotation reuse pattern.
120
+
121
+ ## Audio
122
+
123
+ ### Audio Input
124
+ Audio must be **base64-encoded** (URLs not supported). Use `input_audio` content type.
125
+
126
+ ```js
127
+ content: [
128
+ { type: "text", text: "Transcribe this audio." },
129
+ { type: "input_audio", input_audio: { data: base64Audio, format: "wav" } }
130
+ ]
131
+ ```
132
+
133
+ Supported formats: wav, mp3, aiff, aac, ogg, flac, m4a, pcm16, pcm24 (varies by model).
134
+
135
+ ### Audio Output
136
+ Set `modalities: ["text", "audio"]` and provide `audio` config. **Requires streaming.**
137
+
138
+ ```js
139
+ {
140
+ modalities: ["text", "audio"],
141
+ audio: { voice: "alloy", format: "wav" },
142
+ stream: true
143
+ }
144
+ ```
145
+
146
+ Voices: alloy, echo, fable, onyx, nova, shimmer (varies by model).
147
+ Formats: wav, mp3, flac, opus, pcm16 (varies by model).
148
+
149
+ Audio data arrives in `delta.audio.data` (base64 chunks) and `delta.audio.transcript`.
150
+
151
+ ## Video Input
152
+
153
+ Use `video_url` content type. Supports base64 (`data:video/mp4;base64,...`) and provider-specific URLs (e.g. YouTube links for Gemini on AI Studio).
154
+
155
+ ## Model Compatibility
156
+
157
+ Not all models support all modalities. Use the [Models page](https://openrouter.ai/models) to filter by:
158
+ - Vision models → image input
159
+ - File-compatible models → PDF processing
160
+ - Audio-capable models → audio I/O
161
+ - Video-capable models → video input
162
+ - Output modalities with "image" → image generation
163
+
164
+ ## SDK Usage
165
+
166
+ DuckMind provides official SDKs:
167
+ - **TypeScript**: `@openrouter/sdk` — use `openRouter.chat.send()`
168
+ - **Python**: `openrouter` package
169
+
170
+ Both SDKs use camelCase for parameters (e.g. `imageUrl`, `inputAudio`, `fileData`).
171
+ Raw fetch/requests use snake_case (e.g. `image_url`, `input_audio`, `file_data`).
@@ -0,0 +1,131 @@
1
+ # Image Generation — Detailed Reference
2
+
3
+ ## Model Discovery
4
+
5
+ Find image generation models:
6
+ 1. **Models page**: Filter by output modalities → "image"
7
+ 2. **Chatroom**: Click the "Image" button to auto-filter
8
+ 3. **API**: Check `output_modalities` includes `"image"`
9
+
10
+ ## Compatible Models (examples)
11
+
12
+ - `google/gemini-3.1-flash-image-preview` (extended aspect ratios, 0.5K support)
13
+ - `google/gemini-2.5-flash-image-preview`
14
+ - `google/gemini-3-pro-image-preview`
15
+ - `black-forest-labs/flux.2-pro`
16
+ - `black-forest-labs/flux.2-flex`
17
+ - `sourceful/riverflow-v2-standard-preview`
18
+ - `sourceful/riverflow-v2-fast`
19
+ - `sourceful/riverflow-v2-pro`
20
+
21
+ ## Modalities Parameter
22
+
23
+ - Models outputting both text and images: `modalities: ["image", "text"]`
24
+ - Image-only models (Flux, Sourceful): `modalities: ["image"]`
25
+
26
+ ## Image Config Options
27
+
28
+ ### Aspect Ratio (`image_config.aspect_ratio`)
29
+
30
+ Standard ratios (all models):
31
+
32
+ | Ratio | Resolution |
33
+ |-------|--------------|
34
+ | 1:1 | 1024×1024 (default) |
35
+ | 2:3 | 832×1248 |
36
+ | 3:2 | 1248×832 |
37
+ | 3:4 | 864×1184 |
38
+ | 4:3 | 1184×864 |
39
+ | 4:5 | 896×1152 |
40
+ | 5:4 | 1152×896 |
41
+ | 9:16 | 768×1344 |
42
+ | 16:9 | 1344×768 |
43
+ | 21:9 | 1536×672 |
44
+
45
+ Extended ratios (Gemini 3.1 Flash only):
46
+
47
+ | Ratio | Use Case |
48
+ |-------|---------------------------------------|
49
+ | 1:4 | Scrolling carousels, vertical UI |
50
+ | 4:1 | Hero banners, horizontal layouts |
51
+ | 1:8 | Notification headers, narrow vertical |
52
+ | 8:1 | Wide-format banners, panoramic |
53
+
54
+ ### Image Size (`image_config.image_size`)
55
+
56
+ | Size | Description |
57
+ |------|--------------------------------------|
58
+ | 1K | Standard resolution (default) |
59
+ | 2K | Higher resolution |
60
+ | 4K | Highest resolution |
61
+ | 0.5K | Lower resolution, efficient (Gemini 3.1 Flash only) |
62
+
63
+ ### Font Inputs (`image_config.font_inputs`) — Sourceful only
64
+
65
+ Render custom text with specific fonts. Max 2 font inputs, +$0.03 each.
66
+
67
+ ```json
68
+ {
69
+ "image_config": {
70
+ "font_inputs": [
71
+ { "font_url": "https://example.com/fonts/custom.ttf", "text": "Hello World" }
72
+ ]
73
+ }
74
+ }
75
+ ```
76
+
77
+ Tips:
78
+ - Include the text in your prompt with font name, color, size, position details
79
+ - `text` should match exactly what's in the prompt (no extra wording or quotes)
80
+ - Use line breaks or double spaces to separate headlines and sub-headers
81
+ - Works best with short, clear headlines
82
+
83
+ ### Super Resolution References (`image_config.super_resolution_references`) — Sourceful only
84
+
85
+ Enhance low-quality elements using high-quality reference images. Only works with image-to-image (input images in messages). Max 4 references, +$0.20 each.
86
+
87
+ ```json
88
+ {
89
+ "image_config": {
90
+ "super_resolution_references": [
91
+ "https://example.com/ref1.jpg",
92
+ "https://example.com/ref2.jpg"
93
+ ]
94
+ }
95
+ }
96
+ ```
97
+
98
+ Tips:
99
+ - Output matches input image size — use larger inputs for better quality
100
+ - Use high-quality references showing desired enhancement result
101
+
102
+ ## Streaming Image Generation
103
+
104
+ Works with `stream: true`. Images arrive in `delta.images[]` within SSE chunks:
105
+
106
+ ```js
107
+ // In each SSE chunk:
108
+ parsed.choices[0].delta.images?.forEach(img => {
109
+ console.log(img.image_url.url); // base64 data URL
110
+ });
111
+ ```
112
+
113
+ ## Response Format
114
+
115
+ ```json
116
+ {
117
+ "choices": [{
118
+ "message": {
119
+ "role": "assistant",
120
+ "content": "Description text...",
121
+ "images": [{
122
+ "type": "image_url",
123
+ "image_url": { "url": "data:image/png;base64,..." }
124
+ }]
125
+ }
126
+ }]
127
+ }
128
+ ```
129
+
130
+ - Format: base64-encoded data URLs, typically PNG
131
+ - Some models can generate multiple images per response
@@ -0,0 +1,120 @@
1
+ # PDF Processing — Detailed Reference
2
+
3
+ ## How It Works
4
+
5
+ PDFs are sent via the `file` content type in the messages array. DuckMind handles routing:
6
+ - **Native support**: PDF passed directly to the model
7
+ - **No native support**: DuckMind parses the PDF and passes extracted content to the model
8
+
9
+ This means PDF processing works with **any** model on DuckMind.
10
+
11
+ ## PDF Engines
12
+
13
+ Configure via the `plugins` parameter:
14
+
15
+ ```js
16
+ plugins: [{ id: "file-parser", pdf: { engine: "pdf-text" } }]
17
+ ```
18
+
19
+ | Engine | Cost | Best For |
20
+ |---------------|-------------------|-----------------------------------|
21
+ | `native` | Input token cost | Models with built-in file support |
22
+ | `pdf-text` | Free | Well-structured text PDFs |
23
+ | `mistral-ocr` | $2 / 1,000 pages | Scanned docs, PDFs with images |
24
+
25
+ **Default behavior**: If no engine is specified, DuckMind uses `native` first (if available), then falls back to `mistral-ocr`.
26
+
27
+ ## Sending PDFs
28
+
29
+ ### Via URL (publicly accessible)
30
+ ```js
31
+ {
32
+ type: "file",
33
+ file: {
34
+ filename: "document.pdf",
35
+ file_data: "https://example.com/document.pdf" // SDK: fileData
36
+ }
37
+ }
38
+ ```
39
+
40
+ ### Via Base64 (local/private files)
41
+ ```js
42
+ const base64PDF = `data:application/pdf;base64,${Buffer.from(fs.readFileSync(path)).toString("base64")}`;
43
+
44
+ {
45
+ type: "file",
46
+ file: {
47
+ filename: "document.pdf",
48
+ file_data: base64PDF // SDK: fileData
49
+ }
50
+ }
51
+ ```
52
+
53
+ ## Reusing Parsed Results (Skip Re-parsing Costs)
54
+
55
+ When DuckMind parses a PDF, the response includes `annotations` in the assistant message. Include these annotations in follow-up requests to avoid re-parsing.
56
+
57
+ ### Step-by-step:
58
+
59
+ 1. **First request**: Send PDF normally
60
+ 2. **Extract annotations**: `response.choices[0].message.annotations`
61
+ 3. **Follow-up requests**: Include the annotations in the assistant message
62
+
63
+ ```js
64
+ // Follow-up request structure:
65
+ messages: [
66
+ // Original user message with PDF
67
+ { role: "user", content: [{ type: "text", text: "..." }, { type: "file", file: { ... } }] },
68
+ // Assistant response WITH annotations
69
+ { role: "assistant", content: "Previous response...", annotations: fileAnnotations },
70
+ // New user question
71
+ { role: "user", content: "Follow-up question about the document" }
72
+ ]
73
+ ```
74
+
75
+ ### File Annotation Schema
76
+
77
+ ```typescript
78
+ type FileAnnotation = {
79
+ type: "file";
80
+ file: {
81
+ hash: string; // Unique hash for cache matching
82
+ name?: string; // Original filename
83
+ content: ContentPart[]; // Parsed content
84
+ };
85
+ };
86
+
87
+ type ContentPart =
88
+ | { type: "text"; text: string }
89
+ | { type: "image_url"; image_url: { url: string } };
90
+ ```
91
+
92
+ The `content` array contains extracted text blocks and images (as base64 data URLs). The `hash` field is what DuckMind uses to skip re-parsing.
93
+
94
+ ## Response Format
95
+
96
+ ```json
97
+ {
98
+ "choices": [{
99
+ "message": {
100
+ "role": "assistant",
101
+ "content": "The document discusses...",
102
+ "annotations": [{
103
+ "type": "file",
104
+ "file": {
105
+ "hash": "abc123...",
106
+ "name": "document.pdf",
107
+ "content": [
108
+ { "type": "text", "text": "Parsed text..." },
109
+ { "type": "image_url", "image_url": { "url": "data:image/png;base64,..." } }
110
+ ]
111
+ }
112
+ }]
113
+ }
114
+ }]
115
+ }
116
+ ```
117
+
118
+ ## Multiple Files
119
+
120
+ You can send both PDFs and other file types in the same request by adding multiple `file` entries to the content array.
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: duckmind-transcribe
3
+ description: Transcribe audio files using OpenRouter API with audio-capable models (Gemini, GPT-4o-audio, etc). Use this skill whenever the user asks to transcribe audio, convert speech to text, get a transcript from an audio file, or work with audio recordings (.m4a, .mp3, .wav, .ogg, .flac, .aac, .wma, .opus). Also trigger when the user mentions voice memos, meeting recordings, podcast transcriptions, interview audio, or any task involving extracting text from audio content. Requires OPENROUTER_API_KEY environment variable and ffmpeg installed on the system.
4
+ ---
5
+ # OpenRouter Audio Transcription
6
+ Transcribe audio files via OpenRouter chat completions API using the input_audio content type. Compatible with any audio-capable model on OpenRouter (Gemini, GPT-4o-audio, etc).
7
+ ## Prerequisites
8
+ Before running the transcription script, verify these dependencies are available:
9
+ ```bash
10
+ for cmd in curl ffmpeg base64 jq; do
11
+ command -v "$cmd" >/dev/null 2>&1 || echo "Missing: $cmd"
12
+ done
13
+ ```
14
+ The OPENROUTER_API_KEY environment variable must be set. If not available, retrieve it from DeepQuark's auth store (see **API Key** section below).
15
+ ## API Key
16
+ Before making any API call, retrieve the DuckMind API key from DeepQuark's auth store:
17
+ ```bash
18
+ # With jq (preferred)
19
+ DUCKMIND_API_KEY=$(jq -r '.duckmind.key' ~/.local/share/deepquark/auth.json)
20
+ # With python3 (fallback)
21
+ DUCKMIND_API_KEY=$(python3 -c "import json; d=json.load(open('$HOME/.local/share/deepquark/auth.json')); print(d['duckmind']['key'])")
22
+ ```
23
+ Use `$DUCKMIND_API_KEY` (bash) or the extracted string as the Bearer token in all requests. Never hardcode the key.
24
+ ## Quick Start
25
+ The main script is at {baseDir}/scripts/transcribe.sh. Make it executable first:
26
+ ```bash
27
+ chmod +x {baseDir}/scripts/transcribe.sh
28
+ ```
29
+ Basic transcription:
30
+ ```bash
31
+ {baseDir}/scripts/transcribe.sh /path/to/audio.m4a
32
+ ```
33
+ Output goes to stdout by default.
34
+ ## Options
35
+ | Flag | Description | Default |
36
+ |------|-------------|---------|
37
+ | --model <model> | OpenRouter model ID | google/gemini-2.5-flash |
38
+ | --prompt <text> | Custom transcription instructions | Standard transcription prompt |
39
+ | --out <file> | Save transcript to file | stdout |
40
+ | --title <name> | Caller ID for OpenRouter dashboard | Duckmina |
41
+ | --referer <url> | HTTP-Referer header | https://duckmind.ai |
42
+ ## Usage Examples
43
+ ```bash
44
+ # Transcribe with a different model
45
+ {baseDir}/scripts/transcribe.sh audio.ogg --model openai/gpt-4o-audio-preview
46
+ # Custom instructions (speaker labels, timestamps)
47
+ {baseDir}/scripts/transcribe.sh meeting.m4a --prompt "Transcribe with speaker labels and timestamps"
48
+ # Save output to a file
49
+ {baseDir}/scripts/transcribe.sh interview.m4a --out /tmp/transcript.txt
50
+ # Combine options
51
+ {baseDir}/scripts/transcribe.sh podcast.mp3 --model openai/gpt-4o-audio-preview --prompt "Include timestamps" --out transcript.md
52
+ ```
53
+ ## How It Works
54
+ 1. Audio conversion: ffmpeg converts the input to WAV (mono, 16kHz) for consistent API compatibility
55
+ 2. Base64 encoding: The WAV file is base64-encoded
56
+ 3. API request: Sends the audio as input_audio content to OpenRouter chat completions endpoint
57
+ 4. Extraction: Pulls the transcript text from the API response
58
+ ## Workflow
59
+ When a user asks to transcribe audio:
60
+ 1. Check that the audio file exists (look in /mnt/user-data/uploads/ for uploaded files)
61
+ 2. Retrieve `DUCKMIND_API_KEY` from `~/.local/share/deepquark/auth.json` (see **API Key** section). If the file is missing or the key is empty, ask the user
62
+ 3. Verify ffmpeg is installed. If not, try `apt-get install -y ffmpeg`
63
+ 4. Run the transcription script with appropriate options
64
+ 5. If the user wants the transcript saved, use --out or redirect stdout to a file
65
+ 6. Present the transcript to the user, and optionally save to /mnt/user-data/outputs/
66
+ ## Troubleshooting
67
+ - ffmpeg format errors: The script uses a temp directory (not mktemp -t file.wav) because macOS mktemp adds random suffixes after the extension, breaking format detection
68
+ - Argument list too long: Large audio files produce huge base64 strings. The script handles this by writing to temp files instead of passing data as CLI arguments
69
+ - Empty response: Usually caused by an invalid API key, unsupported model, or corrupted audio. The script dumps the raw response for debugging
70
+ - Model does not support audio: Switch to a known audio-capable model like google/gemini-2.5-flash or openai/gpt-4o-audio-preview
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ usage() {
4
+ cat >&2 <<'EOF'
5
+ Usage:
6
+ transcribe.sh <audio-file> [options]
7
+ Options:
8
+ --model <model> OpenRouter model (default: google/gemini-2.5-flash)
9
+ --prompt <text> Custom transcription instructions
10
+ --out <file> Output file (default: stdout)
11
+ --title <name> Caller identifier for OpenRouter (default: DuckMind)
12
+ --referer <url> HTTP-Referer header (default: https://duckmind.ai)
13
+ Example:
14
+ transcribe.sh audio.m4a --prompt "Include timestamps"
15
+ EOF
16
+ exit 2
17
+ }
18
+ if [[ "${1:-}" == "" || "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
19
+ usage
20
+ fi
21
+ in="${1:-}"
22
+ shift || true
23
+ model="google/gemini-2.5-flash"
24
+ prompt="Please transcribe this audio file. Keep it readable, suitable for messaging. Begin transcript immediately without any commentary."
25
+ out=""
26
+ title="DuckMind"
27
+ referer="https://duckmind.ai"
28
+ while [[ $# -gt 0 ]]; do
29
+ case "$1" in
30
+ --model)
31
+ model="${2:-}"
32
+ shift 2
33
+ ;;
34
+ --prompt)
35
+ prompt="${2:-}"
36
+ shift 2
37
+ ;;
38
+ --out)
39
+ out="${2:-}"
40
+ shift 2
41
+ ;;
42
+ --title)
43
+ title="${2:-}"
44
+ shift 2
45
+ ;;
46
+ --referer)
47
+ referer="${2:-}"
48
+ shift 2
49
+ ;;
50
+ *)
51
+ echo "Unknown arg: $1" >&2
52
+ usage
53
+ ;;
54
+ esac
55
+ done
56
+ if [[ ! -f "$in" ]]; then
57
+ echo "File not found: $in" >&2
58
+ exit 1
59
+ fi
60
+
61
+ # Retrieve DuckMind API key from DeepQuark's auth store
62
+ auth_file="$HOME/.local/share/deepquark/auth.json"
63
+ if [[ ! -f "$auth_file" ]]; then
64
+ echo "Auth file not found: $auth_file" >&2
65
+ exit 1
66
+ fi
67
+
68
+ if command -v jq &>/dev/null; then
69
+ OPENROUTER_API_KEY=$(jq -r '.duckmind.key' "$auth_file")
70
+ else
71
+ OPENROUTER_API_KEY=$(python3 -c "import json; d=json.load(open('$auth_file')); print(d['duckmind']['key'])")
72
+ fi
73
+
74
+ if [[ -z "${OPENROUTER_API_KEY:-}" || "$OPENROUTER_API_KEY" == "null" ]]; then
75
+ echo "Missing or invalid DuckMind API key in $auth_file" >&2
76
+ exit 1
77
+ fi
78
+
79
+ # Create temp files for conversion
80
+ tmp_dir=$(mktemp -d)
81
+ tmp_wav="$tmp_dir/audio.wav"
82
+ trap 'rm -rf "$tmp_dir"' EXIT
83
+ # Convert audio to WAV (mono, 16kHz) using ffmpeg
84
+ if ! ffmpeg -y -i "$in" -ac 1 -ar 16000 "$tmp_wav" 2>/dev/null; then
85
+ echo "ffmpeg failed to convert audio" >&2
86
+ exit 1
87
+ fi
88
+ # Base64 encode the WAV file
89
+ audio_base64=$(base64 < "$tmp_wav" | tr -d '\n')
90
+ # Build JSON payload using jq for proper escaping
91
+ # Write base64 to file first to avoid "argument list too long" errors
92
+ echo "$audio_base64" > "$tmp_dir/audio.b64"
93
+ payload_file="$tmp_dir/payload.json"
94
+ jq -n \
95
+ --arg model "$model" \
96
+ --arg prompt "$prompt" \
97
+ --rawfile audio "$tmp_dir/audio.b64" \
98
+ '{
99
+ model: $model,
100
+ messages: [{
101
+ role: "user",
102
+ content: [
103
+ { type: "text", text: $prompt },
104
+ { type: "input_audio", input_audio: { data: ($audio | rtrimstr("\n")), format: "wav" } }
105
+ ]
106
+ }]
107
+ }' > "$payload_file"
108
+ # Make API request
109
+ response=$(curl -sS "https://openrouter.ai/api/v1/chat/completions" \
110
+ -H "Authorization: Bearer $OPENROUTER_API_KEY" \
111
+ -H "Content-Type: application/json" \
112
+ -H "X-Title: $title" \
113
+ -H "HTTP-Referer: $referer" \
114
+ -d "@$payload_file")
115
+ # Check for API errors first
116
+ if echo "$response" | jq -e '.error' >/dev/null 2>&1; then
117
+ error_msg=$(echo "$response" | jq -r '.error.message // .error // "Unknown API error"')
118
+ echo "API error: $error_msg" >&2
119
+ exit 1
120
+ fi
121
+ # Extract transcript
122
+ transcript=$(echo "$response" | jq -r '.choices[0].message.content // empty')
123
+ if [[ -z "$transcript" ]]; then
124
+ echo "Empty response from API. Raw response:" >&2
125
+ echo "$response" | head -c 500 >&2
126
+ exit 1
127
+ fi
128
+ if [[ "$out" != "" ]]; then
129
+ mkdir -p "$(dirname "$out")"
130
+ echo "$transcript" > "$out"
131
+ echo "$out"
132
+ else
133
+ echo "$transcript"
134
+ fi