@codedrifters/configulator 0.0.214 → 0.0.216
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/lib/index.d.mts +33 -2
- package/lib/index.d.ts +33 -2
- package/lib/index.js +139 -33
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +139 -33
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
package/lib/index.d.mts
CHANGED
|
@@ -198,9 +198,38 @@ interface AgentSkill {
|
|
|
198
198
|
readonly paths?: ReadonlyArray<string>;
|
|
199
199
|
/**
|
|
200
200
|
* Resource directories bundled with the skill (e.g., references/, scripts/, assets/).
|
|
201
|
+
* Documentation hint only — directory names listed here are not emitted to disk.
|
|
202
|
+
* Prefer {@link referenceFiles} to ship actual companion file contents.
|
|
203
|
+
*
|
|
204
|
+
* @deprecated Use {@link referenceFiles} to emit physical companion files.
|
|
201
205
|
* @example ['references/', 'scripts/']
|
|
202
206
|
*/
|
|
203
207
|
readonly references?: ReadonlyArray<string>;
|
|
208
|
+
/**
|
|
209
|
+
* Companion files shipped alongside the SKILL.md (e.g., templates, references, scripts).
|
|
210
|
+
* Each entry is rendered as a TextFile under the skill's directory on every
|
|
211
|
+
* platform that emits skills (Claude: `.claude/skills/{name}/{path}`,
|
|
212
|
+
* Cursor: `.cursor/skills/{name}/{path}`).
|
|
213
|
+
*
|
|
214
|
+
* Use this for skill assets that benefit from being separate files rather than
|
|
215
|
+
* inlined into the skill instructions — large templates, reference tables,
|
|
216
|
+
* runnable scripts.
|
|
217
|
+
*
|
|
218
|
+
* Per-platform `platforms.{claude,cursor}.exclude` flags suppress reference
|
|
219
|
+
* files for that platform alongside the SKILL.md.
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* referenceFiles: [
|
|
223
|
+
* { path: '_references/templates/_template-FR.md', content: '# Functional Requirement\n...' },
|
|
224
|
+
* { path: '_references/standards-and-frameworks.md', content: '# Standards\n...' },
|
|
225
|
+
* ]
|
|
226
|
+
*/
|
|
227
|
+
readonly referenceFiles?: ReadonlyArray<{
|
|
228
|
+
/** Path relative to the skill directory (e.g., `_references/templates/_template-FR.md`). */
|
|
229
|
+
readonly path: string;
|
|
230
|
+
/** File contents written verbatim. */
|
|
231
|
+
readonly content: string;
|
|
232
|
+
}>;
|
|
204
233
|
/**
|
|
205
234
|
* Context isolation mode. Set to 'fork' to run in an isolated subagent context.
|
|
206
235
|
*/
|
|
@@ -1022,8 +1051,10 @@ declare const bcmWriterBundle: AgentRuleBundle;
|
|
|
1022
1051
|
*
|
|
1023
1052
|
* Consuming projects can disable it with
|
|
1024
1053
|
* `excludeBundles: ["company-profile"]`. `appliesWhen` always returns
|
|
1025
|
-
* `true` per
|
|
1026
|
-
* present
|
|
1054
|
+
* `true` per the operating-system directive that bundles assume peers
|
|
1055
|
+
* are present — in Phase 3 this bundle hands work off to
|
|
1056
|
+
* `people-profile` (via `people:research`) and `software-profile` (via
|
|
1057
|
+
* `software:research`).
|
|
1027
1058
|
*
|
|
1028
1059
|
* Ships a sub-agent (`company-profile-analyst`), a user-invocable skill
|
|
1029
1060
|
* (`/profile-company`), and `type:company-profile` plus `company:*`
|
package/lib/index.d.ts
CHANGED
|
@@ -247,9 +247,38 @@ interface AgentSkill {
|
|
|
247
247
|
readonly paths?: ReadonlyArray<string>;
|
|
248
248
|
/**
|
|
249
249
|
* Resource directories bundled with the skill (e.g., references/, scripts/, assets/).
|
|
250
|
+
* Documentation hint only — directory names listed here are not emitted to disk.
|
|
251
|
+
* Prefer {@link referenceFiles} to ship actual companion file contents.
|
|
252
|
+
*
|
|
253
|
+
* @deprecated Use {@link referenceFiles} to emit physical companion files.
|
|
250
254
|
* @example ['references/', 'scripts/']
|
|
251
255
|
*/
|
|
252
256
|
readonly references?: ReadonlyArray<string>;
|
|
257
|
+
/**
|
|
258
|
+
* Companion files shipped alongside the SKILL.md (e.g., templates, references, scripts).
|
|
259
|
+
* Each entry is rendered as a TextFile under the skill's directory on every
|
|
260
|
+
* platform that emits skills (Claude: `.claude/skills/{name}/{path}`,
|
|
261
|
+
* Cursor: `.cursor/skills/{name}/{path}`).
|
|
262
|
+
*
|
|
263
|
+
* Use this for skill assets that benefit from being separate files rather than
|
|
264
|
+
* inlined into the skill instructions — large templates, reference tables,
|
|
265
|
+
* runnable scripts.
|
|
266
|
+
*
|
|
267
|
+
* Per-platform `platforms.{claude,cursor}.exclude` flags suppress reference
|
|
268
|
+
* files for that platform alongside the SKILL.md.
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* referenceFiles: [
|
|
272
|
+
* { path: '_references/templates/_template-FR.md', content: '# Functional Requirement\n...' },
|
|
273
|
+
* { path: '_references/standards-and-frameworks.md', content: '# Standards\n...' },
|
|
274
|
+
* ]
|
|
275
|
+
*/
|
|
276
|
+
readonly referenceFiles?: ReadonlyArray<{
|
|
277
|
+
/** Path relative to the skill directory (e.g., `_references/templates/_template-FR.md`). */
|
|
278
|
+
readonly path: string;
|
|
279
|
+
/** File contents written verbatim. */
|
|
280
|
+
readonly content: string;
|
|
281
|
+
}>;
|
|
253
282
|
/**
|
|
254
283
|
* Context isolation mode. Set to 'fork' to run in an isolated subagent context.
|
|
255
284
|
*/
|
|
@@ -1071,8 +1100,10 @@ declare const bcmWriterBundle: AgentRuleBundle;
|
|
|
1071
1100
|
*
|
|
1072
1101
|
* Consuming projects can disable it with
|
|
1073
1102
|
* `excludeBundles: ["company-profile"]`. `appliesWhen` always returns
|
|
1074
|
-
* `true` per
|
|
1075
|
-
* present
|
|
1103
|
+
* `true` per the operating-system directive that bundles assume peers
|
|
1104
|
+
* are present — in Phase 3 this bundle hands work off to
|
|
1105
|
+
* `people-profile` (via `people:research`) and `software-profile` (via
|
|
1106
|
+
* `software:research`).
|
|
1076
1107
|
*
|
|
1077
1108
|
* Ships a sub-agent (`company-profile-analyst`), a user-invocable skill
|
|
1078
1109
|
* (`/profile-company`), and `type:company-profile` plus `company:*`
|
package/lib/index.js
CHANGED
|
@@ -1704,7 +1704,7 @@ var bcmWriterBundle = {
|
|
|
1704
1704
|
// src/agent/bundles/company-profile.ts
|
|
1705
1705
|
var companyProfileAnalystSubAgent = {
|
|
1706
1706
|
name: "company-profile-analyst",
|
|
1707
|
-
description: "Researches an external company (competitor, vendor, partner, customer, etc.) from public sources and produces a structured markdown profile
|
|
1707
|
+
description: "Researches an external company (competitor, vendor, partner, customer, etc.) from public sources and produces a structured markdown profile, then enqueues downstream `people:research` and `software:research` issues for notable people and software products surfaced during profiling. One company per session, tracked by company:* GitHub issue labels.",
|
|
1708
1708
|
model: AGENT_MODEL.POWERFUL,
|
|
1709
1709
|
maxTurns: 80,
|
|
1710
1710
|
platforms: { cursor: { exclude: true } },
|
|
@@ -1747,7 +1747,10 @@ var companyProfileAnalystSubAgent = {
|
|
|
1747
1747
|
"6. **Follow-up, don't widen scope.** If the session turns up adjacent",
|
|
1748
1748
|
" research questions (a key person worth profiling, a product worth",
|
|
1749
1749
|
" evaluating), emit a follow-up issue rather than expanding the",
|
|
1750
|
-
" profile beyond its scope.",
|
|
1750
|
+
" profile beyond its scope. Notable people are handed off to the",
|
|
1751
|
+
" `people-profile` bundle via `people:research` issues; software",
|
|
1752
|
+
" products are handed off to the `software-profile` bundle via",
|
|
1753
|
+
" `software:research` issues.",
|
|
1751
1754
|
"",
|
|
1752
1755
|
"---",
|
|
1753
1756
|
"",
|
|
@@ -1818,6 +1821,8 @@ var companyProfileAnalystSubAgent = {
|
|
|
1818
1821
|
"| `<PROFILES_DIR>` | Final company profile files | `<COMPANY_ROOT>/profiles/` |",
|
|
1819
1822
|
"| `<NOTES_DIR>` | Research-notes files from Phase 1 | `<COMPANY_ROOT>/notes/` |",
|
|
1820
1823
|
"| `<COMPANY_SLUG>` | Short kebab-case slug identifying the company | derived from the company name |",
|
|
1824
|
+
"| `<PEOPLE_PROFILES_DIR>` | Where existing people profiles live (for duplicate detection during followup) | `docs/people/profiles/` |",
|
|
1825
|
+
"| `<SOFTWARE_PROFILES_DIR>` | Where existing software profiles live (for duplicate detection during followup) | `docs/software/profiles/` |",
|
|
1821
1826
|
"",
|
|
1822
1827
|
"If `docs/project-context.md` specifies a different company-research",
|
|
1823
1828
|
"tree (for example by reusing the research-pipeline deliverables",
|
|
@@ -1999,30 +2004,91 @@ var companyProfileAnalystSubAgent = {
|
|
|
1999
2004
|
"## Phase 3: Followup (`company:followup`)",
|
|
2000
2005
|
"",
|
|
2001
2006
|
"**Goal:** Create downstream research issues for the people and",
|
|
2002
|
-
"products surfaced in the profile.",
|
|
2007
|
+
"software products surfaced in the profile. Hand the candidates off to",
|
|
2008
|
+
"the `people-profile` and `software-profile` bundles so they can be",
|
|
2009
|
+
"researched independently.",
|
|
2003
2010
|
"",
|
|
2004
2011
|
"**Budget:** No new research. Read the profile, enqueue issues, close",
|
|
2005
|
-
"the phase.",
|
|
2012
|
+
"the phase. Markdown cross-references in the profile's",
|
|
2013
|
+
"`## Follow-up Candidates` section are preserved \u2014 issue creation is",
|
|
2014
|
+
"**additive** on top of the existing notes-only behavior.",
|
|
2006
2015
|
"",
|
|
2007
2016
|
"### Steps",
|
|
2008
2017
|
"",
|
|
2009
2018
|
"1. **Read the profile file** referenced in the issue body.",
|
|
2010
2019
|
"",
|
|
2011
|
-
"2. **Enqueue people
|
|
2012
|
-
" `Follow-up Candidates > People to profile
|
|
2013
|
-
"
|
|
2014
|
-
"
|
|
2015
|
-
"
|
|
2016
|
-
"",
|
|
2017
|
-
"
|
|
2018
|
-
"
|
|
2019
|
-
"
|
|
2020
|
-
"
|
|
2021
|
-
"",
|
|
2022
|
-
"
|
|
2023
|
-
"
|
|
2024
|
-
"",
|
|
2025
|
-
"
|
|
2020
|
+
"2. **Enqueue a `people:research` issue per candidate** under",
|
|
2021
|
+
" `Follow-up Candidates > People to profile` that is worth",
|
|
2022
|
+
" downstream research. Each issue must carry:",
|
|
2023
|
+
"",
|
|
2024
|
+
" - `type:people-profile`",
|
|
2025
|
+
" - `people:research`",
|
|
2026
|
+
" - `priority:medium`",
|
|
2027
|
+
" - `status:ready`",
|
|
2028
|
+
"",
|
|
2029
|
+
" The issue body must include:",
|
|
2030
|
+
" - A **discovery source** line naming this company profile",
|
|
2031
|
+
" (`Discovered while profiling: <company name>`)",
|
|
2032
|
+
" - A link to the company profile path (`Company profile: <PROFILES_DIR>/<COMPANY_SLUG>.md`)",
|
|
2033
|
+
" - Enough identifying metadata \u2014 full name, role/title, and",
|
|
2034
|
+
" employing company \u2014 that the `people-profile-analyst` agent can",
|
|
2035
|
+
" begin research without revisiting this company profile",
|
|
2036
|
+
"",
|
|
2037
|
+
"3. **Enqueue a `software:research` issue per candidate** under",
|
|
2038
|
+
" `Follow-up Candidates > Products / software to evaluate` that is",
|
|
2039
|
+
" worth downstream research. Each issue must carry:",
|
|
2040
|
+
"",
|
|
2041
|
+
" - `type:software-profile`",
|
|
2042
|
+
" - `software:research`",
|
|
2043
|
+
" - `priority:medium`",
|
|
2044
|
+
" - `status:ready`",
|
|
2045
|
+
"",
|
|
2046
|
+
" The issue body must include:",
|
|
2047
|
+
" - A **discovery source** line naming this company profile",
|
|
2048
|
+
" (`Discovered while profiling: <company name>`)",
|
|
2049
|
+
" - A link to the company profile path (`Company profile: <PROFILES_DIR>/<COMPANY_SLUG>.md`)",
|
|
2050
|
+
" - Enough identifying metadata \u2014 product name and vendor (usually",
|
|
2051
|
+
" this company if it builds the product, otherwise the upstream",
|
|
2052
|
+
" vendor) \u2014 that the `software-profile-analyst` agent can begin",
|
|
2053
|
+
" research without revisiting this company profile",
|
|
2054
|
+
"",
|
|
2055
|
+
"4. **Avoid duplicates.** Before opening a `people:research` or",
|
|
2056
|
+
" `software:research` issue, verify no existing profile covers the",
|
|
2057
|
+
" candidate:",
|
|
2058
|
+
"",
|
|
2059
|
+
" - People: check `<PEOPLE_PROFILES_DIR>/` for a matching profile",
|
|
2060
|
+
" file (by derived slug or by searching the directory for the",
|
|
2061
|
+
" person's name). If a profile exists, reuse it as a cross-reference",
|
|
2062
|
+
" only \u2014 **do not** open a new `people:research` issue.",
|
|
2063
|
+
" - Software: check `<SOFTWARE_PROFILES_DIR>/` the same way. If a",
|
|
2064
|
+
" profile exists, reuse it as a cross-reference only \u2014 **do not**",
|
|
2065
|
+
" open a new `software:research` issue.",
|
|
2066
|
+
" - Also scan open issues carrying the matching `people:research` or",
|
|
2067
|
+
" `software:research` label so this phase never re-opens research",
|
|
2068
|
+
" that is already queued.",
|
|
2069
|
+
"",
|
|
2070
|
+
"5. **Exercise restraint.** Only create downstream issues for people",
|
|
2071
|
+
" and software products that are **genuinely relevant** to the",
|
|
2072
|
+
" framing of this profile \u2014 executives, founders, and decision-makers",
|
|
2073
|
+
" for people; products the company builds or materially depends on",
|
|
2074
|
+
" for software. Do **not** open issues for every name mentioned in",
|
|
2075
|
+
" passing, every SaaS tool listed in a job ad, or every tangential",
|
|
2076
|
+
" partner. When in doubt, leave the candidate as a markdown",
|
|
2077
|
+
" cross-reference in the profile and skip the downstream issue.",
|
|
2078
|
+
"",
|
|
2079
|
+
"6. **Assume the peers are present.** This pipeline assumes the",
|
|
2080
|
+
" `people-profile` and `software-profile` bundles are enabled in the",
|
|
2081
|
+
" consuming project. If a consuming project has disabled one of",
|
|
2082
|
+
" them, flag the followup issue with `status:needs-attention` and",
|
|
2083
|
+
" list the candidates that could not be routed \u2014 never invent an",
|
|
2084
|
+
" alternative label taxonomy.",
|
|
2085
|
+
"",
|
|
2086
|
+
"7. **Cross-link** \u2014 update the profile's `## Follow-up Candidates`",
|
|
2087
|
+
" section so each entry references its newly-created issue number",
|
|
2088
|
+
" (or the existing profile path, for candidates that were skipped",
|
|
2089
|
+
" because a profile already exists).",
|
|
2090
|
+
"",
|
|
2091
|
+
"8. **Commit and push** (if the profile was updated). Close the",
|
|
2026
2092
|
" followup issue.",
|
|
2027
2093
|
"",
|
|
2028
2094
|
"---",
|
|
@@ -2034,9 +2100,17 @@ var companyProfileAnalystSubAgent = {
|
|
|
2034
2100
|
"- `<NOTES_DIR>/` \u2014 research-notes files (Phase 1)",
|
|
2035
2101
|
"- `<PROFILES_DIR>/` \u2014 company profiles (Phase 2, updated in Phase 3)",
|
|
2036
2102
|
"",
|
|
2037
|
-
"
|
|
2038
|
-
"
|
|
2039
|
-
"
|
|
2103
|
+
"In Phase 3, this agent also **creates `people:research` and",
|
|
2104
|
+
"`software:research` issues** for people and software products",
|
|
2105
|
+
"surfaced in the profile. It never writes the downstream profiles",
|
|
2106
|
+
"themselves \u2014 those are the responsibility of the",
|
|
2107
|
+
"`people-profile-analyst` and `software-profile-analyst` agents, which",
|
|
2108
|
+
"pick up the issues this pipeline creates.",
|
|
2109
|
+
"",
|
|
2110
|
+
"The pipeline produces **company profiles and notes only**. Deeper",
|
|
2111
|
+
"research on people or products is delegated to downstream research",
|
|
2112
|
+
"pipelines via `people:research` and `software:research` issues \u2014 this",
|
|
2113
|
+
"agent never writes person profiles, software profiles, product",
|
|
2040
2114
|
"evaluations, or comparative analyses itself. Keep this boundary clean",
|
|
2041
2115
|
"so the company-profile pipeline stays generic.",
|
|
2042
2116
|
"",
|
|
@@ -2052,10 +2126,23 @@ var companyProfileAnalystSubAgent = {
|
|
|
2052
2126
|
"- **No assumed competition.** Never call a company a competitor unless",
|
|
2053
2127
|
" the invoking issue body or the consuming project's configuration",
|
|
2054
2128
|
" says so.",
|
|
2055
|
-
"- **
|
|
2056
|
-
"
|
|
2057
|
-
"
|
|
2058
|
-
"
|
|
2129
|
+
"- **Delegate, don't duplicate.** People and software products",
|
|
2130
|
+
" surfaced during profiling are handed off to the `people-profile`",
|
|
2131
|
+
" and `software-profile` bundles via `people:research` and",
|
|
2132
|
+
" `software:research` issues in Phase 3 \u2014 never inlined as person or",
|
|
2133
|
+
" software profiles in this pipeline.",
|
|
2134
|
+
"- **Check before enqueueing.** Before opening a `people:research` or",
|
|
2135
|
+
" `software:research` issue, verify no existing profile or open",
|
|
2136
|
+
" research issue already covers the candidate. Reuse existing",
|
|
2137
|
+
" profiles as cross-references rather than re-queuing research.",
|
|
2138
|
+
"- **Restrain the queue.** Only enqueue downstream research for people",
|
|
2139
|
+
" and products that are genuinely relevant to the framing of this",
|
|
2140
|
+
" profile. Do not open issues for every name or product mentioned in",
|
|
2141
|
+
" passing.",
|
|
2142
|
+
"- **Produce profiles, not requirement or evaluation documents.** Do",
|
|
2143
|
+
" not open `type:requirement` or formal evaluation issues from this",
|
|
2144
|
+
" pipeline. Follow-up research is scoped through `people:research`",
|
|
2145
|
+
" and `software:research` only."
|
|
2059
2146
|
].join("\n")
|
|
2060
2147
|
};
|
|
2061
2148
|
var profileCompanySkill = {
|
|
@@ -2107,15 +2194,18 @@ var profileCompanySkill = {
|
|
|
2107
2194
|
"",
|
|
2108
2195
|
"- A research-notes file under the project's notes directory",
|
|
2109
2196
|
"- A single company profile under the profiles directory",
|
|
2110
|
-
"-
|
|
2111
|
-
"
|
|
2112
|
-
"-
|
|
2113
|
-
"
|
|
2197
|
+
"- `people:research` issues for notable people surfaced in the profile",
|
|
2198
|
+
" (handed off to the `people-profile` bundle)",
|
|
2199
|
+
"- `software:research` issues for software products surfaced in the",
|
|
2200
|
+
" profile (handed off to the `software-profile` bundle)",
|
|
2201
|
+
"- This pipeline produces **company profiles only** \u2014 it does not",
|
|
2202
|
+
" write person profiles, software profiles, product evaluations, or",
|
|
2203
|
+
" comparative analyses itself."
|
|
2114
2204
|
].join("\n")
|
|
2115
2205
|
};
|
|
2116
2206
|
var companyProfileBundle = {
|
|
2117
2207
|
name: "company-profile",
|
|
2118
|
-
description: "Company research and profiling pipeline: research, draft profile, followup. Enabled by default; domain-neutral; filesystem-durable between phases.",
|
|
2208
|
+
description: "Company research and profiling pipeline: research, draft profile, followup. Enabled by default; domain-neutral; filesystem-durable between phases. Phase 3 (Followup) hands surfaced people and software products off to the `people-profile` and `software-profile` bundles via `people:research` and `software:research` issues.",
|
|
2119
2209
|
appliesWhen: () => true,
|
|
2120
2210
|
rules: [
|
|
2121
2211
|
{
|
|
@@ -2132,8 +2222,10 @@ var companyProfileBundle = {
|
|
|
2132
2222
|
"`company:followup`. All issues carry `type:company-profile`.",
|
|
2133
2223
|
"",
|
|
2134
2224
|
"The pipeline produces **company profiles only**. Deeper research",
|
|
2135
|
-
"on people
|
|
2136
|
-
"
|
|
2225
|
+
"on notable people and software products surfaced while profiling",
|
|
2226
|
+
"is delegated to the `people-profile` and `software-profile`",
|
|
2227
|
+
"bundles via `people:research` and `software:research` issues",
|
|
2228
|
+
"opened during Phase 3 (Followup).",
|
|
2137
2229
|
"",
|
|
2138
2230
|
"See the `company-profile-analyst` agent definition for full",
|
|
2139
2231
|
"workflow details, default paths, the company-type taxonomy, and",
|
|
@@ -8400,6 +8492,13 @@ var ClaudeRenderer = class _ClaudeRenderer {
|
|
|
8400
8492
|
new import_textfile2.TextFile(component, `.claude/skills/${skill.name}/SKILL.md`, {
|
|
8401
8493
|
lines
|
|
8402
8494
|
});
|
|
8495
|
+
if (skill.referenceFiles && skill.referenceFiles.length > 0) {
|
|
8496
|
+
for (const file of skill.referenceFiles) {
|
|
8497
|
+
new import_textfile2.TextFile(component, `.claude/skills/${skill.name}/${file.path}`, {
|
|
8498
|
+
lines: file.content.split("\n")
|
|
8499
|
+
});
|
|
8500
|
+
}
|
|
8501
|
+
}
|
|
8403
8502
|
}
|
|
8404
8503
|
}
|
|
8405
8504
|
static renderSubAgents(component, subAgents) {
|
|
@@ -8571,6 +8670,13 @@ var CursorRenderer = class _CursorRenderer {
|
|
|
8571
8670
|
new import_textfile3.TextFile(component, `.cursor/skills/${skill.name}/SKILL.md`, {
|
|
8572
8671
|
lines
|
|
8573
8672
|
});
|
|
8673
|
+
if (skill.referenceFiles && skill.referenceFiles.length > 0) {
|
|
8674
|
+
for (const file of skill.referenceFiles) {
|
|
8675
|
+
new import_textfile3.TextFile(component, `.cursor/skills/${skill.name}/${file.path}`, {
|
|
8676
|
+
lines: file.content.split("\n")
|
|
8677
|
+
});
|
|
8678
|
+
}
|
|
8679
|
+
}
|
|
8574
8680
|
}
|
|
8575
8681
|
}
|
|
8576
8682
|
static renderSubAgents(component, subAgents) {
|