wave-agent-sdk 0.17.12 → 0.18.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.
- package/builtin/skills/code-review/SKILL.md +137 -0
- package/builtin/skills/simplify/SKILL.md +55 -0
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +2 -7
- package/dist/managers/messageManager.d.ts +5 -5
- package/dist/managers/messageManager.d.ts.map +1 -1
- package/dist/managers/messageManager.js +18 -6
- package/dist/managers/subagentManager.d.ts +5 -5
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +6 -6
- package/dist/services/authService.d.ts +2 -2
- package/dist/services/authService.d.ts.map +1 -1
- package/dist/services/authService.js +7 -7
- package/dist/services/remoteSettingsService.d.ts +6 -0
- package/dist/services/remoteSettingsService.d.ts.map +1 -1
- package/dist/services/remoteSettingsService.js +29 -0
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +7 -2
- package/dist/utils/messageOperations.d.ts +7 -1
- package/dist/utils/messageOperations.d.ts.map +1 -1
- package/dist/utils/messageOperations.js +6 -4
- package/package.json +1 -1
- package/src/managers/aiManager.ts +2 -7
- package/src/managers/messageManager.ts +40 -12
- package/src/managers/subagentManager.ts +24 -9
- package/src/services/authService.ts +13 -10
- package/src/services/remoteSettingsService.ts +35 -0
- package/src/utils/containerSetup.ts +8 -2
- package/src/utils/messageOperations.ts +15 -5
- package/dist/utils/microcompact.d.ts +0 -7
- package/dist/utils/microcompact.d.ts.map +0 -1
- package/dist/utils/microcompact.js +0 -78
- package/src/utils/microcompact.ts +0 -101
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Review the current diff for correctness bugs and reuse/simplification/efficiency cleanups at the given effort level (low/medium: fewer, high-confidence findings; high/max: broader coverage, may include lower-confidence findings)
|
|
4
|
+
allowed-tools: Bash(git diff:*), Bash(git status:*), Bash(git log:*), Bash(git show:*), Bash(git blame:*), Bash(git remote:*), Bash(command -v:*), Bash(gh pr comment:*), Bash(gh pr view:*), Bash(glab mr note:*), Bash(glab mr view:*), Read, Glob, Grep, Agent
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Code Review
|
|
9
|
+
|
|
10
|
+
Review the current branch's changes for correctness bugs and quality issues.
|
|
11
|
+
|
|
12
|
+
## Phase 1: Gather Context
|
|
13
|
+
|
|
14
|
+
First, collect the diff and metadata:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
GIT STATUS:
|
|
18
|
+
!`git status`
|
|
19
|
+
|
|
20
|
+
FILES MODIFIED:
|
|
21
|
+
!`git diff --name-only $(git merge-base HEAD main)...HEAD 2>/dev/null || git diff --name-only HEAD~1...HEAD`
|
|
22
|
+
|
|
23
|
+
COMMITS:
|
|
24
|
+
!`git log --no-decorate $(git merge-base HEAD main 2>/dev/null || echo HEAD~1)...HEAD`
|
|
25
|
+
|
|
26
|
+
DIFF CONTENT:
|
|
27
|
+
!`git diff $(git merge-base HEAD main 2>/dev/null || echo HEAD~1)...HEAD`
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If there are no changes, stop and tell the user.
|
|
31
|
+
|
|
32
|
+
## Phase 2: Determine Effort Level
|
|
33
|
+
|
|
34
|
+
Parse `$ARGUMENTS` for an effort level:
|
|
35
|
+
- **low**: Launch 2 agents, confidence threshold 90 (only near-certain findings)
|
|
36
|
+
- **medium** (default): Launch 3 agents, confidence threshold 80
|
|
37
|
+
- **high**: Launch 4 agents, confidence threshold 70
|
|
38
|
+
- **max**: Launch 5 agents, confidence threshold 60 (broader coverage, more noise)
|
|
39
|
+
|
|
40
|
+
## Phase 3: Launch Review Agents in Parallel
|
|
41
|
+
|
|
42
|
+
Use the Agent tool to launch all agents concurrently in a single message. Pass each agent the full diff so it has the complete context.
|
|
43
|
+
|
|
44
|
+
### Agent 1: Bug Scanner (all effort levels)
|
|
45
|
+
|
|
46
|
+
Read the file changes in the diff, then do a shallow scan for obvious bugs. Avoid reading extra context beyond the changes, focusing just on the changes themselves. Focus on large bugs, and avoid small issues and nitpicks. Ignore likely false positives.
|
|
47
|
+
|
|
48
|
+
### Agent 2: AGENTS.md Compliance (all effort levels)
|
|
49
|
+
|
|
50
|
+
Audit the changes to make sure they comply with any AGENTS.md files in the repository. Check the root AGENTS.md (if it exists) and any AGENTS.md files in the directories whose files were modified. Note that AGENTS.md is guidance for AI agents as they write code, so not all instructions will be applicable during code review.
|
|
51
|
+
|
|
52
|
+
### Agent 3: Git History Context (medium and above)
|
|
53
|
+
|
|
54
|
+
Read the git blame and history of the code modified, to identify any bugs in light of that historical context.
|
|
55
|
+
|
|
56
|
+
### Agent 4: Code Reuse & Quality (high and above)
|
|
57
|
+
|
|
58
|
+
Search for existing utilities and helpers that could replace newly written code. Also review for hacky patterns: redundant state, parameter sprawl, copy-paste with slight variation, leaky abstractions, stringly-typed code, and unnecessary comments.
|
|
59
|
+
|
|
60
|
+
### Agent 5: Efficiency Review (max only)
|
|
61
|
+
|
|
62
|
+
Review the changes for efficiency: unnecessary work, missed concurrency, hot-path bloat, recurring no-op updates, unnecessary existence checks, memory leaks, and overly broad operations.
|
|
63
|
+
|
|
64
|
+
## Phase 4: Confidence Scoring
|
|
65
|
+
|
|
66
|
+
For each issue found in Phase 3, launch a parallel Agent to independently score the issue. The scoring agent receives the PR diff, the issue description, and the list of AGENTS.md files (if any). It returns a confidence score from 0-100.
|
|
67
|
+
|
|
68
|
+
Give the scoring agent this rubric verbatim:
|
|
69
|
+
|
|
70
|
+
- **0**: Not confident at all. This is a false positive that doesn't stand up to light scrutiny, or is a pre-existing issue.
|
|
71
|
+
- **25**: Somewhat confident. This might be a real issue, but may also be a false positive. The agent wasn't able to verify that it's a real issue. If the issue is stylistic, it is one that was not explicitly called out in the relevant AGENTS.md.
|
|
72
|
+
- **50**: Moderately confident. The agent was able to verify this is a real issue, but it might be a nitpick or not happen very often in practice. Relative to the rest of the PR, it's not very important.
|
|
73
|
+
- **75**: Highly confident. The agent double checked the issue, and verified that it is very likely it is a real issue that will be hit in practice. The existing approach in the PR is insufficient. The issue is very important and will directly impact the code's functionality, or it is an issue that is directly mentioned in the relevant AGENTS.md.
|
|
74
|
+
- **100**: Absolutely certain. The agent double checked the issue, and confirmed that it is definitely a real issue, that will happen frequently in practice. The evidence directly confirms this.
|
|
75
|
+
|
|
76
|
+
## Phase 5: Filter and Deliver
|
|
77
|
+
|
|
78
|
+
1. Filter out any issues with a score below the effort level's threshold.
|
|
79
|
+
2. If no issues remain, say so and stop — do not post anything.
|
|
80
|
+
3. Otherwise, detect the platform and CLI availability:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
REMOTE URL:
|
|
84
|
+
!`git remote get-url origin 2>/dev/null || echo "no-remote"`
|
|
85
|
+
|
|
86
|
+
GH CLI:
|
|
87
|
+
!`command -v gh 2>/dev/null || echo "not-installed"`
|
|
88
|
+
|
|
89
|
+
GLAB CLI:
|
|
90
|
+
!`command -v glab 2>/dev/null || echo "not-installed"`
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
4. **Post as comment** (preferred): If the remote URL contains `github` and `gh` is installed, check if a PR exists for the current branch (`gh pr view --json number`), then post the review as a comment: `gh pr comment --body "<review content>"`. If the remote URL contains `gitlab` and `glab` is installed, check if an MR exists for the current branch (`glab mr view`), then post the review as a note: `glab mr note --message "<review content>"`.
|
|
94
|
+
5. **Output directly** (fallback): If no CLI is installed, no PR/MR exists, or the platform is unrecognized, output the findings directly instead.
|
|
95
|
+
|
|
96
|
+
Whether posting or outputting, use this format:
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Code Review
|
|
101
|
+
|
|
102
|
+
Found N issues:
|
|
103
|
+
|
|
104
|
+
1. <brief description of bug> (AGENTS.md says "<...>")
|
|
105
|
+
|
|
106
|
+
`<file>:<line range>`
|
|
107
|
+
|
|
108
|
+
2. <brief description of bug> (bug due to <file and code snippet>)
|
|
109
|
+
|
|
110
|
+
`<file>:<line range>`
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
Keep the comment brief and avoid emojis.
|
|
115
|
+
|
|
116
|
+
## False Positive Filtering
|
|
117
|
+
|
|
118
|
+
Examples of false positives to exclude:
|
|
119
|
+
|
|
120
|
+
- Pre-existing issues not introduced in this diff
|
|
121
|
+
- Something that looks like a bug but is not actually a bug
|
|
122
|
+
- Pedantic nitpicks that a senior engineer wouldn't call out
|
|
123
|
+
- Issues that a linter, typechecker, or compiler would catch (eg. missing or incorrect imports, type errors, broken tests, formatting issues)
|
|
124
|
+
- General code quality issues (eg. lack of test coverage, general security issues, poor documentation), unless explicitly required in AGENTS.md
|
|
125
|
+
- Issues that are called out in AGENTS.md, but explicitly silenced in the code (eg. due to a lint ignore comment)
|
|
126
|
+
- Changes in functionality that are likely intentional or are directly related to the broader change
|
|
127
|
+
- Real issues, but on lines that the user did not modify in their changes
|
|
128
|
+
|
|
129
|
+
## Notes
|
|
130
|
+
|
|
131
|
+
- Do not check build signal or attempt to build or typecheck the app. These will run separately.
|
|
132
|
+
- You must cite the file and line range for each finding.
|
|
133
|
+
- Make a todo list first.
|
|
134
|
+
|
|
135
|
+
## Input
|
|
136
|
+
|
|
137
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: simplify
|
|
3
|
+
description: Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Simplify: Code Review and Cleanup
|
|
8
|
+
|
|
9
|
+
Review all changed files for reuse, quality, and efficiency. Fix any issues found.
|
|
10
|
+
|
|
11
|
+
## Phase 1: Identify Changes
|
|
12
|
+
|
|
13
|
+
Run `git diff` (or `git diff HEAD` if there are staged changes) to see what changed. If there are no git changes, review the most recently modified files that the user mentioned or that you edited earlier in this conversation.
|
|
14
|
+
|
|
15
|
+
## Phase 2: Launch Three Review Agents in Parallel
|
|
16
|
+
|
|
17
|
+
Use the Agent tool to launch all three agents concurrently in a single message. Pass each agent the full diff so it has the complete context.
|
|
18
|
+
|
|
19
|
+
### Agent 1: Code Reuse Review
|
|
20
|
+
|
|
21
|
+
For each change:
|
|
22
|
+
|
|
23
|
+
1. **Search for existing utilities and helpers** that could replace newly written code. Look for similar patterns elsewhere in the codebase — common locations are utility directories, shared modules, and files adjacent to the changed ones.
|
|
24
|
+
2. **Flag any new function that duplicates existing functionality.** Suggest the existing function to use instead.
|
|
25
|
+
3. **Flag any inline logic that could use an existing utility** — hand-rolled string manipulation, manual path handling, custom environment checks, ad-hoc type guards, and similar patterns are common candidates.
|
|
26
|
+
|
|
27
|
+
### Agent 2: Code Quality Review
|
|
28
|
+
|
|
29
|
+
Review the same changes for hacky patterns:
|
|
30
|
+
|
|
31
|
+
1. **Redundant state**: state that duplicates existing state, cached values that could be derived, observers/effects that could be direct calls
|
|
32
|
+
2. **Parameter sprawl**: adding new parameters to a function instead of generalizing or restructuring existing ones
|
|
33
|
+
3. **Copy-paste with slight variation**: near-duplicate code blocks that should be unified with a shared abstraction
|
|
34
|
+
4. **Leaky abstractions**: exposing internal details that should be encapsulated, or breaking existing abstraction boundaries
|
|
35
|
+
5. **Stringly-typed code**: using raw strings where constants, enums (string unions), or branded types already exist in the codebase
|
|
36
|
+
6. **Unnecessary JSX nesting**: wrapper Boxes/elements that add no layout value — check if inner component props (flexShrink, alignItems, etc.) already provide the needed behavior
|
|
37
|
+
7. **Unnecessary comments**: comments explaining WHAT the code does (well-named identifiers already do that), narrating the change, or referencing the task/caller — delete; keep only non-obvious WHY (hidden constraints, subtle invariants, workarounds)
|
|
38
|
+
|
|
39
|
+
### Agent 3: Efficiency Review
|
|
40
|
+
|
|
41
|
+
Review the same changes for efficiency:
|
|
42
|
+
|
|
43
|
+
1. **Unnecessary work**: redundant computations, repeated file reads, duplicate network/API calls, N+1 patterns
|
|
44
|
+
2. **Missed concurrency**: independent operations run sequentially when they could run in parallel
|
|
45
|
+
3. **Hot-path bloat**: new blocking work added to startup or per-request/per-render hot paths
|
|
46
|
+
4. **Recurring no-op updates**: state/store updates inside polling loops, intervals, or event handlers that fire unconditionally — add a change-detection guard so downstream consumers aren't notified when nothing changed. Also: if a wrapper function takes an updater/reducer callback, verify it honors same-reference returns (or whatever the "no change" signal is) — otherwise callers' early-return no-ops are silently defeated
|
|
47
|
+
5. **Unnecessary existence checks**: pre-checking file/resource existence before operating (TOCTOU anti-pattern) — operate directly and handle the error
|
|
48
|
+
6. **Memory**: unbounded data structures, missing cleanup, event listener leaks
|
|
49
|
+
7. **Overly broad operations**: reading entire files when only a portion is needed, loading all items when filtering for one
|
|
50
|
+
|
|
51
|
+
## Phase 3: Fix Issues
|
|
52
|
+
|
|
53
|
+
Wait for all three agents to complete. Aggregate their findings and fix each issue directly. If a finding is a false positive or not worth addressing, note it and move on — do not argue with the finding, just skip it.
|
|
54
|
+
|
|
55
|
+
When done, briefly summarize what was fixed (or confirm the code was already clean).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aiManager.d.ts","sourceRoot":"","sources":["../../src/managers/aiManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as aiService from "../services/aiService.js";
|
|
2
2
|
import { convertMessagesForAPI } from "../utils/convertMessagesForAPI.js";
|
|
3
|
-
import { microcompactMessages } from "../utils/microcompact.js";
|
|
4
3
|
import { parseTaskNotificationXml } from "../utils/notificationXml.js";
|
|
5
4
|
import { calculateComprehensiveTotalTokens } from "../utils/tokenCalculation.js";
|
|
6
5
|
import { getTaskReminderTurnCounts, maybeInjectTaskReminder, TASK_REMINDER_CONFIG, } from "../utils/taskReminder.js";
|
|
@@ -563,13 +562,9 @@ export class AIManager {
|
|
|
563
562
|
const currentMode = this.permissionManager?.getCurrentEffectiveMode(this.getModelConfig().permissionMode);
|
|
564
563
|
// Add plan mode reminder as persistent meta message before getting messages
|
|
565
564
|
this.maybeAddPlanModeMessage(currentMode);
|
|
566
|
-
// Get recent message history
|
|
565
|
+
// Get recent message history
|
|
567
566
|
const rawMessages = this.messageManager.getMessages();
|
|
568
|
-
const
|
|
569
|
-
timeThresholdMS: 30 * 60 * 1000, // 30 minutes
|
|
570
|
-
recentResultsToKeep: 3,
|
|
571
|
-
});
|
|
572
|
-
const recentMessages = convertMessagesForAPI(microcompactedMessages);
|
|
567
|
+
const recentMessages = convertMessagesForAPI(rawMessages);
|
|
573
568
|
try {
|
|
574
569
|
// Get combined memory content
|
|
575
570
|
const combinedMemory = await this.messageManager.getCombinedMemory();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UserMessageParams, type AgentToolBlockUpdateParams, type AddNotificationMessageParams } from "../utils/messageOperations.js";
|
|
1
|
+
import { UserMessageParams, type AgentToolBlockUpdateParams, type ToolBlockUpdateCallbackParams, type AddNotificationMessageParams } from "../utils/messageOperations.js";
|
|
2
2
|
import type { Message, Usage } from "../types/index.js";
|
|
3
3
|
import { SessionData } from "../services/session.js";
|
|
4
4
|
import { ChatCompletionMessageFunctionToolCall } from "openai/resources.js";
|
|
@@ -9,10 +9,10 @@ export interface MessageManagerCallbacks {
|
|
|
9
9
|
onLatestTotalTokensChange?: (latestTotalTokens: number) => void;
|
|
10
10
|
onUsagesChange?: (usages: Usage[]) => void;
|
|
11
11
|
onUserMessageAdded?: (params: UserMessageParams) => void;
|
|
12
|
-
onAssistantMessageAdded?: () => void;
|
|
13
|
-
onAssistantContentUpdated?: (chunk: string, accumulated: string) => void;
|
|
14
|
-
onAssistantReasoningUpdated?: (chunk: string, accumulated: string) => void;
|
|
15
|
-
onToolBlockUpdated?: (params:
|
|
12
|
+
onAssistantMessageAdded?: (messageId: string) => void;
|
|
13
|
+
onAssistantContentUpdated?: (messageId: string, chunk: string, accumulated: string) => void;
|
|
14
|
+
onAssistantReasoningUpdated?: (messageId: string, chunk: string, accumulated: string) => void;
|
|
15
|
+
onToolBlockUpdated?: (params: ToolBlockUpdateCallbackParams) => void;
|
|
16
16
|
onErrorBlockAdded?: (error: string) => void;
|
|
17
17
|
onCompactBlockAdded?: (content: string) => void;
|
|
18
18
|
onCompactionStateChange?: (isCompacting: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,iBAAiB,EACjB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EAElC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAIL,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAK5E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,yBAAyB,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAE3C,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEzD,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"messageManager.d.ts","sourceRoot":"","sources":["../../src/managers/messageManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -257,7 +257,8 @@ export class MessageManager {
|
|
|
257
257
|
: undefined;
|
|
258
258
|
const newMessages = addAssistantMessageToMessages(this.messages, content, toolCalls, usage, additionalFieldsRecord);
|
|
259
259
|
this.setMessages(newMessages);
|
|
260
|
-
this.
|
|
260
|
+
const messageId = this.messages[this.messages.length - 1]?.id;
|
|
261
|
+
this.callbacks.onAssistantMessageAdded?.(messageId);
|
|
261
262
|
// Note: Subagent-specific callbacks are now handled by SubagentManager
|
|
262
263
|
}
|
|
263
264
|
mergeAssistantAdditionalFields(additionalFields) {
|
|
@@ -289,12 +290,19 @@ export class MessageManager {
|
|
|
289
290
|
updateToolBlock(params) {
|
|
290
291
|
// Finalize any streaming text/reasoning blocks before adding/updating a tool block
|
|
291
292
|
this.finalizeCurrentStreamingBlocks();
|
|
292
|
-
const newMessages = updateToolBlockInMessage({
|
|
293
|
+
const { messages: newMessages, messageId: resolvedMessageId } = updateToolBlockInMessage({
|
|
293
294
|
messages: this.messages,
|
|
294
295
|
...params,
|
|
295
296
|
});
|
|
296
297
|
this.setMessages(newMessages);
|
|
297
|
-
|
|
298
|
+
const callbackParams = {
|
|
299
|
+
...params,
|
|
300
|
+
messageId: params.messageId ||
|
|
301
|
+
resolvedMessageId ||
|
|
302
|
+
this.messages[this.messages.length - 1]?.id ||
|
|
303
|
+
"",
|
|
304
|
+
};
|
|
305
|
+
this.callbacks.onToolBlockUpdated?.(callbackParams);
|
|
298
306
|
// Note: Subagent-specific callbacks are now handled by SubagentManager
|
|
299
307
|
}
|
|
300
308
|
/**
|
|
@@ -305,7 +313,11 @@ export class MessageManager {
|
|
|
305
313
|
this.finalizeCurrentStreamingBlocks();
|
|
306
314
|
const { messages: newMessages, toolBlockId } = addToolBlockToMessageInMessages(this.messages, messageId, params);
|
|
307
315
|
this.setMessages(newMessages);
|
|
308
|
-
this.callbacks.onToolBlockUpdated?.({
|
|
316
|
+
this.callbacks.onToolBlockUpdated?.({
|
|
317
|
+
...params,
|
|
318
|
+
id: toolBlockId,
|
|
319
|
+
messageId,
|
|
320
|
+
});
|
|
309
321
|
return toolBlockId;
|
|
310
322
|
}
|
|
311
323
|
addErrorBlock(error) {
|
|
@@ -497,7 +509,7 @@ export class MessageManager {
|
|
|
497
509
|
});
|
|
498
510
|
}
|
|
499
511
|
// FR-001: Trigger callbacks with chunk and accumulated content
|
|
500
|
-
this.callbacks.onAssistantContentUpdated?.(chunk, newAccumulatedContent);
|
|
512
|
+
this.callbacks.onAssistantContentUpdated?.(lastMessage.id, chunk, newAccumulatedContent);
|
|
501
513
|
// Note: Subagent-specific callbacks are now handled by SubagentManager
|
|
502
514
|
this.callbacks.onMessagesChange?.([...this.messages]); // Still need to notify of changes
|
|
503
515
|
}
|
|
@@ -546,7 +558,7 @@ export class MessageManager {
|
|
|
546
558
|
});
|
|
547
559
|
}
|
|
548
560
|
// Trigger callbacks with chunk and accumulated reasoning content
|
|
549
|
-
this.callbacks.onAssistantReasoningUpdated?.(chunk, newAccumulatedReasoning);
|
|
561
|
+
this.callbacks.onAssistantReasoningUpdated?.(lastMessage.id, chunk, newAccumulatedReasoning);
|
|
550
562
|
this.callbacks.onMessagesChange?.([...this.messages]); // Still need to notify of changes
|
|
551
563
|
}
|
|
552
564
|
/**
|
|
@@ -6,7 +6,7 @@ import { MessageManager } from "./messageManager.js";
|
|
|
6
6
|
import { ToolManager } from "./toolManager.js";
|
|
7
7
|
import { BackgroundTaskManager } from "./backgroundTaskManager.js";
|
|
8
8
|
import { NotificationQueue } from "./notificationQueue.js";
|
|
9
|
-
import { UserMessageParams, type
|
|
9
|
+
import { UserMessageParams, type ToolBlockUpdateCallbackParams } from "../utils/messageOperations.js";
|
|
10
10
|
import { Container } from "../utils/container.js";
|
|
11
11
|
import type { PermissionManager } from "./permissionManager.js";
|
|
12
12
|
import type { PermissionMode } from "../types/permissions.js";
|
|
@@ -14,13 +14,13 @@ export interface SubagentManagerCallbacks {
|
|
|
14
14
|
/** Triggered when subagent adds user message */
|
|
15
15
|
onSubagentUserMessageAdded?: (subagentId: string, params: UserMessageParams) => void;
|
|
16
16
|
/** Triggered when subagent creates assistant message */
|
|
17
|
-
onSubagentAssistantMessageAdded?: (subagentId: string) => void;
|
|
17
|
+
onSubagentAssistantMessageAdded?: (subagentId: string, messageId: string) => void;
|
|
18
18
|
/** Triggered during subagent content streaming updates */
|
|
19
|
-
onSubagentAssistantContentUpdated?: (subagentId: string, chunk: string, accumulated: string) => void;
|
|
19
|
+
onSubagentAssistantContentUpdated?: (subagentId: string, messageId: string, chunk: string, accumulated: string) => void;
|
|
20
20
|
/** Triggered during subagent reasoning streaming updates */
|
|
21
|
-
onSubagentAssistantReasoningUpdated?: (subagentId: string, chunk: string, accumulated: string) => void;
|
|
21
|
+
onSubagentAssistantReasoningUpdated?: (subagentId: string, messageId: string, chunk: string, accumulated: string) => void;
|
|
22
22
|
/** Triggered when subagent tool block is updated */
|
|
23
|
-
onSubagentToolBlockUpdated?: (subagentId: string, params:
|
|
23
|
+
onSubagentToolBlockUpdated?: (subagentId: string, params: ToolBlockUpdateCallbackParams) => void;
|
|
24
24
|
/** Triggered when subagent messages change */
|
|
25
25
|
onSubagentMessagesChange?: (subagentId: string, messages: Message[]) => void;
|
|
26
26
|
/** Triggered when subagent latest total tokens change */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EACL,iBAAiB,EACjB,KAAK,
|
|
1
|
+
{"version":3,"file":"subagentManager.d.ts","sourceRoot":"","sources":["../../src/managers/subagentManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -536,22 +536,22 @@ export class SubagentManager {
|
|
|
536
536
|
this.callbacks.onSubagentUserMessageAdded(subagentId, params);
|
|
537
537
|
}
|
|
538
538
|
},
|
|
539
|
-
onAssistantMessageAdded: () => {
|
|
539
|
+
onAssistantMessageAdded: (messageId) => {
|
|
540
540
|
// Forward assistant message events to parent via SubagentManager callbacks
|
|
541
541
|
if (this.callbacks?.onSubagentAssistantMessageAdded) {
|
|
542
|
-
this.callbacks.onSubagentAssistantMessageAdded(subagentId);
|
|
542
|
+
this.callbacks.onSubagentAssistantMessageAdded(subagentId, messageId);
|
|
543
543
|
}
|
|
544
544
|
},
|
|
545
|
-
onAssistantContentUpdated: (chunk, accumulated) => {
|
|
545
|
+
onAssistantContentUpdated: (messageId, chunk, accumulated) => {
|
|
546
546
|
// Forward assistant content updates to parent via SubagentManager callbacks
|
|
547
547
|
if (this.callbacks?.onSubagentAssistantContentUpdated) {
|
|
548
|
-
this.callbacks.onSubagentAssistantContentUpdated(subagentId, chunk, accumulated);
|
|
548
|
+
this.callbacks.onSubagentAssistantContentUpdated(subagentId, messageId, chunk, accumulated);
|
|
549
549
|
}
|
|
550
550
|
},
|
|
551
|
-
onAssistantReasoningUpdated: (chunk, accumulated) => {
|
|
551
|
+
onAssistantReasoningUpdated: (messageId, chunk, accumulated) => {
|
|
552
552
|
// Forward assistant reasoning updates to parent via SubagentManager callbacks
|
|
553
553
|
if (this.callbacks?.onSubagentAssistantReasoningUpdated) {
|
|
554
|
-
this.callbacks.onSubagentAssistantReasoningUpdated(subagentId, chunk, accumulated);
|
|
554
|
+
this.callbacks.onSubagentAssistantReasoningUpdated(subagentId, messageId, chunk, accumulated);
|
|
555
555
|
}
|
|
556
556
|
},
|
|
557
557
|
onToolBlockUpdated: (params) => {
|
|
@@ -22,12 +22,12 @@ export declare class AuthService {
|
|
|
22
22
|
* Register a callback for auth state changes.
|
|
23
23
|
* Returns an unsubscribe function.
|
|
24
24
|
*/
|
|
25
|
-
onAuthChange(callback: (event: "login" | "logout") => void): () => void;
|
|
25
|
+
onAuthChange(callback: (event: "login" | "logout") => void | Promise<void>): () => void;
|
|
26
26
|
private notifyAuthChange;
|
|
27
27
|
getAuthPath(): string;
|
|
28
28
|
loadAuth(): AuthConfig;
|
|
29
29
|
saveAuth(config: AuthConfig): void;
|
|
30
|
-
clearAuth(): void
|
|
30
|
+
clearAuth(): Promise<void>;
|
|
31
31
|
getSSOToken(): string | undefined;
|
|
32
32
|
getServerUrl(): string;
|
|
33
33
|
login(options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/services/authService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAiB,MAAM,kBAAkB,CAAC;AAM5E,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"authService.d.ts","sourceRoot":"","sources":["../../src/services/authService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAiB,MAAM,kBAAkB,CAAC;AAM5E,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,qBAAqB,CAEtB;IACP,OAAO,CAAC,eAAe,CAAiC;IACxD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAE1D,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;;OAGG;IACH,YAAY,CACV,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5D,MAAM,IAAI;YASC,gBAAgB;IAU9B,WAAW,IAAI,MAAM;IAKrB,QAAQ,IAAI,UAAU;IAmBtB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAgB5B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBhC,WAAW,IAAI,MAAM,GAAG,SAAS;IAKjC,YAAY,IAAI,MAAM;IAUhB,KAAK,CAAC,OAAO,CAAC,EAAE;QACpB,6DAA6D;QAC7D,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAClC,mGAAmG;QACnG,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,oFAAoF;QACpF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgCnB;;;OAGG;YACW,YAAY;IAyB1B,OAAO,CAAC,oBAAoB;IA6F5B,kBAAkB,IAAI,OAAO;IAW7B;;;OAGG;IACH,cAAc,IAAI,OAAO;IAgBzB;;;OAGG;IACG,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAkBtD;;;OAGG;YACW,YAAY;IA4D1B;;;OAGG;IACH,yEAAyE;IACzE,6BAA6B,IAAI,OAAO;IAwBxC,WAAW,IAAI,QAAQ,GAAG,SAAS;CAIpC;AAED,eAAO,MAAM,WAAW,aAA4B,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,OAAO,KAAK,GAAG,OAAO,KAAK,CA+C3E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAsC/C;AAED,4DAA4D;AAC5D,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD"}
|
|
@@ -42,10 +42,10 @@ export class AuthService {
|
|
|
42
42
|
this.onAuthChangeCallbacks = this.onAuthChangeCallbacks.filter((cb) => cb !== callback);
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
-
notifyAuthChange(event) {
|
|
45
|
+
async notifyAuthChange(event) {
|
|
46
46
|
for (const cb of this.onAuthChangeCallbacks) {
|
|
47
47
|
try {
|
|
48
|
-
cb(event);
|
|
48
|
+
await cb(event);
|
|
49
49
|
}
|
|
50
50
|
catch {
|
|
51
51
|
// Don't let callback errors break auth flow
|
|
@@ -92,7 +92,7 @@ export class AuthService {
|
|
|
92
92
|
// ignore stat errors
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
clearAuth() {
|
|
95
|
+
async clearAuth() {
|
|
96
96
|
const config = this.loadAuth();
|
|
97
97
|
delete config.SSO_TOKEN;
|
|
98
98
|
delete config.SSO_REFRESH_TOKEN;
|
|
@@ -106,7 +106,7 @@ export class AuthService {
|
|
|
106
106
|
else {
|
|
107
107
|
this.saveAuth(config);
|
|
108
108
|
}
|
|
109
|
-
this.notifyAuthChange("logout");
|
|
109
|
+
await this.notifyAuthChange("logout");
|
|
110
110
|
}
|
|
111
111
|
getSSOToken() {
|
|
112
112
|
const config = this.loadAuth();
|
|
@@ -139,7 +139,7 @@ export class AuthService {
|
|
|
139
139
|
: undefined,
|
|
140
140
|
user,
|
|
141
141
|
});
|
|
142
|
-
this.notifyAuthChange("login");
|
|
142
|
+
await this.notifyAuthChange("login");
|
|
143
143
|
return token;
|
|
144
144
|
}
|
|
145
145
|
/**
|
|
@@ -303,7 +303,7 @@ export class AuthService {
|
|
|
303
303
|
if (response.status === 400 || response.status === 401) {
|
|
304
304
|
// Refresh token revoked — clear auth
|
|
305
305
|
logger.info(`[Auth] Refresh token rejected (${response.status}), clearing auth`);
|
|
306
|
-
this.clearAuth();
|
|
306
|
+
await this.clearAuth();
|
|
307
307
|
return false;
|
|
308
308
|
}
|
|
309
309
|
if (!response.ok) {
|
|
@@ -324,7 +324,7 @@ export class AuthService {
|
|
|
324
324
|
: config.user,
|
|
325
325
|
});
|
|
326
326
|
logger.info(`[Auth] Token refreshed successfully, new token expires at ${newExpiresAt ? new Date(newExpiresAt).toISOString() : "never"}`);
|
|
327
|
-
this.notifyAuthChange("login");
|
|
327
|
+
await this.notifyAuthChange("login");
|
|
328
328
|
return true;
|
|
329
329
|
}
|
|
330
330
|
catch (err) {
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { RemoteSettingsFetchResult } from "../types/configuration.js";
|
|
2
2
|
import type { WaveConfiguration } from "../types/configuration.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register a callback invoked when remote settings change (checksum differs).
|
|
5
|
+
* Returns an unsubscribe function.
|
|
6
|
+
*/
|
|
7
|
+
export declare function onSettingsUpdate(callback: () => void | Promise<void>): () => void;
|
|
3
8
|
export declare function initialize(): void;
|
|
4
9
|
export declare function getRemoteSettingsSync(): WaveConfiguration | null;
|
|
5
10
|
export declare function refresh(): Promise<RemoteSettingsFetchResult>;
|
|
@@ -17,5 +22,6 @@ export declare const remoteSettingsService: {
|
|
|
17
22
|
readonly clear: typeof clear;
|
|
18
23
|
readonly shutdown: typeof shutdown;
|
|
19
24
|
readonly mergeRemoteSettings: typeof mergeRemoteSettings;
|
|
25
|
+
readonly onSettingsUpdate: typeof onSettingsUpdate;
|
|
20
26
|
};
|
|
21
27
|
//# sourceMappingURL=remoteSettingsService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteSettingsService.d.ts","sourceRoot":"","sources":["../../src/services/remoteSettingsService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,yBAAyB,EAE1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"remoteSettingsService.d.ts","sourceRoot":"","sources":["../../src/services/remoteSettingsService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,yBAAyB,EAE1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAYnE;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACnC,MAAM,IAAI,CAOZ;AAoKD,wBAAgB,UAAU,IAAI,IAAI,CASjC;AAED,wBAAgB,qBAAqB,IAAI,iBAAiB,GAAG,IAAI,CAEhE;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAKlE;AAED,wBAAgB,KAAK,IAAI,IAAI,CAO5B;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAK/B;AAqCD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CA4DnB;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;CAQxB,CAAC"}
|
|
@@ -8,6 +8,27 @@ const POLLING_INTERVAL_MS = 60 * 60 * 1000; // 60 minutes
|
|
|
8
8
|
const FETCH_TIMEOUT_MS = 10000;
|
|
9
9
|
let _cachedSettings = null;
|
|
10
10
|
let _pollingTimer = null;
|
|
11
|
+
let _onSettingsUpdateCallbacks = [];
|
|
12
|
+
/**
|
|
13
|
+
* Register a callback invoked when remote settings change (checksum differs).
|
|
14
|
+
* Returns an unsubscribe function.
|
|
15
|
+
*/
|
|
16
|
+
export function onSettingsUpdate(callback) {
|
|
17
|
+
_onSettingsUpdateCallbacks.push(callback);
|
|
18
|
+
return () => {
|
|
19
|
+
_onSettingsUpdateCallbacks = _onSettingsUpdateCallbacks.filter((cb) => cb !== callback);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function notifySettingsUpdate() {
|
|
23
|
+
for (const cb of _onSettingsUpdateCallbacks) {
|
|
24
|
+
try {
|
|
25
|
+
await cb();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Don't let callback errors break the fetch flow
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
11
32
|
function loadCacheFromDisk() {
|
|
12
33
|
try {
|
|
13
34
|
if (!fs.existsSync(CACHE_FILE)) {
|
|
@@ -64,6 +85,7 @@ async function fetchRemoteSettings() {
|
|
|
64
85
|
if (!token || !serverUrl) {
|
|
65
86
|
return { success: false, error: "Missing SSO token or server URL" };
|
|
66
87
|
}
|
|
88
|
+
const oldChecksum = _cachedSettings?.checksum;
|
|
67
89
|
const headers = {
|
|
68
90
|
Authorization: `Bearer ${token}`,
|
|
69
91
|
};
|
|
@@ -91,6 +113,9 @@ async function fetchRemoteSettings() {
|
|
|
91
113
|
logger.debug("remoteSettings: 404 not configured — clearing stale cache");
|
|
92
114
|
_cachedSettings = null;
|
|
93
115
|
removeCacheFromDisk();
|
|
116
|
+
if (oldChecksum) {
|
|
117
|
+
await notifySettingsUpdate();
|
|
118
|
+
}
|
|
94
119
|
return { success: true, notConfigured: true, settings: null };
|
|
95
120
|
}
|
|
96
121
|
if (!response.ok) {
|
|
@@ -116,6 +141,9 @@ async function fetchRemoteSettings() {
|
|
|
116
141
|
logger.debug("remoteSettings: fetched new settings", {
|
|
117
142
|
checksum: data.checksum,
|
|
118
143
|
});
|
|
144
|
+
if (data.checksum !== oldChecksum) {
|
|
145
|
+
await notifySettingsUpdate();
|
|
146
|
+
}
|
|
119
147
|
return {
|
|
120
148
|
success: true,
|
|
121
149
|
settings: data.settings,
|
|
@@ -277,4 +305,5 @@ export const remoteSettingsService = {
|
|
|
277
305
|
clear,
|
|
278
306
|
shutdown,
|
|
279
307
|
mergeRemoteSettings,
|
|
308
|
+
onSettingsUpdate,
|
|
280
309
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA0B3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,
|
|
1
|
+
{"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA0B3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAM3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,CA6SX"}
|
|
@@ -101,9 +101,9 @@ export function setupAgentContainer(setupOptions) {
|
|
|
101
101
|
});
|
|
102
102
|
container.register("McpManager", mcpManager);
|
|
103
103
|
// Wire up auth change callback to refresh/clear remote settings
|
|
104
|
-
authService.onAuthChange((event) => {
|
|
104
|
+
authService.onAuthChange(async (event) => {
|
|
105
105
|
if (event === "login") {
|
|
106
|
-
remoteSettingsService.refresh();
|
|
106
|
+
await remoteSettingsService.refresh();
|
|
107
107
|
}
|
|
108
108
|
else if (event === "logout") {
|
|
109
109
|
remoteSettingsService.clear();
|
|
@@ -215,6 +215,11 @@ export function setupAgentContainer(setupOptions) {
|
|
|
215
215
|
},
|
|
216
216
|
});
|
|
217
217
|
container.register("LiveConfigManager", liveConfigManager);
|
|
218
|
+
// Wire up remote settings hot-update: when polling detects changed settings,
|
|
219
|
+
// reload configuration so admin changes propagate to the running agent.
|
|
220
|
+
remoteSettingsService.onSettingsUpdate(async () => {
|
|
221
|
+
await liveConfigManager.reload();
|
|
222
|
+
});
|
|
218
223
|
const subagentManager = new SubagentManager(container, {
|
|
219
224
|
workdir,
|
|
220
225
|
callbacks: {
|