indusagi-coding-agent 0.1.43 → 0.1.45

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 (117) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +2 -0
  3. package/dist/command-line/args.d.ts +3 -0
  4. package/dist/command-line/args.d.ts.map +1 -1
  5. package/dist/command-line/args.js +19 -2
  6. package/dist/command-line/args.js.map +1 -1
  7. package/dist/command-line/list-models.js +1 -1
  8. package/dist/command-line/list-models.js.map +1 -1
  9. package/dist/command-line/login-handler.d.ts.map +1 -1
  10. package/dist/command-line/login-handler.js +32 -0
  11. package/dist/command-line/login-handler.js.map +1 -1
  12. package/dist/config.d.ts +1 -0
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +3 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/index.d.ts +4 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +3 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/interfaces/induscode-ui-delegate.d.ts +3 -0
  21. package/dist/interfaces/induscode-ui-delegate.d.ts.map +1 -0
  22. package/dist/interfaces/induscode-ui-delegate.js +148 -0
  23. package/dist/interfaces/induscode-ui-delegate.js.map +1 -0
  24. package/dist/interfaces/terminal-ui/components/footer.d.ts.map +1 -1
  25. package/dist/interfaces/terminal-ui/components/footer.js +9 -15
  26. package/dist/interfaces/terminal-ui/components/footer.js.map +1 -1
  27. package/dist/interfaces/terminal-ui/components/model-selector.d.ts.map +1 -1
  28. package/dist/interfaces/terminal-ui/components/model-selector.js +1 -1
  29. package/dist/interfaces/terminal-ui/components/model-selector.js.map +1 -1
  30. package/dist/interfaces/terminal-ui/components/tool-execution.d.ts.map +1 -1
  31. package/dist/interfaces/terminal-ui/components/tool-execution.js +162 -1
  32. package/dist/interfaces/terminal-ui/components/tool-execution.js.map +1 -1
  33. package/dist/interfaces/terminal-ui/interactive-mode.d.ts +10 -0
  34. package/dist/interfaces/terminal-ui/interactive-mode.d.ts.map +1 -1
  35. package/dist/interfaces/terminal-ui/interactive-mode.js +207 -0
  36. package/dist/interfaces/terminal-ui/interactive-mode.js.map +1 -1
  37. package/dist/main.d.ts.map +1 -1
  38. package/dist/main.js +18 -1
  39. package/dist/main.js.map +1 -1
  40. package/dist/runtime/agent-session.d.ts +41 -0
  41. package/dist/runtime/agent-session.d.ts.map +1 -1
  42. package/dist/runtime/agent-session.js +211 -24
  43. package/dist/runtime/agent-session.js.map +1 -1
  44. package/dist/runtime/index.d.ts +5 -0
  45. package/dist/runtime/index.d.ts.map +1 -1
  46. package/dist/runtime/index.js +5 -0
  47. package/dist/runtime/index.js.map +1 -1
  48. package/dist/runtime/model-registry.d.ts +6 -0
  49. package/dist/runtime/model-registry.d.ts.map +1 -1
  50. package/dist/runtime/model-registry.js +71 -14
  51. package/dist/runtime/model-registry.js.map +1 -1
  52. package/dist/runtime/model-resolver.d.ts.map +1 -1
  53. package/dist/runtime/model-resolver.js +5 -3
  54. package/dist/runtime/model-resolver.js.map +1 -1
  55. package/dist/runtime/plugins/types.d.ts +3 -0
  56. package/dist/runtime/plugins/types.d.ts.map +1 -1
  57. package/dist/runtime/plugins/types.js.map +1 -1
  58. package/dist/runtime/providers/adapters/claude-cli-adapter.d.ts +19 -0
  59. package/dist/runtime/providers/adapters/claude-cli-adapter.d.ts.map +1 -0
  60. package/dist/runtime/providers/adapters/claude-cli-adapter.js +242 -0
  61. package/dist/runtime/providers/adapters/claude-cli-adapter.js.map +1 -0
  62. package/dist/runtime/providers/adapters/codex-cli-adapter.d.ts +18 -0
  63. package/dist/runtime/providers/adapters/codex-cli-adapter.d.ts.map +1 -0
  64. package/dist/runtime/providers/adapters/codex-cli-adapter.js +177 -0
  65. package/dist/runtime/providers/adapters/codex-cli-adapter.js.map +1 -0
  66. package/dist/runtime/providers/adapters/indusagi-cli-adapter.d.ts +21 -0
  67. package/dist/runtime/providers/adapters/indusagi-cli-adapter.d.ts.map +1 -0
  68. package/dist/runtime/providers/adapters/indusagi-cli-adapter.js +162 -0
  69. package/dist/runtime/providers/adapters/indusagi-cli-adapter.js.map +1 -0
  70. package/dist/runtime/providers/adapters/utils.d.ts +12 -0
  71. package/dist/runtime/providers/adapters/utils.d.ts.map +1 -0
  72. package/dist/runtime/providers/adapters/utils.js +122 -0
  73. package/dist/runtime/providers/adapters/utils.js.map +1 -0
  74. package/dist/runtime/providers/builtins.d.ts +3 -0
  75. package/dist/runtime/providers/builtins.d.ts.map +1 -0
  76. package/dist/runtime/providers/builtins.js +99 -0
  77. package/dist/runtime/providers/builtins.js.map +1 -0
  78. package/dist/runtime/providers/provider-adapter-registry.d.ts +11 -0
  79. package/dist/runtime/providers/provider-adapter-registry.d.ts.map +1 -0
  80. package/dist/runtime/providers/provider-adapter-registry.js +36 -0
  81. package/dist/runtime/providers/provider-adapter-registry.js.map +1 -0
  82. package/dist/runtime/providers/provider-adapter.d.ts +33 -0
  83. package/dist/runtime/providers/provider-adapter.d.ts.map +1 -0
  84. package/dist/runtime/providers/provider-adapter.js +2 -0
  85. package/dist/runtime/providers/provider-adapter.js.map +1 -0
  86. package/dist/runtime/providers/provider-service.d.ts +33 -0
  87. package/dist/runtime/providers/provider-service.d.ts.map +1 -0
  88. package/dist/runtime/providers/provider-service.js +157 -0
  89. package/dist/runtime/providers/provider-service.js.map +1 -0
  90. package/dist/runtime/providers/types.d.ts +29 -0
  91. package/dist/runtime/providers/types.d.ts.map +1 -0
  92. package/dist/runtime/providers/types.js +9 -0
  93. package/dist/runtime/providers/types.js.map +1 -0
  94. package/dist/runtime/sdk.d.ts +15 -1
  95. package/dist/runtime/sdk.d.ts.map +1 -1
  96. package/dist/runtime/sdk.js +88 -5
  97. package/dist/runtime/sdk.js.map +1 -1
  98. package/dist/runtime/settings-manager.d.ts +18 -0
  99. package/dist/runtime/settings-manager.d.ts.map +1 -1
  100. package/dist/runtime/settings-manager.js +13 -0
  101. package/dist/runtime/settings-manager.js.map +1 -1
  102. package/dist/runtime/system-prompt.d.ts.map +1 -1
  103. package/dist/runtime/system-prompt.js +52 -1
  104. package/dist/runtime/system-prompt.js.map +1 -1
  105. package/dist/runtime/tooling/index.d.ts +55 -2
  106. package/dist/runtime/tooling/index.d.ts.map +1 -1
  107. package/dist/runtime/tooling/index.js +52 -2
  108. package/dist/runtime/tooling/index.js.map +1 -1
  109. package/dist/runtime/tooling/registry.d.ts.map +1 -1
  110. package/dist/runtime/tooling/registry.js +36 -0
  111. package/dist/runtime/tooling/registry.js.map +1 -1
  112. package/dist/telemetry/core/types.d.ts +1 -1
  113. package/dist/telemetry/core/types.js +1 -1
  114. package/guides/CLAUDE_CODEX_CLI_INTEGRATION_PLAN.md +321 -0
  115. package/guides/{PI_MONO_MIT_REMOVAL_GUIDE.md → INDUSAGI_MONO_MIT_REMOVAL_GUIDE.md} +29 -29
  116. package/guides/OPTION3_PROVIDER_ADAPTER_RUNTIME_PLAN.md +370 -0
  117. package/package.json +10 -5
