@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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -0
  3. package/dist/adapters/code-graph.d.ts +18 -0
  4. package/dist/adapters/code-graph.d.ts.map +1 -0
  5. package/dist/adapters/code-graph.js +151 -0
  6. package/dist/adapters/code-graph.js.map +1 -0
  7. package/dist/adapters/memory.d.ts +13 -0
  8. package/dist/adapters/memory.d.ts.map +1 -0
  9. package/dist/adapters/memory.js +110 -0
  10. package/dist/adapters/memory.js.map +1 -0
  11. package/dist/adapters/orchestration/gsd.d.ts +20 -0
  12. package/dist/adapters/orchestration/gsd.d.ts.map +1 -0
  13. package/dist/adapters/orchestration/gsd.js +78 -0
  14. package/dist/adapters/orchestration/gsd.js.map +1 -0
  15. package/dist/adapters/orchestration/interface.d.ts +32 -0
  16. package/dist/adapters/orchestration/interface.d.ts.map +1 -0
  17. package/dist/adapters/orchestration/interface.js +2 -0
  18. package/dist/adapters/orchestration/interface.js.map +1 -0
  19. package/dist/adapters/orchestration/superpowers.d.ts +33 -0
  20. package/dist/adapters/orchestration/superpowers.d.ts.map +1 -0
  21. package/dist/adapters/orchestration/superpowers.js +117 -0
  22. package/dist/adapters/orchestration/superpowers.js.map +1 -0
  23. package/dist/broker/broker.d.ts +40 -0
  24. package/dist/broker/broker.d.ts.map +1 -0
  25. package/dist/broker/broker.js +181 -0
  26. package/dist/broker/broker.js.map +1 -0
  27. package/dist/broker/compressor.d.ts +7 -0
  28. package/dist/broker/compressor.d.ts.map +1 -0
  29. package/dist/broker/compressor.js +61 -0
  30. package/dist/broker/compressor.js.map +1 -0
  31. package/dist/broker/context-pack.d.ts +126 -0
  32. package/dist/broker/context-pack.d.ts.map +1 -0
  33. package/dist/broker/context-pack.js +103 -0
  34. package/dist/broker/context-pack.js.map +1 -0
  35. package/dist/broker/query-parser.d.ts +17 -0
  36. package/dist/broker/query-parser.d.ts.map +1 -0
  37. package/dist/broker/query-parser.js +127 -0
  38. package/dist/broker/query-parser.js.map +1 -0
  39. package/dist/cli/commands/chat.d.ts +13 -0
  40. package/dist/cli/commands/chat.d.ts.map +1 -0
  41. package/dist/cli/commands/chat.js +264 -0
  42. package/dist/cli/commands/chat.js.map +1 -0
  43. package/dist/cli/commands/config.d.ts +14 -0
  44. package/dist/cli/commands/config.d.ts.map +1 -0
  45. package/dist/cli/commands/config.js +94 -0
  46. package/dist/cli/commands/config.js.map +1 -0
  47. package/dist/cli/commands/memory.d.ts +10 -0
  48. package/dist/cli/commands/memory.d.ts.map +1 -0
  49. package/dist/cli/commands/memory.js +52 -0
  50. package/dist/cli/commands/memory.js.map +1 -0
  51. package/dist/cli/commands/search.d.ts +9 -0
  52. package/dist/cli/commands/search.d.ts.map +1 -0
  53. package/dist/cli/commands/search.js +45 -0
  54. package/dist/cli/commands/search.js.map +1 -0
  55. package/dist/cli/commands/session.d.ts +9 -0
  56. package/dist/cli/commands/session.d.ts.map +1 -0
  57. package/dist/cli/commands/session.js +86 -0
  58. package/dist/cli/commands/session.js.map +1 -0
  59. package/dist/cli/index.d.ts +3 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +77 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/tui/renderer.d.ts +47 -0
  64. package/dist/cli/tui/renderer.d.ts.map +1 -0
  65. package/dist/cli/tui/renderer.js +237 -0
  66. package/dist/cli/tui/renderer.js.map +1 -0
  67. package/dist/hooks/session-start.d.ts +11 -0
  68. package/dist/hooks/session-start.d.ts.map +1 -0
  69. package/dist/hooks/session-start.js +51 -0
  70. package/dist/hooks/session-start.js.map +1 -0
  71. package/dist/hooks/stop.d.ts +11 -0
  72. package/dist/hooks/stop.d.ts.map +1 -0
  73. package/dist/hooks/stop.js +93 -0
  74. package/dist/hooks/stop.js.map +1 -0
  75. package/dist/hooks/user-prompt.d.ts +12 -0
  76. package/dist/hooks/user-prompt.d.ts.map +1 -0
  77. package/dist/hooks/user-prompt.js +46 -0
  78. package/dist/hooks/user-prompt.js.map +1 -0
  79. package/dist/providers/anthropic-api.d.ts +25 -0
  80. package/dist/providers/anthropic-api.d.ts.map +1 -0
  81. package/dist/providers/anthropic-api.js +93 -0
  82. package/dist/providers/anthropic-api.js.map +1 -0
  83. package/dist/providers/claude-cli.d.ts +16 -0
  84. package/dist/providers/claude-cli.d.ts.map +1 -0
  85. package/dist/providers/claude-cli.js +72 -0
  86. package/dist/providers/claude-cli.js.map +1 -0
  87. package/dist/providers/claude-sdk.d.ts +18 -0
  88. package/dist/providers/claude-sdk.d.ts.map +1 -0
  89. package/dist/providers/claude-sdk.js +141 -0
  90. package/dist/providers/claude-sdk.js.map +1 -0
  91. package/dist/providers/interface.d.ts +36 -0
  92. package/dist/providers/interface.d.ts.map +1 -0
  93. package/dist/providers/interface.js +2 -0
  94. package/dist/providers/interface.js.map +1 -0
  95. package/dist/scripts/install-hooks.d.ts +11 -0
  96. package/dist/scripts/install-hooks.d.ts.map +1 -0
  97. package/dist/scripts/install-hooks.js +86 -0
  98. package/dist/scripts/install-hooks.js.map +1 -0
  99. package/dist/session/manager.d.ts +65 -0
  100. package/dist/session/manager.d.ts.map +1 -0
  101. package/dist/session/manager.js +143 -0
  102. package/dist/session/manager.js.map +1 -0
  103. package/dist/session/schema.d.ts +7 -0
  104. package/dist/session/schema.d.ts.map +1 -0
  105. package/dist/session/schema.js +82 -0
  106. package/dist/session/schema.js.map +1 -0
  107. package/dist/utils/exec.d.ts +20 -0
  108. package/dist/utils/exec.d.ts.map +1 -0
  109. package/dist/utils/exec.js +28 -0
  110. package/dist/utils/exec.js.map +1 -0
  111. package/dist/utils/tokens.d.ts +12 -0
  112. package/dist/utils/tokens.d.ts.map +1 -0
  113. package/dist/utils/tokens.js +38 -0
  114. package/dist/utils/tokens.js.map +1 -0
  115. package/package.json +90 -0
  116. package/src/skills/brainstorm.md +33 -0
  117. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interface.js.map
@@ -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