wave-agent-sdk 0.17.0 → 0.17.2

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 (169) hide show
  1. package/builtin/skills/deep-research/SKILL.md +90 -0
  2. package/builtin/skills/settings/ENV.md +6 -3
  3. package/dist/agent.d.ts +28 -1
  4. package/dist/agent.d.ts.map +1 -1
  5. package/dist/agent.js +128 -34
  6. package/dist/constants/goalPrompts.d.ts +2 -0
  7. package/dist/constants/goalPrompts.d.ts.map +1 -0
  8. package/dist/constants/goalPrompts.js +10 -0
  9. package/dist/constants/tools.d.ts +1 -0
  10. package/dist/constants/tools.d.ts.map +1 -1
  11. package/dist/constants/tools.js +1 -0
  12. package/dist/managers/aiManager.d.ts +7 -0
  13. package/dist/managers/aiManager.d.ts.map +1 -1
  14. package/dist/managers/aiManager.js +77 -41
  15. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  16. package/dist/managers/backgroundTaskManager.js +10 -2
  17. package/dist/managers/goalManager.d.ts +43 -0
  18. package/dist/managers/goalManager.d.ts.map +1 -0
  19. package/dist/managers/goalManager.js +177 -0
  20. package/dist/managers/messageManager.d.ts +2 -2
  21. package/dist/managers/messageManager.d.ts.map +1 -1
  22. package/dist/managers/messageQueue.d.ts +10 -0
  23. package/dist/managers/messageQueue.d.ts.map +1 -1
  24. package/dist/managers/messageQueue.js +53 -1
  25. package/dist/managers/pluginManager.d.ts.map +1 -1
  26. package/dist/managers/pluginManager.js +7 -1
  27. package/dist/managers/skillManager.d.ts +2 -0
  28. package/dist/managers/skillManager.d.ts.map +1 -1
  29. package/dist/managers/skillManager.js +19 -9
  30. package/dist/managers/slashCommandManager.d.ts +6 -0
  31. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  32. package/dist/managers/slashCommandManager.js +105 -0
  33. package/dist/managers/toolManager.d.ts.map +1 -1
  34. package/dist/managers/toolManager.js +5 -0
  35. package/dist/managers/workflowManager.d.ts +65 -0
  36. package/dist/managers/workflowManager.d.ts.map +1 -0
  37. package/dist/managers/workflowManager.js +380 -0
  38. package/dist/prompts/index.d.ts +2 -1
  39. package/dist/prompts/index.d.ts.map +1 -1
  40. package/dist/prompts/index.js +3 -3
  41. package/dist/services/aiService.d.ts +23 -0
  42. package/dist/services/aiService.d.ts.map +1 -1
  43. package/dist/services/aiService.js +102 -9
  44. package/dist/services/configurationService.d.ts +1 -1
  45. package/dist/services/configurationService.d.ts.map +1 -1
  46. package/dist/services/configurationService.js +3 -16
  47. package/dist/services/hook.d.ts.map +1 -1
  48. package/dist/services/hook.js +4 -0
  49. package/dist/services/session.d.ts +9 -1
  50. package/dist/services/session.d.ts.map +1 -1
  51. package/dist/services/session.js +28 -1
  52. package/dist/tools/bashTool.d.ts.map +1 -1
  53. package/dist/tools/bashTool.js +49 -7
  54. package/dist/tools/readTool.d.ts.map +1 -1
  55. package/dist/tools/readTool.js +1 -1
  56. package/dist/tools/taskManagementTools.d.ts.map +1 -1
  57. package/dist/tools/taskManagementTools.js +103 -157
  58. package/dist/tools/types.d.ts +2 -0
  59. package/dist/tools/types.d.ts.map +1 -1
  60. package/dist/tools/webFetchTool.d.ts.map +1 -1
  61. package/dist/tools/webFetchTool.js +0 -9
  62. package/dist/tools/workflowTool.d.ts +11 -0
  63. package/dist/tools/workflowTool.d.ts.map +1 -0
  64. package/dist/tools/workflowTool.js +190 -0
  65. package/dist/types/agent.d.ts +2 -0
  66. package/dist/types/agent.d.ts.map +1 -1
  67. package/dist/types/commands.d.ts +4 -0
  68. package/dist/types/commands.d.ts.map +1 -1
  69. package/dist/types/config.d.ts +2 -2
  70. package/dist/types/config.d.ts.map +1 -1
  71. package/dist/types/core.d.ts +1 -1
  72. package/dist/types/core.d.ts.map +1 -1
  73. package/dist/types/hooks.d.ts +2 -0
  74. package/dist/types/hooks.d.ts.map +1 -1
  75. package/dist/types/index.d.ts +1 -0
  76. package/dist/types/index.d.ts.map +1 -1
  77. package/dist/types/index.js +1 -0
  78. package/dist/types/messaging.d.ts +2 -2
  79. package/dist/types/messaging.d.ts.map +1 -1
  80. package/dist/types/processes.d.ts +6 -2
  81. package/dist/types/processes.d.ts.map +1 -1
  82. package/dist/types/workflow.d.ts +2 -0
  83. package/dist/types/workflow.d.ts.map +1 -0
  84. package/dist/types/workflow.js +1 -0
  85. package/dist/utils/cacheControlUtils.d.ts +13 -8
  86. package/dist/utils/cacheControlUtils.d.ts.map +1 -1
  87. package/dist/utils/cacheControlUtils.js +73 -102
  88. package/dist/utils/containerSetup.d.ts.map +1 -1
  89. package/dist/utils/containerSetup.js +7 -0
  90. package/dist/utils/markdownParser.d.ts.map +1 -1
  91. package/dist/utils/markdownParser.js +21 -6
  92. package/dist/utils/messageOperations.d.ts +2 -2
  93. package/dist/utils/messageOperations.d.ts.map +1 -1
  94. package/dist/utils/notificationXml.d.ts.map +1 -1
  95. package/dist/workflow/budgetTracker.d.ts +12 -0
  96. package/dist/workflow/budgetTracker.d.ts.map +1 -0
  97. package/dist/workflow/budgetTracker.js +30 -0
  98. package/dist/workflow/concurrencyLimiter.d.ts +14 -0
  99. package/dist/workflow/concurrencyLimiter.d.ts.map +1 -0
  100. package/dist/workflow/concurrencyLimiter.js +39 -0
  101. package/dist/workflow/journal.d.ts +19 -0
  102. package/dist/workflow/journal.d.ts.map +1 -0
  103. package/dist/workflow/journal.js +74 -0
  104. package/dist/workflow/progressReporter.d.ts +21 -0
  105. package/dist/workflow/progressReporter.d.ts.map +1 -0
  106. package/dist/workflow/progressReporter.js +118 -0
  107. package/dist/workflow/runState.d.ts +16 -0
  108. package/dist/workflow/runState.d.ts.map +1 -0
  109. package/dist/workflow/runState.js +57 -0
  110. package/dist/workflow/scriptRuntime.d.ts +35 -0
  111. package/dist/workflow/scriptRuntime.d.ts.map +1 -0
  112. package/dist/workflow/scriptRuntime.js +196 -0
  113. package/dist/workflow/structuredOutput.d.ts +27 -0
  114. package/dist/workflow/structuredOutput.d.ts.map +1 -0
  115. package/dist/workflow/structuredOutput.js +106 -0
  116. package/dist/workflow/types.d.ts +81 -0
  117. package/dist/workflow/types.d.ts.map +1 -0
  118. package/dist/workflow/types.js +1 -0
  119. package/dist/workflow/workflowApis.d.ts +46 -0
  120. package/dist/workflow/workflowApis.d.ts.map +1 -0
  121. package/dist/workflow/workflowApis.js +280 -0
  122. package/package.json +1 -1
  123. package/src/agent.ts +144 -34
  124. package/src/constants/goalPrompts.ts +10 -0
  125. package/src/constants/tools.ts +1 -0
  126. package/src/managers/aiManager.ts +91 -47
  127. package/src/managers/backgroundTaskManager.ts +16 -4
  128. package/src/managers/goalManager.ts +232 -0
  129. package/src/managers/messageManager.ts +2 -2
  130. package/src/managers/messageQueue.ts +59 -1
  131. package/src/managers/pluginManager.ts +8 -1
  132. package/src/managers/skillManager.ts +20 -9
  133. package/src/managers/slashCommandManager.ts +119 -0
  134. package/src/managers/toolManager.ts +7 -0
  135. package/src/managers/workflowManager.ts +491 -0
  136. package/src/prompts/index.ts +4 -2
  137. package/src/services/aiService.ts +166 -12
  138. package/src/services/configurationService.ts +2 -22
  139. package/src/services/hook.ts +5 -0
  140. package/src/services/session.ts +42 -2
  141. package/src/tools/bashTool.ts +64 -9
  142. package/src/tools/readTool.ts +1 -2
  143. package/src/tools/taskManagementTools.ts +146 -195
  144. package/src/tools/types.ts +2 -0
  145. package/src/tools/webFetchTool.ts +0 -12
  146. package/src/tools/workflowTool.ts +205 -0
  147. package/src/types/agent.ts +6 -0
  148. package/src/types/commands.ts +4 -0
  149. package/src/types/config.ts +2 -2
  150. package/src/types/core.ts +3 -3
  151. package/src/types/hooks.ts +2 -0
  152. package/src/types/index.ts +1 -0
  153. package/src/types/messaging.ts +2 -2
  154. package/src/types/processes.ts +10 -2
  155. package/src/types/workflow.ts +5 -0
  156. package/src/utils/cacheControlUtils.ts +106 -131
  157. package/src/utils/containerSetup.ts +9 -0
  158. package/src/utils/markdownParser.ts +26 -8
  159. package/src/utils/messageOperations.ts +2 -2
  160. package/src/utils/notificationXml.ts +6 -1
  161. package/src/workflow/budgetTracker.ts +34 -0
  162. package/src/workflow/concurrencyLimiter.ts +47 -0
  163. package/src/workflow/journal.ts +95 -0
  164. package/src/workflow/progressReporter.ts +141 -0
  165. package/src/workflow/runState.ts +65 -0
  166. package/src/workflow/scriptRuntime.ts +274 -0
  167. package/src/workflow/structuredOutput.ts +123 -0
  168. package/src/workflow/types.ts +95 -0
  169. package/src/workflow/workflowApis.ts +412 -0
