poe-code 0.1.26
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 +64 -0
- package/dist/cli/api-client.d.ts +14 -0
- package/dist/cli/api-client.js +140 -0
- package/dist/cli/api-client.js.map +1 -0
- package/dist/cli/chat.d.ts +32 -0
- package/dist/cli/chat.js +2 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/command-runner.d.ts +2 -0
- package/dist/cli/command-runner.js +37 -0
- package/dist/cli/command-runner.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +18 -0
- package/dist/cli/commands/agent.js +84 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/configure-agents.d.ts +3 -0
- package/dist/cli/commands/configure-agents.js +72 -0
- package/dist/cli/commands/configure-agents.js.map +1 -0
- package/dist/cli/commands/configure.d.ts +11 -0
- package/dist/cli/commands/configure.js +150 -0
- package/dist/cli/commands/configure.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.js +45 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/interactive.d.ts +3 -0
- package/dist/cli/commands/interactive.js +17 -0
- package/dist/cli/commands/interactive.js.map +1 -0
- package/dist/cli/commands/login.d.ts +6 -0
- package/dist/cli/commands/login.js +51 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +3 -0
- package/dist/cli/commands/logout.js +31 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/prerequisites.d.ts +3 -0
- package/dist/cli/commands/prerequisites.js +23 -0
- package/dist/cli/commands/prerequisites.js.map +1 -0
- package/dist/cli/commands/query.d.ts +7 -0
- package/dist/cli/commands/query.js +46 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +6 -0
- package/dist/cli/commands/remove.js +80 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/root.d.ts +3 -0
- package/dist/cli/commands/root.js +7 -0
- package/dist/cli/commands/root.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +24 -0
- package/dist/cli/commands/shared.js +61 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands/spawn-worktree.d.ts +6 -0
- package/dist/cli/commands/spawn-worktree.js +91 -0
- package/dist/cli/commands/spawn-worktree.js.map +1 -0
- package/dist/cli/commands/spawn.d.ts +7 -0
- package/dist/cli/commands/spawn.js +112 -0
- package/dist/cli/commands/spawn.js.map +1 -0
- package/dist/cli/commands/test.d.ts +6 -0
- package/dist/cli/commands/test.js +26 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/constants.d.ts +10 -0
- package/dist/cli/constants.js +11 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/container.d.ts +48 -0
- package/dist/cli/container.js +94 -0
- package/dist/cli/container.js.map +1 -0
- package/dist/cli/context.d.ts +37 -0
- package/dist/cli/context.js +198 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/environment.d.ts +19 -0
- package/dist/cli/environment.js +26 -0
- package/dist/cli/environment.js.map +1 -0
- package/dist/cli/error-logger.d.ts +46 -0
- package/dist/cli/error-logger.js +137 -0
- package/dist/cli/error-logger.js.map +1 -0
- package/dist/cli/errors.d.ts +91 -0
- package/dist/cli/errors.js +128 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/file-mentions.d.ts +13 -0
- package/dist/cli/file-mentions.js +87 -0
- package/dist/cli/file-mentions.js.map +1 -0
- package/dist/cli/file-picker-state.d.ts +14 -0
- package/dist/cli/file-picker-state.js +23 -0
- package/dist/cli/file-picker-state.js.map +1 -0
- package/dist/cli/http.d.ts +11 -0
- package/dist/cli/http.js +2 -0
- package/dist/cli/http.js.map +1 -0
- package/dist/cli/interactive-command-runner.d.ts +11 -0
- package/dist/cli/interactive-command-runner.js +142 -0
- package/dist/cli/interactive-command-runner.js.map +1 -0
- package/dist/cli/interactive-launcher.d.ts +2 -0
- package/dist/cli/interactive-launcher.js +404 -0
- package/dist/cli/interactive-launcher.js.map +1 -0
- package/dist/cli/interactive-tasks.d.ts +7 -0
- package/dist/cli/interactive-tasks.js +199 -0
- package/dist/cli/interactive-tasks.js.map +1 -0
- package/dist/cli/interactive.d.ts +19 -0
- package/dist/cli/interactive.js +479 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/logger.d.ts +26 -0
- package/dist/cli/logger.js +87 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/markdown-renderer.d.ts +27 -0
- package/dist/cli/markdown-renderer.js +178 -0
- package/dist/cli/markdown-renderer.js.map +1 -0
- package/dist/cli/markdown-renderer.test.d.ts +1 -0
- package/dist/cli/markdown-renderer.test.js +105 -0
- package/dist/cli/markdown-renderer.test.js.map +1 -0
- package/dist/cli/options.d.ts +30 -0
- package/dist/cli/options.js +84 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/program.d.ts +4 -0
- package/dist/cli/program.js +64 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/prompts.d.ts +23 -0
- package/dist/cli/prompts.js +58 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/service-registry.d.ts +33 -0
- package/dist/cli/service-registry.js +35 -0
- package/dist/cli/service-registry.js.map +1 -0
- package/dist/cli/telemetry.d.ts +15 -0
- package/dist/cli/telemetry.js +45 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/types.d.ts +2 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.js +43 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/publish-placeholder.d.ts +8 -0
- package/dist/commands/publish-placeholder.js +50 -0
- package/dist/commands/publish-placeholder.js.map +1 -0
- package/dist/commands/spawn-worktree.d.ts +25 -0
- package/dist/commands/spawn-worktree.js +139 -0
- package/dist/commands/spawn-worktree.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/claude-code-adapter.d.ts +20 -0
- package/dist/providers/claude-code-adapter.js +48 -0
- package/dist/providers/claude-code-adapter.js.map +1 -0
- package/dist/providers/codex-adapter.d.ts +19 -0
- package/dist/providers/codex-adapter.js +49 -0
- package/dist/providers/codex-adapter.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +13 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/opencode-adapter.d.ts +18 -0
- package/dist/providers/opencode-adapter.js +45 -0
- package/dist/providers/opencode-adapter.js.map +1 -0
- package/dist/providers/roo-code-adapter.d.ts +19 -0
- package/dist/providers/roo-code-adapter.js +70 -0
- package/dist/providers/roo-code-adapter.js.map +1 -0
- package/dist/services/agent-config-manager.d.ts +32 -0
- package/dist/services/agent-config-manager.js +130 -0
- package/dist/services/agent-config-manager.js.map +1 -0
- package/dist/services/agent-registry.d.ts +27 -0
- package/dist/services/agent-registry.js +89 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/agent-session.d.ts +24 -0
- package/dist/services/agent-session.js +107 -0
- package/dist/services/agent-session.js.map +1 -0
- package/dist/services/agent-task-registry.d.ts +131 -0
- package/dist/services/agent-task-registry.js +491 -0
- package/dist/services/agent-task-registry.js.map +1 -0
- package/dist/services/chat.d.ts +94 -0
- package/dist/services/chat.js +241 -0
- package/dist/services/chat.js.map +1 -0
- package/dist/services/claude-code.d.ts +28 -0
- package/dist/services/claude-code.js +155 -0
- package/dist/services/claude-code.js.map +1 -0
- package/dist/services/codex.d.ts +27 -0
- package/dist/services/codex.js +231 -0
- package/dist/services/codex.js.map +1 -0
- package/dist/services/credentials.d.ts +11 -0
- package/dist/services/credentials.js +44 -0
- package/dist/services/credentials.js.map +1 -0
- package/dist/services/mcp-client.d.ts +38 -0
- package/dist/services/mcp-client.js +170 -0
- package/dist/services/mcp-client.js.map +1 -0
- package/dist/services/mcp-manager.d.ts +28 -0
- package/dist/services/mcp-manager.js +157 -0
- package/dist/services/mcp-manager.js.map +1 -0
- package/dist/services/model-strategy.d.ts +99 -0
- package/dist/services/model-strategy.js +182 -0
- package/dist/services/model-strategy.js.map +1 -0
- package/dist/services/opencode.d.ts +25 -0
- package/dist/services/opencode.js +161 -0
- package/dist/services/opencode.js.map +1 -0
- package/dist/services/poe-code.d.ts +7 -0
- package/dist/services/poe-code.js +5 -0
- package/dist/services/poe-code.js.map +1 -0
- package/dist/services/roo-code.d.ts +22 -0
- package/dist/services/roo-code.js +134 -0
- package/dist/services/roo-code.js.map +1 -0
- package/dist/services/service-install.d.ts +21 -0
- package/dist/services/service-install.js +47 -0
- package/dist/services/service-install.js.map +1 -0
- package/dist/services/service-manifest.d.ts +122 -0
- package/dist/services/service-manifest.js +368 -0
- package/dist/services/service-manifest.js.map +1 -0
- package/dist/services/task-logger.d.ts +24 -0
- package/dist/services/task-logger.js +73 -0
- package/dist/services/task-logger.js.map +1 -0
- package/dist/services/task-runner.d.ts +19 -0
- package/dist/services/task-runner.js +157 -0
- package/dist/services/task-runner.js.map +1 -0
- package/dist/services/tools.d.ts +76 -0
- package/dist/services/tools.js +870 -0
- package/dist/services/tools.js.map +1 -0
- package/dist/templates/claude-code/anthropic_key.sh.hbs +2 -0
- package/dist/templates/codex/config.toml.hbs +9 -0
- package/dist/templates/python/env.hbs +3 -0
- package/dist/templates/python/main.py.hbs +17 -0
- package/dist/templates/python/requirements.txt.hbs +2 -0
- package/dist/utils/backup.d.ts +5 -0
- package/dist/utils/backup.js +61 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/command-line.d.ts +1 -0
- package/dist/utils/command-line.js +54 -0
- package/dist/utils/command-line.js.map +1 -0
- package/dist/utils/dry-run.d.ts +38 -0
- package/dist/utils/dry-run.js +211 -0
- package/dist/utils/dry-run.js.map +1 -0
- package/dist/utils/e2e-flags.d.ts +1 -0
- package/dist/utils/e2e-flags.js +9 -0
- package/dist/utils/e2e-flags.js.map +1 -0
- package/dist/utils/file-system.d.ts +21 -0
- package/dist/utils/file-system.js +2 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +42 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/prerequisites.d.ts +41 -0
- package/dist/utils/prerequisites.js +92 -0
- package/dist/utils/prerequisites.js.map +1 -0
- package/dist/utils/templates.d.ts +4 -0
- package/dist/utils/templates.js +22 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/toml.d.ts +8 -0
- package/dist/utils/toml.js +30 -0
- package/dist/utils/toml.js.map +1 -0
- package/dist/utils/worktree.d.ts +40 -0
- package/dist/utils/worktree.js +179 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +84 -0
- package/shared/conversation-layout.cjs +11 -0
- package/shared/conversation-layout.d.ts +7 -0
- package/shared/conversation-layout.js +11 -0
- package/shared/package.json +13 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# poe-code
|
|
2
|
+
|
|
3
|
+
> Fast CLI to wire your local dev tools to the Poe API
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i -g poe-code
|
|
9
|
+
poe-code login
|
|
10
|
+
poe-code configure claude-code
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- 🚀 **90-second setup** for coding agents with Poe API
|
|
16
|
+
- 🤖 **Multiple agents** - Claude Code, Codex, OpenCode
|
|
17
|
+
- 💬 **Interactive mode** for conversational workflows
|
|
18
|
+
- ⚡ **Async spawning** with git worktree support
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm i -g poe-code
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
### Authentication
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
poe-code login
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Configure Coding Agents
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Claude Code
|
|
38
|
+
poe-code configure claude-code
|
|
39
|
+
|
|
40
|
+
# Codex
|
|
41
|
+
poe-code configure codex
|
|
42
|
+
|
|
43
|
+
# OpenCode
|
|
44
|
+
poe-code configure opencode
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Interactive Mode
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
poe-code
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Non-Interactive Mode
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
poe-code agent "Recommend me Python web framework"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Spawn Async Agents
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
poe-code spawn claude-code "What is the best web framework?"
|
|
63
|
+
poe-code spawn-git-worktree claude-code "Build me a random fun game"
|
|
64
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HttpClient } from "./http.js";
|
|
2
|
+
export interface VerifyApiKeyOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
}
|
|
5
|
+
export interface QueryOptions {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
model: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PoeApiClient {
|
|
11
|
+
verify(options: VerifyApiKeyOptions): Promise<void>;
|
|
12
|
+
query(options: QueryOptions): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createPoeApiClient(client: HttpClient): PoeApiClient;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ApiError } from "./errors.js";
|
|
2
|
+
const POE_API_ENDPOINT = "https://api.poe.com/v1/chat/completions";
|
|
3
|
+
export function createPoeApiClient(client) {
|
|
4
|
+
const verify = async (options) => {
|
|
5
|
+
const requestBody = {
|
|
6
|
+
model: "EchoBot",
|
|
7
|
+
messages: [{ role: "user", content: "Ping" }]
|
|
8
|
+
};
|
|
9
|
+
let response;
|
|
10
|
+
let responseBody;
|
|
11
|
+
try {
|
|
12
|
+
response = await client(POE_API_ENDPOINT, {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: {
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
Authorization: `Bearer ${options.apiKey}`
|
|
17
|
+
},
|
|
18
|
+
body: JSON.stringify(requestBody)
|
|
19
|
+
});
|
|
20
|
+
responseBody = await response.json();
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new ApiError("Poe API test failed", {
|
|
23
|
+
httpStatus: response.status,
|
|
24
|
+
endpoint: POE_API_ENDPOINT,
|
|
25
|
+
context: {
|
|
26
|
+
operation: "verify API key",
|
|
27
|
+
requestBody,
|
|
28
|
+
responseBody
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const echoed = extractMessageContent(responseBody);
|
|
33
|
+
if (echoed !== "Ping") {
|
|
34
|
+
throw new ApiError("Poe API test failed: unexpected response payload", {
|
|
35
|
+
httpStatus: response.status,
|
|
36
|
+
endpoint: POE_API_ENDPOINT,
|
|
37
|
+
context: {
|
|
38
|
+
operation: "verify API key",
|
|
39
|
+
expected: "Ping",
|
|
40
|
+
received: echoed,
|
|
41
|
+
responseBody
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error instanceof ApiError) {
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
// Network or other errors
|
|
51
|
+
throw new ApiError(`Failed to connect to Poe API: ${String(error)}`, {
|
|
52
|
+
endpoint: POE_API_ENDPOINT,
|
|
53
|
+
context: {
|
|
54
|
+
operation: "verify API key",
|
|
55
|
+
requestBody,
|
|
56
|
+
originalError: String(error)
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const query = async (options) => {
|
|
62
|
+
const requestBody = {
|
|
63
|
+
model: options.model,
|
|
64
|
+
messages: [{ role: "user", content: options.prompt }]
|
|
65
|
+
};
|
|
66
|
+
let response;
|
|
67
|
+
let responseBody;
|
|
68
|
+
try {
|
|
69
|
+
response = await client(POE_API_ENDPOINT, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: {
|
|
72
|
+
"Content-Type": "application/json",
|
|
73
|
+
Authorization: `Bearer ${options.apiKey}`
|
|
74
|
+
},
|
|
75
|
+
body: JSON.stringify(requestBody)
|
|
76
|
+
});
|
|
77
|
+
responseBody = await response.json();
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
throw new ApiError("Poe API query failed", {
|
|
80
|
+
httpStatus: response.status,
|
|
81
|
+
endpoint: POE_API_ENDPOINT,
|
|
82
|
+
context: {
|
|
83
|
+
operation: "query",
|
|
84
|
+
model: options.model,
|
|
85
|
+
requestBody,
|
|
86
|
+
responseBody
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
const content = extractMessageContent(responseBody);
|
|
91
|
+
if (!content) {
|
|
92
|
+
throw new ApiError("Poe API query failed: missing response content", {
|
|
93
|
+
httpStatus: response.status,
|
|
94
|
+
endpoint: POE_API_ENDPOINT,
|
|
95
|
+
context: {
|
|
96
|
+
operation: "query",
|
|
97
|
+
model: options.model,
|
|
98
|
+
responseBody
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return content;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (error instanceof ApiError) {
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
// Network or other errors
|
|
109
|
+
throw new ApiError(`Failed to connect to Poe API: ${String(error)}`, {
|
|
110
|
+
endpoint: POE_API_ENDPOINT,
|
|
111
|
+
context: {
|
|
112
|
+
operation: "query",
|
|
113
|
+
model: options.model,
|
|
114
|
+
requestBody,
|
|
115
|
+
originalError: String(error)
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
return { verify, query };
|
|
121
|
+
}
|
|
122
|
+
function extractMessageContent(payload) {
|
|
123
|
+
if (!isPoeResponse(payload)) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const [first] = payload.choices;
|
|
127
|
+
if (!first || typeof first !== "object") {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const content = first.message?.content;
|
|
131
|
+
return typeof content === "string" ? content : null;
|
|
132
|
+
}
|
|
133
|
+
function isPoeResponse(value) {
|
|
134
|
+
if (typeof value !== "object" || value === null) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
const candidate = value;
|
|
138
|
+
return Array.isArray(candidate.choices) && candidate.choices.length > 0;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/cli/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FileSystem } from "../utils/file-system.js";
|
|
2
|
+
import type { AgentTask } from "../services/agent-task-registry.js";
|
|
3
|
+
import type { LoggerFn } from "./types.js";
|
|
4
|
+
export interface AgentToolCallEvent {
|
|
5
|
+
toolName: string;
|
|
6
|
+
args: Record<string, unknown>;
|
|
7
|
+
result?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AgentSession {
|
|
11
|
+
getModel?(): string;
|
|
12
|
+
setToolCallCallback?(callback: (event: AgentToolCallEvent) => void): void;
|
|
13
|
+
sendMessage(prompt: string, options?: {
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
onChunk?: (chunk: string) => void;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
content: string;
|
|
18
|
+
}>;
|
|
19
|
+
waitForAllTasks?(): Promise<void>;
|
|
20
|
+
drainCompletedTasks?(): AgentTask[];
|
|
21
|
+
dispose?(): Promise<void> | void;
|
|
22
|
+
}
|
|
23
|
+
export interface ChatServiceFactoryOptions {
|
|
24
|
+
apiKey: string;
|
|
25
|
+
model: string;
|
|
26
|
+
cwd: string;
|
|
27
|
+
homeDir: string;
|
|
28
|
+
fs: FileSystem;
|
|
29
|
+
logger: LoggerFn;
|
|
30
|
+
awaitTasksOnDispose?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export type ChatServiceFactory = (options: ChatServiceFactoryOptions) => Promise<AgentSession> | AgentSession;
|
package/dist/cli/chat.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/cli/chat.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export function createDefaultCommandRunner() {
|
|
3
|
+
return async (command, args) => await new Promise((resolve) => {
|
|
4
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
5
|
+
let stdout = "";
|
|
6
|
+
let stderr = "";
|
|
7
|
+
child.stdout?.setEncoding("utf8");
|
|
8
|
+
child.stdout?.on("data", (chunk) => {
|
|
9
|
+
stdout += chunk.toString();
|
|
10
|
+
});
|
|
11
|
+
child.stderr?.setEncoding("utf8");
|
|
12
|
+
child.stderr?.on("data", (chunk) => {
|
|
13
|
+
stderr += chunk.toString();
|
|
14
|
+
});
|
|
15
|
+
child.on("error", (error) => {
|
|
16
|
+
const exitCode = typeof error.code === "number"
|
|
17
|
+
? error.code
|
|
18
|
+
: typeof error.errno === "number"
|
|
19
|
+
? error.errno
|
|
20
|
+
: 127;
|
|
21
|
+
const message = error instanceof Error ? error.message : String(error ?? "error");
|
|
22
|
+
resolve({
|
|
23
|
+
stdout,
|
|
24
|
+
stderr: stderr ? `${stderr}${message}` : message,
|
|
25
|
+
exitCode
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
child.on("close", (code) => {
|
|
29
|
+
resolve({
|
|
30
|
+
stdout,
|
|
31
|
+
stderr,
|
|
32
|
+
exitCode: code ?? 0
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=command-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-runner.js","sourceRoot":"","sources":["../../src/cli/command-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,MAAM,UAAU,0BAA0B;IACxC,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAgC,EAAE,CAC3D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAClD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAClD,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;YACjD,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC5B,CAAC,CAAC,KAAK,CAAC,IAAI;gBACZ,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;oBACjC,CAAC,CAAC,KAAK,CAAC,KAAK;oBACb,CAAC,CAAC,GAAG,CAAC;YACV,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;gBAChD,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,IAAI,IAAI,CAAC;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { AgentToolCallEvent } from "../chat.js";
|
|
3
|
+
import type { ScopedLogger } from "../logger.js";
|
|
4
|
+
import type { CliContainer } from "../container.js";
|
|
5
|
+
export interface AgentCommandOptions {
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function registerAgentCommand(program: Command, container: CliContainer): void;
|
|
10
|
+
export interface AgentConversationOptions {
|
|
11
|
+
container: CliContainer;
|
|
12
|
+
logger: ScopedLogger;
|
|
13
|
+
text: string;
|
|
14
|
+
model: string;
|
|
15
|
+
apiKey: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function runAgentConversation(options: AgentConversationOptions): Promise<string>;
|
|
18
|
+
export declare function logToolCallEvent(event: AgentToolCallEvent, logger: ScopedLogger): void;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resolveCommandFlags } from "./shared.js";
|
|
2
|
+
import { DEFAULT_QUERY_MODEL } from "../constants.js";
|
|
3
|
+
export function registerAgentCommand(program, container) {
|
|
4
|
+
program
|
|
5
|
+
.command("agent")
|
|
6
|
+
.description("Run a single Poe agent prompt with local tooling support.")
|
|
7
|
+
.argument("<text>", "Prompt text to send to the agent")
|
|
8
|
+
.option("--model <model>", "Model identifier", DEFAULT_QUERY_MODEL)
|
|
9
|
+
.option("--api-key <key>", "Poe API key")
|
|
10
|
+
.action(async (text, options) => {
|
|
11
|
+
const flags = resolveCommandFlags(program);
|
|
12
|
+
const logger = container.loggerFactory.create({
|
|
13
|
+
dryRun: flags.dryRun,
|
|
14
|
+
verbose: flags.verbose,
|
|
15
|
+
scope: "agent"
|
|
16
|
+
});
|
|
17
|
+
const model = options.model ?? DEFAULT_QUERY_MODEL;
|
|
18
|
+
if (flags.dryRun) {
|
|
19
|
+
logger.dryRun(`would run agent with model "${model}" and prompt "${text}".`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const apiKey = await container.options.resolveApiKey({
|
|
23
|
+
value: options.apiKey,
|
|
24
|
+
dryRun: flags.dryRun
|
|
25
|
+
});
|
|
26
|
+
const message = await runAgentConversation({
|
|
27
|
+
container,
|
|
28
|
+
logger,
|
|
29
|
+
text,
|
|
30
|
+
model,
|
|
31
|
+
apiKey
|
|
32
|
+
});
|
|
33
|
+
logger.info(message);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function runAgentConversation(options) {
|
|
37
|
+
const session = await options.container.chatServiceFactory({
|
|
38
|
+
apiKey: options.apiKey,
|
|
39
|
+
model: options.model,
|
|
40
|
+
cwd: options.container.env.cwd,
|
|
41
|
+
homeDir: options.container.env.homeDir,
|
|
42
|
+
fs: options.container.fs,
|
|
43
|
+
logger: (message) => options.logger.info(message),
|
|
44
|
+
awaitTasksOnDispose: true
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
if ("setToolCallCallback" in session && session.setToolCallCallback) {
|
|
48
|
+
session.setToolCallCallback((event) => logToolCallEvent(event, options.logger));
|
|
49
|
+
}
|
|
50
|
+
const response = await session.sendMessage(options.text);
|
|
51
|
+
if ("waitForAllTasks" in session && typeof session.waitForAllTasks === "function") {
|
|
52
|
+
await session.waitForAllTasks();
|
|
53
|
+
}
|
|
54
|
+
if ("drainCompletedTasks" in session && typeof session.drainCompletedTasks === "function") {
|
|
55
|
+
const completed = session.drainCompletedTasks();
|
|
56
|
+
for (const task of completed) {
|
|
57
|
+
const summary = task.result ?? task.error ?? "Task finished.";
|
|
58
|
+
options.logger.info(`Task ${task.id} finished (${task.toolName}): ${summary}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const activeModel = "getModel" in session && session.getModel
|
|
62
|
+
? session.getModel()
|
|
63
|
+
: options.model;
|
|
64
|
+
return `Agent response (${activeModel}): ${response.content}`;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
if ("dispose" in session && session.dispose) {
|
|
68
|
+
await session.dispose();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function logToolCallEvent(event, logger) {
|
|
73
|
+
const serializedArgs = JSON.stringify(event.args);
|
|
74
|
+
if (event.error) {
|
|
75
|
+
logger.error(`Tool ${event.toolName} failed: ${event.error}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (event.result) {
|
|
79
|
+
logger.info(`Tool ${event.toolName} result: ${event.result}`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
logger.verbose(`Tool ${event.toolName} invoked with args ${serializedArgs}`);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { resolveCommandFlags } from "./shared.js";
|
|
2
|
+
import { AgentConfigManager } from "../../services/agent-config-manager.js";
|
|
3
|
+
import { createDefaultAgentRegistry } from "../../services/agent-registry.js";
|
|
4
|
+
export function registerConfigureAgentsCommand(configureCommand, container) {
|
|
5
|
+
configureCommand
|
|
6
|
+
.command("agents")
|
|
7
|
+
.description("Enable or disable agents for the worktree tool.")
|
|
8
|
+
.action(async function () {
|
|
9
|
+
const flags = resolveCommandFlags(this);
|
|
10
|
+
const logger = container.loggerFactory.create({
|
|
11
|
+
scope: "configure:agents",
|
|
12
|
+
dryRun: flags.dryRun,
|
|
13
|
+
verbose: flags.verbose
|
|
14
|
+
});
|
|
15
|
+
const registry = createDefaultAgentRegistry();
|
|
16
|
+
const manager = new AgentConfigManager({
|
|
17
|
+
fs: container.fs,
|
|
18
|
+
homeDir: container.env.homeDir,
|
|
19
|
+
registry
|
|
20
|
+
});
|
|
21
|
+
await manager.loadConfig();
|
|
22
|
+
const enabledEntries = await manager.getEnabledAgents();
|
|
23
|
+
const enabledSet = new Set(enabledEntries.map((entry) => entry.id));
|
|
24
|
+
const detectionResults = await Promise.all(registry.list().map(async (adapter) => {
|
|
25
|
+
if (!adapter.detect) {
|
|
26
|
+
logger.info(`${adapter.id}: available`);
|
|
27
|
+
return { adapter, installed: true };
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const installed = await adapter.detect({
|
|
31
|
+
runCommand: container.commandRunner
|
|
32
|
+
});
|
|
33
|
+
logger.info(`${adapter.id}: ${installed ? "available" : "not detected"}`);
|
|
34
|
+
return { adapter, installed };
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
logger.info(`${adapter.id}: not detected (${message})`);
|
|
39
|
+
return { adapter, installed: false };
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
const promptResponse = await container.prompts({
|
|
43
|
+
name: "agents",
|
|
44
|
+
type: "multiselect",
|
|
45
|
+
message: "Select agents to enable",
|
|
46
|
+
choices: detectionResults.map(({ adapter, installed }) => ({
|
|
47
|
+
title: installed
|
|
48
|
+
? `${adapter.label} (${adapter.id})`
|
|
49
|
+
: `${adapter.label} (${adapter.id}) [not detected]`,
|
|
50
|
+
value: adapter.id,
|
|
51
|
+
selected: enabledSet.has(adapter.id)
|
|
52
|
+
}))
|
|
53
|
+
});
|
|
54
|
+
const selectedValue = promptResponse?.agents;
|
|
55
|
+
const selectedIds = Array.isArray(selectedValue)
|
|
56
|
+
? selectedValue.map((id) => String(id))
|
|
57
|
+
: [];
|
|
58
|
+
if (flags.dryRun) {
|
|
59
|
+
logger.dryRun(`would enable agents: ${selectedIds.length > 0 ? selectedIds.join(", ") : "<none>"}`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const selectedSet = new Set(selectedIds);
|
|
63
|
+
for (const adapter of registry.list()) {
|
|
64
|
+
await manager.updateAgent({
|
|
65
|
+
id: adapter.id,
|
|
66
|
+
enabled: selectedSet.has(adapter.id)
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
logger.info("Updated agent configuration.");
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=configure-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure-agents.js","sourceRoot":"","sources":["../../../src/cli/commands/configure-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CliContainer } from "../container.js";
|
|
3
|
+
export interface ConfigureCommandOptions {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
reasoningEffort?: string;
|
|
7
|
+
configName?: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function registerConfigureCommand(program: Command, container: CliContainer): void;
|
|
11
|
+
export declare function executeConfigure(program: Command, container: CliContainer, service: string, options: ConfigureCommandOptions): Promise<void>;
|