swellai 1.0.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/README.md +711 -0
- package/dist/agents/linear-agent.d.ts +32 -0
- package/dist/agents/linear-agent.d.ts.map +1 -0
- package/dist/agents/linear-agent.js +263 -0
- package/dist/agents/linear-agent.js.map +1 -0
- package/dist/agents/planning-agent.d.ts +36 -0
- package/dist/agents/planning-agent.d.ts.map +1 -0
- package/dist/agents/planning-agent.js +248 -0
- package/dist/agents/planning-agent.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 +102 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +11 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/install.js +257 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/manifest.d.ts +27 -0
- package/dist/cli/manifest.d.ts.map +1 -0
- package/dist/cli/manifest.js +65 -0
- package/dist/cli/manifest.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/claude-agent-sdk.d.ts +73 -0
- package/dist/lib/claude-agent-sdk.d.ts.map +1 -0
- package/dist/lib/claude-agent-sdk.js +114 -0
- package/dist/lib/claude-agent-sdk.js.map +1 -0
- package/dist/lib/conversation-logger.d.ts +66 -0
- package/dist/lib/conversation-logger.d.ts.map +1 -0
- package/dist/lib/conversation-logger.js +159 -0
- package/dist/lib/conversation-logger.js.map +1 -0
- package/dist/lib/opencode.d.ts +68 -0
- package/dist/lib/opencode.d.ts.map +1 -0
- package/dist/lib/opencode.js +151 -0
- package/dist/lib/opencode.js.map +1 -0
- package/dist/lib/turso-schema.d.ts +13 -0
- package/dist/lib/turso-schema.d.ts.map +1 -0
- package/dist/lib/turso-schema.js +69 -0
- package/dist/lib/turso-schema.js.map +1 -0
- package/dist/lib/turso.d.ts +56 -0
- package/dist/lib/turso.d.ts.map +1 -0
- package/dist/lib/turso.js +144 -0
- package/dist/lib/turso.js.map +1 -0
- package/dist/lib/types.d.ts +31 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +20 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +34 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +72 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/scripts/build-templates.d.ts +17 -0
- package/dist/scripts/build-templates.d.ts.map +1 -0
- package/dist/scripts/build-templates.js +132 -0
- package/dist/scripts/build-templates.js.map +1 -0
- package/dist/scripts/claude-agent-runner.d.ts +28 -0
- package/dist/scripts/claude-agent-runner.d.ts.map +1 -0
- package/dist/scripts/claude-agent-runner.js +278 -0
- package/dist/scripts/claude-agent-runner.js.map +1 -0
- package/dist/src/agents/linear-agent.d.ts +32 -0
- package/dist/src/agents/linear-agent.d.ts.map +1 -0
- package/dist/src/agents/linear-agent.js +285 -0
- package/dist/src/agents/linear-agent.js.map +1 -0
- package/dist/src/agents/planning-agent.d.ts +36 -0
- package/dist/src/agents/planning-agent.d.ts.map +1 -0
- package/dist/src/agents/planning-agent.js +248 -0
- package/dist/src/agents/planning-agent.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +102 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/install.d.ts +11 -0
- package/dist/src/cli/install.d.ts.map +1 -0
- package/dist/src/cli/install.js +257 -0
- package/dist/src/cli/install.js.map +1 -0
- package/dist/src/cli/manifest.d.ts +27 -0
- package/dist/src/cli/manifest.d.ts.map +1 -0
- package/dist/src/cli/manifest.js +65 -0
- package/dist/src/cli/manifest.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/claude-agent-sdk.d.ts +73 -0
- package/dist/src/lib/claude-agent-sdk.d.ts.map +1 -0
- package/dist/src/lib/claude-agent-sdk.js +114 -0
- package/dist/src/lib/claude-agent-sdk.js.map +1 -0
- package/dist/src/lib/conversation-logger.d.ts +66 -0
- package/dist/src/lib/conversation-logger.d.ts.map +1 -0
- package/dist/src/lib/conversation-logger.js +159 -0
- package/dist/src/lib/conversation-logger.js.map +1 -0
- package/dist/src/lib/opencode.d.ts +153 -0
- package/dist/src/lib/opencode.d.ts.map +1 -0
- package/dist/src/lib/opencode.js +153 -0
- package/dist/src/lib/opencode.js.map +1 -0
- package/dist/src/lib/turso-schema.d.ts +13 -0
- package/dist/src/lib/turso-schema.d.ts.map +1 -0
- package/dist/src/lib/turso-schema.js +69 -0
- package/dist/src/lib/turso-schema.js.map +1 -0
- package/dist/src/lib/turso.d.ts +56 -0
- package/dist/src/lib/turso.d.ts.map +1 -0
- package/dist/src/lib/turso.js +144 -0
- package/dist/src/lib/turso.js.map +1 -0
- package/dist/src/lib/types.d.ts +31 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +20 -0
- package/dist/src/lib/types.js.map +1 -0
- package/dist/src/lib/utils.d.ts +34 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +72 -0
- package/dist/src/lib/utils.js.map +1 -0
- package/package.json +63 -0
- package/templates/.env.example +51 -0
- package/templates/agents/codebase-analyzer.md +121 -0
- package/templates/agents/codebase-locator.md +105 -0
- package/templates/agents/coding-agent.md +187 -0
- package/templates/agents/debug-agent.md +300 -0
- package/templates/prompts/consolidate-and-create-linear.md +282 -0
- package/templates/prompts/implementation.md +94 -0
- package/templates/prompts/plan-generation.md +171 -0
- package/templates/prompts/review.md +39 -0
- package/templates/prompts/verify.md +80 -0
- package/templates/scripts/claude-agent-runner.js +12887 -0
- package/templates/scripts/detect-runtime.sh +95 -0
- package/templates/scripts/linear-agent.js +1753 -0
- package/templates/scripts/planning-agent.js +1738 -0
- package/templates/workflows/claude-implement.yml +931 -0
- package/templates/workflows/claude-plan.yml +301 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Agent SDK helper module for authentication and query configuration.
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for running Claude Code-style queries using the
|
|
5
|
+
* @anthropic-ai/claude-agent-sdk package, mimicking the behavior of the CLI.
|
|
6
|
+
*/
|
|
7
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
8
|
+
/**
|
|
9
|
+
* Get authentication credentials from environment variables.
|
|
10
|
+
*
|
|
11
|
+
* Checks for CLAUDE_CODE_OAUTH_TOKEN first, then falls back to ANTHROPIC_API_KEY.
|
|
12
|
+
* Sets ANTHROPIC_API_KEY in the environment if OAuth token is found (SDK expects this).
|
|
13
|
+
*
|
|
14
|
+
* @returns Authentication configuration with API key and source
|
|
15
|
+
* @throws Error if neither authentication method is available
|
|
16
|
+
*/
|
|
17
|
+
export function getAuthentication() {
|
|
18
|
+
// Check for OAuth token first (preferred)
|
|
19
|
+
const oauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
20
|
+
if (oauthToken) {
|
|
21
|
+
console.warn("[Auth] Using CLAUDE_CODE_OAUTH_TOKEN for authentication");
|
|
22
|
+
// SDK handles CLAUDE_CODE_OAUTH_TOKEN automatically - don't modify env
|
|
23
|
+
return {
|
|
24
|
+
apiKey: oauthToken,
|
|
25
|
+
source: "oauth",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Fall back to API key
|
|
29
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
30
|
+
if (apiKey) {
|
|
31
|
+
console.warn("[Auth] ⚠️ Using ANTHROPIC_API_KEY for authentication");
|
|
32
|
+
console.warn("[Auth] ⚠️ Consider using CLAUDE_CODE_OAUTH_TOKEN for better integration");
|
|
33
|
+
return {
|
|
34
|
+
apiKey,
|
|
35
|
+
source: "api_key",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// No authentication found
|
|
39
|
+
throw new Error("No authentication found. Please set either:\n" +
|
|
40
|
+
" - CLAUDE_CODE_OAUTH_TOKEN (preferred), or\n" +
|
|
41
|
+
" - ANTHROPIC_API_KEY (fallback)\n");
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run a Claude query with configuration matching the CLI behavior.
|
|
45
|
+
*
|
|
46
|
+
* This function configures the SDK to mimic how the Claude Code CLI works:
|
|
47
|
+
* - Uses the 'claude_code' system prompt preset
|
|
48
|
+
* - Loads project settings (CLAUDE.md files)
|
|
49
|
+
* - Bypasses permission prompts (for automation)
|
|
50
|
+
* - Supports structured output for review mode
|
|
51
|
+
*
|
|
52
|
+
* @param prompt - The prompt to send to Claude
|
|
53
|
+
* @param options - Configuration options for the query
|
|
54
|
+
* @returns AsyncGenerator that yields SDK messages
|
|
55
|
+
*/
|
|
56
|
+
export async function* runClaudeQuery(prompt, options) {
|
|
57
|
+
// Get authentication (also sets ANTHROPIC_API_KEY in process.env)
|
|
58
|
+
getAuthentication();
|
|
59
|
+
// Build SDK options
|
|
60
|
+
const sdkOptions = {
|
|
61
|
+
// Working directory
|
|
62
|
+
cwd: options.cwd,
|
|
63
|
+
// Model configuration
|
|
64
|
+
model: options.model || "claude-opus-4-5-20251101",
|
|
65
|
+
// Use Claude Code preset system prompt
|
|
66
|
+
systemPrompt: {
|
|
67
|
+
type: "preset",
|
|
68
|
+
preset: "claude_code",
|
|
69
|
+
},
|
|
70
|
+
// Load project settings (CLAUDE.md files)
|
|
71
|
+
settingSources: ["project"],
|
|
72
|
+
// Bypass permissions for automation
|
|
73
|
+
permissionMode: "bypassPermissions",
|
|
74
|
+
allowDangerouslySkipPermissions: true,
|
|
75
|
+
// Configure MCP servers if provided
|
|
76
|
+
...(options.mcpServers ? { mcpServers: options.mcpServers } : {}),
|
|
77
|
+
// Configure output format based on mode
|
|
78
|
+
...(options.mode === "review" && options.outputSchema
|
|
79
|
+
? {
|
|
80
|
+
outputFormat: {
|
|
81
|
+
type: "json_schema",
|
|
82
|
+
schema: options.outputSchema,
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
: {}),
|
|
86
|
+
// Merge any additional options
|
|
87
|
+
...options.additionalOptions,
|
|
88
|
+
};
|
|
89
|
+
// Log configuration
|
|
90
|
+
console.error("[Query] Starting Claude query");
|
|
91
|
+
console.error(`[Query] Model: ${sdkOptions.model}`);
|
|
92
|
+
console.error(`[Query] CWD: ${sdkOptions.cwd}`);
|
|
93
|
+
console.error(`[Query] Mode: ${options.mode || "implementation"}`);
|
|
94
|
+
console.error(`[Query] Permission Mode: ${sdkOptions.permissionMode}`);
|
|
95
|
+
if (options.mcpServers) {
|
|
96
|
+
console.error(`[Query] MCP Servers: ${Object.keys(options.mcpServers).join(", ")}`);
|
|
97
|
+
}
|
|
98
|
+
// Create and yield from the query
|
|
99
|
+
const queryGenerator = query({
|
|
100
|
+
prompt,
|
|
101
|
+
options: sdkOptions,
|
|
102
|
+
});
|
|
103
|
+
// Stream all messages
|
|
104
|
+
for await (const message of queryGenerator) {
|
|
105
|
+
// Log the message if logger is provided
|
|
106
|
+
if (options.logger && message.type === "assistant") {
|
|
107
|
+
// Log assistant messages
|
|
108
|
+
const content = typeof message.message === "string" ? message.message : JSON.stringify(message.message);
|
|
109
|
+
options.logger.logMessage("assistant", content);
|
|
110
|
+
}
|
|
111
|
+
yield message;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=claude-agent-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent-sdk.js","sourceRoot":"","sources":["../../src/lib/claude-agent-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation logger for storing agent interactions in Turso.
|
|
3
|
+
*
|
|
4
|
+
* This class provides methods for logging sessions, messages, and tool
|
|
5
|
+
* executions to a Turso database. All operations are fire-and-forget
|
|
6
|
+
* to avoid impacting agent performance.
|
|
7
|
+
*/
|
|
8
|
+
import type { Client } from "@libsql/client";
|
|
9
|
+
export interface SessionInfo {
|
|
10
|
+
id: string;
|
|
11
|
+
agentType: string;
|
|
12
|
+
model: string;
|
|
13
|
+
provider?: string;
|
|
14
|
+
metadata?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface ToolExecutionInfo {
|
|
17
|
+
toolName: string;
|
|
18
|
+
status: "running" | "completed" | "error";
|
|
19
|
+
input?: unknown;
|
|
20
|
+
output?: unknown;
|
|
21
|
+
error?: string;
|
|
22
|
+
startedAt?: Date;
|
|
23
|
+
endedAt?: Date;
|
|
24
|
+
}
|
|
25
|
+
export declare class ConversationLogger {
|
|
26
|
+
private client;
|
|
27
|
+
private sessionId;
|
|
28
|
+
private messageSequence;
|
|
29
|
+
constructor(client: Client);
|
|
30
|
+
/**
|
|
31
|
+
* Start a new logging session.
|
|
32
|
+
*/
|
|
33
|
+
startSession(info: SessionInfo): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Log a conversation message (user prompt or assistant response).
|
|
36
|
+
*/
|
|
37
|
+
logMessage(role: "user" | "assistant" | "tool", content: string, options?: {
|
|
38
|
+
toolName?: string;
|
|
39
|
+
toolInput?: unknown;
|
|
40
|
+
toolOutput?: unknown;
|
|
41
|
+
tokenCount?: number;
|
|
42
|
+
}): Promise<string | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Log a tool execution event.
|
|
45
|
+
*/
|
|
46
|
+
logToolExecution(info: ToolExecutionInfo): Promise<string | null>;
|
|
47
|
+
/**
|
|
48
|
+
* End the current session.
|
|
49
|
+
*/
|
|
50
|
+
endSession(status: "completed" | "error", errorMessage?: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Sync local embedded replica to cloud.
|
|
53
|
+
* Should be called at the end of each session to persist data.
|
|
54
|
+
*/
|
|
55
|
+
syncToCloud(): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Get the current session ID.
|
|
58
|
+
*/
|
|
59
|
+
getSessionId(): string | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a conversation logger if Turso is configured.
|
|
63
|
+
* Returns null if logging is disabled.
|
|
64
|
+
*/
|
|
65
|
+
export declare function createConversationLogger(): Promise<ConversationLogger | null>;
|
|
66
|
+
//# sourceMappingURL=conversation-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-logger.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,eAAe,CAAK;gBAEhB,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpD;;OAEG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,EACnC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9F,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA8BzB;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkCvE;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrF;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;CAG9B;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAanF"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation logger for storing agent interactions in Turso.
|
|
3
|
+
*
|
|
4
|
+
* This class provides methods for logging sessions, messages, and tool
|
|
5
|
+
* executions to a Turso database. All operations are fire-and-forget
|
|
6
|
+
* to avoid impacting agent performance.
|
|
7
|
+
*/
|
|
8
|
+
export class ConversationLogger {
|
|
9
|
+
client;
|
|
10
|
+
sessionId = null;
|
|
11
|
+
messageSequence = 0;
|
|
12
|
+
constructor(client) {
|
|
13
|
+
this.client = client;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Start a new logging session.
|
|
17
|
+
*/
|
|
18
|
+
async startSession(info) {
|
|
19
|
+
this.sessionId = info.id;
|
|
20
|
+
this.messageSequence = 0;
|
|
21
|
+
try {
|
|
22
|
+
await this.client.execute({
|
|
23
|
+
sql: `INSERT INTO sessions (id, agent_type, model, provider, metadata)
|
|
24
|
+
VALUES (?, ?, ?, ?, ?)`,
|
|
25
|
+
args: [
|
|
26
|
+
info.id,
|
|
27
|
+
info.agentType,
|
|
28
|
+
info.model,
|
|
29
|
+
info.provider || null,
|
|
30
|
+
info.metadata ? JSON.stringify(info.metadata) : null,
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error("[ConversationLogger] Failed to start session:", error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Log a conversation message (user prompt or assistant response).
|
|
40
|
+
*/
|
|
41
|
+
async logMessage(role, content, options) {
|
|
42
|
+
if (!this.sessionId) {
|
|
43
|
+
console.error("[ConversationLogger] No active session");
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const id = crypto.randomUUID();
|
|
47
|
+
try {
|
|
48
|
+
await this.client.execute({
|
|
49
|
+
sql: `INSERT INTO messages (id, session_id, sequence, role, content, tool_name, tool_input, tool_output, token_count)
|
|
50
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
51
|
+
args: [
|
|
52
|
+
id,
|
|
53
|
+
this.sessionId,
|
|
54
|
+
++this.messageSequence,
|
|
55
|
+
role,
|
|
56
|
+
content,
|
|
57
|
+
options?.toolName || null,
|
|
58
|
+
options?.toolInput ? JSON.stringify(options.toolInput) : null,
|
|
59
|
+
options?.toolOutput ? JSON.stringify(options.toolOutput) : null,
|
|
60
|
+
options?.tokenCount || null,
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
return id;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error("[ConversationLogger] Failed to log message:", error);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Log a tool execution event.
|
|
72
|
+
*/
|
|
73
|
+
async logToolExecution(info) {
|
|
74
|
+
if (!this.sessionId) {
|
|
75
|
+
console.error("[ConversationLogger] No active session");
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const id = crypto.randomUUID();
|
|
79
|
+
const durationMs = info.startedAt && info.endedAt ? info.endedAt.getTime() - info.startedAt.getTime() : null;
|
|
80
|
+
try {
|
|
81
|
+
await this.client.execute({
|
|
82
|
+
sql: `INSERT INTO tool_executions (id, session_id, tool_name, status, input, output, error, started_at, ended_at, duration_ms)
|
|
83
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
84
|
+
args: [
|
|
85
|
+
id,
|
|
86
|
+
this.sessionId,
|
|
87
|
+
info.toolName,
|
|
88
|
+
info.status,
|
|
89
|
+
info.input ? JSON.stringify(info.input) : null,
|
|
90
|
+
info.output ? JSON.stringify(info.output) : null,
|
|
91
|
+
info.error || null,
|
|
92
|
+
info.startedAt?.toISOString() || new Date().toISOString(),
|
|
93
|
+
info.endedAt?.toISOString() || null,
|
|
94
|
+
durationMs,
|
|
95
|
+
],
|
|
96
|
+
});
|
|
97
|
+
return id;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error("[ConversationLogger] Failed to log tool execution:", error);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* End the current session.
|
|
106
|
+
*/
|
|
107
|
+
async endSession(status, errorMessage) {
|
|
108
|
+
if (!this.sessionId) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
await this.client.execute({
|
|
113
|
+
sql: `UPDATE sessions SET status = ?, error_message = ?, ended_at = datetime('now')
|
|
114
|
+
WHERE id = ?`,
|
|
115
|
+
args: [status, errorMessage || null, this.sessionId],
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error("[ConversationLogger] Failed to end session:", error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Sync local embedded replica to cloud.
|
|
124
|
+
* Should be called at the end of each session to persist data.
|
|
125
|
+
*/
|
|
126
|
+
async syncToCloud() {
|
|
127
|
+
try {
|
|
128
|
+
await this.client.sync();
|
|
129
|
+
console.error("[ConversationLogger] Synced session data to cloud");
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error("[ConversationLogger] Failed to sync to cloud:", error);
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get the current session ID.
|
|
139
|
+
*/
|
|
140
|
+
getSessionId() {
|
|
141
|
+
return this.sessionId;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create a conversation logger if Turso is configured.
|
|
146
|
+
* Returns null if logging is disabled.
|
|
147
|
+
*/
|
|
148
|
+
export async function createConversationLogger() {
|
|
149
|
+
// Import dynamically to avoid circular dependencies
|
|
150
|
+
const { getTursoClient, initializeSchema } = await import("./turso.js");
|
|
151
|
+
const client = await getTursoClient();
|
|
152
|
+
if (!client) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
// Ensure schema is initialized
|
|
156
|
+
await initializeSchema();
|
|
157
|
+
return new ConversationLogger(client);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=conversation-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-logger.js","sourceRoot":"","sources":["../../src/lib/conversation-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode SDK helpers for server setup and event monitoring.
|
|
3
|
+
*/
|
|
4
|
+
import type { ConversationLogger } from "./conversation-logger.js";
|
|
5
|
+
import type { Provider } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* OpenCode client interface for event monitoring
|
|
8
|
+
*/
|
|
9
|
+
export interface OpencodeClient {
|
|
10
|
+
event: {
|
|
11
|
+
subscribe(): Promise<{
|
|
12
|
+
stream: AsyncIterable<{
|
|
13
|
+
type: string;
|
|
14
|
+
properties: Record<string, unknown>;
|
|
15
|
+
}>;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for creating an OpenCode server
|
|
21
|
+
*/
|
|
22
|
+
export interface OpencodeServerOptions {
|
|
23
|
+
provider: Provider;
|
|
24
|
+
apiKey: string;
|
|
25
|
+
model: string;
|
|
26
|
+
agentName: string;
|
|
27
|
+
agentDescription: string;
|
|
28
|
+
agentPrompt: string;
|
|
29
|
+
agentTools?: {
|
|
30
|
+
write?: boolean;
|
|
31
|
+
edit?: boolean;
|
|
32
|
+
bash?: boolean;
|
|
33
|
+
read?: boolean;
|
|
34
|
+
list?: boolean;
|
|
35
|
+
glob?: boolean;
|
|
36
|
+
grep?: boolean;
|
|
37
|
+
webfetch?: boolean;
|
|
38
|
+
[key: string]: boolean | undefined;
|
|
39
|
+
};
|
|
40
|
+
agentPermissions?: {
|
|
41
|
+
edit?: string;
|
|
42
|
+
bash?: string;
|
|
43
|
+
webfetch?: string;
|
|
44
|
+
[key: string]: string | undefined;
|
|
45
|
+
};
|
|
46
|
+
maxSteps?: number;
|
|
47
|
+
linearApiKey?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create and configure an OpenCode server instance
|
|
51
|
+
*
|
|
52
|
+
* @param options - Configuration options for the OpenCode server
|
|
53
|
+
* @returns OpenCode client and server instances
|
|
54
|
+
*/
|
|
55
|
+
export declare function createOpencodeServer(options: OpencodeServerOptions): Promise<{
|
|
56
|
+
client: OpencodeClient;
|
|
57
|
+
server: {
|
|
58
|
+
url: string;
|
|
59
|
+
};
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Setup event monitoring for an OpenCode session
|
|
63
|
+
*
|
|
64
|
+
* @param client - OpenCode client instance
|
|
65
|
+
* @param logger - Optional conversation logger for storing tool executions
|
|
66
|
+
*/
|
|
67
|
+
export declare function setupEventMonitoring(client: OpencodeClient, logger?: ConversationLogger | null): void;
|
|
68
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/lib/opencode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QACL,SAAS,IAAI,OAAO,CAAC;YACnB,MAAM,EAAE,aAAa,CAAC;gBACpB,IAAI,EAAE,MAAM,CAAC;gBACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aACrC,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;KACpC,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CA0D9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,CAAC,EAAE,kBAAkB,GAAG,IAAI,GACjC,IAAI,CA6FN"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode SDK helpers for server setup and event monitoring.
|
|
3
|
+
*/
|
|
4
|
+
import { createOpencode } from "@opencode-ai/sdk";
|
|
5
|
+
/**
|
|
6
|
+
* Create and configure an OpenCode server instance
|
|
7
|
+
*
|
|
8
|
+
* @param options - Configuration options for the OpenCode server
|
|
9
|
+
* @returns OpenCode client and server instances
|
|
10
|
+
*/
|
|
11
|
+
export async function createOpencodeServer(options) {
|
|
12
|
+
const { provider, apiKey, model, agentName, agentDescription, agentPrompt, agentTools = {}, agentPermissions = {}, maxSteps = 30, linearApiKey, } = options;
|
|
13
|
+
// Build OpenCode configuration
|
|
14
|
+
const opcodeConfig = {
|
|
15
|
+
provider: {
|
|
16
|
+
[provider]: {
|
|
17
|
+
options: {
|
|
18
|
+
apiKey,
|
|
19
|
+
timeout: false, // Disable timeout
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
...(linearApiKey && {
|
|
24
|
+
mcp: {
|
|
25
|
+
linear: {
|
|
26
|
+
type: "remote",
|
|
27
|
+
url: "https://mcp.linear.app/mcp",
|
|
28
|
+
headers: {
|
|
29
|
+
Authorization: `Bearer ${linearApiKey}`,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
agent: {
|
|
35
|
+
[agentName]: {
|
|
36
|
+
description: agentDescription,
|
|
37
|
+
mode: "subagent",
|
|
38
|
+
model,
|
|
39
|
+
prompt: agentPrompt,
|
|
40
|
+
tools: agentTools,
|
|
41
|
+
maxSteps,
|
|
42
|
+
permission: agentPermissions,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
console.error("Starting OpenCode server...");
|
|
47
|
+
const { client, server } = await createOpencode({
|
|
48
|
+
hostname: "127.0.0.1",
|
|
49
|
+
port: 0, // Auto-assign port
|
|
50
|
+
config: opcodeConfig,
|
|
51
|
+
});
|
|
52
|
+
console.error(`✓ OpenCode server started at ${server.url}`);
|
|
53
|
+
return { client: client, server };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Setup event monitoring for an OpenCode session
|
|
57
|
+
*
|
|
58
|
+
* @param client - OpenCode client instance
|
|
59
|
+
* @param logger - Optional conversation logger for storing tool executions
|
|
60
|
+
*/
|
|
61
|
+
export function setupEventMonitoring(client, logger) {
|
|
62
|
+
console.error("Setting up event monitoring...");
|
|
63
|
+
(async () => {
|
|
64
|
+
try {
|
|
65
|
+
const events = await client.event.subscribe();
|
|
66
|
+
for await (const event of events.stream) {
|
|
67
|
+
// Monitor tool execution
|
|
68
|
+
if (event.type === "message.part.updated") {
|
|
69
|
+
const part = event.properties.part;
|
|
70
|
+
if (part.type === "tool") {
|
|
71
|
+
const status = part.state.status;
|
|
72
|
+
const toolName = part.tool;
|
|
73
|
+
if (status === "running") {
|
|
74
|
+
const input = JSON.stringify(part.state.input || {}, null, 2);
|
|
75
|
+
console.error(`\n[TOOL] ${toolName} - RUNNING`);
|
|
76
|
+
console.error(` Input: ${input}`);
|
|
77
|
+
// Log to database if logger is available
|
|
78
|
+
if (logger) {
|
|
79
|
+
logger.logToolExecution({
|
|
80
|
+
toolName,
|
|
81
|
+
status: "running",
|
|
82
|
+
input: part.state.input,
|
|
83
|
+
startedAt: new Date(),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (status === "completed") {
|
|
88
|
+
const output = part.state.output?.slice(0, 200) || "(no output)";
|
|
89
|
+
const duration = part.state.time?.end && part.state.time?.start
|
|
90
|
+
? `${((part.state.time.end - part.state.time.start) / 1000).toFixed(2)}s`
|
|
91
|
+
: "unknown";
|
|
92
|
+
console.error(`\n[TOOL] ${toolName} - COMPLETED (${duration})`);
|
|
93
|
+
console.error(` Output preview: ${output}${part.state.output && part.state.output.length > 200 ? "..." : ""}`);
|
|
94
|
+
// Log to database if logger is available
|
|
95
|
+
if (logger) {
|
|
96
|
+
logger.logToolExecution({
|
|
97
|
+
toolName,
|
|
98
|
+
status: "completed",
|
|
99
|
+
input: part.state.input,
|
|
100
|
+
output: part.state.output,
|
|
101
|
+
startedAt: part.state.time?.start ? new Date(part.state.time.start) : undefined,
|
|
102
|
+
endedAt: part.state.time?.end ? new Date(part.state.time.end) : undefined,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (status === "error") {
|
|
107
|
+
console.error(`\n[TOOL] ${toolName} - ERROR`);
|
|
108
|
+
console.error(` Error: ${part.state.error}`);
|
|
109
|
+
// Log to database if logger is available
|
|
110
|
+
if (logger) {
|
|
111
|
+
logger.logToolExecution({
|
|
112
|
+
toolName,
|
|
113
|
+
status: "error",
|
|
114
|
+
input: part.state.input,
|
|
115
|
+
error: part.state.error,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Monitor session status
|
|
122
|
+
if (event.type === "session.status") {
|
|
123
|
+
const status = event.properties.status;
|
|
124
|
+
if (String(status) === "idle") {
|
|
125
|
+
console.error(`\n[STATUS] Session idle`);
|
|
126
|
+
}
|
|
127
|
+
else if (String(status) === "busy") {
|
|
128
|
+
console.error(`\n[STATUS] Session busy (processing)`);
|
|
129
|
+
}
|
|
130
|
+
else if (typeof status === "object" && "attempt" in status) {
|
|
131
|
+
// Retry status
|
|
132
|
+
console.error(`\n[STATUS] Session retrying (attempt ${status.attempt})`);
|
|
133
|
+
if ("message" in status)
|
|
134
|
+
console.error(` Reason: ${status.message}`);
|
|
135
|
+
if ("next" in status)
|
|
136
|
+
console.error(` Next retry in: ${status.next}ms`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Monitor session errors
|
|
140
|
+
if (event.type === "session.error") {
|
|
141
|
+
const error = event.properties.error;
|
|
142
|
+
console.error(`\n[ERROR] Session error:`, error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
console.error("Event monitoring subscription error:", err);
|
|
148
|
+
}
|
|
149
|
+
})();
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/lib/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turso database schema definitions and migration logic.
|
|
3
|
+
*
|
|
4
|
+
* This module defines the database schema for conversation logging
|
|
5
|
+
* and provides idempotent migration functions.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SCHEMA_VERSION = 1;
|
|
8
|
+
/**
|
|
9
|
+
* SQL statements for creating the conversation logging schema.
|
|
10
|
+
* All statements use IF NOT EXISTS for idempotent execution.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SCHEMA_STATEMENTS: string[];
|
|
13
|
+
//# sourceMappingURL=turso-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turso-schema.d.ts","sourceRoot":"","sources":["../../src/lib/turso-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,UA4D7B,CAAC"}
|