@@ -418,9 +418,7 @@ export class AIManager {
418
418
  if (usedTokens >= POST_COMPACT_TOKEN_BUDGET)
419
419
  break;
420
420
  }
421
- // 2. Working directory
422
- contextParts.push(`\n\n[Working Directory]\nCurrent working directory: ${this.getWorkdir()}`);
423
- // 3. Plan mode context
421
+ // 2. Plan mode context
424
422
  const currentMode = this.permissionManager?.getCurrentEffectiveMode(this.getModelConfig().permissionMode);
425
423
  if (currentMode === "plan") {
426
424
  const planFilePath = this.permissionManager?.getPlanFilePath();
@@ -637,6 +635,7 @@ export class AIManager {
637
635
  model: model, // Use passed model
638
636
  systemPrompt: buildSystemPrompt(this.systemPrompt, filteredToolPlugins, {
639
637
  workdir: this.getWorkdir(),
638
+ originalWorkdir: this.getOriginalWorkdir(),
640
639
  memory: combinedMemory,
641
640
  language: this.getLanguage(),
642
641
  isSubagent: !!this.subagentType,
@@ -644,6 +643,7 @@ export class AIManager {
644
643
  permissionMode: currentMode,
645
644
  }), // Pass custom system prompt
646
645
  maxTokens: maxTokens, // Pass max tokens override
646
+ toolChoice: this.toolChoiceOverride, // Pass tool_choice override
647
647
  };
648
648
  // Add streaming callbacks only if streaming is enabled
649
649
  if (this.stream) {
@@ -681,32 +681,11 @@ export class AIManager {
681
681
  this.messageManager.updateCurrentMessageReasoning(reasoning);
682
682
  };
683
683
  }
684
- startLLMRequestSpan(model || this.getModelConfig().model);
685
- const apiStartTime = Date.now();
686
- let ttftMs;
687
- // If streaming, track TTFT via callback
688
- if (this.stream && callAgentOptions.onContentUpdate) {
689
- const originalOnContentUpdate = callAgentOptions.onContentUpdate;
690
- let firstTokenReceived = false;
691
- callAgentOptions.onContentUpdate = (content) => {
692
- if (!firstTokenReceived) {
693
- ttftMs = Date.now() - apiStartTime;
694
- firstTokenReceived = true;
695
- }
696
- originalOnContentUpdate(content);
697
- };
698
- }
684
+ startLLMRequestSpan(model || this.getModelConfig().model || "");
699
685
  const result = await aiService.callAgent(callAgentOptions);
700
- const ttltMs = Date.now() - apiStartTime;
701
686
  // End LLM span with usage data
702
687
  endLLMRequestSpan({
703
- model: model || this.getModelConfig().model,
704
- inputTokens: result.usage?.prompt_tokens,
705
- outputTokens: result.usage?.completion_tokens,
706
- cacheReadTokens: result.usage?.cache_read_input_tokens,
707
- cacheCreationTokens: result.usage?.cache_creation_input_tokens,
708
- ttftMs,
709
- ttltMs,
688
+ model: model || this.getModelConfig().model || "",
710
689
  success: true,
711
690
  hasToolCall: !!(result.tool_calls && result.tool_calls.length > 0),
712
691
  });
@@ -906,7 +885,7 @@ export class AIManager {
906
885
  (toolResult.error ? `Error: ${toolResult.error}` : "");
907
886
  if (jsonRecovered) {
908
887
  toolResultContent +=
909
- "\n\n⚠️ Tool arguments were truncated (likely exceeded max output tokens). Please reduce your output or split into multiple tool calls.";
888
+ "\n\nTool arguments were truncated (likely exceeded max output tokens). Please reduce your output or split into multiple tool calls.";
910
889
  }
911
890
  // Update message state - tool execution completed
912
891
  this.messageManager.updateToolBlock({
@@ -1035,7 +1014,7 @@ export class AIManager {
1035
1014
  catch (error) {
1036
1015
  // End LLM span with error
1037
1016
  endLLMRequestSpan({
1038
- model: model || this.getModelConfig().model,
1017
+ model: model || this.getModelConfig().model || "",
1039
1018
  success: false,
1040
1019
  error: error instanceof Error ? error.message : String(error),
1041
1020
  });
@@ -1098,19 +1077,75 @@ export class AIManager {
1098
1077
  this.messageManager.addFileHistoryBlock(snapshots);
1099
1078
  }
1100
1079
  }
1101
- const shouldContinue = await this.executeStopHooks();
1102
- // If Stop/SubagentStop hooks indicate we should continue (due to blocking errors),
1103
- // restart the AI conversation cycle
1104
- if (shouldContinue) {
1105
- logger?.info(`${this.subagentType ? "SubagentStop" : "Stop"} hooks indicate issues need fixing, continuing conversation...`);
1106
- // Restart the conversation to let AI fix the issues
1107
- // Use recursionDepth = 0 to set loading false again for continuation
1108
- await this.sendAIMessage({
1109
- recursionDepth: 0,
1110
- model,
1111
- allowedRules,
1112
- maxTokens,
1113
- });
1080
+ // Goal evaluation supersedes Stop hooks when active
1081
+ const goalManager = this.container.has("GoalManager")
1082
+ ? this.container.get("GoalManager")
1083
+ : undefined;
1084
+ let goalContinuing = false;
1085
+ if (goalManager?.isGoalActive() && !this.subagentType) {
1086
+ // 1. Increment turn count and check circuit breakers
1087
+ goalManager.incrementTurnCount();
1088
+ const circuitBreaker = goalManager.checkCircuitBreakers();
1089
+ if (circuitBreaker) {
1090
+ goalManager.clearGoal();
1091
+ logger?.info(`[Goal] ${circuitBreaker}`);
1092
+ this.messageManager.addUserMessage({
1093
+ content: `<system-reminder>${circuitBreaker}</system-reminder>`,
1094
+ isMeta: true,
1095
+ });
1096
+ // Fall through to normal Stop hooks on the final turn
1097
+ }
1098
+ else {
1099
+ // 2. Evaluate goal
1100
+ const evaluation = await goalManager.evaluateGoal(abortController.signal);
1101
+ if (evaluation.isMet) {
1102
+ goalManager.clearGoal();
1103
+ logger?.info(`[Goal] Goal achieved: ${evaluation.reason}`);
1104
+ this.messageManager.addUserMessage({
1105
+ content: `<system-reminder>Goal achieved: ${evaluation.reason}</system-reminder>`,
1106
+ isMeta: true,
1107
+ });
1108
+ // Fall through to normal Stop hooks on the final turn
1109
+ }
1110
+ else {
1111
+ const goal = goalManager.getGoal();
1112
+ goal.lastReason = evaluation.reason;
1113
+ logger?.info(`[Goal] Not yet met: ${evaluation.reason}`);
1114
+ this.messageManager.addUserMessage({
1115
+ content: `<system-reminder>Goal not yet met: ${evaluation.reason}. Continue working toward: ${goal.condition}</system-reminder>`,
1116
+ isMeta: true,
1117
+ });
1118
+ // Keep loading state active to prevent UI flicker
1119
+ this.setIsLoading(true);
1120
+ goalContinuing = true;
1121
+ await this.sendAIMessage({
1122
+ recursionDepth: 0,
1123
+ model,
1124
+ allowedRules,
1125
+ maxTokens,
1126
+ });
1127
+ }
1128
+ }
1129
+ }
1130
+ // Skip Stop hooks when goal evaluator is continuing the conversation
1131
+ if (goalContinuing) {
1132
+ // Goal evaluator supersedes Stop hooks
1133
+ }
1134
+ else {
1135
+ const shouldContinue = await this.executeStopHooks();
1136
+ // If Stop/SubagentStop hooks indicate we should continue (due to blocking errors),
1137
+ // restart the AI conversation cycle
1138
+ if (shouldContinue) {
1139
+ logger?.info(`${this.subagentType ? "SubagentStop" : "Stop"} hooks indicate issues need fixing, continuing conversation...`);
1140
+ // Restart the conversation to let AI fix the issues
1141
+ // Use recursionDepth = 0 to set loading false again for continuation
1142
+ await this.sendAIMessage({
1143
+ recursionDepth: 0,
1144
+ model,
1145
+ allowedRules,
1146
+ maxTokens,
1147
+ });
1148
+ }
1114
1149
  }
1115
1150
  }
1116
1151
  }
@@ -1249,6 +1284,7 @@ export class AIManager {
1249
1284
  toolInput,
1250
1285
  toolResponse,
1251
1286
  subagentType: this.subagentType, // Include subagent type in hook context
1287
+ planFilePath: this.permissionManager?.getPlanFilePath(),
1252
1288
  env: this.container.get("MergedEnv") ||
1253
1289
  process.env,
1254
1290
  };
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAIzD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,MAAM,WAAW,8BAA8B;IAC7C,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAGd,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,4BAA4B;IAMvC,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,CAAC,iBAAiB;IAIlB,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKnC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI/C,WAAW,IAAI,cAAc,EAAE;IAI/B,UAAU,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IAwKnD,YAAY,CACjB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,EAC1B,aAAa,GAAE,MAAW,GACzB,MAAM;IA+HF,SAAS,CACd,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACd;QACD,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAoCD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAgC7B,OAAO,IAAI,IAAI;CAUvB"}
1
+ {"version":3,"file":"backgroundTaskManager.d.ts","sourceRoot":"","sources":["../../src/managers/backgroundTaskManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAIzD,OAAO,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,MAAM,WAAW,8BAA8B;IAC7C,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,8BAA8B,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAGd,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,4BAA4B;IAMvC,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,CAAC,iBAAiB;IAIlB,UAAU,IAAI,MAAM;IAIpB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKnC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI/C,WAAW,IAAI,cAAc,EAAE;IAI/B,UAAU,CACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,IAAI,CAAA;KAAE;IA8KnD,YAAY,CACjB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,EAC1B,aAAa,GAAE,MAAW,GACzB,MAAM;IAqIF,SAAS,CACd,EAAE,EAAE,MAAM,EACV,MAAM,CAAC,EAAE,MAAM,GACd;QACD,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAoCD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAgC7B,OAAO,IAAI,IAAI;CAUvB"}
@@ -67,7 +67,11 @@ export class BackgroundTaskManager {
67
67
  process.kill(-child.pid, "SIGKILL");
68
68
  }
69
69
  catch (error) {
70
- logger.error("Failed to force kill process:", error);
70
+ // ESRCH means the process already exited — not an error
71
+ if (!(error instanceof Error) ||
72
+ error.code !== "ESRCH") {
73
+ logger.error("Failed to force kill process:", error);
74
+ }
71
75
  }
72
76
  }
73
77
  }, 1000);
@@ -217,7 +221,11 @@ export class BackgroundTaskManager {
217
221
  process.kill(-child.pid, "SIGKILL");
218
222
  }
219
223
  catch (error) {
220
- logger.error("Failed to force kill process:", error);
224
+ // ESRCH means the process already exited — not an error
225
+ if (!(error instanceof Error) ||
226
+ error.code !== "ESRCH") {
227
+ logger.error("Failed to force kill process:", error);
228
+ }
221
229
  }
222
230
  }
223
231
  }, 1000);
