@plotday/twister 0.21.0 → 0.26.0

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 (186) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +35 -6
  3. package/bin/commands/deploy.js +234 -2
  4. package/bin/commands/deploy.js.map +1 -1
  5. package/bin/commands/generate.js +11 -2
  6. package/bin/commands/generate.js.map +1 -1
  7. package/bin/commands/login.js +19 -3
  8. package/bin/commands/login.js.map +1 -1
  9. package/bin/commands/priority-create.js +7 -2
  10. package/bin/commands/priority-create.js.map +1 -1
  11. package/bin/commands/priority-list.js +6 -1
  12. package/bin/commands/priority-list.js.map +1 -1
  13. package/bin/commands/twist-logs.js +12 -3
  14. package/bin/commands/twist-logs.js.map +1 -1
  15. package/bin/templates/AGENTS.template.md +109 -20
  16. package/bin/utils/bundle.js +40 -0
  17. package/bin/utils/bundle.js.map +1 -1
  18. package/bin/utils/network-error.js +149 -0
  19. package/bin/utils/network-error.js.map +1 -0
  20. package/cli/templates/AGENTS.template.md +109 -20
  21. package/dist/common/calendar.d.ts +12 -4
  22. package/dist/common/calendar.d.ts.map +1 -1
  23. package/dist/common/messaging.d.ts +8 -7
  24. package/dist/common/messaging.d.ts.map +1 -1
  25. package/dist/common/projects.d.ts +123 -0
  26. package/dist/common/projects.d.ts.map +1 -0
  27. package/dist/common/projects.js +2 -0
  28. package/dist/common/projects.js.map +1 -0
  29. package/dist/docs/assets/hierarchy.js +1 -1
  30. package/dist/docs/assets/highlight.css +6 -6
  31. package/dist/docs/assets/navigation.js +1 -1
  32. package/dist/docs/assets/search.js +1 -1
  33. package/dist/docs/classes/tool.ITool.html +1 -1
  34. package/dist/docs/classes/tool.Tool.html +5 -5
  35. package/dist/docs/classes/tools_ai.AI.html +3 -3
  36. package/dist/docs/classes/tools_callbacks.Callbacks.html +4 -4
  37. package/dist/docs/classes/tools_integrations.Integrations.html +1 -1
  38. package/dist/docs/classes/tools_network.Network.html +4 -4
  39. package/dist/docs/classes/tools_plot.Plot.html +64 -29
  40. package/dist/docs/classes/tools_store.Store.html +1 -1
  41. package/dist/docs/classes/tools_tasks.Tasks.html +2 -2
  42. package/dist/docs/classes/tools_twists.Twists.html +5 -5
  43. package/dist/docs/classes/twist.Twist.html +1 -1
  44. package/dist/docs/documents/Building_Custom_Tools.html +5 -6
  45. package/dist/docs/documents/Built-in_Tools.html +33 -14
  46. package/dist/docs/documents/Core_Concepts.html +59 -8
  47. package/dist/docs/documents/Getting_Started.html +19 -3
  48. package/dist/docs/documents/Runtime_Environment.html +7 -8
  49. package/dist/docs/enums/plot.ActivityLinkType.html +5 -5
  50. package/dist/docs/enums/plot.ActivityType.html +4 -4
  51. package/dist/docs/enums/plot.ActorType.html +4 -4
  52. package/dist/docs/enums/plot.ConferencingProvider.html +6 -6
  53. package/dist/docs/enums/tag.Tag.html +3 -4
  54. package/dist/docs/enums/tools_plot.ActivityAccess.html +6 -6
  55. package/dist/docs/enums/tools_plot.ContactAccess.html +3 -3
  56. package/dist/docs/enums/tools_plot.PriorityAccess.html +3 -3
  57. package/dist/docs/functions/utils_hash.quickHash.html +1 -0
  58. package/dist/docs/hierarchy.html +1 -1
  59. package/dist/docs/index.html +2 -11
  60. package/dist/docs/interfaces/common_calendar.CalendarTool.html +14 -8
  61. package/dist/docs/interfaces/tools_ai.AIRequest.html +4 -4
  62. package/dist/docs/interfaces/tools_ai.AIResponse.html +2 -2
  63. package/dist/docs/interfaces/tools_twists.TwistSource.html +1 -1
  64. package/dist/docs/modules/index.html +1 -1
  65. package/dist/docs/modules/plot.html +1 -1
  66. package/dist/docs/modules/tools_plot.html +1 -1
  67. package/dist/docs/modules/utils_hash.html +1 -0
  68. package/dist/docs/modules.html +1 -1
  69. package/dist/docs/types/plot.Activity.html +37 -52
  70. package/dist/docs/types/plot.ActivityCommon.html +22 -0
  71. package/dist/docs/types/plot.ActivityLink.html +1 -1
  72. package/dist/docs/types/plot.ActivityMeta.html +24 -6
  73. package/dist/docs/types/plot.ActivityUpdate.html +2 -8
  74. package/dist/docs/types/plot.ActivityWithNotes.html +1 -0
  75. package/dist/docs/types/plot.Actor.html +5 -5
  76. package/dist/docs/types/plot.ActorId.html +8 -3
  77. package/dist/docs/types/plot.ContentType.html +1 -0
  78. package/dist/docs/types/plot.NewActivity.html +18 -3
  79. package/dist/docs/types/plot.NewActivityWithNotes.html +1 -0
  80. package/dist/docs/types/plot.NewContact.html +4 -4
  81. package/dist/docs/types/plot.NewNote.html +16 -0
  82. package/dist/docs/types/plot.NewPriority.html +1 -1
  83. package/dist/docs/types/plot.Note.html +7 -0
  84. package/dist/docs/types/plot.NoteUpdate.html +14 -0
  85. package/dist/docs/types/plot.PickPriorityConfig.html +3 -3
  86. package/dist/docs/types/plot.Priority.html +3 -3
  87. package/dist/docs/types/plot.Tags.html +1 -0
  88. package/dist/docs/types/tools_ai.DataContent.html +1 -1
  89. package/dist/docs/types/tools_network.WebhookRequest.html +4 -2
  90. package/dist/docs/types/{tools_plot.ActivityIntentHandler.html → tools_plot.NoteIntentHandler.html} +5 -5
  91. package/dist/llm-docs/common/calendar.d.ts +2 -2
  92. package/dist/llm-docs/common/calendar.d.ts.map +1 -1
  93. package/dist/llm-docs/common/calendar.js +2 -2
  94. package/dist/llm-docs/common/calendar.js.map +1 -1
  95. package/dist/llm-docs/common/messaging.d.ts +2 -2
  96. package/dist/llm-docs/common/messaging.d.ts.map +1 -1
  97. package/dist/llm-docs/common/messaging.js +2 -2
  98. package/dist/llm-docs/common/messaging.js.map +1 -1
  99. package/dist/llm-docs/common/projects.d.ts +9 -0
  100. package/dist/llm-docs/common/projects.d.ts.map +1 -0
  101. package/dist/llm-docs/common/projects.js +8 -0
  102. package/dist/llm-docs/common/projects.js.map +1 -0
  103. package/dist/llm-docs/index.d.ts +1 -1
  104. package/dist/llm-docs/index.js +17 -17
  105. package/dist/llm-docs/index.js.map +1 -1
  106. package/dist/llm-docs/plot.d.ts +2 -2
  107. package/dist/llm-docs/plot.d.ts.map +1 -1
  108. package/dist/llm-docs/plot.js +2 -2
  109. package/dist/llm-docs/plot.js.map +1 -1
  110. package/dist/llm-docs/tag.d.ts +2 -2
  111. package/dist/llm-docs/tag.d.ts.map +1 -1
  112. package/dist/llm-docs/tag.js +2 -2
  113. package/dist/llm-docs/tag.js.map +1 -1
  114. package/dist/llm-docs/tool.d.ts +2 -2
  115. package/dist/llm-docs/tool.d.ts.map +1 -1
  116. package/dist/llm-docs/tool.js +2 -2
  117. package/dist/llm-docs/tool.js.map +1 -1
  118. package/dist/llm-docs/tools/ai.d.ts +2 -2
  119. package/dist/llm-docs/tools/ai.d.ts.map +1 -1
  120. package/dist/llm-docs/tools/ai.js +2 -2
  121. package/dist/llm-docs/tools/ai.js.map +1 -1
  122. package/dist/llm-docs/tools/callbacks.d.ts +2 -2
  123. package/dist/llm-docs/tools/callbacks.d.ts.map +1 -1
  124. package/dist/llm-docs/tools/callbacks.js +2 -2
  125. package/dist/llm-docs/tools/callbacks.js.map +1 -1
  126. package/dist/llm-docs/tools/integrations.d.ts +1 -1
  127. package/dist/llm-docs/tools/integrations.js +1 -1
  128. package/dist/llm-docs/tools/network.d.ts +2 -2
  129. package/dist/llm-docs/tools/network.d.ts.map +1 -1
  130. package/dist/llm-docs/tools/network.js +2 -2
  131. package/dist/llm-docs/tools/network.js.map +1 -1
  132. package/dist/llm-docs/tools/plot.d.ts +2 -2
  133. package/dist/llm-docs/tools/plot.d.ts.map +1 -1
  134. package/dist/llm-docs/tools/plot.js +2 -2
  135. package/dist/llm-docs/tools/plot.js.map +1 -1
  136. package/dist/llm-docs/tools/store.d.ts +1 -1
  137. package/dist/llm-docs/tools/store.js +1 -1
  138. package/dist/llm-docs/tools/tasks.d.ts +1 -1
  139. package/dist/llm-docs/tools/tasks.js +1 -1
  140. package/dist/llm-docs/tools/twists.d.ts +2 -2
  141. package/dist/llm-docs/tools/twists.d.ts.map +1 -1
  142. package/dist/llm-docs/tools/twists.js +2 -2
  143. package/dist/llm-docs/tools/twists.js.map +1 -1
  144. package/dist/llm-docs/twist-guide-template.d.ts +1 -1
  145. package/dist/llm-docs/twist-guide-template.d.ts.map +1 -1
  146. package/dist/llm-docs/twist-guide-template.js +1 -1
  147. package/dist/llm-docs/twist-guide-template.js.map +1 -1
  148. package/dist/llm-docs/twist.d.ts +1 -1
  149. package/dist/llm-docs/twist.js +1 -1
  150. package/dist/plot.d.ts +271 -61
  151. package/dist/plot.d.ts.map +1 -1
  152. package/dist/plot.js.map +1 -1
  153. package/dist/tag.d.ts +2 -3
  154. package/dist/tag.d.ts.map +1 -1
  155. package/dist/tag.js +2 -3
  156. package/dist/tag.js.map +1 -1
  157. package/dist/tool.d.ts +2 -2
  158. package/dist/tool.d.ts.map +1 -1
  159. package/dist/tool.js +1 -1
  160. package/dist/tool.js.map +1 -1
  161. package/dist/tools/ai.d.ts +2 -2
  162. package/dist/tools/ai.d.ts.map +1 -1
  163. package/dist/tools/callbacks.d.ts +1 -1
  164. package/dist/tools/callbacks.d.ts.map +1 -1
  165. package/dist/tools/network.d.ts +2 -0
  166. package/dist/tools/network.d.ts.map +1 -1
  167. package/dist/tools/network.js.map +1 -1
  168. package/dist/tools/plot.d.ts +150 -29
  169. package/dist/tools/plot.d.ts.map +1 -1
  170. package/dist/tools/plot.js +4 -4
  171. package/dist/tools/plot.js.map +1 -1
  172. package/dist/tools/twists.d.ts +2 -2
  173. package/dist/twist-guide.d.ts +1 -1
  174. package/dist/twist-guide.d.ts.map +1 -1
  175. package/dist/utils/hash.d.ts +2 -0
  176. package/dist/utils/hash.d.ts.map +1 -0
  177. package/dist/utils/hash.js +9 -0
  178. package/dist/utils/hash.js.map +1 -0
  179. package/package.json +56 -2
  180. package/tsconfig.base.json +1 -0
  181. package/dist/docs/documents/Advanced.html +0 -91
  182. package/dist/docs/types/plot.NoteType.html +0 -1
  183. package/dist/llm-docs/creator-docs.d.ts +0 -9
  184. package/dist/llm-docs/creator-docs.d.ts.map +0 -1
  185. package/dist/llm-docs/creator-docs.js +0 -8
  186. package/dist/llm-docs/creator-docs.js.map +0 -1
