@sdsrs/codeagent 0.2.1 → 0.3.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 +0 -0
- package/README.md +18 -6
- package/dist/adapters/__tests__/code-graph.test.d.ts +2 -0
- package/dist/adapters/__tests__/code-graph.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/code-graph.test.js +83 -0
- package/dist/adapters/__tests__/code-graph.test.js.map +1 -0
- package/dist/adapters/__tests__/memory.test.d.ts +2 -0
- package/dist/adapters/__tests__/memory.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/memory.test.js +150 -0
- package/dist/adapters/__tests__/memory.test.js.map +1 -0
- package/dist/adapters/code-graph.d.ts +3 -1
- package/dist/adapters/code-graph.d.ts.map +1 -1
- package/dist/adapters/code-graph.js +23 -20
- package/dist/adapters/code-graph.js.map +1 -1
- package/dist/adapters/memory.d.ts +1 -1
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +12 -8
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/orchestration/gsd.d.ts +0 -0
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -1
- package/dist/adapters/orchestration/gsd.js +18 -1
- package/dist/adapters/orchestration/gsd.js.map +1 -1
- package/dist/adapters/orchestration/interface.d.ts +0 -0
- package/dist/adapters/orchestration/interface.d.ts.map +0 -0
- package/dist/adapters/orchestration/interface.js +0 -0
- package/dist/adapters/orchestration/interface.js.map +0 -0
- package/dist/adapters/orchestration/superpowers.d.ts +0 -0
- package/dist/adapters/orchestration/superpowers.d.ts.map +0 -0
- package/dist/adapters/orchestration/superpowers.js +0 -0
- package/dist/adapters/orchestration/superpowers.js.map +0 -0
- package/dist/broker/__tests__/broker.test.d.ts +2 -0
- package/dist/broker/__tests__/broker.test.d.ts.map +1 -0
- package/dist/broker/__tests__/broker.test.js +125 -0
- package/dist/broker/__tests__/broker.test.js.map +1 -0
- package/dist/broker/__tests__/compressor.test.d.ts +2 -0
- package/dist/broker/__tests__/compressor.test.d.ts.map +1 -0
- package/dist/broker/__tests__/compressor.test.js +145 -0
- package/dist/broker/__tests__/compressor.test.js.map +1 -0
- package/dist/broker/__tests__/query-parser.test.d.ts +2 -0
- package/dist/broker/__tests__/query-parser.test.d.ts.map +1 -0
- package/dist/broker/__tests__/query-parser.test.js +101 -0
- package/dist/broker/__tests__/query-parser.test.js.map +1 -0
- package/dist/broker/broker.d.ts +0 -0
- package/dist/broker/broker.d.ts.map +1 -1
- package/dist/broker/broker.js +17 -14
- package/dist/broker/broker.js.map +1 -1
- package/dist/broker/compressor.d.ts +0 -0
- package/dist/broker/compressor.d.ts.map +1 -1
- package/dist/broker/compressor.js +35 -1
- package/dist/broker/compressor.js.map +1 -1
- package/dist/broker/context-pack.d.ts +0 -0
- package/dist/broker/context-pack.d.ts.map +0 -0
- package/dist/broker/context-pack.js +0 -0
- package/dist/broker/context-pack.js.map +0 -0
- package/dist/broker/query-parser.d.ts +0 -0
- package/dist/broker/query-parser.d.ts.map +0 -0
- package/dist/broker/query-parser.js +0 -0
- package/dist/broker/query-parser.js.map +0 -0
- package/dist/cli/commands/chat.d.ts +0 -0
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +14 -1
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/config.d.ts +1 -2
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +0 -0
- package/dist/cli/commands/config.js.map +0 -0
- package/dist/cli/commands/memory.d.ts +0 -0
- package/dist/cli/commands/memory.d.ts.map +0 -0
- package/dist/cli/commands/memory.js +0 -0
- package/dist/cli/commands/memory.js.map +0 -0
- package/dist/cli/commands/search.d.ts +0 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +6 -2
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/session.d.ts +0 -0
- package/dist/cli/commands/session.d.ts.map +0 -0
- package/dist/cli/commands/session.js +0 -0
- package/dist/cli/commands/session.js.map +0 -0
- package/dist/cli/index.d.ts +0 -0
- package/dist/cli/index.d.ts.map +0 -0
- package/dist/cli/index.js +6 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui/renderer.d.ts +0 -0
- package/dist/cli/tui/renderer.d.ts.map +0 -0
- package/dist/cli/tui/renderer.js +0 -0
- package/dist/cli/tui/renderer.js.map +0 -0
- package/dist/hooks/post-compact.d.ts +0 -0
- package/dist/hooks/post-compact.d.ts.map +0 -0
- package/dist/hooks/post-compact.js +1 -1
- package/dist/hooks/post-compact.js.map +1 -1
- package/dist/hooks/session-start.d.ts +0 -0
- package/dist/hooks/session-start.d.ts.map +0 -0
- package/dist/hooks/session-start.js +2 -1
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.d.ts +0 -0
- package/dist/hooks/stop.d.ts.map +0 -0
- package/dist/hooks/stop.js +0 -0
- package/dist/hooks/stop.js.map +0 -0
- package/dist/hooks/user-prompt.d.ts +0 -0
- package/dist/hooks/user-prompt.d.ts.map +0 -0
- package/dist/hooks/user-prompt.js +0 -0
- package/dist/hooks/user-prompt.js.map +0 -0
- package/dist/providers/__tests__/anthropic-api.test.d.ts +2 -0
- package/dist/providers/__tests__/anthropic-api.test.d.ts.map +1 -0
- package/dist/providers/__tests__/anthropic-api.test.js +113 -0
- package/dist/providers/__tests__/anthropic-api.test.js.map +1 -0
- package/dist/providers/__tests__/claude-sdk.test.d.ts +2 -0
- package/dist/providers/__tests__/claude-sdk.test.d.ts.map +1 -0
- package/dist/providers/__tests__/claude-sdk.test.js +121 -0
- package/dist/providers/__tests__/claude-sdk.test.js.map +1 -0
- package/dist/providers/anthropic-api.d.ts +1 -0
- package/dist/providers/anthropic-api.d.ts.map +1 -1
- package/dist/providers/anthropic-api.js +12 -6
- package/dist/providers/anthropic-api.js.map +1 -1
- package/dist/providers/claude-cli.d.ts +0 -0
- package/dist/providers/claude-cli.d.ts.map +0 -0
- package/dist/providers/claude-cli.js +0 -0
- package/dist/providers/claude-cli.js.map +0 -0
- package/dist/providers/claude-sdk.d.ts +0 -0
- package/dist/providers/claude-sdk.d.ts.map +0 -0
- package/dist/providers/claude-sdk.js +0 -0
- package/dist/providers/claude-sdk.js.map +0 -0
- package/dist/providers/interface.d.ts +1 -0
- package/dist/providers/interface.d.ts.map +1 -1
- package/dist/providers/interface.js +0 -0
- package/dist/providers/interface.js.map +0 -0
- package/dist/scripts/install-hooks.d.ts +2 -2
- package/dist/scripts/install-hooks.d.ts.map +0 -0
- package/dist/scripts/install-hooks.js +6 -9
- package/dist/scripts/install-hooks.js.map +1 -1
- package/dist/session/__tests__/manager.test.d.ts +2 -0
- package/dist/session/__tests__/manager.test.d.ts.map +1 -0
- package/dist/session/__tests__/manager.test.js +108 -0
- package/dist/session/__tests__/manager.test.js.map +1 -0
- package/dist/session/manager.d.ts +0 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +2 -1
- package/dist/session/manager.js.map +1 -1
- package/dist/session/schema.d.ts +0 -0
- package/dist/session/schema.d.ts.map +1 -1
- package/dist/session/schema.js +2 -1
- package/dist/session/schema.js.map +1 -1
- package/dist/utils/__tests__/exec.test.d.ts +2 -0
- package/dist/utils/__tests__/exec.test.d.ts.map +1 -0
- package/dist/utils/__tests__/exec.test.js +104 -0
- package/dist/utils/__tests__/exec.test.js.map +1 -0
- package/dist/utils/__tests__/tokens.test.d.ts +2 -0
- package/dist/utils/__tests__/tokens.test.d.ts.map +1 -0
- package/dist/utils/__tests__/tokens.test.js +64 -0
- package/dist/utils/__tests__/tokens.test.js.map +1 -0
- package/dist/utils/exec.d.ts +16 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +33 -3
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/tokens.d.ts +0 -0
- package/dist/utils/tokens.d.ts.map +0 -0
- package/dist/utils/tokens.js +0 -0
- package/dist/utils/tokens.js.map +0 -0
- package/package.json +1 -1
- package/src/skills/brainstorm.md +0 -0
- package/src/skills/remember.md +0 -0
- package/src/skills/review.md +0 -0
- package/src/skills/spec.md +0 -0
package/LICENSE
CHANGED
|
File without changes
|
package/README.md
CHANGED
|
@@ -21,16 +21,23 @@ devx chat
|
|
|
21
21
|
CodeAgent 的核心是 **Context Broker** —— 一个 5 步管线,在每次 LLM 调用前自动聚合精准上下文:
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
UserQuery → QueryParser →
|
|
24
|
+
UserQuery → QueryParser → 真正异步并行查询(Code Graph + Memory + Orchestration) → 去重合并 → 智能压缩 → ContextPack
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
**关键特性:**
|
|
28
|
+
- 真正的异步并行 — 使用 `execSafeAsync` + `Promise.allSettled`,非假并行
|
|
29
|
+
- 智能 Token 预算 — 动态重分配空源预算,bugWarnings 封顶保护,跨源文件去重
|
|
30
|
+
- 阶段感知记忆检索 — 按 implement/debug/brainstorm 等阶段过滤记忆类型
|
|
31
|
+
- 全面优雅降级 — 任何外部工具缺失不阻塞,降级到空上下文
|
|
32
|
+
- 配置文件生效 — `config set` 的值自动成为 CLI 默认值
|
|
33
|
+
|
|
27
34
|
它消费 3 个已有系统但不合并代码,通过 CLI 调用保持松耦合:
|
|
28
35
|
|
|
29
36
|
| 系统 | 语言 | 职责 | 调用方式 |
|
|
30
37
|
|------|------|------|---------|
|
|
31
|
-
| [Code Graph MCP](https://github.com/
|
|
32
|
-
| [claude-mem-lite](https://github.com/
|
|
33
|
-
| [GSD-Lite](https://github.com/
|
|
38
|
+
| [Code Graph MCP](https://github.com/sdsrss/code-graph-mcp) | Rust | AST 解析、混合搜索、调用图、影响分析 | CLI (`code-graph-mcp`) |
|
|
39
|
+
| [claude-mem-lite](https://github.com/sdsrss/claude-mem-lite) | Node.js | 类型化记忆、FTS5+向量召回 | CLI (`claude-mem-lite`) |
|
|
40
|
+
| [GSD-Lite](https://github.com/sdsrss/gsd-lite) / Superpowers | Node.js | 编排状态机、阶段管理 | 读 state.json / 读 skills 目录 |
|
|
34
41
|
|
|
35
42
|
## 双模式运行
|
|
36
43
|
|
|
@@ -90,6 +97,7 @@ npm run install-hooks:global
|
|
|
90
97
|
|------|---------|------|
|
|
91
98
|
| `UserPromptSubmit` | 每次用户输入 | Context Broker 生成 ContextPack → 注入到 prompt |
|
|
92
99
|
| `SessionStart` | 会话开始 | 注入项目概要 + 活跃编排状态 |
|
|
100
|
+
| `PostCompact` | 上下文压缩后 | 重注入编排状态 + bug 警告,防止压缩丢失 |
|
|
93
101
|
| `Stop` | 会话结束 | 从对话中提取关键发现 → 写入记忆 |
|
|
94
102
|
|
|
95
103
|
## 其他命令
|
|
@@ -120,7 +128,10 @@ codeagent session delete <id> # 删除会话
|
|
|
120
128
|
|
|
121
129
|
### 配置
|
|
122
130
|
|
|
131
|
+
配置值自动成为 CLI 命令的默认值(命令行参数仍然优先):
|
|
132
|
+
|
|
123
133
|
```bash
|
|
134
|
+
codeagent config set provider api # 默认使用 API provider
|
|
124
135
|
codeagent config set orchestration superpowers # 切换编排引擎
|
|
125
136
|
codeagent config set model claude-opus-4-6 # 设置模型
|
|
126
137
|
codeagent config set maxBudgetUsd 5.0 # 设置预算上限
|
|
@@ -193,6 +204,7 @@ src/
|
|
|
193
204
|
├── hooks/ # Claude Code 生命周期 hooks
|
|
194
205
|
│ ├── user-prompt.ts # UserPromptSubmit → Broker → 注入
|
|
195
206
|
│ ├── session-start.ts # SessionStart → 项目概要
|
|
207
|
+
│ ├── post-compact.ts # PostCompact → 恢复编排状态 + bug 警告
|
|
196
208
|
│ └── stop.ts # Stop → 记忆写入
|
|
197
209
|
│
|
|
198
210
|
├── skills/ # Claude Code Skills
|
|
@@ -239,11 +251,11 @@ if (hasContent(pack)) {
|
|
|
239
251
|
## 开发
|
|
240
252
|
|
|
241
253
|
```bash
|
|
242
|
-
git clone https://github.com/
|
|
254
|
+
git clone https://github.com/sdsrss/codeagent.git
|
|
243
255
|
cd codeagent
|
|
244
256
|
npm install
|
|
245
257
|
npm run build
|
|
246
|
-
npm test #
|
|
258
|
+
npm test # 172 tests (unit + integration)
|
|
247
259
|
npm run dev # watch mode
|
|
248
260
|
```
|
|
249
261
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-graph.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-graph.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseRelevantFiles, parseSymbols } from '../code-graph.js';
|
|
3
|
+
describe('parseRelevantFiles', () => {
|
|
4
|
+
it('extracts file paths from code-graph output', () => {
|
|
5
|
+
const raw = `
|
|
6
|
+
Results for "context broker":
|
|
7
|
+
src/broker/broker.ts — ContextBroker class, main pipeline
|
|
8
|
+
src/broker/compressor.ts — budget enforcement
|
|
9
|
+
src/utils/exec.ts — subprocess execution
|
|
10
|
+
`;
|
|
11
|
+
const files = parseRelevantFiles(raw);
|
|
12
|
+
expect(files.length).toBeGreaterThanOrEqual(3);
|
|
13
|
+
expect(files.map(f => f.path)).toContain('src/broker/broker.ts');
|
|
14
|
+
expect(files.map(f => f.path)).toContain('src/broker/compressor.ts');
|
|
15
|
+
});
|
|
16
|
+
it('deduplicates file paths', () => {
|
|
17
|
+
const raw = `
|
|
18
|
+
src/broker/broker.ts — first hit
|
|
19
|
+
src/broker/broker.ts — second hit
|
|
20
|
+
`;
|
|
21
|
+
const files = parseRelevantFiles(raw);
|
|
22
|
+
const paths = files.map(f => f.path);
|
|
23
|
+
expect(new Set(paths).size).toBe(paths.length);
|
|
24
|
+
});
|
|
25
|
+
it('excludes version-like patterns and URLs', () => {
|
|
26
|
+
const raw = `
|
|
27
|
+
v1.2.3/something.ts should be excluded
|
|
28
|
+
https://example.com/file.ts should be excluded
|
|
29
|
+
node_modules/pkg/index.js should be excluded
|
|
30
|
+
src/real/file.ts should be included
|
|
31
|
+
`;
|
|
32
|
+
const files = parseRelevantFiles(raw);
|
|
33
|
+
const paths = files.map(f => f.path);
|
|
34
|
+
expect(paths).toContain('src/real/file.ts');
|
|
35
|
+
expect(paths.some(p => p.includes('node_modules'))).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
it('returns empty array for empty input', () => {
|
|
38
|
+
expect(parseRelevantFiles('')).toEqual([]);
|
|
39
|
+
});
|
|
40
|
+
it('caps at 10 files', () => {
|
|
41
|
+
const lines = Array.from({ length: 20 }, (_, i) => ` src/file${i}/module.ts — hit`);
|
|
42
|
+
const files = parseRelevantFiles(lines.join('\n'));
|
|
43
|
+
expect(files.length).toBeLessThanOrEqual(10);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('parseSymbols', () => {
|
|
47
|
+
it('extracts function and class symbols', () => {
|
|
48
|
+
const raw = `
|
|
49
|
+
function buildContextPack() { ... }
|
|
50
|
+
class ContextBroker { ... }
|
|
51
|
+
interface AgentProvider { ... }
|
|
52
|
+
`;
|
|
53
|
+
const symbols = parseSymbols(raw);
|
|
54
|
+
expect(symbols.map(s => s.name)).toContain('buildContextPack');
|
|
55
|
+
expect(symbols.map(s => s.name)).toContain('ContextBroker');
|
|
56
|
+
expect(symbols.map(s => s.name)).toContain('AgentProvider');
|
|
57
|
+
});
|
|
58
|
+
it('deduplicates symbols by name', () => {
|
|
59
|
+
const raw = `
|
|
60
|
+
function foo() {}
|
|
61
|
+
function foo() {}
|
|
62
|
+
`;
|
|
63
|
+
const symbols = parseSymbols(raw);
|
|
64
|
+
expect(symbols.filter(s => s.name === 'foo').length).toBe(1);
|
|
65
|
+
});
|
|
66
|
+
it('returns empty array for empty input', () => {
|
|
67
|
+
expect(parseSymbols('')).toEqual([]);
|
|
68
|
+
});
|
|
69
|
+
it('caps at 15 symbols', () => {
|
|
70
|
+
const lines = Array.from({ length: 30 }, (_, i) => `function fn${i}() {}`);
|
|
71
|
+
const symbols = parseSymbols(lines.join('\n'));
|
|
72
|
+
expect(symbols.length).toBeLessThanOrEqual(15);
|
|
73
|
+
});
|
|
74
|
+
it('extracts kind correctly', () => {
|
|
75
|
+
const raw = 'class MyClass { }\nfunction myFunc() { }';
|
|
76
|
+
const symbols = parseSymbols(raw);
|
|
77
|
+
const cls = symbols.find(s => s.name === 'MyClass');
|
|
78
|
+
const fn = symbols.find(s => s.name === 'myFunc');
|
|
79
|
+
expect(cls?.kind).toBe('class');
|
|
80
|
+
expect(fn?.kind).toBe('function');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=code-graph.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-graph.test.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-graph.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/memory.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
// Mock exec functions before importing the module under test
|
|
3
|
+
vi.mock('../../utils/exec.js', () => ({
|
|
4
|
+
execSafe: vi.fn(),
|
|
5
|
+
execSafeAsync: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
// Mock truncateToTokenBudget to pass-through
|
|
8
|
+
vi.mock('../../utils/tokens.js', () => ({
|
|
9
|
+
truncateToTokenBudget: vi.fn((raw, _budget) => raw),
|
|
10
|
+
}));
|
|
11
|
+
import { queryMemory } from '../memory.js';
|
|
12
|
+
import { execSafeAsync } from '../../utils/exec.js';
|
|
13
|
+
const mockExecSafeAsync = vi.mocked(execSafeAsync);
|
|
14
|
+
function makeParsed(overrides = {}) {
|
|
15
|
+
return {
|
|
16
|
+
filePaths: [],
|
|
17
|
+
symbols: ['processPayment'],
|
|
18
|
+
keywords: ['payment', 'refund'],
|
|
19
|
+
intent: 'general',
|
|
20
|
+
isActionOnly: false,
|
|
21
|
+
...overrides,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function okResult(stdout) {
|
|
25
|
+
return { stdout, ok: true };
|
|
26
|
+
}
|
|
27
|
+
const EMPTY_RESULT = { stdout: '', ok: false };
|
|
28
|
+
describe('queryMemory', () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
vi.clearAllMocks();
|
|
31
|
+
// Default: all execSafe calls return empty
|
|
32
|
+
mockExecSafeAsync.mockResolvedValue(EMPTY_RESULT);
|
|
33
|
+
});
|
|
34
|
+
describe('implement stage — searches both bugfix AND decision types', () => {
|
|
35
|
+
it('calls execSafe for both types when stage is implement', async () => {
|
|
36
|
+
mockExecSafeAsync.mockResolvedValue(okResult('#1 [bugfix] Fix timeout\nBody'));
|
|
37
|
+
await queryMemory(makeParsed(), 600, 'implement');
|
|
38
|
+
// getSearchTypes('implement') returns ['bugfix', 'decision']
|
|
39
|
+
// We expect two typed search calls (bugfix, decision)
|
|
40
|
+
// Since 'bugfix' IS in types, no extra bugfix call
|
|
41
|
+
const calls = mockExecSafeAsync.mock.calls;
|
|
42
|
+
expect(calls).toHaveLength(2);
|
|
43
|
+
// First call: --type bugfix
|
|
44
|
+
expect(calls[0][1]).toContain('--type');
|
|
45
|
+
expect(calls[0][1]).toContain('bugfix');
|
|
46
|
+
// Second call: --type decision
|
|
47
|
+
expect(calls[1][1]).toContain('--type');
|
|
48
|
+
expect(calls[1][1]).toContain('decision');
|
|
49
|
+
});
|
|
50
|
+
it('includes results from both typed searches', async () => {
|
|
51
|
+
mockExecSafeAsync
|
|
52
|
+
.mockResolvedValueOnce(okResult('#1 [bugfix] Fix timeout\nTimeout body'))
|
|
53
|
+
.mockResolvedValueOnce(okResult('#2 [decision] Use retry\nRetry body'));
|
|
54
|
+
const result = await queryMemory(makeParsed(), 600, 'implement');
|
|
55
|
+
// Both results should be present in raw output
|
|
56
|
+
expect(result.raw).toContain('Fix timeout');
|
|
57
|
+
expect(result.raw).toContain('Use retry');
|
|
58
|
+
// bugWarnings and memories should be separated correctly
|
|
59
|
+
expect(result.bugWarnings).toHaveLength(1);
|
|
60
|
+
expect(result.bugWarnings[0].title).toBe('Fix timeout');
|
|
61
|
+
expect(result.memories).toHaveLength(1);
|
|
62
|
+
expect(result.memories[0].title).toBe('Use retry');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('debug stage — searches both bugfix AND discovery types', () => {
|
|
66
|
+
it('calls execSafe for both types when stage is debug', async () => {
|
|
67
|
+
mockExecSafeAsync.mockResolvedValue(okResult('#1 [bugfix] Some bug\nBody'));
|
|
68
|
+
await queryMemory(makeParsed(), 600, 'debug');
|
|
69
|
+
// getSearchTypes('debug') returns ['bugfix', 'discovery']
|
|
70
|
+
// Since 'bugfix' IS in types, no extra bugfix call
|
|
71
|
+
const calls = mockExecSafeAsync.mock.calls;
|
|
72
|
+
expect(calls).toHaveLength(2);
|
|
73
|
+
expect(calls[0][1]).toContain('bugfix');
|
|
74
|
+
expect(calls[1][1]).toContain('discovery');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('brainstorm stage — bugfix search still runs even if not in types', () => {
|
|
78
|
+
it('searches typed searches + extra bugfix for brainstorm', async () => {
|
|
79
|
+
mockExecSafeAsync.mockResolvedValue(okResult('#1 [decision] Arch choice\nBody'));
|
|
80
|
+
await queryMemory(makeParsed(), 600, 'brainstorm');
|
|
81
|
+
// getSearchTypes('brainstorm') returns ['decision', 'discovery']
|
|
82
|
+
// bugfix NOT in types, so extra bugfix call should be made
|
|
83
|
+
const calls = mockExecSafeAsync.mock.calls;
|
|
84
|
+
expect(calls).toHaveLength(3);
|
|
85
|
+
// First two: typed searches for decision, discovery
|
|
86
|
+
expect(calls[0][1]).toContain('decision');
|
|
87
|
+
expect(calls[1][1]).toContain('discovery');
|
|
88
|
+
// Third: extra bugfix search
|
|
89
|
+
expect(calls[2][1]).toContain('bugfix');
|
|
90
|
+
expect(calls[2][1]).toContain('--limit');
|
|
91
|
+
expect(calls[2][1]).toContain('3');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('empty searchQuery returns early without calling execSafe', () => {
|
|
95
|
+
it('returns empty result when no symbols or keywords', async () => {
|
|
96
|
+
const parsed = makeParsed({ symbols: [], keywords: [] });
|
|
97
|
+
const result = await queryMemory(parsed, 600, 'implement');
|
|
98
|
+
expect(result.memories).toHaveLength(0);
|
|
99
|
+
expect(result.bugWarnings).toHaveLength(0);
|
|
100
|
+
expect(result.raw).toBe('');
|
|
101
|
+
expect(mockExecSafeAsync).not.toHaveBeenCalled();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('general stage (no types) — untyped search + bugfix', () => {
|
|
105
|
+
it('does untyped search when types are empty', async () => {
|
|
106
|
+
mockExecSafeAsync.mockResolvedValue(okResult('#1 [semantic] General info\nBody'));
|
|
107
|
+
await queryMemory(makeParsed(), 600, 'general');
|
|
108
|
+
// getSearchTypes('general') returns []
|
|
109
|
+
// So: 1 untyped search + 1 bugfix search = 2 calls
|
|
110
|
+
const calls = mockExecSafeAsync.mock.calls;
|
|
111
|
+
expect(calls).toHaveLength(2);
|
|
112
|
+
// First: untyped (no --type flag), --limit 8
|
|
113
|
+
expect(calls[0][1]).not.toContain('--type');
|
|
114
|
+
expect(calls[0][1]).toContain('--limit');
|
|
115
|
+
expect(calls[0][1]).toContain('8');
|
|
116
|
+
// Second: bugfix search
|
|
117
|
+
expect(calls[1][1]).toContain('--type');
|
|
118
|
+
expect(calls[1][1]).toContain('bugfix');
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('timeout constraints', () => {
|
|
122
|
+
it('passes 800ms timeout to every execSafe call', async () => {
|
|
123
|
+
mockExecSafeAsync.mockResolvedValue(okResult('#1 [bugfix] X\nY'));
|
|
124
|
+
await queryMemory(makeParsed(), 600, 'implement');
|
|
125
|
+
for (const call of mockExecSafeAsync.mock.calls) {
|
|
126
|
+
expect(call[2]).toEqual({ timeout: 800 });
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('types cap at 2 typed searches', () => {
|
|
131
|
+
it('only searches first 2 types for plan stage (which has 3 types)', async () => {
|
|
132
|
+
mockExecSafeAsync.mockResolvedValue(okResult('#1 [decision] D\nBody'));
|
|
133
|
+
await queryMemory(makeParsed(), 600, 'plan');
|
|
134
|
+
// getSearchTypes('plan') returns ['decision', 'discovery', 'task']
|
|
135
|
+
// Cap at 2 typed searches: decision, discovery
|
|
136
|
+
// bugfix NOT in types, so extra bugfix call
|
|
137
|
+
// Total: 3 calls
|
|
138
|
+
const calls = mockExecSafeAsync.mock.calls;
|
|
139
|
+
expect(calls).toHaveLength(3);
|
|
140
|
+
expect(calls[0][1]).toContain('decision');
|
|
141
|
+
expect(calls[1][1]).toContain('discovery');
|
|
142
|
+
// Third is bugfix, NOT 'task'
|
|
143
|
+
expect(calls[2][1]).toContain('bugfix');
|
|
144
|
+
// Verify 'task' was NOT searched
|
|
145
|
+
const allTypeArgs = calls.flatMap((c) => c[1]);
|
|
146
|
+
expect(allTypeArgs).not.toContain('task');
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=memory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.test.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/memory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,13 @@ export interface CodeGraphResult {
|
|
|
9
9
|
/**
|
|
10
10
|
* Query Code Graph MCP via CLI.
|
|
11
11
|
* Selects the right command based on intent.
|
|
12
|
-
*
|
|
12
|
+
* Uses async exec for truly non-blocking subprocess calls.
|
|
13
13
|
*/
|
|
14
14
|
export declare function queryCodeGraph(parsed: ParsedQuery, tokenBudget: number, repoRoot: string): Promise<CodeGraphResult>;
|
|
15
15
|
/**
|
|
16
16
|
* Get repo map summary via code-graph-mcp map.
|
|
17
17
|
*/
|
|
18
18
|
export declare function getRepoMap(repoRoot: string, timeout?: number): string;
|
|
19
|
+
export declare function parseRelevantFiles(raw: string): RelevantFile[];
|
|
20
|
+
export declare function parseSymbols(raw: string): SymbolInfo[];
|
|
19
21
|
//# sourceMappingURL=code-graph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-graph.d.ts","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAUD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAiF1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,MAAM,CAKnE"}
|
|
1
|
+
{"version":3,"file":"code-graph.d.ts","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,UAAU,EAAE,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;CACb;AAUD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAiF1B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,MAAM,CAKnE;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAe9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAetD"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { execSafe } from '../utils/exec.js';
|
|
1
|
+
import { execSafe, execSafeAsync } from '../utils/exec.js';
|
|
2
2
|
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
3
3
|
import fs from 'node:fs';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
const CG = 'code-graph-mcp';
|
|
6
|
-
/**
|
|
7
|
-
function
|
|
8
|
-
const { stdout, ok } =
|
|
6
|
+
/** Async CLI call — truly non-blocking, for use in Promise.allSettled. */
|
|
7
|
+
async function cgAsync(args, repoRoot, timeout = 2000) {
|
|
8
|
+
const { stdout, ok } = await execSafeAsync(CG, args, { cwd: repoRoot, timeout });
|
|
9
9
|
return ok ? stdout : '';
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Query Code Graph MCP via CLI.
|
|
13
13
|
* Selects the right command based on intent.
|
|
14
|
-
*
|
|
14
|
+
* Uses async exec for truly non-blocking subprocess calls.
|
|
15
15
|
*/
|
|
16
16
|
export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
|
|
17
17
|
const dbPath = path.join(repoRoot, '.code-graph', 'index.db');
|
|
@@ -31,36 +31,36 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
|
|
|
31
31
|
switch (intent) {
|
|
32
32
|
case 'impact': {
|
|
33
33
|
if (symbols.length > 0) {
|
|
34
|
-
result.raw =
|
|
34
|
+
result.raw = await cgAsync(['impact', symbols[0]], repoRoot);
|
|
35
35
|
}
|
|
36
36
|
break;
|
|
37
37
|
}
|
|
38
38
|
case 'understand': {
|
|
39
39
|
if (filePaths.length > 0) {
|
|
40
|
-
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
41
|
-
result.raw =
|
|
40
|
+
const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
|
|
41
|
+
result.raw = await cgAsync(['overview', dir], repoRoot);
|
|
42
42
|
}
|
|
43
43
|
else if (searchQuery) {
|
|
44
|
-
result.raw =
|
|
44
|
+
result.raw = await cgAsync(['search', searchQuery, '--limit', '8'], repoRoot);
|
|
45
45
|
}
|
|
46
46
|
break;
|
|
47
47
|
}
|
|
48
48
|
case 'callgraph': {
|
|
49
49
|
if (symbols.length > 0) {
|
|
50
|
-
result.raw =
|
|
50
|
+
result.raw = await cgAsync(['callgraph', symbols[0], '--depth', '2'], repoRoot);
|
|
51
51
|
}
|
|
52
52
|
break;
|
|
53
53
|
}
|
|
54
54
|
case 'implement': {
|
|
55
55
|
const results = [];
|
|
56
56
|
if (searchQuery) {
|
|
57
|
-
const r =
|
|
57
|
+
const r = await cgAsync(['search', searchQuery, '--limit', '5'], repoRoot);
|
|
58
58
|
if (r)
|
|
59
59
|
results.push(r);
|
|
60
60
|
}
|
|
61
61
|
if (filePaths.length > 0) {
|
|
62
|
-
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
63
|
-
const r =
|
|
62
|
+
const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
|
|
63
|
+
const r = await cgAsync(['overview', dir], repoRoot);
|
|
64
64
|
if (r)
|
|
65
65
|
results.push(r);
|
|
66
66
|
}
|
|
@@ -72,11 +72,11 @@ export async function queryCodeGraph(parsed, tokenBudget, repoRoot) {
|
|
|
72
72
|
case 'general':
|
|
73
73
|
default: {
|
|
74
74
|
if (searchQuery) {
|
|
75
|
-
result.raw =
|
|
75
|
+
result.raw = await cgAsync(['search', searchQuery, '--limit', '8'], repoRoot);
|
|
76
76
|
}
|
|
77
77
|
else if (filePaths.length > 0) {
|
|
78
|
-
const dir = filePaths[0].replace(/\/[^/]+$/, '/');
|
|
79
|
-
result.raw =
|
|
78
|
+
const dir = filePaths[0].includes('/') ? filePaths[0].replace(/\/[^/]+$/, '/') : '.';
|
|
79
|
+
result.raw = await cgAsync(['overview', dir], repoRoot);
|
|
80
80
|
}
|
|
81
81
|
break;
|
|
82
82
|
}
|
|
@@ -99,22 +99,25 @@ export function getRepoMap(repoRoot, timeout = 3000) {
|
|
|
99
99
|
return stdout;
|
|
100
100
|
}
|
|
101
101
|
// --- Parsers for code-graph CLI output ---
|
|
102
|
-
function parseRelevantFiles(raw) {
|
|
102
|
+
export function parseRelevantFiles(raw) {
|
|
103
103
|
if (!raw)
|
|
104
104
|
return [];
|
|
105
105
|
const files = [];
|
|
106
|
-
|
|
106
|
+
// Match file paths with directory separators and common source extensions
|
|
107
|
+
const fileMatches = raw.match(/(?:^|\s)(\.?\/?\w[\w/.-]*\/[\w.-]+\.\w{1,10})/gm) || [];
|
|
107
108
|
const seen = new Set();
|
|
109
|
+
// Exclude version-like patterns (e.g., releases/v1.2.3) and URLs
|
|
110
|
+
const excludePattern = /^v?\d+\.\d+|^https?:|^node_modules\//;
|
|
108
111
|
for (const match of fileMatches) {
|
|
109
112
|
const p = match.trim().replace(/^\.\//, '');
|
|
110
|
-
if (seen.has(p) ||
|
|
113
|
+
if (seen.has(p) || excludePattern.test(p))
|
|
111
114
|
continue;
|
|
112
115
|
seen.add(p);
|
|
113
116
|
files.push({ path: p, reason: 'code-graph search hit' });
|
|
114
117
|
}
|
|
115
118
|
return files.slice(0, 10);
|
|
116
119
|
}
|
|
117
|
-
function parseSymbols(raw) {
|
|
120
|
+
export function parseSymbols(raw) {
|
|
118
121
|
if (!raw)
|
|
119
122
|
return [];
|
|
120
123
|
const symbols = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"code-graph.js","sourceRoot":"","sources":["../../src/adapters/code-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export interface MemoryResult {
|
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Query memory engine via claude-mem-lite CLI.
|
|
10
|
-
*
|
|
10
|
+
* Uses async exec for truly non-blocking subprocess calls.
|
|
11
11
|
*/
|
|
12
12
|
export declare function queryMemory(parsed: ParsedQuery, tokenBudget: number, stage?: Stage): Promise<MemoryResult>;
|
|
13
13
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAeD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAeD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,YAAY,CAAC,CA0CvB"}
|
package/dist/adapters/memory.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execSafeAsync } from '../utils/exec.js';
|
|
2
2
|
import { truncateToTokenBudget } from '../utils/tokens.js';
|
|
3
3
|
const MEM = 'claude-mem-lite';
|
|
4
4
|
function getSearchTypes(stage) {
|
|
@@ -13,7 +13,7 @@ function getSearchTypes(stage) {
|
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Query memory engine via claude-mem-lite CLI.
|
|
16
|
-
*
|
|
16
|
+
* Uses async exec for truly non-blocking subprocess calls.
|
|
17
17
|
*/
|
|
18
18
|
export async function queryMemory(parsed, tokenBudget, stage) {
|
|
19
19
|
const result = { memories: [], bugWarnings: [], raw: '' };
|
|
@@ -22,20 +22,24 @@ export async function queryMemory(parsed, tokenBudget, stage) {
|
|
|
22
22
|
return result;
|
|
23
23
|
const types = getSearchTypes(stage);
|
|
24
24
|
const allRaw = [];
|
|
25
|
+
// Timeouts kept tight (800ms each, max 3 calls) to stay within 3s hook budget
|
|
25
26
|
if (types.length === 0) {
|
|
26
|
-
const { stdout, ok } =
|
|
27
|
+
const { stdout, ok } = await execSafeAsync(MEM, ['search', searchQuery, '--limit', '8'], { timeout: 800 });
|
|
27
28
|
if (ok && stdout)
|
|
28
29
|
allRaw.push(stdout);
|
|
29
30
|
}
|
|
30
31
|
else {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
// Search types in parallel (cap at 2 typed searches to stay within budget)
|
|
33
|
+
const typeResults = await Promise.allSettled(types.slice(0, 2).map(type => execSafeAsync(MEM, ['search', searchQuery, '--type', type, '--limit', '5'], { timeout: 800 })));
|
|
34
|
+
for (const r of typeResults) {
|
|
35
|
+
if (r.status === 'fulfilled' && r.value.ok && r.value.stdout) {
|
|
36
|
+
allRaw.push(r.value.stdout);
|
|
37
|
+
}
|
|
35
38
|
}
|
|
36
39
|
}
|
|
40
|
+
// Always ensure bugfix search runs (if not already in types)
|
|
37
41
|
if (!types.includes('bugfix')) {
|
|
38
|
-
const { stdout, ok } =
|
|
42
|
+
const { stdout, ok } = await execSafeAsync(MEM, ['search', searchQuery, '--type', 'bugfix', '--limit', '3'], { timeout: 800 });
|
|
39
43
|
if (ok && stdout)
|
|
40
44
|
allRaw.push(stdout);
|
|
41
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gsd.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/gsd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA2BtF;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,oBAAoB;IACrD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAO;gBAE/B,QAAQ,EAAE,MAAM;IAI5B,OAAO,CAAC,YAAY;YAIN,SAAS;
|
|
1
|
+
{"version":3,"file":"gsd.d.ts","sourceRoot":"","sources":["../../../src/adapters/orchestration/gsd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA2BtF;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,oBAAoB;IACrD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAO;gBAE/B,QAAQ,EAAE,MAAM;IAI5B,OAAO,CAAC,YAAY;YAIN,SAAS;IAuBjB,eAAe,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAMxC,aAAa,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAU5C,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAQxC,YAAY,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAIlE,cAAc,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,aAAa,IAAI,MAAM;IAIvB,kBAAkB,IAAI,KAAK,EAAE;CAG9B"}
|