@farazirfan/costar-server-executor 1.7.37 → 1.7.39

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 (253) hide show
  1. package/dist/agent/agent.d.ts +90 -0
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/agent.js +606 -0
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/pi-embedded-runner/run.d.ts.map +1 -1
  6. package/dist/agent/pi-embedded-runner/run.js +2 -1
  7. package/dist/agent/pi-embedded-runner/run.js.map +1 -1
  8. package/dist/agent/pi-embedded-runner/system-prompt.d.ts.map +1 -1
  9. package/dist/agent/pi-embedded-runner/system-prompt.js +16 -37
  10. package/dist/agent/pi-embedded-runner/system-prompt.js.map +1 -1
  11. package/dist/agent/pi-embedded-runner/tools.d.ts +4 -1
  12. package/dist/agent/pi-embedded-runner/tools.d.ts.map +1 -1
  13. package/dist/agent/pi-embedded-runner/tools.js +3 -1
  14. package/dist/agent/pi-embedded-runner/tools.js.map +1 -1
  15. package/dist/agent/pi-embedded-runner/types.d.ts +4 -0
  16. package/dist/agent/pi-embedded-runner/types.d.ts.map +1 -1
  17. package/dist/cli/env-loader.d.ts.map +1 -1
  18. package/dist/cli/env-loader.js +1 -0
  19. package/dist/cli/env-loader.js.map +1 -1
  20. package/dist/cli/setup.js +2 -2
  21. package/dist/cli/setup.js.map +1 -1
  22. package/dist/cron/normalize.d.ts +31 -0
  23. package/dist/cron/normalize.d.ts.map +1 -0
  24. package/dist/cron/normalize.js +211 -0
  25. package/dist/cron/normalize.js.map +1 -0
  26. package/dist/cron/scheduler.d.ts +33 -3
  27. package/dist/cron/scheduler.d.ts.map +1 -1
  28. package/dist/cron/scheduler.js +253 -48
  29. package/dist/cron/scheduler.js.map +1 -1
  30. package/dist/heartbeat/runner.d.ts +27 -12
  31. package/dist/heartbeat/runner.d.ts.map +1 -1
  32. package/dist/heartbeat/runner.js +82 -104
  33. package/dist/heartbeat/runner.js.map +1 -1
  34. package/dist/infra/heartbeat-events-filter.d.ts +29 -0
  35. package/dist/infra/heartbeat-events-filter.d.ts.map +1 -0
  36. package/dist/infra/heartbeat-events-filter.js +80 -0
  37. package/dist/infra/heartbeat-events-filter.js.map +1 -0
  38. package/dist/infra/index.d.ts +9 -0
  39. package/dist/infra/index.d.ts.map +1 -0
  40. package/dist/infra/index.js +9 -0
  41. package/dist/infra/index.js.map +1 -0
  42. package/dist/infra/system-events.d.ts +58 -2
  43. package/dist/infra/system-events.d.ts.map +1 -1
  44. package/dist/infra/system-events.js +80 -14
  45. package/dist/infra/system-events.js.map +1 -1
  46. package/dist/server.d.ts.map +1 -1
  47. package/dist/server.js +6 -1
  48. package/dist/server.js.map +1 -1
  49. package/dist/services/platform-keys.d.ts +19 -0
  50. package/dist/services/platform-keys.d.ts.map +1 -0
  51. package/dist/services/platform-keys.js +74 -0
  52. package/dist/services/platform-keys.js.map +1 -0
  53. package/dist/subagent/registry.d.ts +96 -0
  54. package/dist/subagent/registry.d.ts.map +1 -0
  55. package/dist/subagent/registry.js +180 -0
  56. package/dist/subagent/registry.js.map +1 -0
  57. package/dist/tools/complete-turn.d.ts +2 -2
  58. package/dist/tools/complete-turn.js +10 -10
  59. package/dist/tools/complete-turn.js.map +1 -1
  60. package/dist/tools/contacts.d.ts +13 -0
  61. package/dist/tools/contacts.d.ts.map +1 -0
  62. package/dist/tools/contacts.js +80 -0
  63. package/dist/tools/contacts.js.map +1 -0
  64. package/dist/tools/cron.d.ts +17 -2
  65. package/dist/tools/cron.d.ts.map +1 -1
  66. package/dist/tools/cron.js +117 -35
  67. package/dist/tools/cron.js.map +1 -1
  68. package/dist/tools/google-maps.d.ts +6 -6
  69. package/dist/tools/google-maps.d.ts.map +1 -1
  70. package/dist/tools/google-maps.js +207 -262
  71. package/dist/tools/google-maps.js.map +1 -1
  72. package/dist/tools/index.d.ts +17 -7
  73. package/dist/tools/index.d.ts.map +1 -1
  74. package/dist/tools/index.js +40 -9
  75. package/dist/tools/index.js.map +1 -1
  76. package/dist/tools/phone-call.d.ts +11 -0
  77. package/dist/tools/phone-call.d.ts.map +1 -0
  78. package/dist/tools/phone-call.js +151 -0
  79. package/dist/tools/phone-call.js.map +1 -0
  80. package/dist/tools/sessions-spawn.d.ts +33 -0
  81. package/dist/tools/sessions-spawn.d.ts.map +1 -0
  82. package/dist/tools/sessions-spawn.js +164 -0
  83. package/dist/tools/sessions-spawn.js.map +1 -0
  84. package/dist/tools/spotify.d.ts +12 -0
  85. package/dist/tools/spotify.d.ts.map +1 -0
  86. package/dist/tools/spotify.js +251 -0
  87. package/dist/tools/spotify.js.map +1 -0
  88. package/dist/tools/subagents.d.ts +23 -0
  89. package/dist/tools/subagents.d.ts.map +1 -0
  90. package/dist/tools/subagents.js +209 -0
  91. package/dist/tools/subagents.js.map +1 -0
  92. package/dist/tools/whatsapp.d.ts +13 -0
  93. package/dist/tools/whatsapp.d.ts.map +1 -0
  94. package/dist/tools/whatsapp.js +215 -0
  95. package/dist/tools/whatsapp.js.map +1 -0
  96. package/dist/tools/youtube.d.ts +12 -0
  97. package/dist/tools/youtube.d.ts.map +1 -0
  98. package/dist/tools/youtube.js +218 -0
  99. package/dist/tools/youtube.js.map +1 -0
  100. package/dist/utils/asterizk-auth.d.ts +43 -0
  101. package/dist/utils/asterizk-auth.d.ts.map +1 -0
  102. package/dist/utils/asterizk-auth.js +125 -0
  103. package/dist/utils/asterizk-auth.js.map +1 -0
  104. package/dist/web-server.d.ts.map +1 -1
  105. package/dist/web-server.js +132 -0
  106. package/dist/web-server.js.map +1 -1
  107. package/dist/workspace/index.d.ts +3 -4
  108. package/dist/workspace/index.d.ts.map +1 -1
  109. package/dist/workspace/index.js +3 -4
  110. package/dist/workspace/index.js.map +1 -1
  111. package/dist/workspace/templates.d.ts +8 -7
  112. package/dist/workspace/templates.d.ts.map +1 -1
  113. package/dist/workspace/templates.js +18 -127
  114. package/dist/workspace/templates.js.map +1 -1
  115. package/dist/workspace/workspace.d.ts +2 -4
  116. package/dist/workspace/workspace.d.ts.map +1 -1
  117. package/dist/workspace/workspace.js +7 -16
  118. package/dist/workspace/workspace.js.map +1 -1
  119. package/package.json +1 -1
  120. package/public/index.html +231 -0
  121. package/skills/docx/SKILL.md +468 -0
  122. package/skills/docx/scripts/__init__.py +1 -0
  123. package/skills/docx/scripts/accept_changes.py +181 -0
  124. package/skills/docx/scripts/comment.py +347 -0
  125. package/skills/docx/scripts/helpers/__init__.py +0 -0
  126. package/skills/docx/scripts/helpers/merge_runs.py +231 -0
  127. package/skills/docx/scripts/helpers/simplify_redlines.py +240 -0
  128. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  129. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  130. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  131. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  132. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  133. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  134. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  135. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  136. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  137. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  138. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  139. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  140. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  141. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  142. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  143. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  144. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  145. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  146. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  147. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  148. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  149. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  150. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  151. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  152. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  153. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  154. package/skills/docx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  155. package/skills/docx/scripts/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  156. package/skills/docx/scripts/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  157. package/skills/docx/scripts/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  158. package/skills/docx/scripts/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  159. package/skills/docx/scripts/ooxml/schemas/mce/mc.xsd +75 -0
  160. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  161. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  162. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  163. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  164. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  165. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  166. package/skills/docx/scripts/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  167. package/skills/docx/scripts/ooxml/scripts/pack.py +159 -0
  168. package/skills/docx/scripts/ooxml/scripts/unpack.py +29 -0
  169. package/skills/docx/scripts/ooxml/scripts/validate.py +106 -0
  170. package/skills/docx/scripts/ooxml/scripts/validation/__init__.py +15 -0
  171. package/skills/docx/scripts/ooxml/scripts/validation/base.py +1023 -0
  172. package/skills/docx/scripts/ooxml/scripts/validation/docx.py +519 -0
  173. package/skills/docx/scripts/ooxml/scripts/validation/pptx.py +315 -0
  174. package/skills/docx/scripts/ooxml/scripts/validation/redlining.py +284 -0
  175. package/skills/docx/scripts/pack.py +166 -0
  176. package/skills/docx/scripts/templates/comments.xml +3 -0
  177. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  178. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  179. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  180. package/skills/docx/scripts/templates/people.xml +3 -0
  181. package/skills/docx/scripts/unpack.py +134 -0
  182. package/skills/longform-video-generation/SKILL.md +298 -0
  183. package/skills/longform-video-generation/references/advanced_techniques.md +474 -0
  184. package/skills/longform-video-generation/references/google_api_guide.md +288 -0
  185. package/skills/longform-video-generation/scripts/video_generator.py +579 -0
  186. package/skills/pdf/FORMS.md +305 -0
  187. package/skills/pdf/REFERENCE.md +612 -0
  188. package/skills/pdf/SKILL.md +293 -0
  189. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  190. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  191. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  192. package/skills/pdf/scripts/create_validation_image.py +41 -0
  193. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  194. package/skills/pdf/scripts/extract_form_structure.py +124 -0
  195. package/skills/pdf/scripts/fill_fillable_fields.py +116 -0
  196. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +136 -0
  197. package/skills/pptx/SKILL.md +171 -0
  198. package/skills/pptx/editing.md +205 -0
  199. package/skills/pptx/pptxgenjs.md +377 -0
  200. package/skills/pptx/scripts/add_slide.py +225 -0
  201. package/skills/pptx/scripts/clean.py +309 -0
  202. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  203. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  204. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  205. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  206. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  207. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  208. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  209. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  210. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  211. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  212. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  213. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  214. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  215. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  216. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  217. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  218. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  219. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  220. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  221. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  222. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  223. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  224. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  225. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  226. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  227. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  228. package/skills/pptx/scripts/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  229. package/skills/pptx/scripts/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  230. package/skills/pptx/scripts/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  231. package/skills/pptx/scripts/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  232. package/skills/pptx/scripts/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  233. package/skills/pptx/scripts/ooxml/schemas/mce/mc.xsd +75 -0
  234. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  235. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  236. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  237. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  238. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  239. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  240. package/skills/pptx/scripts/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  241. package/skills/pptx/scripts/ooxml/scripts/pack.py +159 -0
  242. package/skills/pptx/scripts/ooxml/scripts/unpack.py +29 -0
  243. package/skills/pptx/scripts/ooxml/scripts/validate.py +106 -0
  244. package/skills/pptx/scripts/ooxml/scripts/validation/__init__.py +15 -0
  245. package/skills/pptx/scripts/ooxml/scripts/validation/base.py +1023 -0
  246. package/skills/pptx/scripts/ooxml/scripts/validation/docx.py +519 -0
  247. package/skills/pptx/scripts/ooxml/scripts/validation/pptx.py +315 -0
  248. package/skills/pptx/scripts/ooxml/scripts/validation/redlining.py +284 -0
  249. package/skills/pptx/scripts/pack.py +168 -0
  250. package/skills/pptx/scripts/thumbnail.py +318 -0
  251. package/skills/pptx/scripts/unpack.py +86 -0
  252. package/skills/xlsx/SKILL.md +291 -0
  253. package/skills/xlsx/recalc.py +247 -0
