@aiderdesk/aiderdesk 0.61.0-dev → 0.61.1

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 (196) hide show
  1. package/out/renderer/assets/__vite-browser-external-2447137e-DYxpcVy9.js +4 -0
  2. package/out/renderer/assets/{_baseUniq-Z8t1Ab1g.js → _baseUniq-BPF2Herp.js} +21 -197
  3. package/out/renderer/assets/{arc-CwESpVYE.js → arc-DfPLteHF.js} +1 -1
  4. package/out/renderer/assets/{architectureDiagram-2XIMDMQ5-C490EQr5.js → architectureDiagram-Q4EWVU46-Bw0u-sSH.js} +34 -20
  5. package/out/renderer/assets/{blockDiagram-WCTKOSBZ-DbHssxrQ.js → blockDiagram-DXYQGD6D-CkfB9if8.js} +21 -8
  6. package/out/renderer/assets/{c4Diagram-IC4MRINW-BxE3GUKu.js → c4Diagram-AHTNJAMY-DweK9Liz.js} +31 -35
  7. package/out/renderer/assets/{channel-C9hJq_Xr.js → channel-C5wwrRof.js} +1 -1
  8. package/out/renderer/assets/{chunk-4BX2VUAB-ChcKNpL6.js → chunk-4BX2VUAB-0KM14cFd.js} +1 -1
  9. package/out/renderer/assets/{chunk-WL4C6EOR-vhby2fZi.js → chunk-4TB4RGXK-CmVtCVL4.js} +121 -82
  10. package/out/renderer/assets/{chunk-55IACEB6-oLT9lXTt.js → chunk-55IACEB6-BzVYZvBM.js} +1 -1
  11. package/out/renderer/assets/{chunk-KX2RTZJC-D32tV7H-.js → chunk-EDXVE4YY-BryQl5Kv.js} +1 -1
  12. package/out/renderer/assets/{chunk-FMBD7UC4-B5k8rETe.js → chunk-FMBD7UC4-CRiLea_e.js} +1 -1
  13. package/out/renderer/assets/{chunk-NQ4KR5QH-Bmqo2FpL.js → chunk-OYMX7WX6-Cpi4N3NO.js} +32 -15
  14. package/out/renderer/assets/{chunk-QZHKN3VN-8BpGifjS.js → chunk-QZHKN3VN-BT8kABWC.js} +1 -1
  15. package/out/renderer/assets/{chunk-JSJVCQXG-DtjSx6Cj.js → chunk-YZCP3GAM-OLZV_Sef.js} +1 -1
  16. package/out/renderer/assets/{classDiagram-VBA2DB6C-BxRSSb9e.js → classDiagram-6PBFFD2Q-VdE6G90i.js} +6 -6
  17. package/out/renderer/assets/{classDiagram-v2-RAHNMMFH-BxRSSb9e.js → classDiagram-v2-HSJHXN6E-VdE6G90i.js} +6 -6
  18. package/out/renderer/assets/{clone-D9a-uIZa.js → clone-DwQZ86nS.js} +1 -1
  19. package/out/renderer/assets/{cose-bilkent-S5V4N54A-CUqqQ-6R.js → cose-bilkent-S5V4N54A-BEcAKM9H.js} +1 -1
  20. package/out/renderer/assets/{dagre-KLK3FWXG-ORIwMMhq.js → dagre-KV5264BT-BcFQYL1M.js} +6 -6
  21. package/out/renderer/assets/diagram-5BDNPKRD-GrUNdC1u.js +171 -0
  22. package/out/renderer/assets/{diagram-E7M64L7V-bS9HcoDQ.js → diagram-G4DWMVQ6-CG4S-ov5.js} +15 -13
  23. package/out/renderer/assets/{diagram-IFDJBPK2-BRlTIR0J.js → diagram-MMDJMWI5-9ogY3MRC.js} +5 -6
  24. package/out/renderer/assets/{diagram-P4PSJMXO-jsjGwH-p.js → diagram-TYMM5635-Ck7mI1bS.js} +5 -6
  25. package/out/renderer/assets/{erDiagram-INFDFZHY-DGlgjHOQ.js → erDiagram-SMLLAGMA-Dvf_c-7M.js} +81 -35
  26. package/out/renderer/assets/{flowDiagram-PKNHOUZH-CzLC87bM.js → flowDiagram-DWJPFMVM-CPDjOXYp.js} +27 -45
  27. package/out/renderer/assets/{ganttDiagram-A5KZAMGK-BbDv36wT.js → ganttDiagram-T4ZO3ILL-B4dJrK-3.js} +17 -8
  28. package/out/renderer/assets/{gitGraphDiagram-K3NZZRJ6-CBQnBjEi.js → gitGraphDiagram-UUTBAWPF-De2eCfMN.js} +244 -67
  29. package/out/renderer/assets/{graph-Dl5N6maZ.js → graph-BFn23kR_.js} +175 -3
  30. package/out/renderer/assets/{index-MDHavDF9.js → index-BL-57WPa.js} +15877 -20787
  31. package/out/renderer/assets/{index-CDCy_DhA.css → index-BkntVzTm.css} +114 -301
  32. package/out/renderer/assets/{infoDiagram-LFFYTUFH-GtEDBEmz.js → infoDiagram-42DDH7IO-BIt9B6mQ.js} +5 -6
  33. package/out/renderer/assets/{ishikawaDiagram-PHBUUO56-Uj90gr3I.js → ishikawaDiagram-UXIWVN3A-CXZs0KGV.js} +3 -3
  34. package/out/renderer/assets/{journeyDiagram-4ABVD52K-DekFuOwS.js → journeyDiagram-VCZTEJTY-B-EXuj5b.js} +14 -13
  35. package/out/renderer/assets/{kanban-definition-K7BYSVSG-Hfz2L6NS.js → kanban-definition-6JOO6SKY-ByvN0qaD.js} +5 -2
  36. package/out/renderer/assets/{layout-B9K2VT39.js → layout-BpybWUv6.js} +117 -4
  37. package/out/renderer/assets/min-DB8ixvoT.js +41 -0
  38. package/out/renderer/assets/{mindmap-definition-YRQLILUH-DDcS7_GH.js → mindmap-definition-QFDTVHPH-Do-I-At8.js} +69 -13
  39. package/out/renderer/assets/{pieDiagram-SKSYHLDU-DwjEcJ0Q.js → pieDiagram-DEJITSTG-Cnpf6Gt6.js} +20 -13
  40. package/out/renderer/assets/{quadrantDiagram-337W2JSQ-CpGqN7vo.js → quadrantDiagram-34T5L4WZ-VcOb1qLd.js} +1 -1
  41. package/out/renderer/assets/{requirementDiagram-Z7DCOOCP-qDRUf1ip.js → requirementDiagram-MS252O5E-VJs9Hpaw.js} +42 -11
  42. package/out/renderer/assets/{sankeyDiagram-WA2Y5GQK-DRKS8C1H.js → sankeyDiagram-XADWPNL6-BoXxgLvi.js} +1 -1
  43. package/out/renderer/assets/{sequenceDiagram-2WXFIKYE-DhVN2ug2.js → sequenceDiagram-FGHM5R23-b69hQjSp.js} +446 -220
  44. package/out/renderer/assets/{stateDiagram-RAJIS63D-BpP4eSqu.js → stateDiagram-FHFEXIEX-BK7E-REm.js} +10 -9
  45. package/out/renderer/assets/{stateDiagram-v2-FVOUBMTO-B_qQJqra.js → stateDiagram-v2-QKLJ7IA2-Cd2wfCQu.js} +4 -4
  46. package/out/renderer/assets/{timeline-definition-YZTLITO2-UoWXE_76.js → timeline-definition-GMOUNBTQ-Bl-MTfK5.js} +445 -71
  47. package/out/renderer/assets/{vennDiagram-LZ73GAT5-Dp1FZ609.js → vennDiagram-DHZGUBPP-DNmr1k2L.js} +1 -1
  48. package/out/renderer/assets/{treemap-KZPCXAKY-W2a2L6ff.js → wardley-RL74JXVD-DTbxPMj9.js} +1474 -977
  49. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BWw08wtD.js +901 -0
  50. package/out/renderer/assets/{xychartDiagram-JWTSCODW-CTzYHTbD.js → xychartDiagram-5P7HB3ND-EEYPnLDT.js} +20 -4
  51. package/out/renderer/index.html +3 -3
  52. package/out/renderer/progress.html +212 -62
  53. package/out/resources/mcp-server/aider-desk-mcp-server.js +642 -402
  54. package/out/resources/skills/extension-creator/SKILL.md +320 -0
  55. package/out/resources/skills/extension-creator/assets/templates/Component.jsx.template +76 -0
  56. package/out/resources/skills/extension-creator/assets/templates/ConfigComponent.jsx.template +38 -0
  57. package/out/resources/skills/extension-creator/assets/templates/folder-extension/config.ts.template +29 -0
  58. package/out/resources/skills/extension-creator/assets/templates/folder-extension/index.ts.template +42 -0
  59. package/out/resources/skills/extension-creator/assets/templates/folder-extension/package.json +12 -0
  60. package/out/resources/skills/extension-creator/assets/templates/folder-extension/tsconfig.json +23 -0
  61. package/out/resources/skills/extension-creator/assets/templates/folder-extension-with-config/index.ts.template +80 -0
  62. package/out/resources/skills/extension-creator/assets/templates/single-file.ts.template +30 -0
  63. package/out/resources/skills/extension-creator/assets/templates/ui-component-external.ts.template +91 -0
  64. package/out/resources/skills/extension-creator/assets/templates/ui-component.ts.template +79 -0
  65. package/out/resources/skills/extension-creator/references/command-definition.md +170 -0
  66. package/out/resources/skills/extension-creator/references/config-components.md +427 -0
  67. package/out/resources/skills/extension-creator/references/event-types.md +156 -0
  68. package/out/resources/skills/extension-creator/references/examples-gallery.md +583 -0
  69. package/out/resources/skills/extension-creator/references/extension-interface.md +240 -0
  70. package/out/resources/skills/extension-creator/references/extension-types.md +186 -0
  71. package/out/resources/skills/extension-creator/references/in-repo-flow.md +132 -0
  72. package/out/resources/skills/extension-creator/references/install-targets.md +96 -0
  73. package/out/resources/skills/extension-creator/references/project-global-flow.md +76 -0
  74. package/out/resources/skills/extension-creator/references/ui-components.md +663 -0
  75. package/out/runner.js +976 -386
  76. package/package.json +2 -3
  77. package/out/renderer/assets/_basePickBy-BWoXHZ8Z.js +0 -161
  78. package/out/renderer/assets/apl-fqmucPXA.js +0 -140
  79. package/out/renderer/assets/asciiarmor-DucZyvP0.js +0 -56
  80. package/out/renderer/assets/asn1-BnOEsgAm.js +0 -144
  81. package/out/renderer/assets/asterisk-QAlztEwS.js +0 -345
  82. package/out/renderer/assets/brainfuck-DZVCuF_t.js +0 -53
  83. package/out/renderer/assets/clike-xqXYL6ge.js +0 -805
  84. package/out/renderer/assets/clojure-BhXMqnxz.js +0 -849
  85. package/out/renderer/assets/cmake-BGaNd9E7.js +0 -71
  86. package/out/renderer/assets/cobol-4yqQntpt.js +0 -120
  87. package/out/renderer/assets/coffeescript-D2dXvhEc.js +0 -308
  88. package/out/renderer/assets/commonlisp-CF_VNHQR.js +0 -130
  89. package/out/renderer/assets/crystal-DyuLTqLs.js +0 -398
  90. package/out/renderer/assets/css-c-jst79C.js +0 -1783
  91. package/out/renderer/assets/cypher-Dlu_3r4V.js +0 -121
  92. package/out/renderer/assets/d-UURgV0Ux.js +0 -179
  93. package/out/renderer/assets/diff-B_Bi2Crb.js +0 -25
  94. package/out/renderer/assets/dockerfile-Bvk733Ga.js +0 -201
  95. package/out/renderer/assets/dtd-Dy74G54E.js +0 -114
  96. package/out/renderer/assets/dylan-TSb-Nfix.js +0 -314
  97. package/out/renderer/assets/ebnf-4fKAGW3a.js +0 -140
  98. package/out/renderer/assets/ecl-B59qGGVg.js +0 -178
  99. package/out/renderer/assets/eiffel-Dze7nlu3.js +0 -134
  100. package/out/renderer/assets/elm-DG7jkhNZ.js +0 -176
  101. package/out/renderer/assets/erlang-BO6gOnGA.js +0 -674
  102. package/out/renderer/assets/factor-CMxFHDqz.js +0 -65
  103. package/out/renderer/assets/fcl-CDDUNjTj.js +0 -141
  104. package/out/renderer/assets/forth-B9D2JCeE.js +0 -116
  105. package/out/renderer/assets/fortran-CAG2BFbe.js +0 -467
  106. package/out/renderer/assets/gas-d3KEcW3x.js +0 -294
  107. package/out/renderer/assets/gherkin-DhZlEZiy.js +0 -115
  108. package/out/renderer/assets/groovy-CpwJiBl7.js +0 -223
  109. package/out/renderer/assets/haskell-ySd-OUo8.js +0 -459
  110. package/out/renderer/assets/haxe-7MlzfeYV.js +0 -514
  111. package/out/renderer/assets/http-BqypyemW.js +0 -79
  112. package/out/renderer/assets/idl-4HIGJlDI.js +0 -985
  113. package/out/renderer/assets/index-6qedlt0q.js +0 -689
  114. package/out/renderer/assets/index-86jDpUJn.js +0 -385
  115. package/out/renderer/assets/index-BRjO8ber.js +0 -332
  116. package/out/renderer/assets/index-BVgw7j0d.js +0 -312
  117. package/out/renderer/assets/index-BhkyI1q3.js +0 -642
  118. package/out/renderer/assets/index-BqrmLPkg.js +0 -82
  119. package/out/renderer/assets/index-BuPbw4xM.js +0 -178
  120. package/out/renderer/assets/index-CTO-LPBg.js +0 -311
  121. package/out/renderer/assets/index-CTO4SzlI.js +0 -97
  122. package/out/renderer/assets/index-CZ9IQK_0.js +0 -2488
  123. package/out/renderer/assets/index-CZxsVxBZ.js +0 -1765
  124. package/out/renderer/assets/index-DIXV-3Xn.js +0 -406
  125. package/out/renderer/assets/index-DNzOtZX5.js +0 -61
  126. package/out/renderer/assets/index-DZtJe7oC.js +0 -1019
  127. package/out/renderer/assets/index-DaWjZz_g.js +0 -291
  128. package/out/renderer/assets/index-De056HHR.js +0 -151
  129. package/out/renderer/assets/index-Dk3wSDSN.js +0 -117
  130. package/out/renderer/assets/index-Dy4VRsnA.js +0 -1041
  131. package/out/renderer/assets/index-FnnayPBc.js +0 -82
  132. package/out/renderer/assets/index-MZb_zy6R.js +0 -704
  133. package/out/renderer/assets/index-chzQl8rJ.js +0 -157
  134. package/out/renderer/assets/index-s-Owx3Pm.js +0 -327
  135. package/out/renderer/assets/javascript-C_OHM9hj.js +0 -994
  136. package/out/renderer/assets/julia-Bs6JJhYG.js +0 -407
  137. package/out/renderer/assets/livescript-DmzgM3Yt.js +0 -296
  138. package/out/renderer/assets/lua-8cJgIlqe.js +0 -256
  139. package/out/renderer/assets/mathematica-DNLOL9PQ.js +0 -110
  140. package/out/renderer/assets/mbox-Ga7d4MMN.js +0 -117
  141. package/out/renderer/assets/mirc-Dma3B8rS.js +0 -107
  142. package/out/renderer/assets/mllike-DHn7xckP.js +0 -334
  143. package/out/renderer/assets/modelica-0d55jYY0.js +0 -147
  144. package/out/renderer/assets/mscgen-DdqZYINH.js +0 -135
  145. package/out/renderer/assets/mumps-Btr8VblO.js +0 -93
  146. package/out/renderer/assets/nginx-DTDtBDVN.js +0 -141
  147. package/out/renderer/assets/nsis-3zG7tgur.js +0 -62
  148. package/out/renderer/assets/ntriples-CvgOYMpL.js +0 -153
  149. package/out/renderer/assets/octave-DYBj3-tl.js +0 -200
  150. package/out/renderer/assets/oz-R_e8WMIi.js +0 -231
  151. package/out/renderer/assets/pascal-GD8iposT.js +0 -105
  152. package/out/renderer/assets/perl-DL9mHpoi.js +0 -1105
  153. package/out/renderer/assets/pig-C_4T4YIV.js +0 -101
  154. package/out/renderer/assets/powershell-B0suO7Vd.js +0 -328
  155. package/out/renderer/assets/properties-BR-vP1aU.js +0 -58
  156. package/out/renderer/assets/protobuf-BxgpyhoW.js +0 -77
  157. package/out/renderer/assets/pug-CTXt1f8z.js +0 -405
  158. package/out/renderer/assets/puppet-Bdao66PW.js +0 -137
  159. package/out/renderer/assets/python-CvWbmiX4.js +0 -427
  160. package/out/renderer/assets/q-CrbCVq4a.js +0 -131
  161. package/out/renderer/assets/r-V7nswm59.js +0 -170
  162. package/out/renderer/assets/rpm-C-DLY-If.js +0 -109
  163. package/out/renderer/assets/ruby-JDKLJNK0.js +0 -330
  164. package/out/renderer/assets/sas-D2UG-yhZ.js +0 -207
  165. package/out/renderer/assets/scheme-BKzrkGJD.js +0 -222
  166. package/out/renderer/assets/shell-BlsXDxCn.js +0 -222
  167. package/out/renderer/assets/sieve-CjwBwOY5.js +0 -135
  168. package/out/renderer/assets/simple-mode-DMneyfDu.js +0 -130
  169. package/out/renderer/assets/smalltalk-BOIGQuhN.js +0 -121
  170. package/out/renderer/assets/solr-CwD7U71z.js +0 -69
  171. package/out/renderer/assets/sparql-DYskk2vE.js +0 -249
  172. package/out/renderer/assets/spreadsheet-Bgtt3oLP.js +0 -87
  173. package/out/renderer/assets/sql-BSrOzCRI.js +0 -354
  174. package/out/renderer/assets/stex-B6LNC55o.js +0 -231
  175. package/out/renderer/assets/stylus-BkS-boTH.js +0 -565
  176. package/out/renderer/assets/swift-FRZi1uvB.js +0 -291
  177. package/out/renderer/assets/tcl-CUcaCdmq.js +0 -114
  178. package/out/renderer/assets/textile-BnFpjsrl.js +0 -414
  179. package/out/renderer/assets/tiddlywiki-CjprD-Qp.js +0 -218
  180. package/out/renderer/assets/tiki-DK9DOeWn.js +0 -268
  181. package/out/renderer/assets/toml-BOuWGMcf.js +0 -76
  182. package/out/renderer/assets/troff-E1bJ0PPL.js +0 -61
  183. package/out/renderer/assets/ttcn-cfg-Dc39-fIP.js +0 -133
  184. package/out/renderer/assets/ttcn-tKd4HLu4.js +0 -192
  185. package/out/renderer/assets/turtle-Dq7-1WAf.js +0 -124
  186. package/out/renderer/assets/vb-Dp90gtsv.js +0 -196
  187. package/out/renderer/assets/vbscript-CI6_mxxU.js +0 -479
  188. package/out/renderer/assets/velocity-BwIZK1TH.js +0 -149
  189. package/out/renderer/assets/verilog-DDCYnHN8.js +0 -430
  190. package/out/renderer/assets/vhdl-DCkMIyT9.js +0 -158
  191. package/out/renderer/assets/webidl-BTLTThCm.js +0 -204
  192. package/out/renderer/assets/xquery-BrBUuxMR.js +0 -525
  193. package/out/renderer/assets/yacas-b5lAVEIl.js +0 -130
  194. package/out/renderer/assets/z80-BZV19vqv.js +0 -93
  195. package/scripts/download-uv.mjs +0 -147
  196. /package/patches/{ai+5.0.161.patch → ai+5.0.167.patch} +0 -0
