@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,16 @@
|
|
|
1
|
+
import type { AgentProvider, SessionHandle, SessionOpts, TurnEvent, TurnInput } from './interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Claude CLI provider.
|
|
4
|
+
* Uses `claude -p` for batch/scripting tasks.
|
|
5
|
+
* Supports session resume via --resume flag.
|
|
6
|
+
*
|
|
7
|
+
* Best for: CI/CD, batch processing, one-shot tasks.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ClaudeCLIProvider implements AgentProvider {
|
|
10
|
+
readonly name = "claude-cli";
|
|
11
|
+
startSession(_opts?: SessionOpts): Promise<SessionHandle>;
|
|
12
|
+
resumeSession(providerSessionId: string, _opts?: SessionOpts): Promise<SessionHandle>;
|
|
13
|
+
sendTurn(handle: SessionHandle, input: TurnInput): AsyncIterable<TurnEvent>;
|
|
14
|
+
endSession(_handle: SessionHandle): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=claude-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAEvB,YAAY,CAAC,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAM7D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,GAAE,WAAgB,GACtB,OAAO,CAAC,aAAa,CAAC;IAOlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;IAoDrB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { execSafe } from '../utils/exec.js';
|
|
2
|
+
import { formatContextPack } from '../broker/broker.js';
|
|
3
|
+
import { hasContent } from '../broker/context-pack.js';
|
|
4
|
+
/**
|
|
5
|
+
* Claude CLI provider.
|
|
6
|
+
* Uses `claude -p` for batch/scripting tasks.
|
|
7
|
+
* Supports session resume via --resume flag.
|
|
8
|
+
*
|
|
9
|
+
* Best for: CI/CD, batch processing, one-shot tasks.
|
|
10
|
+
*/
|
|
11
|
+
export class ClaudeCLIProvider {
|
|
12
|
+
name = 'claude-cli';
|
|
13
|
+
async startSession(_opts = {}) {
|
|
14
|
+
return {
|
|
15
|
+
sessionId: `cli-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async resumeSession(providerSessionId, _opts = {}) {
|
|
19
|
+
return {
|
|
20
|
+
sessionId: `cli-resume-${Date.now()}`,
|
|
21
|
+
providerSessionId,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async *sendTurn(handle, input) {
|
|
25
|
+
// Build prompt with context
|
|
26
|
+
let prompt = input.userMessage;
|
|
27
|
+
if (input.contextPack && hasContent(input.contextPack)) {
|
|
28
|
+
const contextStr = formatContextPack(input.contextPack);
|
|
29
|
+
if (contextStr) {
|
|
30
|
+
prompt = `${contextStr}\n\n${input.userMessage}`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Build command
|
|
34
|
+
const parts = ['claude', '-p', '--output-format', 'json'];
|
|
35
|
+
if (handle.providerSessionId) {
|
|
36
|
+
parts.push('--resume', handle.providerSessionId);
|
|
37
|
+
}
|
|
38
|
+
// Escape prompt for shell
|
|
39
|
+
const escapedPrompt = prompt.replace(/'/g, "'\\''");
|
|
40
|
+
parts.push(`'${escapedPrompt}'`);
|
|
41
|
+
const cmd = parts.join(' ');
|
|
42
|
+
yield { type: 'text', content: '[executing claude -p...]' };
|
|
43
|
+
const { stdout, ok } = execSafe(cmd, {
|
|
44
|
+
timeout: 120000, // 2 min for batch tasks
|
|
45
|
+
});
|
|
46
|
+
if (!ok || !stdout) {
|
|
47
|
+
yield { type: 'error', content: 'claude -p execution failed' };
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Parse JSON output
|
|
51
|
+
try {
|
|
52
|
+
const result = JSON.parse(stdout);
|
|
53
|
+
// Capture session ID for resume
|
|
54
|
+
if (result.session_id) {
|
|
55
|
+
handle.providerSessionId = result.session_id;
|
|
56
|
+
}
|
|
57
|
+
yield {
|
|
58
|
+
type: 'done',
|
|
59
|
+
content: result.result || result.text || stdout,
|
|
60
|
+
metadata: { cost: result.total_cost_usd },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Raw text output
|
|
65
|
+
yield { type: 'done', content: stdout };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async endSession(_handle) {
|
|
69
|
+
// CLI sessions don't need cleanup
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=claude-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentProvider, SessionHandle, SessionOpts, TurnEvent, TurnInput } from './interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Claude Agent SDK provider.
|
|
4
|
+
* Uses V1 query() API with resume for multi-turn.
|
|
5
|
+
*
|
|
6
|
+
* Architecture: Each turn is a separate query() call.
|
|
7
|
+
* Multi-turn continuity is achieved via the `resume` option,
|
|
8
|
+
* which continues from the same Claude Code session.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ClaudeSDKProvider implements AgentProvider {
|
|
11
|
+
readonly name = "claude-sdk";
|
|
12
|
+
private activeQueries;
|
|
13
|
+
startSession(_opts?: SessionOpts): Promise<SessionHandle>;
|
|
14
|
+
resumeSession(providerSessionId: string, _opts?: SessionOpts): Promise<SessionHandle>;
|
|
15
|
+
sendTurn(handle: SessionHandle, input: TurnInput): AsyncIterable<TurnEvent>;
|
|
16
|
+
endSession(handle: SessionHandle): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=claude-sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.d.ts","sourceRoot":"","sources":["../../src/providers/claude-sdk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;GAOG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,aAAa,CAA4B;IAE3C,YAAY,CAAC,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAO7D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,KAAK,GAAE,WAAgB,GACtB,OAAO,CAAC,aAAa,CAAC;IAOlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;IAqHrB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import { formatContextPack } from '../broker/broker.js';
|
|
3
|
+
import { hasContent } from '../broker/context-pack.js';
|
|
4
|
+
/**
|
|
5
|
+
* Claude Agent SDK provider.
|
|
6
|
+
* Uses V1 query() API with resume for multi-turn.
|
|
7
|
+
*
|
|
8
|
+
* Architecture: Each turn is a separate query() call.
|
|
9
|
+
* Multi-turn continuity is achieved via the `resume` option,
|
|
10
|
+
* which continues from the same Claude Code session.
|
|
11
|
+
*/
|
|
12
|
+
export class ClaudeSDKProvider {
|
|
13
|
+
name = 'claude-sdk';
|
|
14
|
+
activeQueries = new Map();
|
|
15
|
+
async startSession(_opts = {}) {
|
|
16
|
+
// We don't actually start the session until the first turn.
|
|
17
|
+
// The session ID will come back from the SDK's init message.
|
|
18
|
+
const sessionId = `sdk-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
19
|
+
return { sessionId };
|
|
20
|
+
}
|
|
21
|
+
async resumeSession(providerSessionId, _opts = {}) {
|
|
22
|
+
return {
|
|
23
|
+
sessionId: `sdk-resume-${Date.now()}`,
|
|
24
|
+
providerSessionId,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async *sendTurn(handle, input) {
|
|
28
|
+
// Build prompt with context pack injection
|
|
29
|
+
let prompt = input.userMessage;
|
|
30
|
+
if (input.contextPack && hasContent(input.contextPack)) {
|
|
31
|
+
const contextStr = formatContextPack(input.contextPack);
|
|
32
|
+
if (contextStr) {
|
|
33
|
+
prompt = `${contextStr}\n\n${input.userMessage}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Build query options
|
|
37
|
+
const options = {
|
|
38
|
+
systemPrompt: input.systemPrompt
|
|
39
|
+
? input.systemPrompt
|
|
40
|
+
: { type: 'preset', preset: 'claude_code' },
|
|
41
|
+
settingSources: ['project'],
|
|
42
|
+
allowedTools: [
|
|
43
|
+
'Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep',
|
|
44
|
+
'WebSearch', 'WebFetch', 'Agent',
|
|
45
|
+
],
|
|
46
|
+
permissionMode: 'acceptEdits',
|
|
47
|
+
persistSession: true,
|
|
48
|
+
};
|
|
49
|
+
// Resume existing session if we have a provider session ID
|
|
50
|
+
if (handle.providerSessionId) {
|
|
51
|
+
options.resume = handle.providerSessionId;
|
|
52
|
+
}
|
|
53
|
+
// Execute query
|
|
54
|
+
const q = query({ prompt, options });
|
|
55
|
+
this.activeQueries.set(handle.sessionId, q);
|
|
56
|
+
try {
|
|
57
|
+
for await (const msg of q) {
|
|
58
|
+
switch (msg.type) {
|
|
59
|
+
case 'system': {
|
|
60
|
+
// Capture the real session ID from the SDK
|
|
61
|
+
if ('session_id' in msg && typeof msg.session_id === 'string') {
|
|
62
|
+
handle.providerSessionId = msg.session_id;
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case 'assistant': {
|
|
67
|
+
// Extract text content from assistant message
|
|
68
|
+
const content = msg.message?.content;
|
|
69
|
+
if (Array.isArray(content)) {
|
|
70
|
+
for (const block of content) {
|
|
71
|
+
if (block.type === 'text' && block.text) {
|
|
72
|
+
yield { type: 'text', content: block.text };
|
|
73
|
+
}
|
|
74
|
+
else if (block.type === 'tool_use') {
|
|
75
|
+
yield {
|
|
76
|
+
type: 'tool_use',
|
|
77
|
+
content: `[${block.name}] ${JSON.stringify(block.input).slice(0, 200)}`,
|
|
78
|
+
metadata: { tool: block.name, id: block.id },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'user': {
|
|
86
|
+
// Tool results come back as user messages
|
|
87
|
+
const userContent = msg.message?.content;
|
|
88
|
+
if (Array.isArray(userContent)) {
|
|
89
|
+
for (const block of userContent) {
|
|
90
|
+
if (block.type === 'tool_result') {
|
|
91
|
+
const text = Array.isArray(block.content)
|
|
92
|
+
? block.content
|
|
93
|
+
.filter((c) => c.type === 'text')
|
|
94
|
+
.map((c) => (c.text || ''))
|
|
95
|
+
.join('\n')
|
|
96
|
+
: typeof block.content === 'string'
|
|
97
|
+
? block.content
|
|
98
|
+
: '';
|
|
99
|
+
yield {
|
|
100
|
+
type: 'tool_result',
|
|
101
|
+
content: text.slice(0, 500),
|
|
102
|
+
metadata: { tool_use_id: block.tool_use_id },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 'result': {
|
|
110
|
+
const resultMsg = msg;
|
|
111
|
+
if (resultMsg.subtype === 'success' && resultMsg.result) {
|
|
112
|
+
yield {
|
|
113
|
+
type: 'done',
|
|
114
|
+
content: resultMsg.result,
|
|
115
|
+
metadata: { cost: resultMsg.total_cost_usd },
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
yield {
|
|
120
|
+
type: 'error',
|
|
121
|
+
content: resultMsg.errors?.join('\n') || 'Unknown error',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
this.activeQueries.delete(handle.sessionId);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async endSession(handle) {
|
|
134
|
+
const q = this.activeQueries.get(handle.sessionId);
|
|
135
|
+
if (q) {
|
|
136
|
+
q.close();
|
|
137
|
+
this.activeQueries.delete(handle.sessionId);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=claude-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.js","sourceRoot":"","sources":["../../src/providers/claude-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ContextPack } from '../broker/context-pack.js';
|
|
2
|
+
export type TurnEventType = 'text' | 'tool_use' | 'tool_result' | 'stage_change' | 'error' | 'done';
|
|
3
|
+
export interface TurnEvent {
|
|
4
|
+
type: TurnEventType;
|
|
5
|
+
content: string;
|
|
6
|
+
metadata?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface SessionHandle {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
providerSessionId?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TurnInput {
|
|
13
|
+
userMessage: string;
|
|
14
|
+
contextPack?: ContextPack;
|
|
15
|
+
systemPrompt?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SessionOpts {
|
|
18
|
+
cwd?: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
maxBudgetUsd?: number;
|
|
21
|
+
maxTurns?: number;
|
|
22
|
+
allowedTools?: string[];
|
|
23
|
+
permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'dontAsk';
|
|
24
|
+
}
|
|
25
|
+
export interface AgentProvider {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
/** Start a new session */
|
|
28
|
+
startSession(opts?: SessionOpts): Promise<SessionHandle>;
|
|
29
|
+
/** Resume an existing session */
|
|
30
|
+
resumeSession(providerSessionId: string, opts?: SessionOpts): Promise<SessionHandle>;
|
|
31
|
+
/** Send a turn and stream back events */
|
|
32
|
+
sendTurn(handle: SessionHandle, input: TurnInput): AsyncIterable<TurnEvent>;
|
|
33
|
+
/** End a session and cleanup */
|
|
34
|
+
endSession(handle: SessionHandle): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,UAAU,GACV,aAAa,GACb,cAAc,GACd,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;CACvF;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0BAA0B;IAC1B,YAAY,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEzD,iCAAiC;IACjC,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAErF,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE5E,gCAAgC;IAChC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Install CodeAgent hooks into Claude Code settings.
|
|
4
|
+
*
|
|
5
|
+
* Usage: node dist/scripts/install-hooks.js [--global | --project]
|
|
6
|
+
*
|
|
7
|
+
* Registers hooks in .claude/settings.json (project) or
|
|
8
|
+
* ~/.claude/settings.json (global).
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=install-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/scripts/install-hooks.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Install CodeAgent hooks into Claude Code settings.
|
|
4
|
+
*
|
|
5
|
+
* Usage: node dist/scripts/install-hooks.js [--global | --project]
|
|
6
|
+
*
|
|
7
|
+
* Registers hooks in .claude/settings.json (project) or
|
|
8
|
+
* ~/.claude/settings.json (global).
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import os from 'node:os';
|
|
13
|
+
const HOOK_DEFINITIONS = {
|
|
14
|
+
hooks: {
|
|
15
|
+
UserPromptSubmit: [
|
|
16
|
+
{
|
|
17
|
+
type: 'command',
|
|
18
|
+
command: 'node {{DIST_DIR}}/hooks/user-prompt.js',
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
SessionStart: [
|
|
22
|
+
{
|
|
23
|
+
type: 'command',
|
|
24
|
+
command: 'node {{DIST_DIR}}/hooks/session-start.js',
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
Stop: [
|
|
28
|
+
{
|
|
29
|
+
type: 'command',
|
|
30
|
+
command: 'node {{DIST_DIR}}/hooks/stop.js',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
function main() {
|
|
36
|
+
const args = process.argv.slice(2);
|
|
37
|
+
const isGlobal = args.includes('--global');
|
|
38
|
+
// Determine dist directory (where compiled hooks live)
|
|
39
|
+
const scriptDir = path.dirname(new URL(import.meta.url).pathname);
|
|
40
|
+
const distDir = path.resolve(scriptDir, '..');
|
|
41
|
+
// Determine settings file location
|
|
42
|
+
let settingsPath;
|
|
43
|
+
if (isGlobal) {
|
|
44
|
+
settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
settingsPath = path.join(process.cwd(), '.claude', 'settings.json');
|
|
48
|
+
}
|
|
49
|
+
// Read existing settings
|
|
50
|
+
let settings = {};
|
|
51
|
+
try {
|
|
52
|
+
if (fs.existsSync(settingsPath)) {
|
|
53
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
console.error(`Warning: Could not parse ${settingsPath}, starting fresh`);
|
|
58
|
+
}
|
|
59
|
+
// Merge hooks
|
|
60
|
+
const existingHooks = (settings.hooks || {});
|
|
61
|
+
const newHooks = { ...existingHooks };
|
|
62
|
+
for (const [event, hooks] of Object.entries(HOOK_DEFINITIONS.hooks)) {
|
|
63
|
+
const resolved = hooks.map((h) => ({
|
|
64
|
+
...h,
|
|
65
|
+
command: h.command.replace('{{DIST_DIR}}', distDir),
|
|
66
|
+
}));
|
|
67
|
+
const existing = (newHooks[event] || []);
|
|
68
|
+
// Remove old codeagent hooks
|
|
69
|
+
const filtered = existing.filter((h) => !h.command?.includes('codeagent') && !h.command?.includes(distDir));
|
|
70
|
+
newHooks[event] = [...filtered, ...resolved];
|
|
71
|
+
}
|
|
72
|
+
settings.hooks = newHooks;
|
|
73
|
+
// Write settings
|
|
74
|
+
const settingsDir = path.dirname(settingsPath);
|
|
75
|
+
if (!fs.existsSync(settingsDir)) {
|
|
76
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
79
|
+
console.log(`✓ CodeAgent hooks installed to ${settingsPath}`);
|
|
80
|
+
console.log(' Hooks registered:');
|
|
81
|
+
console.log(' - UserPromptSubmit → context injection');
|
|
82
|
+
console.log(' - SessionStart → repo overview');
|
|
83
|
+
console.log(' - Stop → memory extraction');
|
|
84
|
+
}
|
|
85
|
+
main();
|
|
86
|
+
//# sourceMappingURL=install-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/scripts/install-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Stage } from '../broker/context-pack.js';
|
|
2
|
+
export interface Session {
|
|
3
|
+
id: string;
|
|
4
|
+
repoRoot: string;
|
|
5
|
+
provider: string;
|
|
6
|
+
providerSessionId: string | null;
|
|
7
|
+
orchestration: string;
|
|
8
|
+
stage: string;
|
|
9
|
+
title: string | null;
|
|
10
|
+
status: 'active' | 'paused' | 'completed';
|
|
11
|
+
branch: string | null;
|
|
12
|
+
activeSpecId: string | null;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
updatedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SessionEvent {
|
|
17
|
+
id: number;
|
|
18
|
+
sessionId: string;
|
|
19
|
+
eventType: string;
|
|
20
|
+
payload: string | null;
|
|
21
|
+
createdAt: string;
|
|
22
|
+
}
|
|
23
|
+
export type EventType = 'user_turn' | 'agent_turn' | 'stage_change' | 'memory_write' | 'error' | 'session_start' | 'session_end';
|
|
24
|
+
export declare class SessionManager {
|
|
25
|
+
private db;
|
|
26
|
+
constructor(dbPath?: string);
|
|
27
|
+
/** Create a new session */
|
|
28
|
+
create(opts: {
|
|
29
|
+
repoRoot: string;
|
|
30
|
+
provider?: string;
|
|
31
|
+
orchestration?: string;
|
|
32
|
+
branch?: string;
|
|
33
|
+
title?: string;
|
|
34
|
+
}): Session;
|
|
35
|
+
/** Get a session by ID */
|
|
36
|
+
get(id: string): Session | null;
|
|
37
|
+
/** Get the most recent active session for a repo */
|
|
38
|
+
getActive(repoRoot: string): Session | null;
|
|
39
|
+
/** List sessions, optionally filtered */
|
|
40
|
+
list(opts?: {
|
|
41
|
+
repoRoot?: string;
|
|
42
|
+
status?: string;
|
|
43
|
+
limit?: number;
|
|
44
|
+
}): Session[];
|
|
45
|
+
/** Update session fields */
|
|
46
|
+
update(id: string, updates: Partial<{
|
|
47
|
+
providerSessionId: string;
|
|
48
|
+
stage: Stage | string;
|
|
49
|
+
title: string;
|
|
50
|
+
status: 'active' | 'paused' | 'completed';
|
|
51
|
+
activeSpecId: string;
|
|
52
|
+
}>): void;
|
|
53
|
+
/** Record a session event */
|
|
54
|
+
addEvent(sessionId: string, type: EventType, payload?: unknown): void;
|
|
55
|
+
/** Get events for a session */
|
|
56
|
+
getEvents(sessionId: string, opts?: {
|
|
57
|
+
limit?: number;
|
|
58
|
+
types?: EventType[];
|
|
59
|
+
}): SessionEvent[];
|
|
60
|
+
/** Delete a session and its events */
|
|
61
|
+
delete(id: string): void;
|
|
62
|
+
/** Close the database connection */
|
|
63
|
+
close(): void;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAIvD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,cAAc,GACd,OAAO,GACP,eAAe,GACf,aAAa,CAAC;AAIlB,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,CAAC,EAAE,MAAM;IAI3B,2BAA2B;IAC3B,MAAM,CAAC,IAAI,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO;IAiBX,0BAA0B;IAC1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAQ/B,oDAAoD;IACpD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAY3C,yCAAyC;IACzC,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,EAAE;IAuBb,4BAA4B;IAC5B,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC;QACf,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;QAC1C,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,GACD,IAAI;IA+BP,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAarE,+BAA+B;IAC/B,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;KAAE,GAC7C,YAAY,EAAE;IAsBjB,sCAAsC;IACtC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxB,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { openDatabase } from './schema.js';
|
|
2
|
+
// --- Session Manager ---
|
|
3
|
+
export class SessionManager {
|
|
4
|
+
db;
|
|
5
|
+
constructor(dbPath) {
|
|
6
|
+
this.db = openDatabase(dbPath);
|
|
7
|
+
}
|
|
8
|
+
/** Create a new session */
|
|
9
|
+
create(opts) {
|
|
10
|
+
const id = `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
11
|
+
const stmt = this.db.prepare(`
|
|
12
|
+
INSERT INTO sessions (id, repo_root, provider, orchestration, branch, title)
|
|
13
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
14
|
+
`);
|
|
15
|
+
stmt.run(id, opts.repoRoot, opts.provider || 'sdk', opts.orchestration || 'gsd', opts.branch || null, opts.title || null);
|
|
16
|
+
return this.get(id);
|
|
17
|
+
}
|
|
18
|
+
/** Get a session by ID */
|
|
19
|
+
get(id) {
|
|
20
|
+
const row = this.db.prepare('SELECT * FROM sessions WHERE id = ?').get(id);
|
|
21
|
+
if (!row)
|
|
22
|
+
return null;
|
|
23
|
+
return mapSession(row);
|
|
24
|
+
}
|
|
25
|
+
/** Get the most recent active session for a repo */
|
|
26
|
+
getActive(repoRoot) {
|
|
27
|
+
const row = this.db
|
|
28
|
+
.prepare(`SELECT * FROM sessions
|
|
29
|
+
WHERE repo_root = ? AND status = 'active'
|
|
30
|
+
ORDER BY updated_at DESC, id DESC LIMIT 1`)
|
|
31
|
+
.get(repoRoot);
|
|
32
|
+
if (!row)
|
|
33
|
+
return null;
|
|
34
|
+
return mapSession(row);
|
|
35
|
+
}
|
|
36
|
+
/** List sessions, optionally filtered */
|
|
37
|
+
list(opts) {
|
|
38
|
+
const conditions = [];
|
|
39
|
+
const params = [];
|
|
40
|
+
if (opts?.repoRoot) {
|
|
41
|
+
conditions.push('repo_root = ?');
|
|
42
|
+
params.push(opts.repoRoot);
|
|
43
|
+
}
|
|
44
|
+
if (opts?.status) {
|
|
45
|
+
conditions.push('status = ?');
|
|
46
|
+
params.push(opts.status);
|
|
47
|
+
}
|
|
48
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
49
|
+
const limit = opts?.limit || 20;
|
|
50
|
+
const rows = this.db
|
|
51
|
+
.prepare(`SELECT * FROM sessions ${where} ORDER BY updated_at DESC LIMIT ?`)
|
|
52
|
+
.all(...params, limit);
|
|
53
|
+
return rows.map(mapSession);
|
|
54
|
+
}
|
|
55
|
+
/** Update session fields */
|
|
56
|
+
update(id, updates) {
|
|
57
|
+
const sets = ["updated_at = datetime('now')"];
|
|
58
|
+
const params = [];
|
|
59
|
+
if (updates.providerSessionId !== undefined) {
|
|
60
|
+
sets.push('provider_session_id = ?');
|
|
61
|
+
params.push(updates.providerSessionId);
|
|
62
|
+
}
|
|
63
|
+
if (updates.stage !== undefined) {
|
|
64
|
+
sets.push('stage = ?');
|
|
65
|
+
params.push(updates.stage);
|
|
66
|
+
}
|
|
67
|
+
if (updates.title !== undefined) {
|
|
68
|
+
sets.push('title = ?');
|
|
69
|
+
params.push(updates.title);
|
|
70
|
+
}
|
|
71
|
+
if (updates.status !== undefined) {
|
|
72
|
+
sets.push('status = ?');
|
|
73
|
+
params.push(updates.status);
|
|
74
|
+
}
|
|
75
|
+
if (updates.activeSpecId !== undefined) {
|
|
76
|
+
sets.push('active_spec_id = ?');
|
|
77
|
+
params.push(updates.activeSpecId);
|
|
78
|
+
}
|
|
79
|
+
params.push(id);
|
|
80
|
+
this.db
|
|
81
|
+
.prepare(`UPDATE sessions SET ${sets.join(', ')} WHERE id = ?`)
|
|
82
|
+
.run(...params);
|
|
83
|
+
}
|
|
84
|
+
/** Record a session event */
|
|
85
|
+
addEvent(sessionId, type, payload) {
|
|
86
|
+
this.db
|
|
87
|
+
.prepare(`INSERT INTO session_events (session_id, event_type, payload)
|
|
88
|
+
VALUES (?, ?, ?)`)
|
|
89
|
+
.run(sessionId, type, payload ? JSON.stringify(payload) : null);
|
|
90
|
+
}
|
|
91
|
+
/** Get events for a session */
|
|
92
|
+
getEvents(sessionId, opts) {
|
|
93
|
+
const conditions = ['session_id = ?'];
|
|
94
|
+
const params = [sessionId];
|
|
95
|
+
if (opts?.types?.length) {
|
|
96
|
+
const placeholders = opts.types.map(() => '?').join(',');
|
|
97
|
+
conditions.push(`event_type IN (${placeholders})`);
|
|
98
|
+
params.push(...opts.types);
|
|
99
|
+
}
|
|
100
|
+
const limit = opts?.limit || 50;
|
|
101
|
+
const rows = this.db
|
|
102
|
+
.prepare(`SELECT * FROM session_events
|
|
103
|
+
WHERE ${conditions.join(' AND ')}
|
|
104
|
+
ORDER BY created_at DESC LIMIT ?`)
|
|
105
|
+
.all(...params, limit);
|
|
106
|
+
return rows.map(mapEvent);
|
|
107
|
+
}
|
|
108
|
+
/** Delete a session and its events */
|
|
109
|
+
delete(id) {
|
|
110
|
+
this.db.prepare('DELETE FROM sessions WHERE id = ?').run(id);
|
|
111
|
+
}
|
|
112
|
+
/** Close the database connection */
|
|
113
|
+
close() {
|
|
114
|
+
this.db.close();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// --- Row mappers ---
|
|
118
|
+
function mapSession(row) {
|
|
119
|
+
return {
|
|
120
|
+
id: row.id,
|
|
121
|
+
repoRoot: row.repo_root,
|
|
122
|
+
provider: row.provider,
|
|
123
|
+
providerSessionId: row.provider_session_id,
|
|
124
|
+
orchestration: row.orchestration,
|
|
125
|
+
stage: row.stage,
|
|
126
|
+
title: row.title,
|
|
127
|
+
status: row.status,
|
|
128
|
+
branch: row.branch,
|
|
129
|
+
activeSpecId: row.active_spec_id,
|
|
130
|
+
createdAt: row.created_at,
|
|
131
|
+
updatedAt: row.updated_at,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function mapEvent(row) {
|
|
135
|
+
return {
|
|
136
|
+
id: row.id,
|
|
137
|
+
sessionId: row.session_id,
|
|
138
|
+
eventType: row.event_type,
|
|
139
|
+
payload: row.payload,
|
|
140
|
+
createdAt: row.created_at,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=manager.js.map
|