@@ -0,0 +1,43 @@
1
+ import { Container } from "../utils/container.js";
2
+ export interface GoalState {
3
+ condition: string;
4
+ startedAt: number;
5
+ turnCount: number;
6
+ tokenBaseline: number;
7
+ lastReason?: string;
8
+ consecutiveEvalFailures: number;
9
+ }
10
+ export declare class GoalManager {
11
+ private container;
12
+ private state;
13
+ private onGoalStateChange?;
14
+ private onGoalEvaluating?;
15
+ constructor(container: Container);
16
+ private get messageManager();
17
+ private get aiManager();
18
+ setOnGoalStateChange(callback: (active: boolean, condition?: string, elapsed?: string) => void): void;
19
+ setOnGoalEvaluating(callback: (evaluating: boolean) => void): void;
20
+ setGoal(condition: string): void;
21
+ clearGoal(): void;
22
+ getGoal(): GoalState | null;
23
+ isGoalActive(): boolean;
24
+ incrementTurnCount(): void;
25
+ getStatusString(): string;
26
+ /**
27
+ * Check circuit breakers. Returns a clear reason if goal should be force-cleared, null otherwise.
28
+ */
29
+ checkCircuitBreakers(): string | null;
30
+ /**
31
+ * Evaluate whether the goal has been met using the fast model.
32
+ */
33
+ evaluateGoal(abortSignal?: AbortSignal): Promise<{
34
+ isMet: boolean;
35
+ reason: string;
36
+ }>;
37
+ /**
38
+ * Parse the evaluation response from the fast model.
39
+ */
40
+ private parseEvaluationResponse;
41
+ private formatElapsed;
42
+ }
43
+ //# sourceMappingURL=goalManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalManager.d.ts","sourceRoot":"","sources":["../../src/managers/goalManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAQlD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAOD,qBAAa,WAAW;IASV,OAAO,CAAC,SAAS;IAR7B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,iBAAiB,CAAC,CAIhB;IACV,OAAO,CAAC,gBAAgB,CAAC,CAAgC;gBAErC,SAAS,EAAE,SAAS;IAExC,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,SAAS,GAEpB;IAEM,oBAAoB,CACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,GACxE,IAAI;IAIA,mBAAmB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIlE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAqBhC,SAAS,IAAI,IAAI;IAQjB,OAAO,IAAI,SAAS,GAAG,IAAI;IAI3B,YAAY,IAAI,OAAO;IAIvB,kBAAkB,IAAI,IAAI;IAM1B,eAAe,IAAI,MAAM;IAUhC;;OAEG;IACI,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAkB5C;;OAEG;IACU,YAAY,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;QAC5D,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IA0DF;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,aAAa;CAQtB"}
@@ -0,0 +1,177 @@
1
+ import { evaluateGoal as aiEvaluateGoal } from "../services/aiService.js";
2
+ import { convertMessagesForAPI } from "../utils/convertMessagesForAPI.js";
3
+ import { logger } from "../utils/globalLogger.js";
4
+ const MAX_GOAL_TURNS = 50;
5
+ const MAX_GOAL_DURATION_MS = 30 * 60 * 1000; // 30 minutes
6
+ const MAX_CONSECUTIVE_EVAL_FAILURES = 3;
7
+ const MAX_CONDITION_LENGTH = 4000;
8
+ export class GoalManager {
9
+ constructor(container) {
10
+ this.container = container;
11
+ this.state = null;
12
+ }
13
+ get messageManager() {
14
+ return this.container.get("MessageManager");
15
+ }
16
+ get aiManager() {
17
+ return this.container.get("AIManager");
18
+ }
19
+ setOnGoalStateChange(callback) {
20
+ this.onGoalStateChange = callback;
21
+ }
22
+ setOnGoalEvaluating(callback) {
23
+ this.onGoalEvaluating = callback;
24
+ }
25
+ setGoal(condition) {
26
+ if (condition.length > MAX_CONDITION_LENGTH) {
27
+ throw new Error(`Goal condition exceeds maximum length of ${MAX_CONDITION_LENGTH} characters`);
28
+ }
29
+ const totalTokens = this.messageManager.getLatestTotalTokens?.() ?? 0;
30
+ this.state = {
31
+ condition,
32
+ startedAt: Date.now(),
33
+ turnCount: 0,
34
+ tokenBaseline: totalTokens,
35
+ consecutiveEvalFailures: 0,
36
+ };
37
+ this.onGoalStateChange?.(true, condition, "0m");
38
+ logger?.info(`[Goal] Set goal: ${condition}`);
39
+ }
40
+ clearGoal() {
41
+ if (this.state) {
42
+ logger?.info(`[Goal] Cleared goal: ${this.state.condition}`);
43
+ this.state = null;
44
+ this.onGoalStateChange?.(false);
45
+ }
46
+ }
47
+ getGoal() {
48
+ return this.state;
49
+ }
50
+ isGoalActive() {
51
+ return this.state !== null;
52
+ }
53
+ incrementTurnCount() {
54
+ if (this.state) {
55
+ this.state.turnCount++;
56
+ }
57
+ }
58
+ getStatusString() {
59
+ if (!this.state)
60
+ return "No active goal";
61
+ const elapsed = this.formatElapsed(Date.now() - this.state.startedAt);
62
+ let status = `Goal: ${this.state.condition}\nElapsed: ${elapsed}\nTurns: ${this.state.turnCount}`;
63
+ if (this.state.lastReason) {
64
+ status += `\nLast evaluation: ${this.state.lastReason}`;
65
+ }
66
+ return status;
67
+ }
68
+ /**
69
+ * Check circuit breakers. Returns a clear reason if goal should be force-cleared, null otherwise.
70
+ */
71
+ checkCircuitBreakers() {
72
+ if (!this.state)
73
+ return null;
74
+ if (this.state.turnCount >= MAX_GOAL_TURNS) {
75
+ return `Goal cancelled: maximum turns (${MAX_GOAL_TURNS}) exceeded`;
76
+ }
77
+ if (Date.now() - this.state.startedAt >= MAX_GOAL_DURATION_MS) {
78
+ return `Goal cancelled: time limit (${MAX_GOAL_DURATION_MS / 60000} minutes) exceeded`;
79
+ }
80
+ if (this.state.consecutiveEvalFailures >= MAX_CONSECUTIVE_EVAL_FAILURES) {
81
+ return `Goal cancelled: ${MAX_CONSECUTIVE_EVAL_FAILURES} consecutive evaluation failures`;
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Evaluate whether the goal has been met using the fast model.
87
+ */
88
+ async evaluateGoal(abortSignal) {
89
+ if (!this.state) {
90
+ return { isMet: false, reason: "No active goal" };
91
+ }
92
+ try {
93
+ const messages = this.messageManager.getMessages();
94
+ const apiMessages = convertMessagesForAPI(messages);
95
+ const gatewayConfig = this.aiManager.getGatewayConfig();
96
+ const modelConfig = this.aiManager.getModelConfig();
97
+ const fastModel = modelConfig.fastModel || modelConfig.model;
98
+ if (!fastModel) {
99
+ return {
100
+ isMet: false,
101
+ reason: "No model configured for goal evaluation",
102
+ };
103
+ }
104
+ this.onGoalEvaluating?.(true);
105
+ const result = await aiEvaluateGoal({
106
+ gatewayConfig,
107
+ modelConfig,
108
+ model: fastModel,
109
+ goalCondition: this.state.condition,
110
+ messages: apiMessages,
111
+ abortSignal,
112
+ });
113
+ // Track evaluation tokens separately
114
+ if (result.usage) {
115
+ const usage = {
116
+ ...result.usage,
117
+ operation_type: "goal_evaluation",
118
+ model: fastModel,
119
+ };
120
+ this.messageManager.addUsage(usage);
121
+ }
122
+ // Reset failure counter on success
123
+ this.state.consecutiveEvalFailures = 0;
124
+ this.onGoalEvaluating?.(false);
125
+ // Parse the response
126
+ return this.parseEvaluationResponse(result.content);
127
+ }
128
+ catch (error) {
129
+ this.onGoalEvaluating?.(false);
130
+ this.state.consecutiveEvalFailures++;
131
+ logger?.warn(`[Goal] Evaluation failed (${this.state.consecutiveEvalFailures}/${MAX_CONSECUTIVE_EVAL_FAILURES}): ${error.message}`);
132
+ return {
133
+ isMet: false,
134
+ reason: `Evaluation failed: ${error.message}`,
135
+ };
136
+ }
137
+ }
138
+ /**
139
+ * Parse the evaluation response from the fast model.
140
+ */
141
+ parseEvaluationResponse(content) {
142
+ // Try direct JSON parse
143
+ try {
144
+ const parsed = JSON.parse(content);
145
+ if (typeof parsed.met === "boolean") {
146
+ return {
147
+ isMet: parsed.met,
148
+ reason: parsed.reason || "No reason provided",
149
+ };
150
+ }
151
+ }
152
+ catch {
153
+ // Fall through to regex
154
+ }
155
+ // Try regex extraction
156
+ const metMatch = content.match(/"met"\s*:\s*(true|false)/);
157
+ const reasonMatch = content.match(/"reason"\s*:\s*"([^"]*)"/);
158
+ if (metMatch) {
159
+ return {
160
+ isMet: metMatch[1] === "true",
161
+ reason: reasonMatch?.[1] || "No reason provided",
162
+ };
163
+ }
164
+ // Default: not met
165
+ return { isMet: false, reason: "Could not parse evaluation response" };
166
+ }
167
+ formatElapsed(ms) {
168
+ const minutes = Math.floor(ms / 60000);
169
+ if (minutes < 1)
170
+ return "<1m";
171
+ if (minutes < 60)
172
+ return `${minutes}m`;
173
+ const hours = Math.floor(minutes / 60);
174
+ const remainingMin = minutes % 60;
175
+ return `${hours}h${remainingMin}m`;
176
+ }
177
+ }
@@ -24,8 +24,8 @@ export interface MessageManagerCallbacks {
24
24
  onFileHistoryBlockAdded?: (snapshots: import("../types/reversion.js").FileSnapshot[]) => void;
25
25
  onNotificationMessageAdded?: (params: {
26
26
  taskId: string;
27
- taskType: "shell" | "agent";
28
- status: "completed" | "failed" | "killed";
27
+ taskType: "shell" | "agent" | "workflow";
28
+ status: "completed" | "failed" | "killed" | "aborted";
29
29
  summary: string;
30
30
  }) => void;
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ export type QueueState = "idle" | "dispatching" | "running";
1
2
  export interface QueuedMessage {
3
+ id?: string;
2
4
  type?: "message" | "bang";
3
5
  content: string;
4
6
  images?: Array<{
@@ -6,15 +8,23 @@ export interface QueuedMessage {
6
8
  mimeType: string;
7
9
  }>;
8
10
  longTextMap?: Record<string, string>;
11
+ editable?: boolean;
9
12
  }
10
13
  export declare class MessageQueue {
11
14
  private queue;
15
+ private nextId;
16
+ private _state;
12
17
  onMessageEnqueued?: () => void;
18
+ get state(): QueueState;
19
+ transitionTo(newState: QueueState): boolean;
13
20
  enqueue(message: QueuedMessage): void;
14
21
  dequeue(): QueuedMessage | null;
15
22
  clear(): void;
16
23
  hasPending(): boolean;
17
24
  getQueue(): QueuedMessage[];
18
25
  removeAt(index: number): boolean;
26
+ removeById(id: string): boolean;
27
+ popLastEditable(): QueuedMessage | null;
28
+ popAllEditable(): QueuedMessage[];
19
29
  }
20
30
  //# sourceMappingURL=messageQueue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageQueue.d.ts","sourceRoot":"","sources":["../../src/managers/messageQueue.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAuB;IACpC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAE/B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKrC,OAAO,IAAI,aAAa,GAAG,IAAI;IAI/B,KAAK,IAAI,IAAI;IAIb,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,aAAa,EAAE;IAI3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAQjC"}
1
+ {"version":3,"file":"messageQueue.d.ts","sourceRoot":"","sources":["../../src/managers/messageQueue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAsB;IACpC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAE/B,IAAI,KAAK,IAAI,UAAU,CAEtB;IAED,YAAY,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO;IAW3C,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAUrC,OAAO,IAAI,aAAa,GAAG,IAAI;IAI/B,KAAK,IAAI,IAAI;IAKb,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,aAAa,EAAE;IAI3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAShC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQ/B,eAAe,IAAI,aAAa,GAAG,IAAI;IASvC,cAAc,IAAI,aAAa,EAAE;CAalC"}
@@ -1,9 +1,30 @@
1
1
  export class MessageQueue {
2
2
  constructor() {
3
3
  this.queue = [];
4
+ this.nextId = 0;
5
+ this._state = "idle";
6
+ }
7
+ get state() {
8
+ return this._state;
9
+ }
10
+ transitionTo(newState) {
11
+ const valid = {
12
+ idle: ["dispatching"],
13
+ dispatching: ["running", "idle"],
14
+ running: ["idle"],
15
+ };
16
+ if (!valid[this._state].includes(newState))
17
+ return false;
18
+ this._state = newState;
19
+ return true;
4
20
  }
5
21
  enqueue(message) {
6
- this.queue.push(message);
22
+ const msg = {
23
+ ...message,
24
+ id: message.id || `mq-${this.nextId++}`,
25
+ editable: message.editable ?? true,
26
+ };
27
+ this.queue.push(msg);
7
28
  this.onMessageEnqueued?.();
8
29
  }
9
30
  dequeue() {
@@ -11,6 +32,7 @@ export class MessageQueue {
11
32
  }
12
33
  clear() {
13
34
  this.queue = [];
35
+ this._state = "idle";
14
36
  }
15
37
  hasPending() {
16
38
  return this.queue.length > 0;
@@ -26,4 +48,34 @@ export class MessageQueue {
26
48
  this.onMessageEnqueued?.();
27
49
  return true;
28
50
  }
51
+ removeById(id) {
52
+ const index = this.queue.findIndex((m) => m.id === id);
53
+ if (index === -1)
54
+ return false;
55
+ this.queue.splice(index, 1);
56
+ this.onMessageEnqueued?.();
57
+ return true;
58
+ }
59
+ popLastEditable() {
60
+ for (let i = this.queue.length - 1; i >= 0; i--) {
61
+ if (this.queue[i].editable !== false) {
62
+ return this.queue.splice(i, 1)[0] ?? null;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+ popAllEditable() {
68
+ const editable = [];
69
+ const remaining = [];
70
+ for (const msg of this.queue) {
71
+ if (msg.editable !== false) {
72
+ editable.push(msg);
73
+ }
74
+ else {
75
+ remaining.push(msg);
76
+ }
77
+ }
78
+ this.queue = remaining;
79
+ return editable;
80
+ }
29
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pluginManager.d.ts","sourceRoot":"","sources":["../../src/managers/pluginManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,qBAAa,aAAa;IAMtB,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAA0B;gBAGtC,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,oBAAoB;IAM/B,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,oBAAoB,GAE/B;IAED,OAAO,KAAK,eAAe,GAE1B;IAED;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInE;;OAEG;YACW,oBAAoB;IAwHlC;;OAEG;YACW,gBAAgB;IAgE9B;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG5C"}
1
+ {"version":3,"file":"pluginManager.d.ts","sourceRoot":"","sources":["../../src/managers/pluginManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAWzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,qBAAa,aAAa;IAMtB,OAAO,CAAC,SAAS;IALnB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAA0B;gBAGtC,SAAS,EAAE,SAAS,EAC5B,OAAO,EAAE,oBAAoB;IAM/B,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,oBAAoB,GAE/B;IAED,OAAO,KAAK,eAAe,GAE1B;IAED;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInE;;OAEG;YACW,oBAAoB;IA+HlC;;OAEG;YACW,gBAAgB;IAgE9B;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG5C"}
@@ -81,7 +81,13 @@ export class PluginManager {
81
81
  }
82
82
  }
83
83
  catch {
84
- // Manifest read failed (marketplace not cloned yet?) fall through to installPlugin
84
+ // Manifest read failed marketplace may not be cloned yet, try to clone/update it
85
+ try {
86
+ await marketplaceService.updateMarketplace(marketplaceName);
87
+ }
88
+ catch (updateError) {
89
+ logger?.warn(`Failed to clone/update marketplace ${marketplaceName}: ${updateError instanceof Error ? updateError.message : String(updateError)}`);
90
+ }
85
91
  }
86
92
  logger?.info(`Auto-installing missing plugin: ${pluginId}`);
87
93
  try {
@@ -11,6 +11,8 @@ export declare class SkillManager extends EventEmitter {
11
11
  private workdir;
12
12
  private skillMetadata;
13
13
  private skillContent;
14
+ private pluginSkillMetadata;
15
+ private pluginSkillContent;
14
16
  private initialized;
15
17
  private fileWatcher;
16
18
  private watchEnabled;
@@ -1 +1 @@
1
- {"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAY1C,OAAO,CAAC,SAAS;IAXnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAU;gBAGpB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAUnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;YACW,aAAa;IA6B3B;;OAEG;YACW,YAAY;IAkC1B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IA4B5B;;OAEG;YACW,uBAAuB;IAoFrC;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA8BF;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAC5C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;KACd,GACD;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CACzC;IA6BD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;OAEG;YACW,yBAAyB;IASvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CA2BhE"}
1
+ {"version":3,"file":"skillManager.d.ts","sourceRoot":"","sources":["../../src/managers/skillManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,KAAK,EAGL,aAAa,EACb,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAc1C,OAAO,CAAC,SAAS;IAbnB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,YAAY,CAAU;gBAGpB,SAAS,EAAE,SAAS,EAC5B,OAAO,GAAE,mBAAwB;IAUnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;OAEG;YACW,aAAa;IAqC3B;;OAEG;YACW,YAAY;IAkC1B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,kBAAkB,IAAI,aAAa,EAAE;IAQrC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAQzD;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAgBzD;;OAEG;YACW,cAAc;IA4B5B;;OAEG;YACW,uBAAuB;IAoFrC;;OAEG;YACW,oBAAoB;IA4BlC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;QACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA8BF;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAC5C;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;KACd,GACD;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CACzC;IA6BD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;YACW,yBAAyB;IASvC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;CA8BhE"}