@sdsrs/codeagent 0.1.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/LICENSE +21 -0
- package/README.md +116 -0
- package/dist/adapters/code-graph.d.ts +18 -0
- package/dist/adapters/code-graph.d.ts.map +1 -0
- package/dist/adapters/code-graph.js +151 -0
- package/dist/adapters/code-graph.js.map +1 -0
- package/dist/adapters/memory.d.ts +13 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +110 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/orchestration/gsd.d.ts +20 -0
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -0
- package/dist/adapters/orchestration/gsd.js +78 -0
- package/dist/adapters/orchestration/gsd.js.map +1 -0
- package/dist/adapters/orchestration/interface.d.ts +32 -0
- package/dist/adapters/orchestration/interface.d.ts.map +1 -0
- package/dist/adapters/orchestration/interface.js +2 -0
- package/dist/adapters/orchestration/interface.js.map +1 -0
- package/dist/adapters/orchestration/superpowers.d.ts +33 -0
- package/dist/adapters/orchestration/superpowers.d.ts.map +1 -0
- package/dist/adapters/orchestration/superpowers.js +117 -0
- package/dist/adapters/orchestration/superpowers.js.map +1 -0
- package/dist/broker/broker.d.ts +40 -0
- package/dist/broker/broker.d.ts.map +1 -0
- package/dist/broker/broker.js +181 -0
- package/dist/broker/broker.js.map +1 -0
- package/dist/broker/compressor.d.ts +7 -0
- package/dist/broker/compressor.d.ts.map +1 -0
- package/dist/broker/compressor.js +61 -0
- package/dist/broker/compressor.js.map +1 -0
- package/dist/broker/context-pack.d.ts +126 -0
- package/dist/broker/context-pack.d.ts.map +1 -0
- package/dist/broker/context-pack.js +103 -0
- package/dist/broker/context-pack.js.map +1 -0
- package/dist/broker/query-parser.d.ts +17 -0
- package/dist/broker/query-parser.d.ts.map +1 -0
- package/dist/broker/query-parser.js +127 -0
- package/dist/broker/query-parser.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +13 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +264 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +94 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +10 -0
- package/dist/cli/commands/memory.d.ts.map +1 -0
- package/dist/cli/commands/memory.js +52 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/search.d.ts +9 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +45 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/session.d.ts +9 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +86 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +77 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui/renderer.d.ts +47 -0
- package/dist/cli/tui/renderer.d.ts.map +1 -0
- package/dist/cli/tui/renderer.js +237 -0
- package/dist/cli/tui/renderer.js.map +1 -0
- package/dist/hooks/session-start.d.ts +11 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +51 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/stop.d.ts +11 -0
- package/dist/hooks/stop.d.ts.map +1 -0
- package/dist/hooks/stop.js +93 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/hooks/user-prompt.d.ts +12 -0
- package/dist/hooks/user-prompt.d.ts.map +1 -0
- package/dist/hooks/user-prompt.js +46 -0
- package/dist/hooks/user-prompt.js.map +1 -0
- package/dist/providers/anthropic-api.d.ts +25 -0
- package/dist/providers/anthropic-api.d.ts.map +1 -0
- package/dist/providers/anthropic-api.js +93 -0
- package/dist/providers/anthropic-api.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +16 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +72 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/claude-sdk.d.ts +18 -0
- package/dist/providers/claude-sdk.d.ts.map +1 -0
- package/dist/providers/claude-sdk.js +141 -0
- package/dist/providers/claude-sdk.js.map +1 -0
- package/dist/providers/interface.d.ts +36 -0
- package/dist/providers/interface.d.ts.map +1 -0
- package/dist/providers/interface.js +2 -0
- package/dist/providers/interface.js.map +1 -0
- package/dist/scripts/install-hooks.d.ts +11 -0
- package/dist/scripts/install-hooks.d.ts.map +1 -0
- package/dist/scripts/install-hooks.js +86 -0
- package/dist/scripts/install-hooks.js.map +1 -0
- package/dist/session/manager.d.ts +65 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +143 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/schema.d.ts +7 -0
- package/dist/session/schema.d.ts.map +1 -0
- package/dist/session/schema.js +82 -0
- package/dist/session/schema.js.map +1 -0
- package/dist/utils/exec.d.ts +20 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +28 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/tokens.d.ts +12 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +38 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +90 -0
- package/src/skills/brainstorm.md +33 -0
- package/src/skills/review.md +41 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
// Map Superpowers skill names to our Stage type
|
|
5
|
+
const SKILL_TO_STAGE = {
|
|
6
|
+
'brainstorming': 'brainstorm',
|
|
7
|
+
'writing-plans': 'plan',
|
|
8
|
+
'executing-plans': 'plan',
|
|
9
|
+
'test-driven-development': 'implement',
|
|
10
|
+
'subagent-driven-development': 'implement',
|
|
11
|
+
'systematic-debugging': 'debug',
|
|
12
|
+
'requesting-code-review': 'review',
|
|
13
|
+
'receiving-code-review': 'review',
|
|
14
|
+
'verification-before-completion': 'review',
|
|
15
|
+
'finishing-a-development-branch': 'review',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Superpowers orchestration adapter.
|
|
19
|
+
*
|
|
20
|
+
* Key insight: Superpowers is stateless — it doesn't track "current skill".
|
|
21
|
+
* All skills are always available, selection happens at request time.
|
|
22
|
+
*
|
|
23
|
+
* This adapter:
|
|
24
|
+
* - Discovers available skills from the plugin directory
|
|
25
|
+
* - Maps skill names to Stage types
|
|
26
|
+
* - Maintains a lightweight local stage state (in-memory)
|
|
27
|
+
* since Superpowers itself doesn't persist this
|
|
28
|
+
*/
|
|
29
|
+
export class SuperpowersAdapter {
|
|
30
|
+
currentStageValue = null;
|
|
31
|
+
availableSkills = [];
|
|
32
|
+
constructor(_repoRoot) {
|
|
33
|
+
this.availableSkills = this.discoverSkills();
|
|
34
|
+
}
|
|
35
|
+
getPluginDir() {
|
|
36
|
+
// Search common plugin cache locations
|
|
37
|
+
const candidates = [
|
|
38
|
+
path.join(os.homedir(), '.claude', 'plugins', 'cache', 'claude-plugins-official', 'superpowers'),
|
|
39
|
+
path.join(os.homedir(), '.claude', 'plugins', 'superpowers'),
|
|
40
|
+
];
|
|
41
|
+
for (const dir of candidates) {
|
|
42
|
+
if (fs.existsSync(dir)) {
|
|
43
|
+
// Find the latest version directory
|
|
44
|
+
try {
|
|
45
|
+
const versions = fs.readdirSync(dir).filter((d) => {
|
|
46
|
+
return fs.statSync(path.join(dir, d)).isDirectory() && /^\d/.test(d);
|
|
47
|
+
});
|
|
48
|
+
if (versions.length > 0) {
|
|
49
|
+
versions.sort(); // Semver sort (lexical works for typical versions)
|
|
50
|
+
return path.join(dir, versions[versions.length - 1]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch { /* ignore */ }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
discoverSkills() {
|
|
59
|
+
const pluginDir = this.getPluginDir();
|
|
60
|
+
if (!pluginDir)
|
|
61
|
+
return [];
|
|
62
|
+
const skillsDir = path.join(pluginDir, 'skills');
|
|
63
|
+
if (!fs.existsSync(skillsDir))
|
|
64
|
+
return [];
|
|
65
|
+
try {
|
|
66
|
+
return fs.readdirSync(skillsDir).filter((d) => {
|
|
67
|
+
const skillPath = path.join(skillsDir, d, 'SKILL.md');
|
|
68
|
+
return fs.existsSync(skillPath);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async getCurrentStage() {
|
|
76
|
+
// Superpowers doesn't track stage persistently.
|
|
77
|
+
// We use our in-memory stage tracking.
|
|
78
|
+
return this.currentStageValue;
|
|
79
|
+
}
|
|
80
|
+
async getActiveSpec() {
|
|
81
|
+
// Superpowers doesn't have a spec concept
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
async getActiveTasks() {
|
|
85
|
+
// Superpowers doesn't track tasks
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
async advanceStage(evidence) {
|
|
89
|
+
// Infer stage from the evidence/skill being invoked
|
|
90
|
+
const skillName = evidence.data || '';
|
|
91
|
+
const newStage = SKILL_TO_STAGE[skillName];
|
|
92
|
+
if (newStage && newStage !== this.currentStageValue) {
|
|
93
|
+
const from = this.currentStageValue || 'general';
|
|
94
|
+
this.currentStageValue = newStage;
|
|
95
|
+
return { from, to: newStage, reason: `Skill activated: ${skillName}` };
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
async recordEvidence(_evidence) {
|
|
100
|
+
// No persistent state in Superpowers
|
|
101
|
+
}
|
|
102
|
+
getEngineName() {
|
|
103
|
+
return 'superpowers';
|
|
104
|
+
}
|
|
105
|
+
getAvailableStages() {
|
|
106
|
+
return ['brainstorm', 'plan', 'implement', 'review', 'debug'];
|
|
107
|
+
}
|
|
108
|
+
/** Get list of discovered skills */
|
|
109
|
+
getSkills() {
|
|
110
|
+
return this.availableSkills;
|
|
111
|
+
}
|
|
112
|
+
/** Manually set the current stage */
|
|
113
|
+
setStage(stage) {
|
|
114
|
+
this.currentStageValue = stage;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=superpowers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../../../src/adapters/orchestration/superpowers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { BrokerInput, ContextPack, TokenBudget } from './context-pack.js';
|
|
2
|
+
export interface BrokerOptions {
|
|
3
|
+
budget?: Partial<TokenBudget>;
|
|
4
|
+
orchestrationEngine?: 'gsd' | 'superpowers';
|
|
5
|
+
totalTimeout?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Context Broker — the core of CodeAgent.
|
|
9
|
+
*
|
|
10
|
+
* 5-step pipeline:
|
|
11
|
+
* 1. QueryParse — extract intent, entities, implied stage
|
|
12
|
+
* 2. CodeSearch — query Code Graph MCP via CLI
|
|
13
|
+
* 3. MemoryRecall — query claude-mem-lite via CLI
|
|
14
|
+
* 4. OrchState — read orchestration state
|
|
15
|
+
* 5. Compress — fit into token budget
|
|
16
|
+
*/
|
|
17
|
+
export declare class ContextBroker {
|
|
18
|
+
private repoRoot;
|
|
19
|
+
private orchAdapter;
|
|
20
|
+
private budget;
|
|
21
|
+
constructor(repoRoot: string, options?: BrokerOptions);
|
|
22
|
+
/**
|
|
23
|
+
* Build a ContextPack from user query.
|
|
24
|
+
* This is the main entry point — called by hooks and CLI.
|
|
25
|
+
*/
|
|
26
|
+
buildContextPack(input: BrokerInput): Promise<ContextPack>;
|
|
27
|
+
/**
|
|
28
|
+
* Build a session-start context (repo overview + active state).
|
|
29
|
+
* Called once at session start — can be slower (5s).
|
|
30
|
+
*/
|
|
31
|
+
buildSessionContext(): Promise<ContextPack>;
|
|
32
|
+
private queryCode;
|
|
33
|
+
private queryMem;
|
|
34
|
+
private queryOrch;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Format a ContextPack as plain text for injection into Claude Code prompt.
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatContextPack(pack: ContextPack): string;
|
|
40
|
+
//# sourceMappingURL=broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../src/broker/broker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAU3B,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,mBAAmB,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,MAAM,CAAc;gBAEhB,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAYzD;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA8ChE;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;YAwBnC,SAAS;YAKT,QAAQ;YAIR,SAAS;CAQxB;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA+D3D"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { DEFAULT_BUDGET, emptyContextPack, hasContent } from './context-pack.js';
|
|
2
|
+
import { parseQuery } from './query-parser.js';
|
|
3
|
+
import { queryCodeGraph, getRepoMap } from '../adapters/code-graph.js';
|
|
4
|
+
import { queryMemory } from '../adapters/memory.js';
|
|
5
|
+
import { GsdAdapter } from '../adapters/orchestration/gsd.js';
|
|
6
|
+
import { SuperpowersAdapter } from '../adapters/orchestration/superpowers.js';
|
|
7
|
+
import { compressContextPack } from './compressor.js';
|
|
8
|
+
/**
|
|
9
|
+
* Context Broker — the core of CodeAgent.
|
|
10
|
+
*
|
|
11
|
+
* 5-step pipeline:
|
|
12
|
+
* 1. QueryParse — extract intent, entities, implied stage
|
|
13
|
+
* 2. CodeSearch — query Code Graph MCP via CLI
|
|
14
|
+
* 3. MemoryRecall — query claude-mem-lite via CLI
|
|
15
|
+
* 4. OrchState — read orchestration state
|
|
16
|
+
* 5. Compress — fit into token budget
|
|
17
|
+
*/
|
|
18
|
+
export class ContextBroker {
|
|
19
|
+
repoRoot;
|
|
20
|
+
orchAdapter;
|
|
21
|
+
budget;
|
|
22
|
+
constructor(repoRoot, options = {}) {
|
|
23
|
+
this.repoRoot = repoRoot;
|
|
24
|
+
this.budget = { ...DEFAULT_BUDGET, ...options.budget };
|
|
25
|
+
// Select orchestration adapter
|
|
26
|
+
if (options.orchestrationEngine === 'superpowers') {
|
|
27
|
+
this.orchAdapter = new SuperpowersAdapter(repoRoot);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
this.orchAdapter = new GsdAdapter(repoRoot);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Build a ContextPack from user query.
|
|
35
|
+
* This is the main entry point — called by hooks and CLI.
|
|
36
|
+
*/
|
|
37
|
+
async buildContextPack(input) {
|
|
38
|
+
const pack = emptyContextPack();
|
|
39
|
+
// Step 1: Parse query
|
|
40
|
+
const parsed = parseQuery(input.userQuery);
|
|
41
|
+
if (parsed.isActionOnly)
|
|
42
|
+
return pack;
|
|
43
|
+
// Determine stage (explicit > inferred > orchestration)
|
|
44
|
+
const orchStage = await this.orchAdapter.getCurrentStage().catch(() => null);
|
|
45
|
+
const stage = input.stage || parsed.impliedStage || orchStage || undefined;
|
|
46
|
+
if (stage)
|
|
47
|
+
pack.currentStage = stage;
|
|
48
|
+
// Step 2-4: Parallel queries with timeout
|
|
49
|
+
const [codeResult, memResult, orchResult] = await Promise.allSettled([
|
|
50
|
+
this.queryCode(parsed),
|
|
51
|
+
this.queryMem(parsed, stage),
|
|
52
|
+
this.queryOrch(),
|
|
53
|
+
]);
|
|
54
|
+
// Merge Code Graph results
|
|
55
|
+
if (codeResult.status === 'fulfilled') {
|
|
56
|
+
const code = codeResult.value;
|
|
57
|
+
pack.relevantFiles = code.relevantFiles;
|
|
58
|
+
pack.relatedSymbols = code.relatedSymbols;
|
|
59
|
+
pack.repoSummary = code.repoSummary;
|
|
60
|
+
}
|
|
61
|
+
// Merge Memory results
|
|
62
|
+
if (memResult.status === 'fulfilled') {
|
|
63
|
+
const mem = memResult.value;
|
|
64
|
+
pack.priorMemories = mem.memories;
|
|
65
|
+
pack.bugWarnings = mem.bugWarnings;
|
|
66
|
+
}
|
|
67
|
+
// Merge Orchestration results
|
|
68
|
+
if (orchResult.status === 'fulfilled') {
|
|
69
|
+
const orch = orchResult.value;
|
|
70
|
+
if (orch.spec)
|
|
71
|
+
pack.activeSpec = orch.spec;
|
|
72
|
+
pack.pendingTasks = orch.tasks;
|
|
73
|
+
}
|
|
74
|
+
// Step 5: Compress to budget
|
|
75
|
+
return compressContextPack(pack, this.budget);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Build a session-start context (repo overview + active state).
|
|
79
|
+
* Called once at session start — can be slower (5s).
|
|
80
|
+
*/
|
|
81
|
+
async buildSessionContext() {
|
|
82
|
+
const pack = emptyContextPack();
|
|
83
|
+
const [mapResult, orchResult] = await Promise.allSettled([
|
|
84
|
+
Promise.resolve(getRepoMap(this.repoRoot, 3000)),
|
|
85
|
+
this.queryOrch(),
|
|
86
|
+
]);
|
|
87
|
+
if (mapResult.status === 'fulfilled') {
|
|
88
|
+
pack.repoSummary = mapResult.value;
|
|
89
|
+
}
|
|
90
|
+
if (orchResult.status === 'fulfilled') {
|
|
91
|
+
const orch = orchResult.value;
|
|
92
|
+
if (orch.stage)
|
|
93
|
+
pack.currentStage = orch.stage;
|
|
94
|
+
if (orch.spec)
|
|
95
|
+
pack.activeSpec = orch.spec;
|
|
96
|
+
pack.pendingTasks = orch.tasks;
|
|
97
|
+
}
|
|
98
|
+
return compressContextPack(pack, this.budget);
|
|
99
|
+
}
|
|
100
|
+
// --- Private query methods ---
|
|
101
|
+
async queryCode(parsed) {
|
|
102
|
+
const code = await queryCodeGraph(parsed, this.budget.code, this.repoRoot);
|
|
103
|
+
return code;
|
|
104
|
+
}
|
|
105
|
+
async queryMem(parsed, stage) {
|
|
106
|
+
return queryMemory(parsed, this.budget.memory, stage);
|
|
107
|
+
}
|
|
108
|
+
async queryOrch() {
|
|
109
|
+
const [stage, spec, tasks] = await Promise.all([
|
|
110
|
+
this.orchAdapter.getCurrentStage().catch(() => null),
|
|
111
|
+
this.orchAdapter.getActiveSpec().catch(() => null),
|
|
112
|
+
this.orchAdapter.getActiveTasks().catch(() => []),
|
|
113
|
+
]);
|
|
114
|
+
return { stage, spec, tasks };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// --- Formatting ---
|
|
118
|
+
/**
|
|
119
|
+
* Format a ContextPack as plain text for injection into Claude Code prompt.
|
|
120
|
+
*/
|
|
121
|
+
export function formatContextPack(pack) {
|
|
122
|
+
if (!hasContent(pack))
|
|
123
|
+
return '';
|
|
124
|
+
const sections = [];
|
|
125
|
+
// Code context
|
|
126
|
+
if (pack.relevantFiles.length > 0 || pack.relatedSymbols.length > 0) {
|
|
127
|
+
const lines = ['## Code Context'];
|
|
128
|
+
for (const f of pack.relevantFiles) {
|
|
129
|
+
const symbols = f.symbols?.length ? ` (${f.symbols.join(', ')})` : '';
|
|
130
|
+
lines.push(`- ${f.path}: ${f.reason}${symbols}`);
|
|
131
|
+
}
|
|
132
|
+
for (const s of pack.relatedSymbols) {
|
|
133
|
+
const callers = s.callers?.length ? ` ← called by: ${s.callers.join(', ')}` : '';
|
|
134
|
+
lines.push(`- [${s.kind}] ${s.name} (${s.file})${callers}`);
|
|
135
|
+
}
|
|
136
|
+
sections.push(lines.join('\n'));
|
|
137
|
+
}
|
|
138
|
+
// Bug warnings (high priority — shown first)
|
|
139
|
+
if (pack.bugWarnings.length > 0) {
|
|
140
|
+
const lines = ['## ⚠ Bug Warnings'];
|
|
141
|
+
for (const b of pack.bugWarnings) {
|
|
142
|
+
lines.push(`- [bug] ${b.title}`);
|
|
143
|
+
if (b.body)
|
|
144
|
+
lines.push(` ${b.body.split('\n')[0]}`);
|
|
145
|
+
}
|
|
146
|
+
sections.push(lines.join('\n'));
|
|
147
|
+
}
|
|
148
|
+
// Prior memories
|
|
149
|
+
if (pack.priorMemories.length > 0) {
|
|
150
|
+
const lines = ['## Related Memories'];
|
|
151
|
+
for (const m of pack.priorMemories) {
|
|
152
|
+
lines.push(`- [${m.type}] ${m.title}`);
|
|
153
|
+
if (m.body)
|
|
154
|
+
lines.push(` ${m.body.split('\n')[0]}`);
|
|
155
|
+
}
|
|
156
|
+
sections.push(lines.join('\n'));
|
|
157
|
+
}
|
|
158
|
+
// Orchestration state
|
|
159
|
+
const orchLines = [];
|
|
160
|
+
if (pack.currentStage)
|
|
161
|
+
orchLines.push(`- Stage: ${pack.currentStage}`);
|
|
162
|
+
if (pack.activeSpec)
|
|
163
|
+
orchLines.push(`- Active Spec: ${pack.activeSpec.title}`);
|
|
164
|
+
if (pack.pendingTasks.length > 0) {
|
|
165
|
+
orchLines.push(`- Pending Tasks: ${pack.pendingTasks.length}`);
|
|
166
|
+
for (const t of pack.pendingTasks.slice(0, 5)) {
|
|
167
|
+
orchLines.push(` - [${t.status}] ${t.title}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (orchLines.length > 0) {
|
|
171
|
+
sections.push(['## Current State', ...orchLines].join('\n'));
|
|
172
|
+
}
|
|
173
|
+
// Risks
|
|
174
|
+
if (pack.risks.length > 0) {
|
|
175
|
+
sections.push(['## Risks', ...pack.risks.map((r) => `- ${r}`)].join('\n'));
|
|
176
|
+
}
|
|
177
|
+
if (sections.length === 0)
|
|
178
|
+
return '';
|
|
179
|
+
return `<codeagent-context>\n${sections.join('\n\n')}\n</codeagent-context>`;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../../src/broker/broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ContextPack, TokenBudget } from './context-pack.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compress a ContextPack to fit within the total token budget.
|
|
4
|
+
* Priority: bugWarnings > exact symbol hits > semantic search > memories > repoSummary
|
|
5
|
+
*/
|
|
6
|
+
export declare function compressContextPack(pack: ContextPack, budget: TokenBudget): ContextPack;
|
|
7
|
+
//# sourceMappingURL=compressor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../src/broker/compressor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGlE;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,GAClB,WAAW,CAsEb"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { estimateTokens, truncateToTokenBudget } from '../utils/tokens.js';
|
|
2
|
+
/**
|
|
3
|
+
* Compress a ContextPack to fit within the total token budget.
|
|
4
|
+
* Priority: bugWarnings > exact symbol hits > semantic search > memories > repoSummary
|
|
5
|
+
*/
|
|
6
|
+
export function compressContextPack(pack, budget) {
|
|
7
|
+
const compressed = { ...pack };
|
|
8
|
+
// 1. Bug warnings — highest priority, always include (from memory budget)
|
|
9
|
+
const bugTokens = compressed.bugWarnings.reduce((sum, b) => sum + estimateTokens(b.title + b.body), 0);
|
|
10
|
+
// 2. Code context — truncate to code budget
|
|
11
|
+
const codeBudget = budget.code;
|
|
12
|
+
let codeUsed = 0;
|
|
13
|
+
compressed.relevantFiles = compressed.relevantFiles.filter((f) => {
|
|
14
|
+
const tokens = estimateTokens(f.path + (f.reason || '') + (f.snippet || ''));
|
|
15
|
+
if (codeUsed + tokens <= codeBudget) {
|
|
16
|
+
codeUsed += tokens;
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
});
|
|
21
|
+
compressed.relatedSymbols = compressed.relatedSymbols.filter((s) => {
|
|
22
|
+
const tokens = estimateTokens(s.name + s.kind + s.file + (s.callers?.join(',') || ''));
|
|
23
|
+
if (codeUsed + tokens <= codeBudget) {
|
|
24
|
+
codeUsed += tokens;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
});
|
|
29
|
+
// 3. Memories — truncate to memory budget (minus bug tokens already counted)
|
|
30
|
+
const memBudget = Math.max(0, budget.memory - bugTokens);
|
|
31
|
+
let memUsed = 0;
|
|
32
|
+
compressed.priorMemories = compressed.priorMemories.filter((m) => {
|
|
33
|
+
const tokens = estimateTokens(m.title + m.body);
|
|
34
|
+
if (memUsed + tokens <= memBudget) {
|
|
35
|
+
memUsed += tokens;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
});
|
|
40
|
+
// 4. Orchestration — truncate to orch budget
|
|
41
|
+
const orchBudget = budget.orch;
|
|
42
|
+
let orchUsed = 0;
|
|
43
|
+
if (compressed.activeSpec) {
|
|
44
|
+
orchUsed += estimateTokens((compressed.activeSpec.title || '') + (compressed.activeSpec.summary || ''));
|
|
45
|
+
}
|
|
46
|
+
compressed.pendingTasks = compressed.pendingTasks.filter((t) => {
|
|
47
|
+
const tokens = estimateTokens(t.title + t.status);
|
|
48
|
+
if (orchUsed + tokens <= orchBudget) {
|
|
49
|
+
orchUsed += tokens;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
});
|
|
54
|
+
// 5. Meta — repoSummary, suggestedApproach, risks
|
|
55
|
+
const metaBudget = budget.meta;
|
|
56
|
+
if (compressed.repoSummary) {
|
|
57
|
+
compressed.repoSummary = truncateToTokenBudget(compressed.repoSummary, metaBudget);
|
|
58
|
+
}
|
|
59
|
+
return compressed;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=compressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../src/broker/compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const StageValues: readonly ["brainstorm", "plan", "implement", "review", "debug", "general"];
|
|
3
|
+
export type Stage = (typeof StageValues)[number];
|
|
4
|
+
export declare const StageSchema: z.ZodEnum<{
|
|
5
|
+
brainstorm: "brainstorm";
|
|
6
|
+
plan: "plan";
|
|
7
|
+
implement: "implement";
|
|
8
|
+
review: "review";
|
|
9
|
+
debug: "debug";
|
|
10
|
+
general: "general";
|
|
11
|
+
}>;
|
|
12
|
+
export declare const RelevantFileSchema: z.ZodObject<{
|
|
13
|
+
path: z.ZodString;
|
|
14
|
+
reason: z.ZodString;
|
|
15
|
+
symbols: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
16
|
+
snippet: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export type RelevantFile = z.infer<typeof RelevantFileSchema>;
|
|
19
|
+
export declare const SymbolInfoSchema: z.ZodObject<{
|
|
20
|
+
name: z.ZodString;
|
|
21
|
+
kind: z.ZodString;
|
|
22
|
+
file: z.ZodString;
|
|
23
|
+
callers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
24
|
+
callees: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export type SymbolInfo = z.infer<typeof SymbolInfoSchema>;
|
|
27
|
+
export declare const MemoryEntrySchema: z.ZodObject<{
|
|
28
|
+
id: z.ZodOptional<z.ZodNumber>;
|
|
29
|
+
type: z.ZodString;
|
|
30
|
+
title: z.ZodString;
|
|
31
|
+
body: z.ZodString;
|
|
32
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
export type MemoryEntry = z.infer<typeof MemoryEntrySchema>;
|
|
35
|
+
export declare const TaskSummarySchema: z.ZodObject<{
|
|
36
|
+
id: z.ZodString;
|
|
37
|
+
title: z.ZodString;
|
|
38
|
+
status: z.ZodString;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export type TaskSummary = z.infer<typeof TaskSummarySchema>;
|
|
41
|
+
export declare const SpecSummarySchema: z.ZodObject<{
|
|
42
|
+
id: z.ZodOptional<z.ZodString>;
|
|
43
|
+
title: z.ZodString;
|
|
44
|
+
stage: z.ZodOptional<z.ZodString>;
|
|
45
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
export type SpecSummary = z.infer<typeof SpecSummarySchema>;
|
|
48
|
+
export declare const ContextPackSchema: z.ZodObject<{
|
|
49
|
+
repoSummary: z.ZodOptional<z.ZodString>;
|
|
50
|
+
relevantFiles: z.ZodArray<z.ZodObject<{
|
|
51
|
+
path: z.ZodString;
|
|
52
|
+
reason: z.ZodString;
|
|
53
|
+
symbols: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
54
|
+
snippet: z.ZodOptional<z.ZodString>;
|
|
55
|
+
}, z.core.$strip>>;
|
|
56
|
+
relatedSymbols: z.ZodArray<z.ZodObject<{
|
|
57
|
+
name: z.ZodString;
|
|
58
|
+
kind: z.ZodString;
|
|
59
|
+
file: z.ZodString;
|
|
60
|
+
callers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
61
|
+
callees: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
62
|
+
}, z.core.$strip>>;
|
|
63
|
+
priorMemories: z.ZodArray<z.ZodObject<{
|
|
64
|
+
id: z.ZodOptional<z.ZodNumber>;
|
|
65
|
+
type: z.ZodString;
|
|
66
|
+
title: z.ZodString;
|
|
67
|
+
body: z.ZodString;
|
|
68
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
69
|
+
}, z.core.$strip>>;
|
|
70
|
+
bugWarnings: z.ZodArray<z.ZodObject<{
|
|
71
|
+
id: z.ZodOptional<z.ZodNumber>;
|
|
72
|
+
type: z.ZodString;
|
|
73
|
+
title: z.ZodString;
|
|
74
|
+
body: z.ZodString;
|
|
75
|
+
confidence: z.ZodOptional<z.ZodNumber>;
|
|
76
|
+
}, z.core.$strip>>;
|
|
77
|
+
currentStage: z.ZodOptional<z.ZodEnum<{
|
|
78
|
+
brainstorm: "brainstorm";
|
|
79
|
+
plan: "plan";
|
|
80
|
+
implement: "implement";
|
|
81
|
+
review: "review";
|
|
82
|
+
debug: "debug";
|
|
83
|
+
general: "general";
|
|
84
|
+
}>>;
|
|
85
|
+
activeSpec: z.ZodOptional<z.ZodObject<{
|
|
86
|
+
id: z.ZodOptional<z.ZodString>;
|
|
87
|
+
title: z.ZodString;
|
|
88
|
+
stage: z.ZodOptional<z.ZodString>;
|
|
89
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
90
|
+
}, z.core.$strip>>;
|
|
91
|
+
pendingTasks: z.ZodArray<z.ZodObject<{
|
|
92
|
+
id: z.ZodString;
|
|
93
|
+
title: z.ZodString;
|
|
94
|
+
status: z.ZodString;
|
|
95
|
+
}, z.core.$strip>>;
|
|
96
|
+
suggestedApproach: z.ZodOptional<z.ZodString>;
|
|
97
|
+
risks: z.ZodArray<z.ZodString>;
|
|
98
|
+
}, z.core.$strip>;
|
|
99
|
+
export type ContextPack = z.infer<typeof ContextPackSchema>;
|
|
100
|
+
export declare const BrokerInputSchema: z.ZodObject<{
|
|
101
|
+
repoRoot: z.ZodString;
|
|
102
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
103
|
+
userQuery: z.ZodString;
|
|
104
|
+
stage: z.ZodOptional<z.ZodEnum<{
|
|
105
|
+
brainstorm: "brainstorm";
|
|
106
|
+
plan: "plan";
|
|
107
|
+
implement: "implement";
|
|
108
|
+
review: "review";
|
|
109
|
+
debug: "debug";
|
|
110
|
+
general: "general";
|
|
111
|
+
}>>;
|
|
112
|
+
changedFiles: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
113
|
+
currentBranch: z.ZodOptional<z.ZodString>;
|
|
114
|
+
}, z.core.$strip>;
|
|
115
|
+
export type BrokerInput = z.infer<typeof BrokerInputSchema>;
|
|
116
|
+
export declare const TokenBudgetSchema: z.ZodObject<{
|
|
117
|
+
code: z.ZodDefault<z.ZodNumber>;
|
|
118
|
+
memory: z.ZodDefault<z.ZodNumber>;
|
|
119
|
+
orch: z.ZodDefault<z.ZodNumber>;
|
|
120
|
+
meta: z.ZodDefault<z.ZodNumber>;
|
|
121
|
+
}, z.core.$strip>;
|
|
122
|
+
export type TokenBudget = z.infer<typeof TokenBudgetSchema>;
|
|
123
|
+
export declare const DEFAULT_BUDGET: TokenBudget;
|
|
124
|
+
export declare function emptyContextPack(): ContextPack;
|
|
125
|
+
export declare function hasContent(pack: ContextPack): boolean;
|
|
126
|
+
//# sourceMappingURL=context-pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-pack.d.ts","sourceRoot":"","sources":["../../src/broker/context-pack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW,4EAOd,CAAC;AAEX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,eAAO,MAAM,WAAW;;;;;;;EAAsB,CAAC;AAI/C,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB;;;;;;iBAM3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,iBAAiB;;;;;;iBAM5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;;iBAK5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkB5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;iBAO5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI5D,eAAO,MAAM,iBAAiB;;;;;iBAK5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,cAAc,EAAE,WAK5B,CAAC;AAIF,wBAAgB,gBAAgB,IAAI,WAAW,CAS9C;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAUrD"}
|