crewly 1.4.40 → 1.4.42
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/config/orchestrator_tasks/prompts/orchestrator-prompt.md +11 -11
- package/config/roles/architect/prompt.md +1 -5
- package/config/roles/backend-developer/prompt.md +1 -5
- package/config/roles/content-strategist/prompt.md +1 -5
- package/config/roles/designer/prompt.md +1 -5
- package/config/roles/developer/prompt.md +1 -7
- package/config/roles/developer/soul.md +18 -0
- package/config/roles/frontend-developer/prompt.md +1 -5
- package/config/roles/fullstack-dev/prompt.md +1 -5
- package/config/roles/generalist/prompt.md +1 -7
- package/config/roles/ops/prompt.md +1 -7
- package/config/roles/orchestrator/fragments/communication.md +117 -0
- package/config/roles/orchestrator/fragments/lifecycle.md +112 -0
- package/config/roles/orchestrator/fragments/recovery.md +47 -0
- package/config/roles/orchestrator/prompt.md +44 -44
- package/config/roles/orchestrator/soul.md +18 -0
- package/config/roles/product-manager/prompt.md +1 -5
- package/config/roles/qa/prompt.md +1 -5
- package/config/roles/qa-engineer/prompt.md +1 -5
- package/config/roles/researcher/prompt.md +1 -5
- package/config/roles/researcher/soul.md +18 -0
- package/config/roles/sales/prompt.md +1 -5
- package/config/roles/support/prompt.md +1 -5
- package/config/roles/team-leader/prompt.md +2 -6
- package/config/roles/tpm/prompt.md +1 -5
- package/config/roles/ux-designer/prompt.md +1 -5
- package/config/souls/developer.md +30 -0
- package/config/souls/orchestrator.md +30 -0
- package/config/souls/researcher.md +30 -0
- package/config/templates/agent-claude-md.md +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +18 -7
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +16 -4
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +11 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +5 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts +46 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +151 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/context-assembly.service.d.ts +145 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/context-assembly.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/context-assembly.service.js +232 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/context-assembly.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/identity.module.d.ts +28 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/identity.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/identity.module.js +47 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/identity.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +22 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js +26 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts +28 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/learning-reference.module.js +55 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/learning-reference.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts +44 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/lifecycle.module.js +120 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/lifecycle.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +28 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js +46 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.d.ts +29 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.js +50 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +103 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +305 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +135 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js +46 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts +34 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +69 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/scheduled-messages.loader.d.ts +55 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/scheduled-messages.loader.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/scheduled-messages.loader.js +96 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/scheduled-messages.loader.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +28 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +65 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/soul.module.d.ts +70 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/soul.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/soul.module.js +166 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/soul.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/team-reference.module.d.ts +54 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/team-reference.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/team-reference.module.js +149 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/team-reference.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts +28 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.js +53 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/attention.service.d.ts +74 -0
- package/dist/backend/backend/src/services/ai/self-improvement/attention.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/attention.service.js +132 -0
- package/dist/backend/backend/src/services/ai/self-improvement/attention.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/growth-areas.service.d.ts +81 -0
- package/dist/backend/backend/src/services/ai/self-improvement/growth-areas.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/growth-areas.service.js +135 -0
- package/dist/backend/backend/src/services/ai/self-improvement/growth-areas.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/index.d.ts +13 -0
- package/dist/backend/backend/src/services/ai/self-improvement/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/index.js +13 -0
- package/dist/backend/backend/src/services/ai/self-improvement/index.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts +107 -0
- package/dist/backend/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/memory-consolidation.service.js +183 -0
- package/dist/backend/backend/src/services/ai/self-improvement/memory-consolidation.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +97 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js +128 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/self-model.service.d.ts +95 -0
- package/dist/backend/backend/src/services/ai/self-improvement/self-model.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/self-model.service.js +116 -0
- package/dist/backend/backend/src/services/ai/self-improvement/self-model.service.js.map +1 -0
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.js +9 -11
- package/dist/backend/backend/src/services/prompt/prompt-generator.service.js.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js +3 -1
- package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { readFile, access } from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Team reference module — provides team hierarchy, TL duties, and norms references.
|
|
5
|
+
*
|
|
6
|
+
* Wraps the existing `buildTeamLeadSection` and `buildTeamNormsSection` logic
|
|
7
|
+
* from PromptBuilderService. The TL addon is conditionally loaded only when
|
|
8
|
+
* the agent has `canDelegate=true` and subordinates.
|
|
9
|
+
*
|
|
10
|
+
* Sources: Path A Step 7, Path B Sections 4+5.
|
|
11
|
+
*/
|
|
12
|
+
export class TeamReferenceModule {
|
|
13
|
+
name = 'team_references';
|
|
14
|
+
priority = 6;
|
|
15
|
+
maxTokens = 8000;
|
|
16
|
+
compactable = false; // TL core is not compactable
|
|
17
|
+
/**
|
|
18
|
+
* Include when agent has a team (teamId set) or has subordinates.
|
|
19
|
+
*/
|
|
20
|
+
shouldInclude(config) {
|
|
21
|
+
return !!(config.teamId || (config.canDelegate && config.subordinates && config.subordinates.length > 0));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build team reference section. Includes TL addon if agent can delegate,
|
|
25
|
+
* and team norms if available.
|
|
26
|
+
*
|
|
27
|
+
* @param config - Module configuration with team and subordinate details
|
|
28
|
+
* @returns Formatted markdown team reference section
|
|
29
|
+
*/
|
|
30
|
+
async build(config) {
|
|
31
|
+
const sections = [];
|
|
32
|
+
// Build TL section if agent can delegate
|
|
33
|
+
if (config.canDelegate && config.subordinates && config.subordinates.length > 0) {
|
|
34
|
+
const tlSection = await this.buildTeamLeadSection(config);
|
|
35
|
+
if (tlSection) {
|
|
36
|
+
sections.push(tlSection);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Build team norms section if team exists
|
|
40
|
+
if (config.teamId) {
|
|
41
|
+
const normsSection = await this.buildTeamNormsSection(config.teamId, config.role);
|
|
42
|
+
if (normsSection) {
|
|
43
|
+
sections.push(normsSection);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return sections.join('\n\n---\n\n');
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build Team Lead section by loading tl-addon.md and resolving variables.
|
|
50
|
+
* Falls back to inline section if addon file not found.
|
|
51
|
+
*
|
|
52
|
+
* @param config - Module configuration with subordinate details
|
|
53
|
+
* @returns Formatted TL section or empty string
|
|
54
|
+
*/
|
|
55
|
+
async buildTeamLeadSection(config) {
|
|
56
|
+
if (!config.subordinates || config.subordinates.length === 0) {
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
const workerList = config.subordinates
|
|
60
|
+
.map((sub) => `- **${sub.name}** (session: \`${sub.sessionName}\`, memberId: \`${sub.memberId}\`) — ${sub.role}`)
|
|
61
|
+
.join('\n');
|
|
62
|
+
// Try loading the comprehensive TL addon from file
|
|
63
|
+
const addonPath = path.join(config.projectRoot, 'config', 'roles', 'team-leader', 'tl-addon.md');
|
|
64
|
+
try {
|
|
65
|
+
await access(addonPath);
|
|
66
|
+
let addonContent = await readFile(addonPath, 'utf8');
|
|
67
|
+
// Resolve template variables
|
|
68
|
+
const variables = {
|
|
69
|
+
WORKER_LIST: workerList,
|
|
70
|
+
TL_SKILLS_PATH: config.tlSkillsPath,
|
|
71
|
+
TEAM_ID: config.teamId || '',
|
|
72
|
+
MEMBER_ID: config.memberId || '',
|
|
73
|
+
PROJECT_PATH: config.projectPath || '',
|
|
74
|
+
AGENT_SKILLS_PATH: config.agentSkillsPath,
|
|
75
|
+
};
|
|
76
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
77
|
+
addonContent = addonContent.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value);
|
|
78
|
+
}
|
|
79
|
+
return addonContent.trim();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Fallback to minimal inline section
|
|
83
|
+
return this.buildInlineTeamLeadSection(workerList, config.subordinates.length);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build minimal inline TL section as fallback when tl-addon.md is not found.
|
|
88
|
+
*
|
|
89
|
+
* @param workerList - Pre-formatted worker list
|
|
90
|
+
* @param subordinateCount - Number of subordinates
|
|
91
|
+
* @returns Formatted inline TL section
|
|
92
|
+
*/
|
|
93
|
+
buildInlineTeamLeadSection(workerList, subordinateCount) {
|
|
94
|
+
return `## Team Lead Responsibilities
|
|
95
|
+
|
|
96
|
+
You manage ${subordinateCount} subordinate(s):
|
|
97
|
+
|
|
98
|
+
${workerList}
|
|
99
|
+
|
|
100
|
+
### Your TL Duties
|
|
101
|
+
|
|
102
|
+
1. **Task Decomposition** — Break down large tasks into actionable sub-tasks
|
|
103
|
+
2. **Delegation** — Assign sub-tasks to subordinates using \`send-message\`
|
|
104
|
+
3. **Quality Review** — Review subordinates' work before reporting completion
|
|
105
|
+
4. **Progress Reporting** — Report progress to the orchestrator via \`report-status\`
|
|
106
|
+
5. **Unblocking** — Help subordinates when they are stuck`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build team norms section by loading norms files from team directory.
|
|
110
|
+
* Only includes norms whose role list matches the agent's role or '*'.
|
|
111
|
+
*
|
|
112
|
+
* @param teamId - Team ID to load norms for
|
|
113
|
+
* @param role - Agent's role for filtering
|
|
114
|
+
* @returns Formatted norms markdown or empty string
|
|
115
|
+
*/
|
|
116
|
+
async buildTeamNormsSection(teamId, role) {
|
|
117
|
+
if (!teamId)
|
|
118
|
+
return '';
|
|
119
|
+
try {
|
|
120
|
+
const { existsSync, readdirSync, readFileSync } = await import('fs');
|
|
121
|
+
const crewlyHome = path.join(process.env['HOME'] || '/tmp', '.crewly');
|
|
122
|
+
const normsDir = path.join(crewlyHome, 'teams', teamId, 'norms');
|
|
123
|
+
if (!existsSync(normsDir))
|
|
124
|
+
return '';
|
|
125
|
+
const normFiles = readdirSync(normsDir).filter((f) => f.endsWith('.md'));
|
|
126
|
+
if (normFiles.length === 0)
|
|
127
|
+
return '';
|
|
128
|
+
const normalizedRole = role.toLowerCase().replace(/\s+/g, '-');
|
|
129
|
+
const sections = ['## Team Norms'];
|
|
130
|
+
for (const file of normFiles) {
|
|
131
|
+
const content = readFileSync(path.join(normsDir, file), 'utf8');
|
|
132
|
+
// Check if norm applies to this role (roles: line at top)
|
|
133
|
+
const rolesMatch = content.match(/^roles:\s*(.+)$/m);
|
|
134
|
+
if (rolesMatch) {
|
|
135
|
+
const roles = rolesMatch[1].split(',').map((r) => r.trim().toLowerCase());
|
|
136
|
+
if (!roles.includes('*') && !roles.includes(normalizedRole)) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
sections.push(content.trim());
|
|
141
|
+
}
|
|
142
|
+
return sections.length > 1 ? sections.join('\n\n') : '';
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return '';
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=team-reference.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/team-reference.module.ts"],"names":[],"mappings":"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"}
|
package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PromptModule, ModuleConfig } from './prompt-module.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* User profile reference module — tells the agent how to access user preferences.
|
|
4
|
+
*
|
|
5
|
+
* Provides instructions for language matching, communication style adaptation,
|
|
6
|
+
* and accessing stored user preferences via recall/remember skills.
|
|
7
|
+
*
|
|
8
|
+
* Sources: Path B Section 10 (language matching), new user prefs system.
|
|
9
|
+
*/
|
|
10
|
+
export declare class UserProfileReferenceModule implements PromptModule {
|
|
11
|
+
name: string;
|
|
12
|
+
priority: number;
|
|
13
|
+
maxTokens: number;
|
|
14
|
+
compactable: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Always included — agents should know how to adapt to user preferences.
|
|
17
|
+
*/
|
|
18
|
+
shouldInclude(_config: ModuleConfig): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Build the user profile reference section with instructions
|
|
21
|
+
* on how to discover and adapt to user preferences.
|
|
22
|
+
*
|
|
23
|
+
* @param config - Module configuration with agent skill paths
|
|
24
|
+
* @returns Formatted markdown user profile reference section
|
|
25
|
+
*/
|
|
26
|
+
build(config: ModuleConfig): Promise<string>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=user-profile-reference.module.d.ts.map
|
package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-profile-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/user-profile-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;GAOG;AACH,qBAAa,0BAA2B,YAAW,YAAY;IAC9D,IAAI,SAA4B;IAChC,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,UAAQ;IAEnB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CAyBlD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User profile reference module — tells the agent how to access user preferences.
|
|
3
|
+
*
|
|
4
|
+
* Provides instructions for language matching, communication style adaptation,
|
|
5
|
+
* and accessing stored user preferences via recall/remember skills.
|
|
6
|
+
*
|
|
7
|
+
* Sources: Path B Section 10 (language matching), new user prefs system.
|
|
8
|
+
*/
|
|
9
|
+
export class UserProfileReferenceModule {
|
|
10
|
+
name = 'user_profile_reference';
|
|
11
|
+
priority = 9;
|
|
12
|
+
maxTokens = 200;
|
|
13
|
+
compactable = true;
|
|
14
|
+
/**
|
|
15
|
+
* Always included — agents should know how to adapt to user preferences.
|
|
16
|
+
*/
|
|
17
|
+
shouldInclude(_config) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build the user profile reference section with instructions
|
|
22
|
+
* on how to discover and adapt to user preferences.
|
|
23
|
+
*
|
|
24
|
+
* @param config - Module configuration with agent skill paths
|
|
25
|
+
* @returns Formatted markdown user profile reference section
|
|
26
|
+
*/
|
|
27
|
+
async build(config) {
|
|
28
|
+
return `## User Preferences
|
|
29
|
+
|
|
30
|
+
### Language Matching
|
|
31
|
+
Match the user's language automatically:
|
|
32
|
+
- If the user writes in Chinese, respond in Chinese
|
|
33
|
+
- If the user writes in English, respond in English
|
|
34
|
+
- For mixed-language messages, follow the dominant language
|
|
35
|
+
|
|
36
|
+
### Accessing Preferences
|
|
37
|
+
Use your memory tools to recall user-specific preferences:
|
|
38
|
+
\`\`\`bash
|
|
39
|
+
bash ${config.agentSkillsPath}/core/recall/execute.sh '{"agentId":"${config.sessionName}","context":"user preferences, communication style","projectPath":"${config.projectPath || ''}"}'
|
|
40
|
+
\`\`\`
|
|
41
|
+
|
|
42
|
+
When you discover a user preference (e.g., preferred detail level, communication style), store it:
|
|
43
|
+
\`\`\`bash
|
|
44
|
+
bash ${config.agentSkillsPath}/core/remember/execute.sh '{"agentId":"${config.sessionName}","content":"<preference>","category":"preference","scope":"agent","projectPath":"${config.projectPath || ''}"}'
|
|
45
|
+
\`\`\`
|
|
46
|
+
|
|
47
|
+
### Adaptation Rules
|
|
48
|
+
- Adapt verbosity to user preference (concise vs detailed)
|
|
49
|
+
- Mirror the user's formality level
|
|
50
|
+
- Respect timezone and working hours when mentioned`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=user-profile-reference.module.js.map
|
package/dist/backend/backend/src/services/ai/prompt-modules/user-profile-reference.module.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-profile-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/user-profile-reference.module.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,0BAA0B;IACtC,IAAI,GAAG,wBAAwB,CAAC;IAChC,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,GAAG,CAAC;IAChB,WAAW,GAAG,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,OAAqB;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC/B,OAAO;;;;;;;;;;;OAWF,MAAM,CAAC,eAAe,wCAAwC,MAAM,CAAC,WAAW,sEAAsE,MAAM,CAAC,WAAW,IAAI,EAAE;;;;;OAK9K,MAAM,CAAC,eAAe,0CAA0C,MAAM,CAAC,WAAW,qFAAqF,MAAM,CAAC,WAAW,IAAI,EAAE;;;;;;oDAMlJ,CAAC;IACpD,CAAC;CACD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted attention management data structure.
|
|
3
|
+
*/
|
|
4
|
+
export interface AttentionData {
|
|
5
|
+
/** Current focus items — topics the agent should prioritize */
|
|
6
|
+
focus: string[];
|
|
7
|
+
/** Suppressed items — topics the agent should deprioritize */
|
|
8
|
+
suppressed: string[];
|
|
9
|
+
/** Last time focus items were pruned (ISO date string) */
|
|
10
|
+
lastPruned: string;
|
|
11
|
+
/** Timestamps for each focus item (for pruning stale items) */
|
|
12
|
+
focusTimestamps?: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Service for managing agent attention — what to focus on and what to suppress.
|
|
16
|
+
*
|
|
17
|
+
* Focus items direct the agent's attention toward high-priority topics.
|
|
18
|
+
* Suppressed items filter out noise from irrelevant past context.
|
|
19
|
+
* Pruning removes stale focus items that haven't been updated in 2+ weeks.
|
|
20
|
+
*
|
|
21
|
+
* Storage: ~/.crewly/agents/{sessionName}/attention.json
|
|
22
|
+
*/
|
|
23
|
+
export declare class AttentionService {
|
|
24
|
+
/**
|
|
25
|
+
* Get the file path for an agent's attention data.
|
|
26
|
+
*
|
|
27
|
+
* @param sessionName - Agent session name
|
|
28
|
+
* @returns Absolute path to attention.json
|
|
29
|
+
*/
|
|
30
|
+
private getFilePath;
|
|
31
|
+
/**
|
|
32
|
+
* Read attention data from disk.
|
|
33
|
+
*
|
|
34
|
+
* @param sessionName - Agent session name
|
|
35
|
+
* @returns Attention data, or empty default if file doesn't exist
|
|
36
|
+
*/
|
|
37
|
+
getAttention(sessionName: string): Promise<AttentionData>;
|
|
38
|
+
/**
|
|
39
|
+
* Get the current focus items for an agent.
|
|
40
|
+
*
|
|
41
|
+
* @param sessionName - Agent session name
|
|
42
|
+
* @returns Array of focus item strings
|
|
43
|
+
*/
|
|
44
|
+
getFocus(sessionName: string): Promise<string[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Set the focus items for an agent (replaces existing focus).
|
|
47
|
+
*
|
|
48
|
+
* @param sessionName - Agent session name
|
|
49
|
+
* @param items - New focus items
|
|
50
|
+
*/
|
|
51
|
+
setFocus(sessionName: string, items: string[]): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Add a single item to the suppressed list.
|
|
54
|
+
*
|
|
55
|
+
* @param sessionName - Agent session name
|
|
56
|
+
* @param item - Item to suppress
|
|
57
|
+
*/
|
|
58
|
+
suppress(sessionName: string, item: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Prune stale focus items that haven't been updated in PRUNE_THRESHOLD_DAYS.
|
|
61
|
+
*
|
|
62
|
+
* @param sessionName - Agent session name
|
|
63
|
+
* @returns Number of items pruned
|
|
64
|
+
*/
|
|
65
|
+
prune(sessionName: string): Promise<number>;
|
|
66
|
+
/**
|
|
67
|
+
* Persist attention data to disk.
|
|
68
|
+
*
|
|
69
|
+
* @param sessionName - Agent session name
|
|
70
|
+
* @param data - Attention data to save
|
|
71
|
+
*/
|
|
72
|
+
private save;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=attention.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention.service.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/self-improvement/attention.service.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAOD;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAKnB;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAU/D;;;;;OAKG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtD;;;;;OAKG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAanE;;;;;OAKG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhE;;;;;OAKG;IACG,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgCjD;;;;;OAKG;YACW,IAAI;CAMlB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Number of days after which a focus item is considered stale.
|
|
5
|
+
*/
|
|
6
|
+
const PRUNE_THRESHOLD_DAYS = 14;
|
|
7
|
+
/**
|
|
8
|
+
* Service for managing agent attention — what to focus on and what to suppress.
|
|
9
|
+
*
|
|
10
|
+
* Focus items direct the agent's attention toward high-priority topics.
|
|
11
|
+
* Suppressed items filter out noise from irrelevant past context.
|
|
12
|
+
* Pruning removes stale focus items that haven't been updated in 2+ weeks.
|
|
13
|
+
*
|
|
14
|
+
* Storage: ~/.crewly/agents/{sessionName}/attention.json
|
|
15
|
+
*/
|
|
16
|
+
export class AttentionService {
|
|
17
|
+
/**
|
|
18
|
+
* Get the file path for an agent's attention data.
|
|
19
|
+
*
|
|
20
|
+
* @param sessionName - Agent session name
|
|
21
|
+
* @returns Absolute path to attention.json
|
|
22
|
+
*/
|
|
23
|
+
getFilePath(sessionName) {
|
|
24
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '/tmp';
|
|
25
|
+
return path.join(homeDir, '.crewly', 'agents', sessionName, 'attention.json');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read attention data from disk.
|
|
29
|
+
*
|
|
30
|
+
* @param sessionName - Agent session name
|
|
31
|
+
* @returns Attention data, or empty default if file doesn't exist
|
|
32
|
+
*/
|
|
33
|
+
async getAttention(sessionName) {
|
|
34
|
+
try {
|
|
35
|
+
const filePath = this.getFilePath(sessionName);
|
|
36
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
37
|
+
return JSON.parse(raw);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return { focus: [], suppressed: [], lastPruned: '', focusTimestamps: {} };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the current focus items for an agent.
|
|
45
|
+
*
|
|
46
|
+
* @param sessionName - Agent session name
|
|
47
|
+
* @returns Array of focus item strings
|
|
48
|
+
*/
|
|
49
|
+
async getFocus(sessionName) {
|
|
50
|
+
const data = await this.getAttention(sessionName);
|
|
51
|
+
return data.focus;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Set the focus items for an agent (replaces existing focus).
|
|
55
|
+
*
|
|
56
|
+
* @param sessionName - Agent session name
|
|
57
|
+
* @param items - New focus items
|
|
58
|
+
*/
|
|
59
|
+
async setFocus(sessionName, items) {
|
|
60
|
+
const data = await this.getAttention(sessionName);
|
|
61
|
+
const now = new Date().toISOString().split('T')[0];
|
|
62
|
+
data.focus = items;
|
|
63
|
+
data.focusTimestamps = {};
|
|
64
|
+
for (const item of items) {
|
|
65
|
+
data.focusTimestamps[item] = now;
|
|
66
|
+
}
|
|
67
|
+
await this.save(sessionName, data);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Add a single item to the suppressed list.
|
|
71
|
+
*
|
|
72
|
+
* @param sessionName - Agent session name
|
|
73
|
+
* @param item - Item to suppress
|
|
74
|
+
*/
|
|
75
|
+
async suppress(sessionName, item) {
|
|
76
|
+
const data = await this.getAttention(sessionName);
|
|
77
|
+
if (!data.suppressed.includes(item)) {
|
|
78
|
+
data.suppressed.push(item);
|
|
79
|
+
}
|
|
80
|
+
// Also remove from focus if present
|
|
81
|
+
data.focus = data.focus.filter((f) => f !== item);
|
|
82
|
+
if (data.focusTimestamps) {
|
|
83
|
+
delete data.focusTimestamps[item];
|
|
84
|
+
}
|
|
85
|
+
await this.save(sessionName, data);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Prune stale focus items that haven't been updated in PRUNE_THRESHOLD_DAYS.
|
|
89
|
+
*
|
|
90
|
+
* @param sessionName - Agent session name
|
|
91
|
+
* @returns Number of items pruned
|
|
92
|
+
*/
|
|
93
|
+
async prune(sessionName) {
|
|
94
|
+
const data = await this.getAttention(sessionName);
|
|
95
|
+
const now = new Date();
|
|
96
|
+
const timestamps = data.focusTimestamps || {};
|
|
97
|
+
let pruned = 0;
|
|
98
|
+
data.focus = data.focus.filter((item) => {
|
|
99
|
+
const ts = timestamps[item];
|
|
100
|
+
if (!ts) {
|
|
101
|
+
// No timestamp — prune it
|
|
102
|
+
pruned++;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const itemDate = new Date(ts);
|
|
106
|
+
const daysDiff = (now.getTime() - itemDate.getTime()) / (1000 * 60 * 60 * 24);
|
|
107
|
+
if (daysDiff > PRUNE_THRESHOLD_DAYS) {
|
|
108
|
+
pruned++;
|
|
109
|
+
delete timestamps[item];
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
});
|
|
114
|
+
data.focusTimestamps = timestamps;
|
|
115
|
+
data.lastPruned = now.toISOString().split('T')[0];
|
|
116
|
+
await this.save(sessionName, data);
|
|
117
|
+
return pruned;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Persist attention data to disk.
|
|
121
|
+
*
|
|
122
|
+
* @param sessionName - Agent session name
|
|
123
|
+
* @param data - Attention data to save
|
|
124
|
+
*/
|
|
125
|
+
async save(sessionName, data) {
|
|
126
|
+
const filePath = this.getFilePath(sessionName);
|
|
127
|
+
const dir = path.dirname(filePath);
|
|
128
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
129
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=attention.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attention.service.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/self-improvement/attention.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single growth area tracked for an agent.
|
|
3
|
+
*/
|
|
4
|
+
export interface GrowthArea {
|
|
5
|
+
/** Description of the growth area */
|
|
6
|
+
area: string;
|
|
7
|
+
/** Date the area was identified (ISO date string) */
|
|
8
|
+
identifiedAt: string;
|
|
9
|
+
/** Current progress status */
|
|
10
|
+
progress: 'identified' | 'improving' | 'proficient';
|
|
11
|
+
/** Evidence of progress or regression */
|
|
12
|
+
evidence: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Persisted growth areas data structure.
|
|
16
|
+
*/
|
|
17
|
+
export interface GrowthAreasData {
|
|
18
|
+
/** List of tracked growth areas */
|
|
19
|
+
areas: GrowthArea[];
|
|
20
|
+
/** Last time the areas were reviewed (ISO date string) */
|
|
21
|
+
lastReviewedAt: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Service for tracking agent growth areas over time.
|
|
25
|
+
*
|
|
26
|
+
* Each agent maintains a growth-areas.json file that records areas
|
|
27
|
+
* where the agent is actively improving. Growth areas can be manually
|
|
28
|
+
* added or auto-extracted from learnings and failures.
|
|
29
|
+
*
|
|
30
|
+
* Storage: ~/.crewly/agents/{sessionName}/growth-areas.json
|
|
31
|
+
*/
|
|
32
|
+
export declare class GrowthAreasService {
|
|
33
|
+
/**
|
|
34
|
+
* Get the file path for an agent's growth areas.
|
|
35
|
+
*
|
|
36
|
+
* @param sessionName - Agent session name
|
|
37
|
+
* @returns Absolute path to growth-areas.json
|
|
38
|
+
*/
|
|
39
|
+
private getFilePath;
|
|
40
|
+
/**
|
|
41
|
+
* Read growth areas data from disk.
|
|
42
|
+
*
|
|
43
|
+
* @param sessionName - Agent session name
|
|
44
|
+
* @returns Growth areas data, or empty default if file doesn't exist
|
|
45
|
+
*/
|
|
46
|
+
getGrowthAreas(sessionName: string): Promise<GrowthAreasData>;
|
|
47
|
+
/**
|
|
48
|
+
* Add a new growth area for an agent.
|
|
49
|
+
*
|
|
50
|
+
* @param sessionName - Agent session name
|
|
51
|
+
* @param area - Description of the growth area
|
|
52
|
+
* @returns The created growth area
|
|
53
|
+
*/
|
|
54
|
+
addGrowthArea(sessionName: string, area: string): Promise<GrowthArea>;
|
|
55
|
+
/**
|
|
56
|
+
* Update the progress of an existing growth area.
|
|
57
|
+
*
|
|
58
|
+
* @param sessionName - Agent session name
|
|
59
|
+
* @param area - Growth area description to update
|
|
60
|
+
* @param progress - New progress status
|
|
61
|
+
* @param evidence - Evidence supporting the progress update
|
|
62
|
+
* @returns Updated growth area or null if not found
|
|
63
|
+
*/
|
|
64
|
+
updateProgress(sessionName: string, area: string, progress: 'identified' | 'improving' | 'proficient', evidence: string): Promise<GrowthArea | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Auto-extract potential growth areas from a learning or failure text.
|
|
67
|
+
*
|
|
68
|
+
* @param sessionName - Agent session name
|
|
69
|
+
* @param text - Learning or failure text to analyze
|
|
70
|
+
* @returns Array of newly added growth areas (empty if no new areas found)
|
|
71
|
+
*/
|
|
72
|
+
extractFromText(sessionName: string, text: string): Promise<GrowthArea[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Persist growth areas data to disk.
|
|
75
|
+
*
|
|
76
|
+
* @param sessionName - Agent session name
|
|
77
|
+
* @param data - Growth areas data to save
|
|
78
|
+
*/
|
|
79
|
+
private save;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=growth-areas.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"growth-areas.service.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/self-improvement/growth-areas.service.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;IACpD,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,mCAAmC;IACnC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,CAAC;CACvB;AAkBD;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC9B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAKnB;;;;;OAKG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAUnE;;;;;;OAMG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyB3E;;;;;;;;OAQG;IACG,cAAc,CACnB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,EACnD,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkB7B;;;;;;OAMG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoB/E;;;;;OAKG;YACW,IAAI;CAMlB"}
|