@@ -0,0 +1,240 @@
1
+ # Extension Interface
2
+
3
+ Full TypeScript interface for AiderDesk extensions.
4
+
5
+ ## Extension Interface
6
+
7
+ ```typescript
8
+ interface Extension {
9
+ // Lifecycle
10
+ onLoad?(context: ExtensionContext): Promise<void> | void;
11
+ onUnload?(context: ExtensionContext): Promise<void> | void;
12
+
13
+ // Registration
14
+ getCommands?(context: ExtensionContext): CommandDefinition[];
15
+ getTools?(context: ExtensionContext, mode: string, agentProfile: AgentProfile): ToolDefinition[];
16
+ getAgents?(context: ExtensionContext): AgentProfile[];
17
+ getModes?(context: ExtensionContext): ModeDefinition[];
18
+ getUIComponents?(context: ExtensionContext): UIComponentDefinition[];
19
+
20
+ // UI Component support
21
+ getUIExtensionData?(componentId: string, context: ExtensionContext): Promise<unknown>;
22
+ executeUIExtensionAction?(componentId: string, action: string, args: unknown[], context: ExtensionContext): Promise<unknown>;
23
+
24
+ // Settings configuration (per-extension settings UI)
25
+ getConfigComponent?(context: ExtensionContext): string | undefined;
26
+ getConfigData?(context: ExtensionContext): Promise<unknown>;
27
+ saveConfigData?(configData: unknown, context: ExtensionContext): Promise<unknown>;
28
+
29
+ // Task Events
30
+ onTaskCreated?(event: TaskCreatedEvent, context: ExtensionContext): Promise<void | Partial<TaskCreatedEvent>>;
31
+ onTaskInitialized?(event: TaskInitializedEvent, context: ExtensionContext): Promise<void>;
32
+ onTaskClosed?(event: TaskClosedEvent, context: ExtensionContext): Promise<void>;
33
+
34
+ // Agent Events
35
+ onAgentStarted?(event: AgentStartedEvent, context: ExtensionContext): Promise<void | Partial<AgentStartedEvent>>;
36
+ onAgentFinished?(event: AgentFinishedEvent, context: ExtensionContext): Promise<void | Partial<AgentFinishedEvent>>;
37
+ onAgentStepFinished?(event: AgentStepFinishedEvent, context: ExtensionContext): Promise<void | Partial<AgentStepFinishedEvent>>;
38
+ onAgentProfileUpdated?(context: ExtensionContext, agentId: string, updatedProfile: AgentProfile): Promise<AgentProfile>;
39
+
40
+ // Tool Events
41
+ onToolApproval?(event: ToolApprovalEvent, context: ExtensionContext): Promise<void | Partial<ToolApprovalEvent>>;
42
+ onToolCalled?(event: ToolCalledEvent, context: ExtensionContext): Promise<void | Partial<ToolCalledEvent>>;
43
+ onToolFinished?(event: ToolFinishedEvent, context: ExtensionContext): Promise<void | Partial<ToolFinishedEvent>>;
44
+
45
+ // File Events
46
+ onFileAdded?(event: FileAddedEvent, context: ExtensionContext): Promise<void>;
47
+ onFileDropped?(event: FileDroppedEvent, context: ExtensionContext): Promise<void>;
48
+
49
+ // Prompt Events
50
+ onPromptSubmitted?(event: PromptSubmittedEvent, context: ExtensionContext): Promise<void | Partial<PromptSubmittedEvent>>;
51
+ onPromptStarted?(event: PromptStartedEvent, context: ExtensionContext): Promise<void>;
52
+ onPromptFinished?(event: PromptFinishedEvent, context: ExtensionContext): Promise<void>;
53
+
54
+ // Message Events
55
+ onResponseMessageProcessed?(event: ResponseMessageProcessedEvent, context: ExtensionContext): Promise<void | Partial<ResponseMessageProcessedEvent>>;
56
+
57
+ // Other Events
58
+ onProjectOpen?(context: ExtensionContext): Promise<void>;
59
+ onRuleFilesRetrieved?(context: ExtensionContext, ruleFiles: string[]): Promise<string[]>;
60
+ onSubagentStarted?(event: SubagentStartedEvent, context: ExtensionContext): Promise<void | Partial<SubagentStartedEvent>>;
61
+ onSubagentFinished?(event: SubagentFinishedEvent, context: ExtensionContext): Promise<void>;
62
+ onQuestionAsked?(event: QuestionAskedEvent, context: ExtensionContext): Promise<void>;
63
+ onQuestionAnswered?(event: QuestionAnsweredEvent, context: ExtensionContext): Promise<void>;
64
+ onCommandExecuted?(event: CommandExecutedEvent, context: ExtensionContext): Promise<void>;
65
+ }
66
+ ```
67
+
68
+ ## ExtensionContext
69
+
70
+ ```typescript
71
+ interface ExtensionContext {
72
+ // Logging (backend/dev console only — NOT visible to users in chat UI)
73
+ log(message: string, type: 'info' | 'error' | 'warn' | 'debug'): void;
74
+
75
+ // Project access
76
+ getProjectDir(): string;
77
+ getTaskContext(): TaskContext | null;
78
+ getProjectContext(): ProjectContext;
79
+
80
+ // Settings
81
+ getSetting(key: string): Promise<unknown>;
82
+ updateSettings(updates: Record<string, unknown>): Promise<void>;
83
+
84
+ // Models
85
+ getModelConfigs(): Promise<Model[]>;
86
+
87
+ // UI updates
88
+ triggerUIDataRefresh(componentId?: string, taskId?: string): void;
89
+ triggerUIComponentsReload(): void;
90
+
91
+ // Navigation
92
+ openUrl(url: string, target?: 'external' | 'window' | 'modal-overlay'): Promise<void>;
93
+ openPath(path: string): Promise<boolean>;
94
+ }
95
+ ```
96
+
97
+ ## TaskContext
98
+
99
+ ```typescript
100
+ interface TaskContext {
101
+ // Logging to chat (visible to users in the task's chat UI)
102
+ addLogMessage(level: 'info' | 'error' | 'warning', message?: string): void;
103
+ addLoadingMessage(message?: string, finished?: boolean): void;
104
+
105
+ // Task operations
106
+ updateTask(updates: Partial<TaskData>): Promise<TaskData>;
107
+ runPrompt(prompt: string, mode?: string): Promise<void>;
108
+ runCustomCommand(name: string, args?: string[], mode?: string): Promise<void>;
109
+ runSubagent(agentProfile: AgentProfile, prompt: string): Promise<void>;
110
+ interruptResponse(): Promise<void>;
111
+
112
+ // File operations
113
+ getRepoMap(): string;
114
+ getContextFiles(): ContextFile[];
115
+ addContextFiles(files: ContextFile[]): Promise<void>;
116
+
117
+ // Questions
118
+ askQuestion(text: string, options?: QuestionOptions): Promise<string>;
119
+ }
120
+ ```
121
+
122
+ ## UIComponentDefinition
123
+
124
+ ```typescript
125
+ interface UIComponentDefinition {
126
+ /** Unique component identifier */
127
+ id: string;
128
+
129
+ /** Where in UI to render this component */
130
+ placement: UIComponentPlacement;
131
+
132
+ /** JSX/TSX component as string to be parsed */
133
+ jsx: string;
134
+
135
+ /** Optional flag to load data from extension (default: false) */
136
+ loadData?: boolean;
137
+
138
+ /** Optional flag to disable data caching (default: false) */
139
+ noDataCache?: boolean;
140
+ }
141
+
142
+ type UIComponentPlacement =
143
+ | 'task-status-bar-left'
144
+ | 'task-status-bar-right'
145
+ | 'task-usage-info-bottom'
146
+ | 'task-messages-top'
147
+ | 'task-messages-bottom'
148
+ | 'task-input-above'
149
+ | 'task-input-toolbar-left'
150
+ | 'task-input-toolbar-right'
151
+ | 'tasks-sidebar-header'
152
+ | 'tasks-sidebar-bottom'
153
+ | 'task-message-above'
154
+ | 'task-message-below'
155
+ | 'task-message-bar'
156
+ | 'task-top-bar-left'
157
+ | 'task-top-bar-right'
158
+ | 'task-state-actions'
159
+ | 'task-state-actions-all'
160
+ | 'header-left'
161
+ | 'header-right'
162
+ | 'welcome-page';
163
+ ```
164
+
165
+ ## UIComponentProps
166
+
167
+ Props available to UI components via the `data` prop (React is globally available, not a prop):
168
+
169
+ ```typescript
170
+ interface UIComponentProps {
171
+ // Context data
172
+ projectDir?: string;
173
+ task?: TaskData;
174
+ agentProfile?: AgentProfile;
175
+ models: Model[];
176
+ providers: ProviderProfile[];
177
+
178
+ // UI library
179
+ ui: UIComponents;
180
+
181
+ // Icons library (organized by icon set)
182
+ icons: Record<string, Record<string, IconComponent>>;
183
+
184
+ // Extension actions
185
+ executeExtensionAction: (action: string, ...args: unknown[]) => Promise<unknown>;
186
+
187
+ // Data from getUIExtensionData() (if loadData: true)
188
+ data?: unknown;
189
+
190
+ // Message-specific (for message placements)
191
+ message?: MessageData;
192
+ }
193
+
194
+ interface UIComponents {
195
+ Button: Component;
196
+ Checkbox: Component;
197
+ Input: Component;
198
+ Select: Component;
199
+ TextArea: Component;
200
+ IconButton: Component;
201
+ RadioButton: Component;
202
+ MultiSelect: Component;
203
+ Slider: Component;
204
+ DatePicker: Component;
205
+ Chip: Component;
206
+ ModelSelector: Component;
207
+ Tooltip: Component;
208
+ LoadingOverlay: Component;
209
+ ConfirmDialog: Component;
210
+ }
211
+ ```
212
+
213
+ ## Metadata
214
+
215
+ Metadata is defined as a **static property** on the extension class:
216
+
217
+ ```typescript
218
+ export default class MyExtension implements Extension {
219
+ static metadata = {
220
+ name: 'My Extension',
221
+ version: '1.0.0',
222
+ description: 'What this extension does',
223
+ author: 'Author Name',
224
+ capabilities: ['events', 'commands'],
225
+ };
226
+ }
227
+ ```
228
+
229
+ **Important:** Metadata must be a `static` property on the class. Do NOT use a separate `export const metadata = { ... }` — the extension loader reads it from `ExtensionClass.metadata`.
230
+
231
+ ```typescript
232
+ interface ExtensionMetadata {
233
+ name: string;
234
+ version: string;
235
+ description?: string;
236
+ author?: string;
237
+ capabilities?: string[];
238
+ iconUrl?: string;
239
+ }
240
+ ```
@@ -0,0 +1,186 @@
1
+ # Extension Types
2
+
3
+ AiderDesk supports two types of extensions: single-file and folder extensions.
4
+
5
+ ## Single-File Extensions
6
+
7
+ **When to use:** Simple extensions with no npm dependencies
8
+
9
+ **Location:** `packages/extensions/extensions/my-extension.ts`
10
+
11
+ **Structure:**
12
+ ```typescript
13
+ import type { Extension, ExtensionContext } from '@aiderdesk/extensions';
14
+
15
+ export default class MyExtension implements Extension {
16
+ static metadata = {
17
+ name: 'My Extension',
18
+ version: '1.0.0',
19
+ description: 'What this extension does',
20
+ author: 'Author Name',
21
+ capabilities: ['events', 'commands'],
22
+ };
23
+
24
+ async onLoad(context: ExtensionContext): Promise<void> {
25
+ context.log('Extension loaded', 'info');
26
+ }
27
+ }
28
+ ```
29
+
30
+ **Advantages:**
31
+ - Simple structure
32
+ - Easy to maintain
33
+ - No build step required
34
+
35
+ **Limitations:**
36
+ - Cannot use npm dependencies
37
+ - All code in one file
38
+ - No separate config or logger files
39
+
40
+ ## Folder Extensions
41
+
42
+ **When to use:** Complex extensions with npm dependencies or multiple files
43
+
44
+ **Location:** `packages/extensions/extensions/my-extension/`
45
+
46
+ **Structure:**
47
+ ```
48
+ packages/extensions/extensions/my-extension/
49
+ ├── index.ts # Main extension file (implements Extension)
50
+ ├── package.json # npm dependencies
51
+ ├── tsconfig.json # TypeScript config (module: ES2020+)
52
+ ├── README.md # Documentation
53
+ ├── config.ts # Optional: persistent config storage
54
+ ├── logger.ts # Optional: local logger
55
+ ├── constants.ts # Optional: extension constants
56
+ └── resources/ # Optional: WASM, queries, assets
57
+ ```
58
+
59
+ **package.json:**
60
+ ```json
61
+ {
62
+ "name": "my-extension",
63
+ "version": "1.0.0",
64
+ "main": "index.ts",
65
+ "dependencies": {
66
+ // Required packages
67
+ }
68
+ }
69
+ ```
70
+
71
+ **tsconfig.json:**
72
+ ```json
73
+ {
74
+ "compilerOptions": {
75
+ "target": "ES2020",
76
+ "module": "ES2020",
77
+ "moduleResolution": "node",
78
+ "esModuleInterop": true,
79
+ "strict": true
80
+ }
81
+ }
82
+ ```
83
+
84
+ **Advantages:**
85
+ - Can use npm dependencies
86
+ - Modular structure
87
+ - Separate config and logger files
88
+ - Can include resources (WASM, queries, assets)
89
+
90
+ **Requirements:**
91
+ - Must have package.json
92
+ - Must have tsconfig.json with ES2020+ module
93
+ - Must set `hasDependencies: true` in extensions.json
94
+
95
+ ## Choosing Extension Type
96
+
97
+ **When:** Extension needs npm packages
98
+
99
+ **Then:** Use folder extension
100
+
101
+ **When:** Extension is simple with no dependencies
102
+
103
+ **Then:** Use single-file extension
104
+
105
+ **When:** Extension needs multiple files
106
+
107
+ **Then:** Use folder extension
108
+
109
+ **When:** Extension needs resources (WASM, queries)
110
+
111
+ **Then:** Use folder extension
112
+
113
+ ## Common Patterns by Type
114
+
115
+ ### Single-File: Simple Event Handler
116
+
117
+ ```typescript
118
+ import type { Extension, ExtensionContext, AgentStartedEvent } from '@aiderdesk/extensions';
119
+
120
+ export default class SimpleExtension implements Extension {
121
+ static metadata = {
122
+ name: 'Simple Extension',
123
+ version: '1.0.0',
124
+ description: 'Simple event handler',
125
+ author: 'Author Name',
126
+ capabilities: ['events'],
127
+ };
128
+
129
+ async onLoad(context: ExtensionContext): Promise<void> {
130
+ context.log('Simple extension loaded', 'info');
131
+ }
132
+
133
+ async onAgentStarted(
134
+ event: AgentStartedEvent,
135
+ context: ExtensionContext
136
+ ): Promise<void | Partial<AgentStartedEvent>> {
137
+ context.log('Agent started', 'info');
138
+ return { contextMessages: [...event.contextMessages] };
139
+ }
140
+ }
141
+ ```
142
+
143
+ ### Folder: Extension with Config and Dependencies
144
+
145
+ ```
146
+ tree-sitter-repo-map/
147
+ ├── index.ts # Main extension with getTools()
148
+ ├── package.json # tree-sitter dependencies
149
+ ├── tsconfig.json # ES2020 module
150
+ ├── config.ts # Config storage
151
+ ├── logger.ts # Extension logger
152
+ ├── constants.ts # Extension constants
153
+ └── resources/
154
+ └── queries/ # Language queries
155
+ ```
156
+
157
+ ## Updating extensions.json
158
+
159
+ ### Single-File Entry
160
+
161
+ ```json
162
+ {
163
+ "id": "my-extension",
164
+ "name": "My Extension",
165
+ "description": "Description of what it does",
166
+ "file": "extensions/my-extension.ts",
167
+ "type": "single",
168
+ "capabilities": ["onLoad", "onAgentStarted"]
169
+ }
170
+ ```
171
+
172
+ ### Folder Entry
173
+
174
+ ```json
175
+ {
176
+ "id": "my-extension",
177
+ "name": "My Extension",
178
+ "description": "Description",
179
+ "folder": "extensions/my-extension",
180
+ "type": "folder",
181
+ "hasDependencies": true,
182
+ "capabilities": ["onLoad", "getCommands", "onAgentStarted"]
183
+ }
184
+ ```
185
+
186
+ **Note:** Always set `hasDependencies: true` for folder extensions, even if they don't have dependencies yet. This ensures proper loading.
@@ -0,0 +1,132 @@
1
+ # In-Repo Installation Flow
2
+
3
+ This flow covers developing extensions **inside the AiderDesk codebase** at `packages/extensions/extensions/`. These extensions ship with the application and are available to all users by default.
4
+
5
+ ## When to Use This Flow
6
+
7
+ Only when:
8
+ 1. The current working project **is** the AiderDesk repository itself
9
+ 2. The user explicitly chooses "In-Repo" as the installation target
10
+ 3. The extension is meant to be a built-in feature, not a personal or project-specific tool
11
+
12
+ ## Process
13
+
14
+ 1. **Determine extension type** — single-file or folder
15
+ 2. **Create extension file(s)** in `packages/extensions/extensions/`
16
+ 3. **Implement Extension interface methods**
17
+ 4. **Export metadata and default class**
18
+ 5. **Update `packages/extensions/extensions.json`** — register the extension
19
+ 6. **Update `docs-site/docs/extensions/examples.md`** — document it
20
+ 7. **Verify with type checking and code-checker**
21
+
22
+ ## Directory Structure
23
+
24
+ ### Single-File In-Repo Extension
25
+
26
+ ```
27
+ packages/extensions/extensions/
28
+ └── my-extension.ts # Everything in one file
29
+ ```
30
+
31
+ ### Folder In-Repo Extension
32
+
33
+ ```
34
+ packages/extensions/extensions/
35
+ └── my-extension/
36
+ ├── index.ts # Main extension file
37
+ ├── package.json # npm dependencies (must run npm install)
38
+ ├── tsconfig.json # TypeScript config (module: ES2020+)
39
+ ├── README.md # Documentation
40
+ ├── config.ts # Optional: persistent config storage
41
+ ├── logger.ts # Optional: local logger
42
+ ├── constants.ts # Optional: extension constants
43
+ └── resources/ # Optional: WASM, queries, assets
44
+ ```
45
+
46
+ ## Step-by-Step
47
+
48
+ ### Step 1: Determine type
49
+
50
+ - **Single-file**: No npm dependencies, simple logic
51
+ - **Folder**: Needs npm packages, multiple files, resources
52
+
53
+ ### Step 2: Create the extension
54
+
55
+ Use the templates:
56
+ - [single-file.ts.template](../assets/templates/single-file.ts.template)
57
+ - [folder-extension/](../assets/templates/folder-extension/)
58
+ - [folder-extension-with-config/index.ts.template](../assets/templates/folder-extension-with-config/index.ts.template)
59
+
60
+ Create files in `packages/extensions/extensions/{name}/` or `packages/extensions/extensions/{name}.ts`.
61
+
62
+ ### Step 3: Implement interface
63
+
64
+ Same as any extension — implement required methods, export metadata and class.
65
+
66
+ Reference: [extension-interface.md](extension-interface.md)
67
+
68
+ ### Step 4: Register in extensions.json
69
+
70
+ **This step is unique to In-Repo extensions.**
71
+
72
+ Add an entry to `packages/extensions/extensions.json`:
73
+
74
+ **Single-file entry:**
75
+ ```json
76
+ {
77
+ "id": "my-extension",
78
+ "name": "My Extension",
79
+ "description": "Description of what it does",
80
+ "file": "extensions/my-extension.ts",
81
+ "type": "single",
82
+ "capabilities": ["onLoad", "onAgentStarted"]
83
+ }
84
+ ```
85
+
86
+ **Folder entry:**
87
+ ```json
88
+ {
89
+ "id": "my-extension",
90
+ "name": "My Extension",
91
+ "description": "Description",
92
+ "folder": "extensions/my-extension",
93
+ "type": "folder",
94
+ "hasDependencies": true,
95
+ "capabilities": ["onLoad", "getCommands", "onAgentStarted"]
96
+ }
97
+ ```
98
+
99
+ **Important:** Always set `hasDependencies: true` for folder extensions, even if they don't have dependencies yet.
100
+
101
+ ### Step 5: Document in examples.md
102
+
103
+ Add an entry to the table in `docs-site/docs/extensions/examples.md`:
104
+
105
+ | Extension | Description | Capabilities | Type |
106
+ |-----------|-------------|-------------|------|
107
+ | My Extension | What it does | events, commands | folder |
108
+
109
+ Include extension name, description, capabilities, and type.
110
+
111
+ ### Step 6: Install dependencies (folder extensions only)
112
+
113
+ If this is a folder extension with npm dependencies:
114
+
115
+ ```bash
116
+ cd packages/extensions
117
+ npm install
118
+ ```
119
+
120
+ ### Step 7: Verify
121
+
122
+ - Run type checking: `npm run typecheck`
123
+ - Run tests if applicable: `npm run test`
124
+ - Verify extension loads without errors
125
+ - Check that extension appears in extensions list
126
+
127
+ ## What NOT to do (In-Repo)
128
+
129
+ - Do NOT use `@/` imports in extension files — use relative imports or `@aiderdesk/extensions` package imports only
130
+ - Do NOT forget to update `extensions.json` — the extension won't load without registration
131
+ - Do NOT forget to update `examples.md` — users won't know about the extension
132
+ - Do NOT place files outside `packages/extensions/extensions/` unless there's a specific reason (e.g., shared utilities should go in `packages/extensions/src/`)
@@ -0,0 +1,96 @@
1
+ # Installation Targets
2
+
3
+ AiderDesk extensions can be installed in three locations, each with different purposes and workflows.
4
+
5
+ ## Target Options
6
+
7
+ ### 1. Current Project (`.aider-desk/extensions/`)
8
+
9
+ **Use when:** The extension is specific to this project and should travel with the codebase.
10
+
11
+ **Location:** `{projectDir}/.aider-desk/extensions/`
12
+
13
+ **Characteristics:**
14
+ - Project-scoped: only available when working in this project
15
+ - Committed to version control alongside the project
16
+ - Shared with team members via git
17
+ - No need to update any registry or manifest files
18
+ - Simple drop-in: just create the file/folder in the directory
19
+
20
+ **Best for:** Project-specific tools, domain-specific rules, team conventions, repo-specific integrations.
21
+
22
+ ---
23
+
24
+ ### 2. Global (`~/.aider-desk/extensions/`)
25
+
26
+ **Use when:** The extension is a personal utility you want available across all projects.
27
+
28
+ **Location:** `~/.aider-desk/extensions/`
29
+
30
+ **Characteristics:**
31
+ - User-scoped: available in every project you work on
32
+ - Not committed to any repository (lives in home directory)
33
+ - Private to your environment
34
+ - No need to update any registry or manifest files
35
+ - Simple drop-in: just create the file/folder in the directory
36
+
37
+ **Best for:** Personal productivity tools, custom commands, cross-project utilities, personal preferences.
38
+
39
+ ---
40
+
41
+ ### 3. In-Repo (`packages/extensions/`) — **Only when working inside the AiderDesk project**
42
+
43
+ **Use when:** You are developing an extension that ships *with* AiderDesk itself, as part of the application.
44
+
45
+ **Location:** `packages/extensions/extensions/{name}/` or `packages/extensions/extensions/{name}.ts`
46
+
47
+ **Characteristics:**
48
+ - Ships with the AiderDesk application as a built-in extension
49
+ - Available to all users by default
50
+ - Requires updating `packages/extensions/extensions.json` (the extension registry)
51
+ - Requires updating documentation in `docs-site/docs/extensions/examples.md`
52
+ - Must follow monorepo conventions (no `@/` imports, proper tsconfig/package.json)
53
+ - Subject to the full AiderDesk development workflow (type checking, testing, etc.)
54
+
55
+ **Best for:** Core features, official integrations, extensions that should be available out-of-the-box.
56
+
57
+ ## How to Choose
58
+
59
+ Ask the user at the start of every extension creation session:
60
+
61
+ > "Where should this extension be installed? **Current project** (project-scoped, shared with team), **Global** (personal, available everywhere), or **In-Repo** (ships with AiderDesk, only available when working in the aider-desk project)?"
62
+
63
+ **Decision tree:**
64
+
65
+ ```
66
+ Is the current project the AiderDesk codebase itself?
67
+ ├── YES → Offer all 3 options (Project, Global, In-Repo)
68
+ │ In-Repo means: packages/extensions/ + update extensions.json + update docs
69
+
70
+ └── NO → Offer only 2 options (Project, Global)
71
+ Project = .aider-desk/extensions/ in current project
72
+ Global = ~/.aider-desk/extensions/
73
+ ```
74
+
75
+ ## Key Differences Summary
76
+
77
+ | Aspect | Project | Global | In-Repo |
78
+ |--------|---------|--------|---------|
79
+ | Location | `.aider-desk/extensions/` | `~/.aider-desk/extensions/` | `packages/extensions/extensions/` |
80
+ | Scope | This project only | All projects | All users (ships with app) |
81
+ | Version controlled | Yes (with project) | No | Yes (with AiderDesk) |
82
+ | Update extensions.json | No | No | **Yes** |
83
+ | Update examples.md docs | No | No | **Yes** |
84
+ | npm install needed | No | No | **Yes** (if folder extension) |
85
+ | Available immediately | Yes | Yes | After build/restart |
86
+
87
+ ## Shared Rules (All Targets)
88
+
89
+ Regardless of target, these rules always apply:
90
+
91
+ - Implement the `Extension` interface correctly
92
+ - Export `metadata` object with name, version, description, author, capabilities
93
+ - Export class as `default`
94
+ - Never use `@/` imports in extension files
95
+ - Store config files inside the extension directory
96
+ - Use proper TypeScript (ES2020+ modules for folder extensions)