opencode-swarm 7.10.0 → 7.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/architect.d.ts +1 -0
- package/dist/agents/skill-improver.d.ts +12 -0
- package/dist/agents/spec-writer.d.ts +8 -0
- package/dist/cli/index.js +157 -14
- package/dist/config/constants.d.ts +2 -2
- package/dist/config/schema.d.ts +103 -0
- package/dist/hooks/curator-types.d.ts +25 -0
- package/dist/hooks/curator.d.ts +33 -1
- package/dist/hooks/knowledge-application-gate.d.ts +61 -0
- package/dist/hooks/knowledge-application.d.ts +103 -0
- package/dist/hooks/knowledge-reader.d.ts +18 -1
- package/dist/hooks/knowledge-store.d.ts +1 -0
- package/dist/hooks/knowledge-types.d.ts +96 -1
- package/dist/hooks/knowledge-validator.d.ts +16 -1
- package/dist/hooks/skill-improver-llm-factory.d.ts +30 -0
- package/dist/index.js +3190 -1003
- package/dist/plan/manager.d.ts +13 -0
- package/dist/services/skill-generator.d.ts +120 -0
- package/dist/services/skill-improver-quota.d.ts +57 -0
- package/dist/services/skill-improver.d.ts +102 -0
- package/dist/state.d.ts +40 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/knowledge-ack.d.ts +15 -0
- package/dist/tools/skill-apply.d.ts +11 -0
- package/dist/tools/skill-generate.d.ts +16 -0
- package/dist/tools/skill-improve.d.ts +16 -0
- package/dist/tools/skill-inspect.d.ts +9 -0
- package/dist/tools/skill-list.d.ts +8 -0
- package/dist/tools/spec-write.d.ts +13 -0
- package/dist/tools/tool-names.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge application tracking — distinguishes shown / acknowledged / applied
|
|
3
|
+
* / ignored / violated outcomes for injected knowledge directives.
|
|
4
|
+
*
|
|
5
|
+
* Writes one JSONL line per outcome to `.swarm/knowledge-application.jsonl`,
|
|
6
|
+
* and updates per-entry retrieval-outcome counters on the source knowledge file.
|
|
7
|
+
*/
|
|
8
|
+
import type { KnowledgeApplicationResult } from './knowledge-types.js';
|
|
9
|
+
export declare function resolveApplicationLogPath(directory: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Parse explicit knowledge-acknowledgment markers from architect text.
|
|
12
|
+
* Recognised forms (case-insensitive, line-anchored or inline):
|
|
13
|
+
* KNOWLEDGE_APPLIED: <id>
|
|
14
|
+
* KNOWLEDGE_IGNORED: <id> reason=<reason>
|
|
15
|
+
* KNOWLEDGE_VIOLATED: <id> reason=<reason>
|
|
16
|
+
*/
|
|
17
|
+
export interface ParsedAcknowledgment {
|
|
18
|
+
id: string;
|
|
19
|
+
result: 'applied' | 'ignored' | 'violated';
|
|
20
|
+
reason?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseAcknowledgments(text: string): ParsedAcknowledgment[];
|
|
23
|
+
export interface RecordContext {
|
|
24
|
+
phase?: string;
|
|
25
|
+
taskId?: string;
|
|
26
|
+
action?: string;
|
|
27
|
+
tool?: string;
|
|
28
|
+
targetAgent?: string;
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Record one or more knowledge IDs as "shown" (injected into context). */
|
|
32
|
+
export declare function recordKnowledgeShown(directory: string, ids: string[], ctx: RecordContext): Promise<void>;
|
|
33
|
+
/** Record an explicit acknowledgment outcome (applied / ignored / violated).
|
|
34
|
+
* Per-(sessionId, knowledgeId, result, dayKey) dedup is enforced by the
|
|
35
|
+
* caller via swarmState.knowledgeAckDedup; this fn always records when
|
|
36
|
+
* invoked, so test code can trigger duplicates if needed. The runtime
|
|
37
|
+
* integration in src/index.ts uses recordAcknowledgmentDeduped instead. */
|
|
38
|
+
export declare function recordAcknowledgment(directory: string, ack: ParsedAcknowledgment, ctx: RecordContext): Promise<void>;
|
|
39
|
+
/** Build the dedup key. Exported so test code and the runtime integration
|
|
40
|
+
* share the exact format. */
|
|
41
|
+
export declare function buildAckDedupKey(sessionId: string, id: string, result: KnowledgeApplicationResult, now?: Date): string;
|
|
42
|
+
/** Acknowledgment recording with dedup. Returns whether a record was actually
|
|
43
|
+
* written (false on dedup hit). dedupSet should be swarmState.knowledgeAckDedup
|
|
44
|
+
* in production; tests can pass a fresh Set. */
|
|
45
|
+
export declare function recordAcknowledgmentDeduped(directory: string, ack: ParsedAcknowledgment, ctx: RecordContext, dedupSet: Set<string>, now?: Date): Promise<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Process a chunk of architect text: extract any KNOWLEDGE_* markers and record
|
|
48
|
+
* each as an outcome. Returns the parsed list (empty if none).
|
|
49
|
+
*/
|
|
50
|
+
export declare function processArchitectText(directory: string, text: string, ctx: RecordContext): Promise<ParsedAcknowledgment[]>;
|
|
51
|
+
export interface ShownNotAppliedQuery {
|
|
52
|
+
taskId?: string;
|
|
53
|
+
phase?: string;
|
|
54
|
+
knowledgeIds: string[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the subset of `knowledgeIds` that have at least one "shown" record
|
|
58
|
+
* in the audit log without a subsequent "applied"/"ignored"/"violated" record
|
|
59
|
+
* in the same task or phase scope.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getShownButNotAcknowledged(directory: string, q: ShownNotAppliedQuery): Promise<string[]>;
|
|
62
|
+
export interface KnowledgeApplicationConfig {
|
|
63
|
+
enabled: boolean;
|
|
64
|
+
mode: 'warn' | 'enforce';
|
|
65
|
+
min_confidence: number;
|
|
66
|
+
critical_requires_ack: boolean;
|
|
67
|
+
require_skill_refs: boolean;
|
|
68
|
+
}
|
|
69
|
+
export declare const DEFAULT_KNOWLEDGE_APPLICATION_CONFIG: KnowledgeApplicationConfig;
|
|
70
|
+
export interface GateResult {
|
|
71
|
+
allowed: boolean;
|
|
72
|
+
mode: 'warn' | 'enforce';
|
|
73
|
+
violations: Array<{
|
|
74
|
+
id: string;
|
|
75
|
+
reason: string;
|
|
76
|
+
}>;
|
|
77
|
+
warnings: Array<{
|
|
78
|
+
id: string;
|
|
79
|
+
reason: string;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Enforce the knowledge-application contract before a high-risk action.
|
|
84
|
+
* In 'warn' mode: never blocks; returns { allowed: true } with warnings.
|
|
85
|
+
* In 'enforce' mode: returns { allowed: false } if any critical+matching
|
|
86
|
+
* directive is in `criticalShownIds` and not present in `recentArchitectText`.
|
|
87
|
+
*/
|
|
88
|
+
export declare function gateKnowledgeApplication(args: {
|
|
89
|
+
criticalShownIds: string[];
|
|
90
|
+
recentArchitectText: string;
|
|
91
|
+
config: KnowledgeApplicationConfig;
|
|
92
|
+
}): GateResult;
|
|
93
|
+
export declare const _internals: {
|
|
94
|
+
parseAcknowledgments: typeof parseAcknowledgments;
|
|
95
|
+
recordKnowledgeShown: typeof recordKnowledgeShown;
|
|
96
|
+
recordAcknowledgment: typeof recordAcknowledgment;
|
|
97
|
+
recordAcknowledgmentDeduped: typeof recordAcknowledgmentDeduped;
|
|
98
|
+
processArchitectText: typeof processArchitectText;
|
|
99
|
+
getShownButNotAcknowledged: typeof getShownButNotAcknowledged;
|
|
100
|
+
gateKnowledgeApplication: typeof gateKnowledgeApplication;
|
|
101
|
+
resolveApplicationLogPath: typeof resolveApplicationLogPath;
|
|
102
|
+
buildAckDedupKey: typeof buildAckDedupKey;
|
|
103
|
+
};
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Merges swarm + hive knowledge, deduplicates (hive wins), ranks by composite score,
|
|
3
3
|
* and provides utility tracking.
|
|
4
4
|
*/
|
|
5
|
-
import type { KnowledgeConfig, KnowledgeEntryBase } from './knowledge-types.js';
|
|
5
|
+
import type { KnowledgeConfig, KnowledgeEntryBase, KnowledgeRetrievalContext } from './knowledge-types.js';
|
|
6
6
|
export interface ProjectContext {
|
|
7
7
|
projectName: string;
|
|
8
8
|
currentPhase: string;
|
|
@@ -20,7 +20,24 @@ export interface RankedEntry extends KnowledgeEntryBase {
|
|
|
20
20
|
}
|
|
21
21
|
export declare function readMergedKnowledge(directory: string, config: KnowledgeConfig, context?: ProjectContext): Promise<RankedEntry[]>;
|
|
22
22
|
export declare function updateRetrievalOutcome(directory: string, phaseInfo: string, phaseSucceeded: boolean): Promise<void>;
|
|
23
|
+
/** Returns 0..1 score representing trigger/action match strength against the context. */
|
|
24
|
+
export declare function scoreDirectiveAgainstContext(entry: KnowledgeEntryBase, ctx: KnowledgeRetrievalContext): {
|
|
25
|
+
triggerHit: boolean;
|
|
26
|
+
actionHit: boolean;
|
|
27
|
+
agentHit: boolean;
|
|
28
|
+
score: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* v2: Action-aware retrieval. Returns RankedEntry[] but uses the richer
|
|
32
|
+
* KnowledgeRetrievalContext to bias ranking toward entries whose triggers,
|
|
33
|
+
* applies_to_tools, applies_to_agents, or directive_priority match the
|
|
34
|
+
* current decision point. Falls back to readMergedKnowledge ordering for
|
|
35
|
+
* non-matching entries.
|
|
36
|
+
*/
|
|
37
|
+
export declare function readContextualKnowledge(directory: string, config: KnowledgeConfig, ctx: KnowledgeRetrievalContext): Promise<RankedEntry[]>;
|
|
23
38
|
export declare const _internals: {
|
|
24
39
|
readMergedKnowledge: typeof readMergedKnowledge;
|
|
40
|
+
readContextualKnowledge: typeof readContextualKnowledge;
|
|
25
41
|
updateRetrievalOutcome: typeof updateRetrievalOutcome;
|
|
42
|
+
scoreDirectiveAgainstContext: typeof scoreDirectiveAgainstContext;
|
|
26
43
|
};
|
|
@@ -6,6 +6,7 @@ export declare function resolveSwarmRejectedPath(directory: string): string;
|
|
|
6
6
|
export declare function resolveHiveKnowledgePath(): string;
|
|
7
7
|
export declare function resolveHiveRejectedPath(): string;
|
|
8
8
|
export declare function readKnowledge<T>(filePath: string): Promise<T[]>;
|
|
9
|
+
export declare function normalizeEntry<T>(raw: T): T;
|
|
9
10
|
export declare function readRejectedLessons(directory: string): Promise<RejectedLesson[]>;
|
|
10
11
|
export declare function appendKnowledge<T>(filePath: string, entry: T): Promise<void>;
|
|
11
12
|
export declare function rewriteKnowledge<T>(filePath: string, entries: T[]): Promise<void>;
|
|
@@ -11,12 +11,69 @@ export interface ProjectConfirmationRecord {
|
|
|
11
11
|
phase_number?: number;
|
|
12
12
|
}
|
|
13
13
|
export interface RetrievalOutcome {
|
|
14
|
+
/** @deprecated v1 LEGACY field — frozen in v2.
|
|
15
|
+
* v1 callers incremented this for every "shown" event (i.e. it conflated
|
|
16
|
+
* shown with applied). v2 stops auto-incrementing it. Existing v1 entries
|
|
17
|
+
* still load their historical value; the v1→v2 normalizer copies it into
|
|
18
|
+
* `shown_count` so downstream consumers can keep working. New code MUST
|
|
19
|
+
* read `applied_explicit_count` for explicit application or
|
|
20
|
+
* `succeeded_after_shown_count` / `failed_after_shown_count` for outcome
|
|
21
|
+
* attribution. */
|
|
14
22
|
applied_count: number;
|
|
23
|
+
/** @deprecated v1 LEGACY: succeeded_after_count was bumped after
|
|
24
|
+
* applied_count. Frozen in v2; new equivalent is succeeded_after_shown_count. */
|
|
15
25
|
succeeded_after_count: number;
|
|
26
|
+
/** @deprecated v1 LEGACY: failed_after_count was bumped after
|
|
27
|
+
* applied_count. Frozen in v2; new equivalent is failed_after_shown_count. */
|
|
16
28
|
failed_after_count: number;
|
|
17
29
|
last_applied_at?: string;
|
|
30
|
+
/** v2: number of times this entry was injected/shown to architect. */
|
|
31
|
+
shown_count?: number;
|
|
32
|
+
/** v2: explicit acknowledgment ("I see directive X") count. */
|
|
33
|
+
acknowledged_count?: number;
|
|
34
|
+
/** v2: explicit application count (KNOWLEDGE_APPLIED: id). */
|
|
35
|
+
applied_explicit_count?: number;
|
|
36
|
+
/** v2: explicit ignore count (KNOWLEDGE_IGNORED: id reason=...). */
|
|
37
|
+
ignored_count?: number;
|
|
38
|
+
/** v2: explicit/inferred violation count (KNOWLEDGE_VIOLATED: id reason=...). */
|
|
39
|
+
violated_count?: number;
|
|
40
|
+
/** v2: phase-success count after a "shown" (replaces succeeded_after_count). */
|
|
41
|
+
succeeded_after_shown_count?: number;
|
|
42
|
+
/** v2: phase-failure count after a "shown" (replaces failed_after_count). */
|
|
43
|
+
failed_after_shown_count?: number;
|
|
18
44
|
}
|
|
19
|
-
|
|
45
|
+
/** v2: priority used by retrieval ranking and enforcement. */
|
|
46
|
+
export type DirectivePriority = 'low' | 'medium' | 'high' | 'critical';
|
|
47
|
+
/** v2: optional actionable-directive metadata attached to a knowledge entry. */
|
|
48
|
+
export interface ActionableDirectiveFields {
|
|
49
|
+
/** Trigger phrases that surface this entry (e.g. "coder delegation modifying source"). */
|
|
50
|
+
triggers?: string[];
|
|
51
|
+
/** Required actions when the trigger matches. */
|
|
52
|
+
required_actions?: string[];
|
|
53
|
+
/** Forbidden actions when the trigger matches. */
|
|
54
|
+
forbidden_actions?: string[];
|
|
55
|
+
/** Agent role names this directive applies to. */
|
|
56
|
+
applies_to_agents?: string[];
|
|
57
|
+
/** Tool names this directive applies to. */
|
|
58
|
+
applies_to_tools?: string[];
|
|
59
|
+
/** Reviewer/test-engineer/runtime checks the directive expects. */
|
|
60
|
+
verification_checks?: string[];
|
|
61
|
+
/** Source pointers (file:line, plan section, etc.). Sanitized. */
|
|
62
|
+
source_refs?: string[];
|
|
63
|
+
/** UUIDs of source knowledge entries (for derived/clustered entries). */
|
|
64
|
+
source_knowledge_ids?: string[];
|
|
65
|
+
/** Slug of generated skill, if a SKILL.md was compiled from this entry. */
|
|
66
|
+
generated_skill_slug?: string;
|
|
67
|
+
/** Repo-local path to generated SKILL.md. */
|
|
68
|
+
generated_skill_path?: string;
|
|
69
|
+
/** Directive priority for ranking/enforcement. */
|
|
70
|
+
directive_priority?: DirectivePriority;
|
|
71
|
+
/** ISO 8601 timestamp of last explicit application. */
|
|
72
|
+
last_applied_at?: string;
|
|
73
|
+
/** ISO 8601 timestamp of last explicit acknowledgment. */
|
|
74
|
+
last_acknowledged_at?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface KnowledgeEntryBase extends ActionableDirectiveFields {
|
|
20
77
|
id: string;
|
|
21
78
|
tier: 'swarm' | 'hive';
|
|
22
79
|
lesson: string;
|
|
@@ -35,6 +92,8 @@ export interface KnowledgeEntryBase {
|
|
|
35
92
|
phases_alive?: number;
|
|
36
93
|
max_phases?: number;
|
|
37
94
|
}
|
|
95
|
+
/** v2 schema marker. v1 entries are still parseable and normalized in-memory by knowledge-store.normalizeEntry. */
|
|
96
|
+
export declare const KNOWLEDGE_SCHEMA_VERSION = 2;
|
|
38
97
|
export interface SwarmKnowledgeEntry extends KnowledgeEntryBase {
|
|
39
98
|
tier: 'swarm';
|
|
40
99
|
confirmed_by: PhaseConfirmationRecord[];
|
|
@@ -129,3 +188,39 @@ export interface MessageWithParts {
|
|
|
129
188
|
info: MessageInfo;
|
|
130
189
|
parts: MessagePart[];
|
|
131
190
|
}
|
|
191
|
+
export type RetrievalMode = 'phase_start' | 'delegation' | 'tool_before' | 'phase_complete' | 'manual_recall' | 'curator';
|
|
192
|
+
/** Decision-point context passed to action-aware retrieval. */
|
|
193
|
+
export interface KnowledgeRetrievalContext {
|
|
194
|
+
projectName?: string;
|
|
195
|
+
currentPhase?: string;
|
|
196
|
+
taskId?: string;
|
|
197
|
+
taskTitle?: string;
|
|
198
|
+
taskDescription?: string;
|
|
199
|
+
lastUserMessage?: string;
|
|
200
|
+
currentTool?: string;
|
|
201
|
+
currentAction?: string;
|
|
202
|
+
targetAgent?: string;
|
|
203
|
+
filePaths?: string[];
|
|
204
|
+
recentReviewerFailures?: string[];
|
|
205
|
+
recentTestFailures?: string[];
|
|
206
|
+
recentToolErrors?: string[];
|
|
207
|
+
declaredScope?: string;
|
|
208
|
+
techStack?: string[];
|
|
209
|
+
planConstraints?: string[];
|
|
210
|
+
mode?: RetrievalMode;
|
|
211
|
+
}
|
|
212
|
+
export type KnowledgeApplicationResult = 'shown' | 'acknowledged' | 'applied' | 'ignored' | 'violated';
|
|
213
|
+
/** One line of .swarm/knowledge-application.jsonl. */
|
|
214
|
+
export interface KnowledgeApplicationRecord {
|
|
215
|
+
timestamp: string;
|
|
216
|
+
phase?: string;
|
|
217
|
+
taskId?: string;
|
|
218
|
+
action?: string;
|
|
219
|
+
tool?: string;
|
|
220
|
+
targetAgent?: string;
|
|
221
|
+
knowledgeId: string;
|
|
222
|
+
result: KnowledgeApplicationResult;
|
|
223
|
+
reason?: string;
|
|
224
|
+
generatedSkillPath?: string;
|
|
225
|
+
sessionId?: string;
|
|
226
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Three-layer validation gate for the opencode-swarm v6.17 knowledge system. */
|
|
2
|
-
import type { KnowledgeCategory, KnowledgeEntryBase } from './knowledge-types.js';
|
|
2
|
+
import type { ActionableDirectiveFields, DirectivePriority, KnowledgeCategory, KnowledgeEntryBase } from './knowledge-types.js';
|
|
3
3
|
export interface ValidationResult {
|
|
4
4
|
valid: boolean;
|
|
5
5
|
layer: 1 | 2 | 3 | null;
|
|
@@ -15,6 +15,21 @@ export declare function validateLesson(candidate: string, existingLessons: strin
|
|
|
15
15
|
scope: string;
|
|
16
16
|
confidence: number;
|
|
17
17
|
}): ValidationResult;
|
|
18
|
+
/** Maximum chars allowed per trigger / required-action / forbidden-action string. */
|
|
19
|
+
export declare const ACTIONABLE_STRING_MAX = 200;
|
|
20
|
+
/** Maximum number of items in any actionable list (triggers, required_actions, etc.). */
|
|
21
|
+
export declare const ACTIONABLE_LIST_MAX = 20;
|
|
22
|
+
/** Generated skill paths must be repo-local under one of these prefixes. */
|
|
23
|
+
export declare const ALLOWED_SKILL_PATH_PREFIXES: string[];
|
|
24
|
+
export interface ActionableValidationResult {
|
|
25
|
+
valid: boolean;
|
|
26
|
+
errors: string[];
|
|
27
|
+
}
|
|
28
|
+
/** Validate a generated_skill_path: must be repo-local and under an allowed prefix. */
|
|
29
|
+
export declare function validateSkillPath(p: unknown): boolean;
|
|
30
|
+
/** Validate the optional ActionableDirectiveFields block on a knowledge entry. */
|
|
31
|
+
export declare function validateActionableFields(fields: ActionableDirectiveFields | undefined): ActionableValidationResult;
|
|
32
|
+
export type { ActionableDirectiveFields, DirectivePriority };
|
|
18
33
|
export interface QuarantinedEntry extends KnowledgeEntryBase {
|
|
19
34
|
quarantine_reason: string;
|
|
20
35
|
quarantined_at: string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill-improver LLM delegate factory.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors src/hooks/curator-llm-factory.ts so the skill_improver agent can be
|
|
5
|
+
* dispatched via the same ephemeral-session-per-call pattern. Returns
|
|
6
|
+
* `undefined` when `swarmState.opencodeClient` is null (e.g. in unit tests),
|
|
7
|
+
* letting the caller fall back to deterministic mode behind an opt-in flag.
|
|
8
|
+
*
|
|
9
|
+
* Resolution priority for the registered agent name follows the curator
|
|
10
|
+
* factory exactly: direct lookup via active session → heuristic scan → static
|
|
11
|
+
* fallback. The `mode` parameter is reserved for future role variants (e.g.
|
|
12
|
+
* "review_only" vs "draft_skills"); today both modes resolve to the same
|
|
13
|
+
* `skill_improver` agent.
|
|
14
|
+
*/
|
|
15
|
+
export type SkillImproverLLMDelegate = (systemPrompt: string, userInput: string, signal?: AbortSignal) => Promise<string>;
|
|
16
|
+
declare function resolveSkillImproverAgentName(sessionId?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Create a SkillImproverLLMDelegate that dispatches the registered
|
|
19
|
+
* skill_improver agent on an ephemeral OpenCode session.
|
|
20
|
+
*
|
|
21
|
+
* Returns `undefined` when no OpenCode client is wired (unit tests, library
|
|
22
|
+
* mode). Callers MUST handle that case explicitly: if the deterministic
|
|
23
|
+
* fallback is disabled, refuse the run BEFORE reserving any quota.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createSkillImproverLLMDelegate(directory: string, sessionId?: string): SkillImproverLLMDelegate | undefined;
|
|
26
|
+
export declare const _internals: {
|
|
27
|
+
createSkillImproverLLMDelegate: typeof createSkillImproverLLMDelegate;
|
|
28
|
+
resolveSkillImproverAgentName: typeof resolveSkillImproverAgentName;
|
|
29
|
+
};
|
|
30
|
+
export {};
|