@@ -0,0 +1,251 @@
1
+ /**
2
+ * CoStar Server Executor - Spotify Tool
3
+ *
4
+ * Search Spotify for tracks, albums, artists, and playlists.
5
+ * Uses Spotify Web API with client credentials flow (no user login needed).
6
+ * Search + info only — cannot control playback (server has no speakers).
7
+ *
8
+ * Requires: SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET env vars.
9
+ */
10
+ import { Type } from "@sinclair/typebox";
11
+ import { jsonResult, readStringParam, readNumberParam } from "../utils/tool-helpers.js";
12
+ const SpotifySchema = Type.Object({
13
+ operation: Type.Union([
14
+ Type.Literal("search"),
15
+ Type.Literal("get_track"),
16
+ Type.Literal("get_artist"),
17
+ Type.Literal("get_album"),
18
+ Type.Literal("get_playlist"),
19
+ ], {
20
+ description: "Operation: search (find music), get_track (track details), get_artist (artist info + top tracks), get_album (album tracks), get_playlist (playlist tracks)",
21
+ }),
22
+ query: Type.Optional(Type.String({ description: "Search query. Required for search." })),
23
+ type: Type.Optional(Type.Union([
24
+ Type.Literal("track"),
25
+ Type.Literal("artist"),
26
+ Type.Literal("album"),
27
+ Type.Literal("playlist"),
28
+ ], { description: "Type of content to search for. Default: track. Used with search." })),
29
+ id: Type.Optional(Type.String({ description: "Spotify ID. Required for get_track, get_artist, get_album, get_playlist." })),
30
+ limit: Type.Optional(Type.Number({ description: "Number of results. Default: 10. Max: 50. Used with search." })),
31
+ });
32
+ /** Cached access token */
33
+ let cachedToken = null;
34
+ /**
35
+ * Get Spotify access token via client credentials flow
36
+ */
37
+ async function getSpotifyToken() {
38
+ // Return cached token if still valid (with 60s buffer)
39
+ if (cachedToken && Date.now() < cachedToken.expiresAt - 60_000) {
40
+ return cachedToken.token;
41
+ }
42
+ const clientId = process.env.SPOTIFY_CLIENT_ID;
43
+ const clientSecret = process.env.SPOTIFY_CLIENT_SECRET;
44
+ if (!clientId || !clientSecret) {
45
+ throw new Error("SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET are required");
46
+ }
47
+ const response = await fetch("https://accounts.spotify.com/api/token", {
48
+ method: "POST",
49
+ headers: {
50
+ "Content-Type": "application/x-www-form-urlencoded",
51
+ Authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
52
+ },
53
+ body: "grant_type=client_credentials",
54
+ });
55
+ if (!response.ok) {
56
+ throw new Error(`Spotify auth failed (${response.status}): ${await response.text()}`);
57
+ }
58
+ const data = await response.json();
59
+ cachedToken = {
60
+ token: data.access_token,
61
+ expiresAt: Date.now() + data.expires_in * 1000,
62
+ };
63
+ return cachedToken.token;
64
+ }
65
+ /**
66
+ * Make an authenticated Spotify API call
67
+ */
68
+ async function spotifyApi(path) {
69
+ const token = await getSpotifyToken();
70
+ const response = await fetch(`https://api.spotify.com/v1${path}`, {
71
+ headers: { Authorization: `Bearer ${token}` },
72
+ });
73
+ if (!response.ok) {
74
+ const errText = await response.text();
75
+ throw new Error(`Spotify API error (${response.status}): ${errText}`);
76
+ }
77
+ return response.json();
78
+ }
79
+ /**
80
+ * Format milliseconds to mm:ss
81
+ */
82
+ function formatDuration(ms) {
83
+ const minutes = Math.floor(ms / 60000);
84
+ const seconds = Math.floor((ms % 60000) / 1000);
85
+ return `${minutes}:${seconds.toString().padStart(2, "0")}`;
86
+ }
87
+ export function createSpotifyTool() {
88
+ return {
89
+ name: "spotify",
90
+ label: "Spotify",
91
+ description: "Search Spotify for tracks, albums, artists, and playlists. Get details and share Spotify links. Cannot control playback — server has no speakers. Requires SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET env vars.",
92
+ parameters: SpotifySchema,
93
+ execute: async (_toolCallId, params) => {
94
+ const operation = readStringParam(params, "operation", { required: true });
95
+ try {
96
+ switch (operation) {
97
+ case "search": {
98
+ const query = readStringParam(params, "query", { required: true });
99
+ const type = readStringParam(params, "type") || "track";
100
+ const limit = readNumberParam(params, "limit") || 10;
101
+ console.log(`[SPOTIFY] Searching ${type}: "${query}" (limit: ${limit})`);
102
+ const data = await spotifyApi(`/search?q=${encodeURIComponent(query)}&type=${type}&limit=${limit}`);
103
+ // Extract items from the appropriate key (tracks, artists, albums, playlists)
104
+ const key = `${type}s`;
105
+ const container = data[key];
106
+ const items = (container?.items || []);
107
+ const results = items.map((item) => {
108
+ const base = {
109
+ id: item.id,
110
+ name: item.name,
111
+ url: item.external_urls?.spotify,
112
+ };
113
+ if (type === "track") {
114
+ const artists = item.artists || [];
115
+ base.artists = artists.map((a) => a.name).join(", ");
116
+ base.album = item.album?.name;
117
+ base.duration = formatDuration(item.duration_ms);
118
+ base.popularity = item.popularity;
119
+ }
120
+ else if (type === "artist") {
121
+ base.genres = item.genres;
122
+ base.followers = item.followers?.total;
123
+ base.popularity = item.popularity;
124
+ }
125
+ else if (type === "album") {
126
+ const artists = item.artists || [];
127
+ base.artists = artists.map((a) => a.name).join(", ");
128
+ base.total_tracks = item.total_tracks;
129
+ base.release_date = item.release_date;
130
+ }
131
+ else if (type === "playlist") {
132
+ base.owner = item.owner?.display_name;
133
+ base.total_tracks = item.tracks?.total;
134
+ }
135
+ return base;
136
+ });
137
+ return jsonResult({ query, type, count: results.length, results });
138
+ }
139
+ case "get_track": {
140
+ const id = readStringParam(params, "id", { required: true });
141
+ console.log(`[SPOTIFY] Getting track ${id}`);
142
+ const data = await spotifyApi(`/tracks/${id}`);
143
+ const artists = data.artists || [];
144
+ return jsonResult({
145
+ id: data.id,
146
+ name: data.name,
147
+ artists: artists.map((a) => a.name).join(", "),
148
+ album: data.album?.name,
149
+ duration: formatDuration(data.duration_ms),
150
+ popularity: data.popularity,
151
+ preview_url: data.preview_url,
152
+ url: data.external_urls?.spotify,
153
+ release_date: data.album?.release_date,
154
+ });
155
+ }
156
+ case "get_artist": {
157
+ const id = readStringParam(params, "id", { required: true });
158
+ console.log(`[SPOTIFY] Getting artist ${id}`);
159
+ const [artist, topTracks] = await Promise.all([
160
+ spotifyApi(`/artists/${id}`),
161
+ spotifyApi(`/artists/${id}/top-tracks?market=US`),
162
+ ]);
163
+ const tracks = (topTracks.tracks || []).map((t) => ({
164
+ name: t.name,
165
+ album: t.album?.name,
166
+ duration: formatDuration(t.duration_ms),
167
+ popularity: t.popularity,
168
+ url: t.external_urls?.spotify,
169
+ }));
170
+ return jsonResult({
171
+ id: artist.id,
172
+ name: artist.name,
173
+ genres: artist.genres,
174
+ followers: artist.followers?.total,
175
+ popularity: artist.popularity,
176
+ url: artist.external_urls?.spotify,
177
+ top_tracks: tracks,
178
+ });
179
+ }
180
+ case "get_album": {
181
+ const id = readStringParam(params, "id", { required: true });
182
+ console.log(`[SPOTIFY] Getting album ${id}`);
183
+ const data = await spotifyApi(`/albums/${id}`);
184
+ const artists = data.artists || [];
185
+ const trackItems = (data.tracks?.items || []);
186
+ const tracks = trackItems.map((t, i) => ({
187
+ track_number: i + 1,
188
+ name: t.name,
189
+ duration: formatDuration(t.duration_ms),
190
+ url: t.external_urls?.spotify,
191
+ }));
192
+ return jsonResult({
193
+ id: data.id,
194
+ name: data.name,
195
+ artists: artists.map((a) => a.name).join(", "),
196
+ release_date: data.release_date,
197
+ total_tracks: data.total_tracks,
198
+ url: data.external_urls?.spotify,
199
+ tracks,
200
+ });
201
+ }
202
+ case "get_playlist": {
203
+ const id = readStringParam(params, "id", { required: true });
204
+ console.log(`[SPOTIFY] Getting playlist ${id}`);
205
+ const data = await spotifyApi(`/playlists/${id}`);
206
+ const trackContainer = data.tracks;
207
+ const trackItems = (trackContainer?.items || []);
208
+ const tracks = trackItems.slice(0, 50).map((item) => {
209
+ const t = item.track;
210
+ if (!t)
211
+ return null;
212
+ const artists = t.artists || [];
213
+ return {
214
+ name: t.name,
215
+ artists: artists.map((a) => a.name).join(", "),
216
+ duration: formatDuration(t.duration_ms),
217
+ url: t.external_urls?.spotify,
218
+ };
219
+ }).filter(Boolean);
220
+ return jsonResult({
221
+ id: data.id,
222
+ name: data.name,
223
+ owner: data.owner?.display_name,
224
+ description: data.description,
225
+ total_tracks: trackContainer?.total || 0,
226
+ url: data.external_urls?.spotify,
227
+ tracks,
228
+ });
229
+ }
230
+ default:
231
+ return jsonResult({
232
+ error: "invalid_operation",
233
+ message: `Unknown operation: ${operation}. Use: search, get_track, get_artist, get_album, get_playlist`,
234
+ });
235
+ }
236
+ }
237
+ catch (error) {
238
+ console.error(`[SPOTIFY] Error (${operation}):`, error);
239
+ const msg = error instanceof Error ? error.message : String(error);
240
+ if (msg.includes("SPOTIFY_CLIENT_ID")) {
241
+ return jsonResult({
242
+ error: "not_configured",
243
+ message: "Spotify is not configured. SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET are required.",
244
+ });
245
+ }
246
+ return jsonResult({ error: `${operation}_failed`, message: msg });
247
+ }
248
+ },
249
+ };
250
+ }
251
+ //# sourceMappingURL=spotify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotify.js","sourceRoot":"","sources":["../../src/tools/spotify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * CoStar Server Executor - Subagents Management Tool
3
+ * Ported from OpenClaw's agents/tools/subagents-tool.ts
4
+ *
5
+ * Differences from OpenClaw:
6
+ * - No steer action (requires aborting + re-prompting, deferred for v1)
7
+ * - No gateway RPC calls (no callGateway, no session store lookups)
8
+ * - No cascade kill (depth=1 means no grandchildren possible)
9
+ * - Uses in-memory SubagentRegistry instead of disk/Supabase persistence
10
+ * - No multi-agent routing (single agent per user)
11
+ * - Simplified target resolution (index, runId prefix, or label)
12
+ *
13
+ * Matched with OpenClaw:
14
+ * - Same tool name: subagents
15
+ * - Same list action with active/recent split
16
+ * - Same kill action with target resolution
17
+ * - Same formatted output with index, label, status, runtime
18
+ * - Same constants: DEFAULT_RECENT_MINUTES=30, MAX_RECENT_MINUTES=1440
19
+ */
20
+ import type { AnyAgentTool } from "../types/tool.js";
21
+ import type { SubagentToolDeps } from "./sessions-spawn.js";
22
+ export declare function createSubagentsTool(deps: SubagentToolDeps): AnyAgentTool;
23
+ //# sourceMappingURL=subagents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagents.d.ts","sourceRoot":"","sources":["../../src/tools/subagents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAUrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA2D5D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAwJxE"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * CoStar Server Executor - Subagents Management Tool
3
+ * Ported from OpenClaw's agents/tools/subagents-tool.ts
4
+ *
5
+ * Differences from OpenClaw:
6
+ * - No steer action (requires aborting + re-prompting, deferred for v1)
7
+ * - No gateway RPC calls (no callGateway, no session store lookups)
8
+ * - No cascade kill (depth=1 means no grandchildren possible)
9
+ * - Uses in-memory SubagentRegistry instead of disk/Supabase persistence
10
+ * - No multi-agent routing (single agent per user)
11
+ * - Simplified target resolution (index, runId prefix, or label)
12
+ *
13
+ * Matched with OpenClaw:
14
+ * - Same tool name: subagents
15
+ * - Same list action with active/recent split
16
+ * - Same kill action with target resolution
17
+ * - Same formatted output with index, label, status, runtime
18
+ * - Same constants: DEFAULT_RECENT_MINUTES=30, MAX_RECENT_MINUTES=1440
19
+ */
20
+ import { Type } from "@sinclair/typebox";
21
+ import { jsonResult, readStringParam } from "../utils/tool-helpers.js";
22
+ import { listRunsForRequester, resolveTarget, killRun, killAllForSession, formatRunDuration, } from "../subagent/registry.js";
23
+ // ---------- constants (from OpenClaw subagents-tool.ts:46-48) ----------
24
+ const SUBAGENT_ACTIONS = ["list", "kill"];
25
+ const DEFAULT_RECENT_MINUTES = 30;
26
+ const MAX_RECENT_MINUTES = 24 * 60; // 1440
27
+ // ---------- schema (from OpenClaw subagents-tool.ts:54-59, simplified) ----------
28
+ const SubagentsToolSchema = Type.Object({
29
+ action: Type.String({ description: "One of: list, kill" }),
30
+ target: Type.Optional(Type.String({ description: "For kill: 1-based index from list, runId prefix, label, or 'all'" })),
31
+ recentMinutes: Type.Optional(Type.Number({ description: "Time window for 'recent' completed runs (default: 30, max: 1440)" })),
32
+ });
33
+ // ---------- helpers (from OpenClaw subagents-tool.ts:72-84, 118-128, 318-338) ----------
34
+ function resolveRunStatus(entry) {
35
+ // OpenClaw: subagents-tool.ts:72-84
36
+ if (entry.status === "running")
37
+ return "running";
38
+ if (entry.status === "completed")
39
+ return "done";
40
+ if (entry.status === "killed")
41
+ return "killed";
42
+ if (entry.status === "timeout")
43
+ return "timeout";
44
+ if (entry.status === "failed")
45
+ return "failed";
46
+ return entry.status;
47
+ }
48
+ function truncateLine(text, maxLen) {
49
+ if (text.length <= maxLen)
50
+ return text;
51
+ return text.slice(0, maxLen - 1) + "…";
52
+ }
53
+ function buildListText(params) {
54
+ // OpenClaw: subagents-tool.ts:318-338
55
+ const lines = [];
56
+ lines.push("active subagents:");
57
+ if (params.active.length === 0) {
58
+ lines.push("(none)");
59
+ }
60
+ else {
61
+ lines.push(...params.active.map((entry) => entry.line));
62
+ }
63
+ lines.push("");
64
+ lines.push(`recent (last ${params.recentMinutes}m):`);
65
+ if (params.recent.length === 0) {
66
+ lines.push("(none)");
67
+ }
68
+ else {
69
+ lines.push(...params.recent.map((entry) => entry.line));
70
+ }
71
+ return lines.join("\n");
72
+ }
73
+ // ---------- tool factory ----------
74
+ export function createSubagentsTool(deps) {
75
+ return {
76
+ label: "Subagents",
77
+ name: "subagents",
78
+ description: `List or kill spawned sub-agents for this session. Use for sub-agent orchestration.
79
+
80
+ Actions:
81
+ - list: Show all active and recently completed sub-agents with index, status, runtime, and task
82
+ - kill: Terminate a running sub-agent by index (from list), runId prefix, label, or 'all'
83
+
84
+ Examples:
85
+ - list all: { "action": "list" }
86
+ - kill by index: { "action": "kill", "target": "1" }
87
+ - kill by label: { "action": "kill", "target": "research" }
88
+ - kill all: { "action": "kill", "target": "all" }`,
89
+ parameters: SubagentsToolSchema,
90
+ execute: async (_toolCallId, params) => {
91
+ const action = (readStringParam(params, "action") ?? "list");
92
+ if (!SUBAGENT_ACTIONS.includes(action)) {
93
+ return jsonResult({
94
+ status: "error",
95
+ error: `Unknown action: ${action}. Valid: ${SUBAGENT_ACTIONS.join(", ")}`,
96
+ });
97
+ }
98
+ const runs = listRunsForRequester(deps.userId);
99
+ const recentMinutesRaw = typeof params.recentMinutes === "number" ? params.recentMinutes : undefined;
100
+ const recentMinutes = recentMinutesRaw
101
+ ? Math.max(1, Math.min(MAX_RECENT_MINUTES, Math.floor(recentMinutesRaw)))
102
+ : DEFAULT_RECENT_MINUTES;
103
+ // ── list ──
104
+ // (OpenClaw: subagents-tool.ts:361-417)
105
+ if (action === "list") {
106
+ const now = Date.now();
107
+ const recentCutoff = now - recentMinutes * 60_000;
108
+ let index = 1;
109
+ const buildListEntry = (entry, runtimeMs) => {
110
+ const status = resolveRunStatus(entry);
111
+ const runtime = formatRunDuration(entry.startedAt, entry.completedAt);
112
+ const label = truncateLine(entry.label || entry.runId.slice(0, 8), 48);
113
+ const task = truncateLine(entry.task.trim(), 72);
114
+ const tokensText = (entry.inputTokens || entry.outputTokens)
115
+ ? `, ${((entry.inputTokens ?? 0) + (entry.outputTokens ?? 0)).toLocaleString()} tokens`
116
+ : "";
117
+ const line = `${index}. ${label} (${runtime}${tokensText}) ${status} - ${task}`;
118
+ const view = {
119
+ index,
120
+ runId: entry.runId,
121
+ label,
122
+ task,
123
+ status,
124
+ runtime,
125
+ runtimeMs,
126
+ startedAt: entry.startedAt,
127
+ ...(entry.completedAt ? { completedAt: entry.completedAt } : {}),
128
+ ...(entry.inputTokens ? { inputTokens: entry.inputTokens } : {}),
129
+ ...(entry.outputTokens ? { outputTokens: entry.outputTokens } : {}),
130
+ };
131
+ index += 1;
132
+ return { line, view };
133
+ };
134
+ const active = runs
135
+ .filter((entry) => entry.status === "running")
136
+ .map((entry) => buildListEntry(entry, now - entry.startedAt));
137
+ const recent = runs
138
+ .filter((entry) => entry.status !== "running" && (entry.completedAt ?? 0) >= recentCutoff)
139
+ .map((entry) => buildListEntry(entry, entry.durationMs ?? 0));
140
+ const text = buildListText({ active, recent, recentMinutes });
141
+ return jsonResult({
142
+ status: "ok",
143
+ action: "list",
144
+ total: runs.length,
145
+ active: active.map((entry) => entry.view),
146
+ recent: recent.map((entry) => entry.view),
147
+ text,
148
+ });
149
+ }
150
+ // ── kill ──
151
+ // (OpenClaw: subagents-tool.ts:419-517)
152
+ if (action === "kill") {
153
+ const target = readStringParam(params, "target", { required: true });
154
+ // Kill all
155
+ if (target === "all" || target === "*") {
156
+ const result = killAllForSession(deps.userId);
157
+ return jsonResult({
158
+ status: "ok",
159
+ action: "kill",
160
+ target: "all",
161
+ killed: result.killed,
162
+ labels: result.labels,
163
+ text: result.killed > 0
164
+ ? `killed ${result.killed} subagent${result.killed === 1 ? "" : "s"}.`
165
+ : "no running subagents to kill.",
166
+ });
167
+ }
168
+ // Resolve target
169
+ const resolved = resolveTarget(deps.userId, target);
170
+ if (!resolved) {
171
+ return jsonResult({
172
+ status: "error",
173
+ action: "kill",
174
+ target,
175
+ error: `Unknown subagent target: "${target}". Use a 1-based index from list, runId prefix, or label.`,
176
+ });
177
+ }
178
+ // Already finished?
179
+ if (resolved.status !== "running") {
180
+ return jsonResult({
181
+ status: "done",
182
+ action: "kill",
183
+ target,
184
+ runId: resolved.runId,
185
+ label: resolved.label,
186
+ text: `${resolved.label || resolved.runId.slice(0, 8)} is already finished (${resolved.status}).`,
187
+ });
188
+ }
189
+ // Kill it
190
+ const killed = killRun(resolved.runId);
191
+ return jsonResult({
192
+ status: killed ? "ok" : "error",
193
+ action: "kill",
194
+ target,
195
+ runId: resolved.runId,
196
+ label: resolved.label,
197
+ text: killed
198
+ ? `killed ${resolved.label || resolved.runId.slice(0, 8)}.`
199
+ : `failed to kill ${resolved.label || resolved.runId.slice(0, 8)}.`,
200
+ });
201
+ }
202
+ return jsonResult({
203
+ status: "error",
204
+ error: `Unknown action: ${action}`,
205
+ });
206
+ },
207
+ };
208
+ }
209
+ //# sourceMappingURL=subagents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagents.js","sourceRoot":"","sources":["../../src/tools/subagents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * CoStar Server Executor - WhatsApp Tool
3
+ *
4
+ * Send and receive WhatsApp messages via Asterizk API.
5
+ * All operations go through POST /email/whatsapp/manage.
6
+ * Uses draft-then-send pattern: draft message → get draft_id → send draft.
7
+ *
8
+ * Operations: send_message, send_media, get_messages, get_messages_by_contact,
9
+ * get_groups, get_contacts
10
+ */
11
+ import type { AnyAgentTool } from "../types/tool.js";
12
+ export declare function createWhatsAppTool(): AnyAgentTool;
13
+ //# sourceMappingURL=whatsapp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/tools/whatsapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkHrD,wBAAgB,kBAAkB,IAAI,YAAY,CAwJjD"}