@@ -234,7 +234,7 @@ import { ExtensionRunner, wrapRegisteredTools, wrapToolsWithExtensions, } from "
234
234
  import { expandPromptTemplate } from "./prompt-templates.js";
235
235
  import { buildSystemPrompt } from "./system-prompt.js";
236
236
  import { HookRunner } from "./lifecycle/index.js";
237
- import { createAllTools } from "./tooling/index.js";
237
+ import { ComposioService, createAllTools, } from "./tooling/index.js";
238
238
  import { createMemory, createMemoryTools, DEFAULT_WORKING_MEMORY_TEMPLATE } from "./tooling/memory.js";
239
239
  import { SubagentStore } from "./subagents.js";
240
240
  import { createSessionTodoStore } from "./tooling/index.js";
@@ -294,6 +294,7 @@ export class AgentSession {
294
294
  this._memoryTools = [];
295
295
  this._memoryThreadId = "";
296
296
  this._memoryResourceId = "default-user";
297
+ this._composioTools = [];
297
298
  // Tool registry for extension getTools/setTools
298
299
  this._toolRegistry = new Map();
299
300
  // Base system prompt (without extension appends) - used to apply fresh appends each turn
@@ -335,6 +336,7 @@ export class AgentSession {
335
336
  this._customTools = config.customTools ?? [];
336
337
  this._cwd = config.cwd;
337
338
  this._modelRegistry = config.modelRegistry;
339
+ this._providerService = config.providerService;
338
340
  this._agentDir = config.agentDir ?? getAgentDir();
339
341
  this._todoStore = createSessionTodoStore({
340
342
  sessionManager: this.sessionManager,
@@ -396,6 +398,20 @@ export class AgentSession {
396
398
  _rebuildTodoStore() {
397
399
  this._todoStore.rebuildFromBranch();
398
400
  }
401
+ _getComposioService() {
402
+ if (!this._composioService) {
403
+ this._composioService = new ComposioService();
404
+ }
405
+ return this._composioService;
406
+ }
407
+ _createComposioToolOptions() {
408
+ return {
409
+ service: this._getComposioService(),
410
+ onEnable: async (tools) => {
411
+ this.registerComposioTools(tools);
412
+ },
413
+ };
414
+ }
399
415
  _consumeQueuedUserMessage(event) {
400
416
  if (event.type !== "message_start" || event.message.role !== "user") {
401
417
  return;
@@ -591,6 +607,9 @@ export class AgentSession {
591
607
  * Call this when completely done with the session.
592
608
  */
593
609
  dispose() {
610
+ if (this.model && this._providerService?.usesAdapter(this.model)) {
611
+ void this._providerService.stopCurrent(this.model).catch(() => { });
612
+ }
594
613
  this._disconnectFromAgent();
595
614
  this._observeAgentEventsUnsubscribe?.();
596
615
  this._observeAgentEventsUnsubscribe = undefined;
@@ -779,16 +798,18 @@ export class AgentSession {
779
798
  "Then use /model to select a model.");
780
799
  }
781
800
  // Validate API key
782
- const apiKey = await this._modelRegistry.getApiKey(this.model);
783
- if (!apiKey) {
784
- const isOAuth = this._modelRegistry.isUsingOAuth(this.model);
785
- if (isOAuth) {
786
- throw new Error(`Authentication failed for "${this.model.provider}". ` +
787
- `Credentials may have expired or network is unavailable. ` +
788
- `Run '/login ${this.model.provider}' to re-authenticate.`);
801
+ if (this._modelRegistry.providerNeedsAuth(this.model.provider)) {
802
+ const apiKey = await this._modelRegistry.getApiKey(this.model);
803
+ if (!apiKey) {
804
+ const isOAuth = this._modelRegistry.isUsingOAuth(this.model);
805
+ if (isOAuth) {
806
+ throw new Error(`Authentication failed for "${this.model.provider}". ` +
807
+ `Credentials may have expired or network is unavailable. ` +
808
+ `Run '/login ${this.model.provider}' to re-authenticate.`);
809
+ }
810
+ throw new Error(`No API key found for ${this.model.provider}.\n\n` +
811
+ `Use /login or set an API key environment variable. See ${join(getDocsPath(), "authentication.md")}`);
789
812
  }
790
- throw new Error(`No API key found for ${this.model.provider}.\n\n` +
791
- `Use /login or set an API key environment variable. See ${join(getDocsPath(), "authentication.md")}`);
792
813
  }
793
814
  // Check if we need to compact before sending (catches aborted responses)
794
815
  const lastAssistant = this._findLastAssistantMessage();
@@ -1108,6 +1129,9 @@ export class AgentSession {
1108
1129
  */
1109
1130
  async abort() {
1110
1131
  this.abortRetry();
1132
+ if (this.model && this._providerService?.usesAdapter(this.model)) {
1133
+ await this._providerService.interruptCurrent(this.model);
1134
+ }
1111
1135
  this.agent.abort();
1112
1136
  await this.agent.waitForIdle();
1113
1137
  }
@@ -1134,6 +1158,9 @@ export class AgentSession {
1134
1158
  }
1135
1159
  this._disconnectFromAgent();
1136
1160
  await this.abort();
1161
+ if (this.model && this._providerService?.usesAdapter(this.model)) {
1162
+ await this._providerService.stopCurrent(this.model);
1163
+ }
1137
1164
  this.agent.reset();
1138
1165
  this.sessionManager.newSession(options);
1139
1166
  this._rebuildTodoStore();
@@ -1190,11 +1217,16 @@ export class AgentSession {
1190
1217
  * @throws Error if no API key available for the model
1191
1218
  */
1192
1219
  async setModel(model) {
1193
- const apiKey = await this._modelRegistry.getApiKey(model);
1194
- if (!apiKey) {
1195
- throw new Error(`No API key for ${model.provider}/${model.id}`);
1220
+ if (this._modelRegistry.providerNeedsAuth(model.provider)) {
1221
+ const apiKey = await this._modelRegistry.getApiKey(model);
1222
+ if (!apiKey) {
1223
+ throw new Error(`No API key for ${model.provider}/${model.id}`);
1224
+ }
1196
1225
  }
1197
1226
  const previousModel = this.model;
1227
+ if (previousModel && !modelsAreEqual(previousModel, model) && this._providerService?.usesAdapter(previousModel)) {
1228
+ await this._providerService.stopCurrent(previousModel);
1229
+ }
1198
1230
  this.agent.setModel(model);
1199
1231
  this.sessionManager.appendModelChange(model.provider, model.id);
1200
1232
  this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
@@ -1224,10 +1256,14 @@ export class AgentSession {
1224
1256
  const len = this._scopedModels.length;
1225
1257
  const nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
1226
1258
  const next = this._scopedModels[nextIndex];
1227
- // Validate API key
1228
- const apiKey = await this._modelRegistry.getApiKey(next.model);
1229
- if (!apiKey) {
1230
- throw new Error(`No API key for ${next.model.provider}/${next.model.id}`);
1259
+ if (this._modelRegistry.providerNeedsAuth(next.model.provider)) {
1260
+ const apiKey = await this._modelRegistry.getApiKey(next.model);
1261
+ if (!apiKey) {
1262
+ throw new Error(`No API key for ${next.model.provider}/${next.model.id}`);
1263
+ }
1264
+ }
1265
+ if (currentModel && !modelsAreEqual(currentModel, next.model) && this._providerService?.usesAdapter(currentModel)) {
1266
+ await this._providerService.stopCurrent(currentModel);
1231
1267
  }
1232
1268
  // Apply model
1233
1269
  this.agent.setModel(next.model);
@@ -1249,9 +1285,14 @@ export class AgentSession {
1249
1285
  const len = availableModels.length;
1250
1286
  const nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
1251
1287
  const nextModel = availableModels[nextIndex];
1252
- const apiKey = await this._modelRegistry.getApiKey(nextModel);
1253
- if (!apiKey) {
1254
- throw new Error(`No API key for ${nextModel.provider}/${nextModel.id}`);
1288
+ if (this._modelRegistry.providerNeedsAuth(nextModel.provider)) {
1289
+ const apiKey = await this._modelRegistry.getApiKey(nextModel);
1290
+ if (!apiKey) {
1291
+ throw new Error(`No API key for ${nextModel.provider}/${nextModel.id}`);
1292
+ }
1293
+ }
1294
+ if (currentModel && !modelsAreEqual(currentModel, nextModel) && this._providerService?.usesAdapter(currentModel)) {
1295
+ await this._providerService.stopCurrent(currentModel);
1255
1296
  }
1256
1297
  this.agent.setModel(nextModel);
1257
1298
  this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);
@@ -1723,9 +1764,11 @@ export class AgentSession {
1723
1764
  getAllTools: () => this.getAllTools(),
1724
1765
  setActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),
1725
1766
  setModel: async (model) => {
1726
- const key = await this.modelRegistry.getApiKey(model);
1727
- if (!key)
1728
- return false;
1767
+ if (this.modelRegistry.providerNeedsAuth(model.provider)) {
1768
+ const key = await this.modelRegistry.getApiKey(model);
1769
+ if (!key)
1770
+ return false;
1771
+ }
1729
1772
  await this.setModel(model);
1730
1773
  return true;
1731
1774
  },
@@ -1779,6 +1822,7 @@ export class AgentSession {
1779
1822
  bash: { commandPrefix: shellCommandPrefix },
1780
1823
  task: taskOptions,
1781
1824
  todoStore: this._todoStore,
1825
+ composio: this._createComposioToolOptions(),
1782
1826
  });
1783
1827
  this._baseToolRegistry = new Map(Object.entries(baseTools).map(([name, tool]) => [name, tool]));
1784
1828
  const extensionsResult = this._resourceLoader.getExtensions();
@@ -1831,7 +1875,18 @@ export class AgentSession {
1831
1875
  const activeMCPTools = this._mcpTools.filter((tool) => activeToolNameSet.has(tool.name));
1832
1876
  // Include memory tools that are in the active set
1833
1877
  const activeMemoryTools = this._memoryTools.filter((tool) => activeToolNameSet.has(tool.name));
1834
- const activeToolsArray = [...activeBaseTools, ...activeExtensionTools, ...activeMCPTools, ...activeMemoryTools];
1878
+ // Include Composio toolkit tools that are in the active set
1879
+ const activeComposioTools = this._composioTools.filter((tool) => activeToolNameSet.has(tool.name));
1880
+ for (const tool of [...this._mcpTools, ...this._memoryTools, ...this._composioTools]) {
1881
+ toolRegistry.set(tool.name, tool);
1882
+ }
1883
+ const activeToolsArray = [
1884
+ ...activeBaseTools,
1885
+ ...activeExtensionTools,
1886
+ ...activeMCPTools,
1887
+ ...activeMemoryTools,
1888
+ ...activeComposioTools,
1889
+ ];
1835
1890
  const shouldWrapTools = Boolean(this._extensionRunner || this._hookRunner);
1836
1891
  if (shouldWrapTools) {
1837
1892
  const wrappedActiveTools = wrapToolsWithExtensions(activeToolsArray, this._extensionRunner, this._hookRunner, this.sessionId);
@@ -2132,6 +2187,9 @@ export class AgentSession {
2132
2187
  }
2133
2188
  this._disconnectFromAgent();
2134
2189
  await this.abort();
2190
+ if (this.model && this._providerService?.usesAdapter(this.model)) {
2191
+ await this._providerService.stopCurrent(this.model);
2192
+ }
2135
2193
  this._steeringMessages = [];
2136
2194
  this._followUpMessages = [];
2137
2195
  this._pendingNextTurnMessages = [];
@@ -2677,6 +2735,135 @@ export class AgentSession {
2677
2735
  });
2678
2736
  }
2679
2737
  // =========================================================================
2738
+ // Composio
2739
+ // =========================================================================
2740
+ /**
2741
+ * Register Composio toolkit tools with the session.
2742
+ * These are hydrated native agent tools produced by composio_enable or startup preload.
2743
+ */
2744
+ registerComposioTools(tools) {
2745
+ const mergedTools = new Map(this._composioTools.map((tool) => [tool.name, tool]));
2746
+ for (const tool of tools) {
2747
+ mergedTools.set(tool.name, tool);
2748
+ this._toolRegistry.set(tool.name, tool);
2749
+ }
2750
+ this._composioTools = Array.from(mergedTools.values());
2751
+ const currentActive = this.getActiveToolNames();
2752
+ const activeToolNames = Array.from(new Set([...currentActive, ...tools.map((tool) => tool.name)]));
2753
+ this.setActiveToolsByName(activeToolNames);
2754
+ this._rebuildRuntimeState({
2755
+ activeToolNames,
2756
+ includeAllExtensionTools: true,
2757
+ });
2758
+ void this._refreshObserveSession();
2759
+ void this._logObserve({
2760
+ name: "composio.register_tools",
2761
+ summary: "registered Composio tools",
2762
+ attributes: {
2763
+ toolCount: tools.length,
2764
+ toolNames: tools.map((tool) => tool.name),
2765
+ },
2766
+ });
2767
+ }
2768
+ /**
2769
+ * Enable Composio toolkit tools for the current session.
2770
+ */
2771
+ async enableComposio(options = {}) {
2772
+ return this._runObserveOperation("composio.enable", "custom", async () => {
2773
+ const persistSettings = options.persistSettings ?? false;
2774
+ const toolkits = options.toolkits?.length ? options.toolkits : this.settingsManager.getComposioDefaultToolkits();
2775
+ const toolSlugs = options.toolSlugs ?? [];
2776
+ if (toolkits.length === 0 && toolSlugs.length === 0) {
2777
+ throw new Error("Composio requires at least one toolkit or tool slug.");
2778
+ }
2779
+ const tools = await this._getComposioService().createAgentTools({
2780
+ toolkits,
2781
+ toolSlugs,
2782
+ authConfigs: options.authConfigs,
2783
+ connectedAccounts: options.connectedAccounts,
2784
+ authConfigId: options.authConfigId,
2785
+ connectedAccountId: options.connectedAccountId,
2786
+ });
2787
+ this.registerComposioTools(tools);
2788
+ if (persistSettings) {
2789
+ this.settingsManager.setComposioSettings({
2790
+ enabled: true,
2791
+ autoConnect: toolkits.length > 0,
2792
+ defaultToolkits: toolkits,
2793
+ mode: toolkits.length > 0 ? "preload" : "control",
2794
+ });
2795
+ }
2796
+ await this._refreshObserveSession();
2797
+ return tools;
2798
+ }, {
2799
+ attributes: {
2800
+ toolkits: options.toolkits ?? [],
2801
+ toolSlugs: options.toolSlugs ?? [],
2802
+ persistSettings: options.persistSettings ?? false,
2803
+ },
2804
+ });
2805
+ }
2806
+ /**
2807
+ * Remove hydrated Composio toolkit tools from the current session.
2808
+ */
2809
+ async clearComposioTools(options) {
2810
+ await this._runObserveOperation("composio.clear", "custom", async () => {
2811
+ const persistSettings = options?.persistSettings ?? false;
2812
+ const composioToolNames = new Set(this._composioTools.map((tool) => tool.name));
2813
+ const activeWithoutComposio = this.getActiveToolNames().filter((name) => !composioToolNames.has(name));
2814
+ this._composioTools = [];
2815
+ this._rebuildRuntimeState({
2816
+ activeToolNames: activeWithoutComposio,
2817
+ includeAllExtensionTools: true,
2818
+ });
2819
+ if (persistSettings) {
2820
+ this.settingsManager.setComposioSettings({
2821
+ autoConnect: false,
2822
+ defaultToolkits: [],
2823
+ mode: "control",
2824
+ });
2825
+ }
2826
+ await this._refreshObserveSession();
2827
+ }, {
2828
+ attributes: {
2829
+ persistSettings: options?.persistSettings ?? false,
2830
+ },
2831
+ });
2832
+ }
2833
+ getComposioToolNames() {
2834
+ return this._composioTools.map((tool) => tool.name);
2835
+ }
2836
+ getComposioTools() {
2837
+ return this._composioTools;
2838
+ }
2839
+ async connectComposio(options) {
2840
+ return this._runObserveOperation("composio.connect", "custom", () => this._getComposioService().connectAccount({
2841
+ toolkit: options.toolkit,
2842
+ connectedAccountId: options.connectedAccountId,
2843
+ authConfigId: options.authConfigId,
2844
+ callbackUrl: options.callbackUrl,
2845
+ }), {
2846
+ attributes: {
2847
+ toolkit: options.toolkit ?? "",
2848
+ connectedAccountId: options.connectedAccountId ?? "",
2849
+ },
2850
+ });
2851
+ }
2852
+ async listComposioAccounts(filters) {
2853
+ return this._runObserveOperation("composio.accounts", "custom", () => this._getComposioService().listAccounts({
2854
+ toolkitSlugs: filters?.toolkits,
2855
+ statuses: filters?.statuses,
2856
+ limit: filters?.limit,
2857
+ cursor: filters?.cursor,
2858
+ authConfigIds: filters?.authConfigIds,
2859
+ }), {
2860
+ attributes: {
2861
+ toolkits: filters?.toolkits ?? [],
2862
+ statuses: filters?.statuses ?? [],
2863
+ },
2864
+ });
2865
+ }
2866
+ // =========================================================================
2680
2867
  // Memory System
2681
2868
  // =========================================================================
2682
2869
  /**