@@ -50,7 +50,7 @@
50
50
  <h3 id="minimal-tool-example" class="tsd-anchor-link">Minimal Tool Example<a href="#minimal-tool-example" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Tool</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">export</span><span class="hl-1"> </span><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">HelloTool</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Tool</span><span class="hl-1">&lt;</span><span class="hl-5">HelloTool</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">sayHello</span><span class="hl-1">(</span><span class="hl-2">name</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">string</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> </span><span class="hl-3">`Hello, </span><span class="hl-4">${</span><span class="hl-2">name</span><span class="hl-4">}</span><span class="hl-3">!`</span><span class="hl-1">;</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
51
51
  </code><button type="button">Copy</button></pre>
52
52
 
53
- <h3 id="using-your-tool" class="tsd-anchor-link">Using Your Tool<a href="#using-your-tool" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">twist</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">HelloTool</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;./tools/hello&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">export</span><span class="hl-1"> </span><span class="hl-0">default</span><span class="hl-1"> </span><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">MyTwist</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Twist</span><span class="hl-1">&lt;</span><span class="hl-5">MyTwist</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-5">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">hello:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">HelloTool</span><span class="hl-1">),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">activate</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">message</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">hello</span><span class="hl-1">.</span><span class="hl-6">sayHello</span><span class="hl-1">(</span><span class="hl-3">&quot;World&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">message</span><span class="hl-1">); </span><span class="hl-7">// &quot;Hello, World!&quot;</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
53
+ <h3 id="using-your-tool" class="tsd-anchor-link">Using Your Tool<a href="#using-your-tool" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1">, </span><span class="hl-2">twist</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">HelloTool</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;./tools/hello&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">export</span><span class="hl-1"> </span><span class="hl-0">default</span><span class="hl-1"> </span><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">MyTwist</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Twist</span><span class="hl-1">&lt;</span><span class="hl-5">MyTwist</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-5">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">hello:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">HelloTool</span><span class="hl-1">),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">activate</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">message</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">hello</span><span class="hl-1">.</span><span class="hl-6">sayHello</span><span class="hl-1">(</span><span class="hl-3">&quot;World&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">message</span><span class="hl-1">); </span><span class="hl-7">// &quot;Hello, World!&quot;</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
54
54
  </code><button type="button">Copy</button></pre>
55
55
 
56
56
  <hr>
@@ -101,7 +101,7 @@
101
101
  <pre><code class="typescript"><span class="hl-2">async</span><span class="hl-1"> </span><span class="hl-6">postDeactivate</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-4">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Final cleanup</span><br/><span class="hl-1"> await this.clearAll();</span><br/><span class="hl-1">}</span>
102
102
  </code><button type="button">Copy</button></pre>
103
103
 
104
- <h3 id="execution-order" class="tsd-anchor-link">Execution Order<a href="#execution-order" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code><span class="hl-2">twist</span><span class="hl-1"> </span><span class="hl-14">Activation</span><span class="hl-1">:</span><br/><span class="hl-1"> </span><span class="hl-12">1.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">preActivate</span><span class="hl-1">() (</span><span class="hl-2">deepest</span><span class="hl-1"> </span><span class="hl-2">dependencies</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-12">2.</span><span class="hl-1"> </span><span class="hl-2">twist</span><span class="hl-1">.</span><span class="hl-6">activate</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-12">3.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">postActivate</span><span class="hl-1">() (</span><span class="hl-2">top</span><span class="hl-1">-</span><span class="hl-2">level</span><span class="hl-1"> </span><span class="hl-2">tools</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span><br/><br/><span class="hl-2">twist</span><span class="hl-1"> </span><span class="hl-14">Deactivation</span><span class="hl-1">:</span><br/><span class="hl-1"> </span><span class="hl-12">1.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">preDeactivate</span><span class="hl-1">() (</span><span class="hl-2">deepest</span><span class="hl-1"> </span><span class="hl-2">dependencies</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-12">2.</span><span class="hl-1"> </span><span class="hl-2">twist</span><span class="hl-1">.</span><span class="hl-6">deactivate</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-12">3.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">postDeactivate</span><span class="hl-1">() (</span><span class="hl-2">top</span><span class="hl-1">-</span><span class="hl-2">level</span><span class="hl-1"> </span><span class="hl-2">tools</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span>
104
+ <h3 id="execution-order" class="tsd-anchor-link">Execution Order<a href="#execution-order" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code><span class="hl-2">twist</span><span class="hl-1"> </span><span class="hl-15">Activation</span><span class="hl-1">:</span><br/><span class="hl-1"> </span><span class="hl-14">1.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">preActivate</span><span class="hl-1">() (</span><span class="hl-2">deepest</span><span class="hl-1"> </span><span class="hl-2">dependencies</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-14">2.</span><span class="hl-1"> </span><span class="hl-2">twist</span><span class="hl-1">.</span><span class="hl-6">activate</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-14">3.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">postActivate</span><span class="hl-1">() (</span><span class="hl-2">top</span><span class="hl-1">-</span><span class="hl-2">level</span><span class="hl-1"> </span><span class="hl-2">tools</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span><br/><br/><span class="hl-2">twist</span><span class="hl-1"> </span><span class="hl-15">Deactivation</span><span class="hl-1">:</span><br/><span class="hl-1"> </span><span class="hl-14">1.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">preDeactivate</span><span class="hl-1">() (</span><span class="hl-2">deepest</span><span class="hl-1"> </span><span class="hl-2">dependencies</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-14">2.</span><span class="hl-1"> </span><span class="hl-2">twist</span><span class="hl-1">.</span><span class="hl-6">deactivate</span><span class="hl-1">()</span><br/><span class="hl-1"> </span><span class="hl-14">3.</span><span class="hl-1"> </span><span class="hl-2">Tool</span><span class="hl-1">.</span><span class="hl-6">postDeactivate</span><span class="hl-1">() (</span><span class="hl-2">top</span><span class="hl-1">-</span><span class="hl-2">level</span><span class="hl-1"> </span><span class="hl-2">tools</span><span class="hl-1"> </span><span class="hl-2">first</span><span class="hl-1">)</span>
105
105
  </code><button>Copy</button></pre>
106
106
 
107
107
  <hr>
@@ -125,12 +125,12 @@
125
125
  <h3 id="using-options" class="tsd-anchor-link">Using Options<a href="#using-options" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-2">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">slack:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">SlackTool</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">workspaceId:</span><span class="hl-1"> </span><span class="hl-3">&quot;T1234567&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">defaultChannel:</span><span class="hl-1"> </span><span class="hl-3">&quot;#general&quot;</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1">}</span>
126
126
  </code><button type="button">Copy</button></pre>
127
127
 
128
- <h3 id="required-vs-optional-options" class="tsd-anchor-link">Required vs. Optional Options<a href="#required-vs-optional-options" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-2">static</span><span class="hl-1"> </span><span class="hl-2">Options</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-7">// Required - no default value, not undefined</span><br/><span class="hl-1"> </span><span class="hl-2">apiKey:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">workspaceId:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// Optional - has undefined as possible value</span><br/><span class="hl-1"> defaultChannel?</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1"> | </span><span class="hl-5">undefined</span><span class="hl-1">,</span><br/><span class="hl-1"> timeout?</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-12">0</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">number</span><span class="hl-1"> | </span><span class="hl-5">undefined</span><span class="hl-1">,</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// Optional with default</span><br/><span class="hl-1"> </span><span class="hl-2">retryCount:</span><span class="hl-1"> </span><span class="hl-12">3</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">number</span><span class="hl-1">,</span><br/><span class="hl-1">};</span>
128
+ <h3 id="required-vs-optional-options" class="tsd-anchor-link">Required vs. Optional Options<a href="#required-vs-optional-options" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><pre><code class="typescript"><span class="hl-2">static</span><span class="hl-1"> </span><span class="hl-2">Options</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-7">// Required - no default value, not undefined</span><br/><span class="hl-1"> </span><span class="hl-2">apiKey:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">workspaceId:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// Optional - has undefined as possible value</span><br/><span class="hl-1"> defaultChannel?</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1"> | </span><span class="hl-5">undefined</span><span class="hl-1">,</span><br/><span class="hl-1"> timeout?</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-14">0</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">number</span><span class="hl-1"> | </span><span class="hl-5">undefined</span><span class="hl-1">,</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// Optional with default</span><br/><span class="hl-1"> </span><span class="hl-2">retryCount:</span><span class="hl-1"> </span><span class="hl-14">3</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">number</span><span class="hl-1">,</span><br/><span class="hl-1">};</span>
129
129
  </code><button type="button">Copy</button></pre>
130
130
 
131
131
  <hr>
132
132
  <h2 id="complete-examples" class="tsd-anchor-link">Complete Examples<a href="#complete-examples" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><h3 id="example-1-github-integration-tool" class="tsd-anchor-link">Example 1: GitHub Integration Tool<a href="#example-1-github-integration-tool" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><p>A complete GitHub integration with webhooks and issue management.</p>
133
- <pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">Priority</span><span class="hl-1">, </span><span class="hl-2">Tool</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">ActivityLinkType</span><span class="hl-1">, </span><span class="hl-2">ActivityType</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Network</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">WebhookRequest</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister/tools/network&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Plot</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister/tools/plot&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">export</span><span class="hl-1"> </span><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">GitHubTool</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Tool</span><span class="hl-1">&lt;</span><span class="hl-5">GitHubTool</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">static</span><span class="hl-1"> </span><span class="hl-2">Options</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">owner:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">repo:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">token:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> };</span><br/><br/><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-5">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">network:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">Network</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">urls:</span><span class="hl-1"> [</span><span class="hl-3">&quot;https://api.github.com/*&quot;</span><span class="hl-1">],</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> </span><span class="hl-2">plot:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">Plot</span><span class="hl-1">),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">postActivate</span><span class="hl-1">(</span><span class="hl-2">priority</span><span class="hl-1">: </span><span class="hl-5">Priority</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Set up webhook for issue updates</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">webhookUrl</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">network</span><span class="hl-1">.</span><span class="hl-6">createWebhook</span><span class="hl-1">(</span><span class="hl-3">&quot;onIssueUpdate&quot;</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">priorityId:</span><span class="hl-1"> </span><span class="hl-2">priority</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">set</span><span class="hl-1">(</span><span class="hl-3">&quot;webhook_url&quot;</span><span class="hl-1">, </span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// Register webhook with GitHub</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">registerWebhook</span><span class="hl-1">(</span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">preDeactivate</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Cleanup webhook</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">webhookUrl</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">get</span><span class="hl-1">&lt;</span><span class="hl-5">string</span><span class="hl-1">&gt;(</span><span class="hl-3">&quot;webhook_url&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">webhookUrl</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">unregisterWebhook</span><span class="hl-1">(</span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">network</span><span class="hl-1">.</span><span class="hl-6">deleteWebhook</span><span class="hl-1">(</span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">getIssues</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">any</span><span class="hl-1">[]&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">response</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">fetch</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">`https://api.github.com/repos/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">owner</span><span class="hl-4">}</span><span class="hl-3">/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">repo</span><span class="hl-4">}</span><span class="hl-3">/issues`</span><span class="hl-1">,</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">Authorization:</span><span class="hl-1"> </span><span class="hl-3">`Bearer </span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">token</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">Accept:</span><span class="hl-1"> </span><span class="hl-3">&quot;application/vnd.github.v3+json&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">response</span><span class="hl-1">.</span><span class="hl-6">json</span><span class="hl-1">();</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">syncIssues</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">issues</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">getIssues</span><span class="hl-1">();</span><br/><br/><span class="hl-1"> </span><span class="hl-0">for</span><span class="hl-1"> (</span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">issue</span><span class="hl-1"> </span><span class="hl-4">of</span><span class="hl-1"> </span><span class="hl-2">issues</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">createActivity</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityType</span><span class="hl-1">.</span><span class="hl-2">Action</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">title</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">note:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">body</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">meta:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-2">github_number:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">number</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">links:</span><span class="hl-1"> [</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityLinkType</span><span class="hl-1">.</span><span class="hl-2">external</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-3">&quot;View on GitHub&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">url:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">html_url</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">onIssueUpdate</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">request</span><span class="hl-1">: </span><span class="hl-5">WebhookRequest</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">context</span><span class="hl-1">: { </span><span class="hl-2">priorityId</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1"> }</span><br/><span class="hl-1"> ): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> { </span><span class="hl-8">action</span><span class="hl-1">, </span><span class="hl-8">issue</span><span class="hl-1"> } = </span><span class="hl-2">request</span><span class="hl-1">.</span><span class="hl-2">body</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">action</span><span class="hl-1"> === </span><span class="hl-3">&quot;opened&quot;</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// Create new activity for new issue</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">createActivity</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityType</span><span class="hl-1">.</span><span class="hl-2">Action</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">title</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">meta:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> } </span><span class="hl-0">else</span><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">action</span><span class="hl-1"> === </span><span class="hl-3">&quot;closed&quot;</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// Mark activity as done</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">activity</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">getActivityByMeta</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">activity</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">updateActivity</span><span class="hl-1">(</span><span class="hl-2">activity</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">doneAt:</span><span class="hl-1"> </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Date</span><span class="hl-1">(),</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">private</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">registerWebhook</span><span class="hl-1">(</span><span class="hl-2">url</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">fetch</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">`https://api.github.com/repos/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">owner</span><span class="hl-4">}</span><span class="hl-3">/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">repo</span><span class="hl-4">}</span><span class="hl-3">/hooks`</span><span class="hl-1">,</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">method:</span><span class="hl-1"> </span><span class="hl-3">&quot;POST&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">Authorization:</span><span class="hl-1"> </span><span class="hl-3">`Bearer </span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">token</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">Accept:</span><span class="hl-1"> </span><span class="hl-3">&quot;application/vnd.github.v3+json&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">body:</span><span class="hl-1"> </span><span class="hl-8">JSON</span><span class="hl-1">.</span><span class="hl-6">stringify</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">config:</span><span class="hl-1"> { </span><span class="hl-2">url</span><span class="hl-1">, </span><span class="hl-2">content_type:</span><span class="hl-1"> </span><span class="hl-3">&quot;json&quot;</span><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">events:</span><span class="hl-1"> [</span><span class="hl-3">&quot;issues&quot;</span><span class="hl-1">],</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> );</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">private</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">unregisterWebhook</span><span class="hl-1">(</span><span class="hl-2">url</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Implementation to remove webhook from GitHub</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
133
+ <pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">Priority</span><span class="hl-1">, </span><span class="hl-2">Tool</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">ActivityLinkType</span><span class="hl-1">, </span><span class="hl-2">ActivityType</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Network</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">WebhookRequest</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister/tools/network&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Plot</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister/tools/plot&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">export</span><span class="hl-1"> </span><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">GitHubTool</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Tool</span><span class="hl-1">&lt;</span><span class="hl-5">GitHubTool</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">static</span><span class="hl-1"> </span><span class="hl-2">Options</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">owner:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">repo:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">token:</span><span class="hl-1"> </span><span class="hl-3">&quot;&quot;</span><span class="hl-1"> </span><span class="hl-0">as</span><span class="hl-1"> </span><span class="hl-5">string</span><span class="hl-1">,</span><br/><span class="hl-1"> };</span><br/><br/><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-5">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">network:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">Network</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">urls:</span><span class="hl-1"> [</span><span class="hl-3">&quot;https://api.github.com/*&quot;</span><span class="hl-1">],</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> </span><span class="hl-2">plot:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">Plot</span><span class="hl-1">),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">postActivate</span><span class="hl-1">(</span><span class="hl-2">priority</span><span class="hl-1">: </span><span class="hl-5">Priority</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Set up webhook for issue updates</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">webhookUrl</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">network</span><span class="hl-1">.</span><span class="hl-6">createWebhook</span><span class="hl-1">(</span><span class="hl-3">&quot;onIssueUpdate&quot;</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">priorityId:</span><span class="hl-1"> </span><span class="hl-2">priority</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">set</span><span class="hl-1">(</span><span class="hl-3">&quot;webhook_url&quot;</span><span class="hl-1">, </span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-7">// Register webhook with GitHub</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">registerWebhook</span><span class="hl-1">(</span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">preDeactivate</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Cleanup webhook</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">webhookUrl</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">get</span><span class="hl-1">&lt;</span><span class="hl-5">string</span><span class="hl-1">&gt;(</span><span class="hl-3">&quot;webhook_url&quot;</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">webhookUrl</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">unregisterWebhook</span><span class="hl-1">(</span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">network</span><span class="hl-1">.</span><span class="hl-6">deleteWebhook</span><span class="hl-1">(</span><span class="hl-2">webhookUrl</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">getIssues</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">any</span><span class="hl-1">[]&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">response</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">fetch</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">`https://api.github.com/repos/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">owner</span><span class="hl-4">}</span><span class="hl-3">/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">repo</span><span class="hl-4">}</span><span class="hl-3">/issues`</span><span class="hl-1">,</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">Authorization:</span><span class="hl-1"> </span><span class="hl-3">`Bearer </span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">token</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">Accept:</span><span class="hl-1"> </span><span class="hl-3">&quot;application/vnd.github.v3+json&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">response</span><span class="hl-1">.</span><span class="hl-6">json</span><span class="hl-1">();</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">syncIssues</span><span class="hl-1">(): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">issues</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-6">getIssues</span><span class="hl-1">();</span><br/><br/><span class="hl-1"> </span><span class="hl-0">for</span><span class="hl-1"> (</span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">issue</span><span class="hl-1"> </span><span class="hl-4">of</span><span class="hl-1"> </span><span class="hl-2">issues</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">createActivity</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityType</span><span class="hl-1">.</span><span class="hl-2">Action</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">title</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">meta:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-2">github_number:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">number</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">notes:</span><span class="hl-1"> [</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">note:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">body</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">links:</span><span class="hl-1"> [</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityLinkType</span><span class="hl-1">.</span><span class="hl-2">external</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-3">&quot;View on GitHub&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">url:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">html_url</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">onIssueUpdate</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">request</span><span class="hl-1">: </span><span class="hl-5">WebhookRequest</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">context</span><span class="hl-1">: { </span><span class="hl-2">priorityId</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1"> }</span><br/><span class="hl-1"> ): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> { </span><span class="hl-8">action</span><span class="hl-1">, </span><span class="hl-8">issue</span><span class="hl-1">, </span><span class="hl-8">comment</span><span class="hl-1"> } = </span><span class="hl-2">request</span><span class="hl-1">.</span><span class="hl-2">body</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">action</span><span class="hl-1"> === </span><span class="hl-3">&quot;opened&quot;</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// Create new activity for new issue with initial Note</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">createActivity</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityType</span><span class="hl-1">.</span><span class="hl-2">Action</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">title</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">meta:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">notes:</span><span class="hl-1"> [</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">note:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">body</span><span class="hl-1"> || </span><span class="hl-3">&quot;No description provided&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">links:</span><span class="hl-1"> [</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">ActivityLinkType</span><span class="hl-1">.</span><span class="hl-2">external</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">title:</span><span class="hl-1"> </span><span class="hl-3">&quot;View on GitHub&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">url:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">html_url</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> ],</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> } </span><span class="hl-0">else</span><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">action</span><span class="hl-1"> === </span><span class="hl-3">&quot;created&quot;</span><span class="hl-1"> &amp;&amp; </span><span class="hl-2">comment</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// Add comment as Note to existing Activity</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">activity</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">getActivityBySource</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">activity</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">createNote</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">activity:</span><span class="hl-1"> { </span><span class="hl-2">id:</span><span class="hl-1"> </span><span class="hl-2">activity</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">note:</span><span class="hl-1"> </span><span class="hl-2">comment</span><span class="hl-1">.</span><span class="hl-2">body</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-7">// author could be set if you have user mapping</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> } </span><span class="hl-0">else</span><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">action</span><span class="hl-1"> === </span><span class="hl-3">&quot;closed&quot;</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// Mark activity as done</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-8">activity</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">getActivityBySource</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">github_issue_id:</span><span class="hl-1"> </span><span class="hl-2">issue</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">.</span><span class="hl-6">toString</span><span class="hl-1">(),</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">activity</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">plot</span><span class="hl-1">.</span><span class="hl-6">updateActivity</span><span class="hl-1">(</span><span class="hl-2">activity</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">doneAt:</span><span class="hl-1"> </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Date</span><span class="hl-1">(),</span><br/><span class="hl-1"> });</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">private</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">registerWebhook</span><span class="hl-1">(</span><span class="hl-2">url</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">fetch</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">`https://api.github.com/repos/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">owner</span><span class="hl-4">}</span><span class="hl-3">/</span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">repo</span><span class="hl-4">}</span><span class="hl-3">/hooks`</span><span class="hl-1">,</span><br/><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">method:</span><span class="hl-1"> </span><span class="hl-3">&quot;POST&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">headers:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">Authorization:</span><span class="hl-1"> </span><span class="hl-3">`Bearer </span><span class="hl-4">${</span><span class="hl-4">this</span><span class="hl-13">.</span><span class="hl-2">options</span><span class="hl-13">.</span><span class="hl-2">token</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">Accept:</span><span class="hl-1"> </span><span class="hl-3">&quot;application/vnd.github.v3+json&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">body:</span><span class="hl-1"> </span><span class="hl-8">JSON</span><span class="hl-1">.</span><span class="hl-6">stringify</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">config:</span><span class="hl-1"> { </span><span class="hl-2">url</span><span class="hl-1">, </span><span class="hl-2">content_type:</span><span class="hl-1"> </span><span class="hl-3">&quot;json&quot;</span><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-2">events:</span><span class="hl-1"> [</span><span class="hl-3">&quot;issues&quot;</span><span class="hl-1">],</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> );</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">private</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">unregisterWebhook</span><span class="hl-1">(</span><span class="hl-2">url</span><span class="hl-1">: </span><span class="hl-5">string</span><span class="hl-1">): </span><span class="hl-5">Promise</span><span class="hl-1">&lt;</span><span class="hl-5">void</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-7">// Implementation to remove webhook from GitHub</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
134
134
  </code><button type="button">Copy</button></pre>
135
135
 
136
136
  <h3 id="example-2-slack-notification-tool" class="tsd-anchor-link">Example 2: Slack Notification Tool<a href="#example-2-slack-notification-tool" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><p>A tool for sending Slack notifications.</p>
@@ -142,7 +142,7 @@
142
142
  </code><button type="button">Copy</button></pre>
143
143
 
144
144
  <h3 id="integration-testing" class="tsd-anchor-link">Integration Testing<a href="#integration-testing" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Test your tool with a real twist:</p>
145
- <pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">twist</span><span class="hl-1">, </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Plot</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister/tools/plot&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">GitHubTool</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;./github-tool&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">TestTwist</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Twist</span><span class="hl-1">&lt;</span><span class="hl-5">TestTwist</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-5">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">plot:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">Plot</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-2">github:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">GitHubTool</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">owner:</span><span class="hl-1"> </span><span class="hl-3">&quot;plotday&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">repo:</span><span class="hl-1"> </span><span class="hl-3">&quot;plot&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">token:</span><span class="hl-1"> </span><span class="hl-2">process</span><span class="hl-1">.</span><span class="hl-2">env</span><span class="hl-1">.</span><span class="hl-8">GITHUB_TOKEN</span><span class="hl-1">!,</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">activate</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-7">// Test syncing</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">github</span><span class="hl-1">.</span><span class="hl-6">syncIssues</span><span class="hl-1">();</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
145
+ <pre><code class="typescript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-0">type</span><span class="hl-1"> </span><span class="hl-2">ToolBuilder</span><span class="hl-1">, </span><span class="hl-2">twist</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister&quot;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Plot</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;@plotday/twister/tools/plot&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">GitHubTool</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&quot;./github-tool&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-4">class</span><span class="hl-1"> </span><span class="hl-5">TestTwist</span><span class="hl-1"> </span><span class="hl-4">extends</span><span class="hl-1"> </span><span class="hl-5">Twist</span><span class="hl-1">&lt;</span><span class="hl-5">TestTwist</span><span class="hl-1">&gt; {</span><br/><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">build</span><span class="hl-1">: </span><span class="hl-5">ToolBuilder</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">plot:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">Plot</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-2">github:</span><span class="hl-1"> </span><span class="hl-6">build</span><span class="hl-1">(</span><span class="hl-2">GitHubTool</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">owner:</span><span class="hl-1"> </span><span class="hl-3">&quot;plotday&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">repo:</span><span class="hl-1"> </span><span class="hl-3">&quot;plot&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">token:</span><span class="hl-1"> </span><span class="hl-2">process</span><span class="hl-1">.</span><span class="hl-2">env</span><span class="hl-1">.</span><span class="hl-8">GITHUB_TOKEN</span><span class="hl-1">!,</span><br/><span class="hl-1"> }),</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> </span><span class="hl-6">activate</span><span class="hl-1">() {</span><br/><span class="hl-1"> </span><span class="hl-7">// Test syncing</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-4">this</span><span class="hl-1">.</span><span class="hl-2">tools</span><span class="hl-1">.</span><span class="hl-2">github</span><span class="hl-1">.</span><span class="hl-6">syncIssues</span><span class="hl-1">();</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
146
146
  </code><button type="button">Copy</button></pre>
147
147
 
148
148
  <hr>
@@ -194,7 +194,6 @@
194
194
  <hr>
195
195
  <h2 id="next-steps" class="tsd-anchor-link">Next Steps<a href="#next-steps" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h2><ul>
196
196
  <li><strong><a href="Built-in_Tools.html">Built-in Tools Guide</a></strong> - Learn from built-in tool patterns</li>
197
- <li><strong><a href="Advanced.html">Advanced Topics</a></strong> - Complex tool patterns</li>
198
197
  <li><strong>API Reference</strong> - Explore the Tool class API</li>
199
198
  </ul>
200
199
  </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#building-custom-tools"><span>Building <wbr/>Custom <wbr/>Tools</span></a><ul><li><a href="#table-of-contents"><span>Table of <wbr/>Contents</span></a></li><li><a href="#why-build-tools"><span>Why <wbr/>Build <wbr/>Tools?</span></a></li><li><ul><li><a href="#built-in-vs-custom-tools"><span>Built-<wbr/>in vs. <wbr/>Custom <wbr/>Tools</span></a></li></ul></li><li><a href="#tool-basics"><span>Tool <wbr/>Basics</span></a></li><li><ul><li><a href="#minimal-tool-example"><span>Minimal <wbr/>Tool <wbr/>Example</span></a></li><li><a href="#using-your-tool"><span>Using <wbr/>Your <wbr/>Tool</span></a></li></ul></li><li><a href="#tool-structure"><span>Tool <wbr/>Structure</span></a></li><li><ul><li><a href="#class-definition"><span>Class <wbr/>Definition</span></a></li><li><a href="#type-parameter"><span>Type <wbr/>Parameter</span></a></li></ul></li><li><a href="#lifecycle-methods"><span>Lifecycle <wbr/>Methods</span></a></li><li><ul><li><a href="#preactivatepriority"><span>pre<wbr/>Activate(priority)</span></a></li><li><a href="#postactivatepriority"><span>post<wbr/>Activate(priority)</span></a></li><li><a href="#preupgrade"><span>pre<wbr/>Upgrade()</span></a></li><li><a href="#postupgrade"><span>post<wbr/>Upgrade()</span></a></li><li><a href="#predeactivate"><span>pre<wbr/>Deactivate()</span></a></li><li><a href="#postdeactivate"><span>post<wbr/>Deactivate()</span></a></li><li><a href="#execution-order"><span>Execution <wbr/>Order</span></a></li></ul></li><li><a href="#dependencies"><span>Dependencies</span></a></li><li><ul><li><a href="#declaring-dependencies"><span>Declaring <wbr/>Dependencies</span></a></li><li><a href="#accessing-dependencies"><span>Accessing <wbr/>Dependencies</span></a></li><li><a href="#built-in-tool-access"><span>Built-<wbr/>in <wbr/>Tool <wbr/>Access</span></a></li></ul></li><li><a href="#options-and-configuration"><span>Options and <wbr/>Configuration</span></a></li><li><ul><li><a href="#defining-options"><span>Defining <wbr/>Options</span></a></li><li><a href="#using-options"><span>Using <wbr/>Options</span></a></li><li><a href="#required-vs-optional-options"><span>Required vs. <wbr/>Optional <wbr/>Options</span></a></li></ul></li><li><a href="#complete-examples"><span>Complete <wbr/>Examples</span></a></li><li><ul><li><a href="#example-1-github-integration-tool"><span>Example 1: <wbr/>Git<wbr/>Hub <wbr/>Integration <wbr/>Tool</span></a></li><li><a href="#example-2-slack-notification-tool"><span>Example 2: <wbr/>Slack <wbr/>Notification <wbr/>Tool</span></a></li></ul></li><li><a href="#testing-tools"><span>Testing <wbr/>Tools</span></a></li><li><ul><li><a href="#unit-testing"><span>Unit <wbr/>Testing</span></a></li><li><a href="#integration-testing"><span>Integration <wbr/>Testing</span></a></li></ul></li><li><a href="#publishing-tools"><span>Publishing <wbr/>Tools</span></a></li><li><ul><li><a href="#package-structure"><span>Package <wbr/>Structure</span></a></li><li><a href="#packagejson"><span>package.json</span></a></li><li><a href="#publishing"><span>Publishing</span></a></li><li><a href="#documentation"><span>Documentation</span></a></li></ul></li><li><a href="#best-practices"><span>Best <wbr/>Practices</span></a></li><li><ul><li><a href="#1-single-responsibility"><span>1. <wbr/>Single <wbr/>Responsibility</span></a></li><li><a href="#2-type-safety"><span>2. <wbr/>Type <wbr/>Safety</span></a></li><li><a href="#3-error-handling"><span>3. <wbr/>Error <wbr/>Handling</span></a></li><li><a href="#4-configuration-validation"><span>4. <wbr/>Configuration <wbr/>Validation</span></a></li><li><a href="#5-resource-cleanup"><span>5. <wbr/>Resource <wbr/>Cleanup</span></a></li><li><a href="#6-avoid-instance-state"><span>6. <wbr/>Avoid <wbr/>Instance <wbr/>State</span></a></li><li><a href="#7-document-your-api"><span>7. <wbr/>Document <wbr/>Your <wbr/>API</span></a></li></ul></li><li><a href="#next-steps"><span>Next <wbr/>Steps</span></a></li></ul></div></details></div><div class="site-menu"><nav id="tsd-sidebar-links" class="tsd-navigation"><a href="https://plot.day" class="tsd-nav-link">Plot</a><a href="https://github.com/plotday/plot" class="tsd-nav-link">GitHub</a><a href="https://www.npmjs.com/package/@plotday/twister" class="tsd-nav-link">NPM</a></nav><nav class="tsd-navigation"><a href="../modules.html">Creating Plot Twists</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>