@action-llama/action-llama 0.26.10 → 0.26.12
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/dist/agents/bash-prefix.d.ts +1 -1
- package/dist/agents/bash-prefix.js +2 -2
- package/dist/agents/container-entry.d.ts.map +1 -1
- package/dist/agents/container-entry.js +12 -16
- package/dist/agents/container-entry.js.map +1 -1
- package/dist/agents/credential-setup.d.ts +1 -0
- package/dist/agents/credential-setup.d.ts.map +1 -1
- package/dist/agents/credential-setup.js +21 -0
- package/dist/agents/credential-setup.js.map +1 -1
- package/dist/agents/harness/claude-cli-harness.d.ts +15 -0
- package/dist/agents/harness/claude-cli-harness.d.ts.map +1 -0
- package/dist/agents/harness/claude-cli-harness.js +229 -0
- package/dist/agents/harness/claude-cli-harness.js.map +1 -0
- package/dist/agents/harness/consumer.d.ts +15 -0
- package/dist/agents/harness/consumer.d.ts.map +1 -0
- package/dist/agents/harness/consumer.js +115 -0
- package/dist/agents/harness/consumer.js.map +1 -0
- package/dist/agents/harness/factory.d.ts +9 -0
- package/dist/agents/harness/factory.d.ts.map +1 -0
- package/dist/agents/harness/factory.js +25 -0
- package/dist/agents/harness/factory.js.map +1 -0
- package/dist/agents/harness/index.d.ts +9 -0
- package/dist/agents/harness/index.d.ts.map +1 -0
- package/dist/agents/harness/index.js +5 -0
- package/dist/agents/harness/index.js.map +1 -0
- package/dist/agents/harness/pi-harness.d.ts +18 -0
- package/dist/agents/harness/pi-harness.d.ts.map +1 -0
- package/dist/agents/harness/pi-harness.js +203 -0
- package/dist/agents/harness/pi-harness.js.map +1 -0
- package/dist/agents/harness/types.d.ts +54 -0
- package/dist/agents/harness/types.d.ts.map +1 -0
- package/dist/agents/harness/types.js +2 -0
- package/dist/{chat → agents/harness}/types.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/cli/commands/run-agent.d.ts.map +1 -1
- package/dist/cli/commands/run-agent.js +12 -9
- package/dist/cli/commands/run-agent.js.map +1 -1
- package/dist/cli/commands/webhook.js +1 -5
- package/dist/cli/commands/webhook.js.map +1 -1
- package/dist/cli/main.js +0 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/control/routes/stats.d.ts.map +1 -1
- package/dist/control/routes/stats.js +1 -4
- package/dist/control/routes/stats.js.map +1 -1
- package/dist/events/webhook-setup.d.ts.map +1 -1
- package/dist/events/webhook-setup.js +16 -1
- package/dist/events/webhook-setup.js.map +1 -1
- package/dist/execution/execution.d.ts.map +1 -1
- package/dist/execution/execution.js +10 -0
- package/dist/execution/execution.js.map +1 -1
- package/dist/execution/lock-store.d.ts +4 -2
- package/dist/execution/lock-store.d.ts.map +1 -1
- package/dist/execution/lock-store.js +6 -8
- package/dist/execution/lock-store.js.map +1 -1
- package/dist/frontend/assets/index-CLzpDcLm.css +2 -0
- package/dist/frontend/assets/{index-CDp1ALeQ.js → index-Dx2aJ_Db.js} +2 -2
- package/dist/frontend/assets/index-Dx2aJ_Db.js.map +1 -0
- package/dist/frontend/index.html +2 -2
- package/dist/gateway/frontend.d.ts +2 -2
- package/dist/gateway/frontend.d.ts.map +1 -1
- package/dist/gateway/frontend.js +2 -4
- package/dist/gateway/frontend.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +3 -29
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/middleware/auth.d.ts +1 -1
- package/dist/gateway/middleware/auth.d.ts.map +1 -1
- package/dist/gateway/middleware/auth.js +2 -3
- package/dist/gateway/middleware/auth.js.map +1 -1
- package/dist/gateway/types.d.ts +0 -11
- package/dist/gateway/types.d.ts.map +1 -1
- package/dist/scheduler/gateway-setup.d.ts +0 -3
- package/dist/scheduler/gateway-setup.d.ts.map +1 -1
- package/dist/scheduler/gateway-setup.js +1 -43
- package/dist/scheduler/gateway-setup.js.map +1 -1
- package/dist/scheduler/index.js +4 -3
- package/dist/scheduler/index.js.map +1 -1
- package/dist/shared/config/load-agent.d.ts.map +1 -1
- package/dist/shared/config/load-agent.js +10 -0
- package/dist/shared/config/load-agent.js.map +1 -1
- package/dist/shared/config/load-project.d.ts.map +1 -1
- package/dist/shared/config/load-project.js +8 -0
- package/dist/shared/config/load-project.js.map +1 -1
- package/dist/shared/config/types.d.ts +7 -1
- package/dist/shared/config/types.d.ts.map +1 -1
- package/dist/shared/validation.d.ts.map +1 -1
- package/dist/shared/validation.js +18 -3
- package/dist/shared/validation.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +0 -4
- package/dist/tui/App.js.map +1 -1
- package/dist/webhooks/types.d.ts +1 -0
- package/dist/webhooks/types.d.ts.map +1 -1
- package/docker/Dockerfile +2 -1
- package/package.json +1 -1
- package/dist/agents/chat-entry.d.ts +0 -9
- package/dist/agents/chat-entry.d.ts.map +0 -1
- package/dist/agents/chat-entry.js +0 -165
- package/dist/agents/chat-entry.js.map +0 -1
- package/dist/agents/session-factory.d.ts +0 -13
- package/dist/agents/session-factory.d.ts.map +0 -1
- package/dist/agents/session-factory.js +0 -28
- package/dist/agents/session-factory.js.map +0 -1
- package/dist/chat/container-launcher.d.ts +0 -38
- package/dist/chat/container-launcher.d.ts.map +0 -1
- package/dist/chat/container-launcher.js +0 -120
- package/dist/chat/container-launcher.js.map +0 -1
- package/dist/chat/event-mapper.d.ts +0 -27
- package/dist/chat/event-mapper.d.ts.map +0 -1
- package/dist/chat/event-mapper.js +0 -56
- package/dist/chat/event-mapper.js.map +0 -1
- package/dist/chat/ink-adapter.d.ts +0 -9
- package/dist/chat/ink-adapter.d.ts.map +0 -1
- package/dist/chat/ink-adapter.js +0 -120
- package/dist/chat/ink-adapter.js.map +0 -1
- package/dist/chat/local-transport.d.ts +0 -28
- package/dist/chat/local-transport.d.ts.map +0 -1
- package/dist/chat/local-transport.js +0 -68
- package/dist/chat/local-transport.js.map +0 -1
- package/dist/chat/remote-transport.d.ts +0 -30
- package/dist/chat/remote-transport.d.ts.map +0 -1
- package/dist/chat/remote-transport.js +0 -110
- package/dist/chat/remote-transport.js.map +0 -1
- package/dist/chat/routes.d.ts +0 -10
- package/dist/chat/routes.d.ts.map +0 -1
- package/dist/chat/routes.js +0 -94
- package/dist/chat/routes.js.map +0 -1
- package/dist/chat/session-manager.d.ts +0 -22
- package/dist/chat/session-manager.d.ts.map +0 -1
- package/dist/chat/session-manager.js +0 -77
- package/dist/chat/session-manager.js.map +0 -1
- package/dist/chat/transport.d.ts +0 -15
- package/dist/chat/transport.d.ts.map +0 -1
- package/dist/chat/transport.js +0 -5
- package/dist/chat/transport.js.map +0 -1
- package/dist/chat/types.d.ts +0 -51
- package/dist/chat/types.d.ts.map +0 -1
- package/dist/chat/types.js +0 -7
- package/dist/chat/validation.d.ts +0 -30
- package/dist/chat/validation.d.ts.map +0 -1
- package/dist/chat/validation.js +0 -79
- package/dist/chat/validation.js.map +0 -1
- package/dist/chat/ws-handler.d.ts +0 -32
- package/dist/chat/ws-handler.d.ts.map +0 -1
- package/dist/chat/ws-handler.js +0 -234
- package/dist/chat/ws-handler.js.map +0 -1
- package/dist/cli/commands/chat.d.ts +0 -7
- package/dist/cli/commands/chat.d.ts.map +0 -1
- package/dist/cli/commands/chat.js +0 -436
- package/dist/cli/commands/chat.js.map +0 -1
- package/dist/frontend/assets/index-CDp1ALeQ.js.map +0 -1
- package/dist/frontend/assets/index-EMdmdqAZ.css +0 -2
- package/dist/gateway/routes/chat.d.ts +0 -32
- package/dist/gateway/routes/chat.d.ts.map +0 -1
- package/dist/gateway/routes/chat.js +0 -24
- package/dist/gateway/routes/chat.js.map +0 -1
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
import { resolve, join } from "path";
|
|
2
|
-
import { readFileSync, existsSync, mkdirSync, writeFileSync, rmSync } from "fs";
|
|
3
|
-
import { tmpdir, homedir } from "os";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
import { loadCredentialField, loadCredentialFields, parseCredentialRef } from "../../shared/credentials.js";
|
|
6
|
-
import { discoverAgents, loadAgentConfig, loadGlobalConfig } from "../../shared/config.js";
|
|
7
|
-
import { builtinCredentials } from "../../credentials/builtins/index.js";
|
|
8
|
-
import { BASH_COMMAND_PREFIX, ensureBinDir } from "../../agents/bash-prefix.js";
|
|
9
|
-
function resolvePackageRoot() {
|
|
10
|
-
const thisFile = fileURLToPath(import.meta.url);
|
|
11
|
-
return resolve(thisFile, "..", "..", "..", "..");
|
|
12
|
-
}
|
|
13
|
-
function loadExampleTemplate(agentType) {
|
|
14
|
-
const dir = resolve(resolvePackageRoot(), "docs", "examples", agentType);
|
|
15
|
-
const skillPath = resolve(dir, "SKILL.md");
|
|
16
|
-
if (!existsSync(skillPath))
|
|
17
|
-
return undefined;
|
|
18
|
-
return {
|
|
19
|
-
skill: readFileSync(skillPath, "utf-8"),
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
const AL_KEYBINDINGS = {
|
|
23
|
-
newLine: ["shift+enter", "alt+enter"],
|
|
24
|
-
followUp: [],
|
|
25
|
-
};
|
|
26
|
-
function buildNoAgentsContext() {
|
|
27
|
-
const templates = ["dev", "reviewer", "devops"];
|
|
28
|
-
const templateSections = [];
|
|
29
|
-
for (const name of templates) {
|
|
30
|
-
const tpl = loadExampleTemplate(name);
|
|
31
|
-
if (!tpl)
|
|
32
|
-
continue;
|
|
33
|
-
templateSections.push(`### Template: ${name}\n\n` +
|
|
34
|
-
`#### SKILL.md\n\n\`\`\`markdown\n${tpl.skill.trim()}\n\`\`\``);
|
|
35
|
-
}
|
|
36
|
-
return `
|
|
37
|
-
## Console Mode — No Agents Yet
|
|
38
|
-
|
|
39
|
-
This project has no agents yet. The user has just opened the console to create their first agent.
|
|
40
|
-
|
|
41
|
-
### Available templates
|
|
42
|
-
|
|
43
|
-
1. **dev** — Picks up GitHub issues labeled with a trigger label, implements the changes, and opens PRs
|
|
44
|
-
2. **reviewer** — Reviews open pull requests, approves good ones, and requests changes on problematic ones
|
|
45
|
-
3. **devops** — Monitors CI/CD failures and Sentry errors, then files deduplicated GitHub issues
|
|
46
|
-
4. **custom** — Start from scratch with a blank SKILL.md
|
|
47
|
-
|
|
48
|
-
### Creating an agent
|
|
49
|
-
|
|
50
|
-
When the user picks a template:
|
|
51
|
-
|
|
52
|
-
1. **Ask what they need** — which template, which repos, any customization
|
|
53
|
-
2. **Create the agent directory** (\`agents/<name>/\`)
|
|
54
|
-
3. **Write SKILL.md** — a single file with YAML frontmatter (config) and markdown body (instructions). Use the template below as a starting point. Customize the frontmatter \`params\` based on the user's answers (repos, triggerLabel, assignee, etc.). Always include a \`models:\` field listing named models from \`config.toml [models.*]\` — e.g. \`models: [sonnet]\`.
|
|
55
|
-
4. **Create a Dockerfile if needed** — analyze the SKILL.md to determine what CLI tools the agent needs. The base image (\`al-agent\`) is Alpine-based (\`node:20-alpine\`) and includes: Node.js, git, curl, jq, openssh-client, ca-certificates. If the agent needs anything else (e.g. \`gh\` CLI), create a Dockerfile:
|
|
56
|
-
|
|
57
|
-
\`\`\`dockerfile
|
|
58
|
-
FROM al-agent
|
|
59
|
-
USER root
|
|
60
|
-
RUN apk add --no-cache github-cli
|
|
61
|
-
USER node
|
|
62
|
-
\`\`\`
|
|
63
|
-
|
|
64
|
-
5. **Tell the user to run \`al doctor\`** to set up any missing credentials. Do NOT check for credentials yourself or run any shell commands to verify them.
|
|
65
|
-
|
|
66
|
-
### Credentials in SKILL.md
|
|
67
|
-
|
|
68
|
-
Reference credentials by type name (e.g. \`"github_token"\`, \`"git_ssh"\`). The instance is resolved automatically at runtime. Do not worry about whether credentials exist yet — \`al doctor\` handles that.
|
|
69
|
-
|
|
70
|
-
${templateSections.join("\n\n")}
|
|
71
|
-
`;
|
|
72
|
-
}
|
|
73
|
-
const NO_AGENTS_INITIAL_MESSAGE = `Help me create my first agent.`;
|
|
74
|
-
export async function execute(opts) {
|
|
75
|
-
// Ensure agent shell scripts (al-bash-init.sh, etc.) are on PATH for local sessions.
|
|
76
|
-
ensureBinDir();
|
|
77
|
-
if (opts.agent) {
|
|
78
|
-
// Remote mode: when --env is set and gateway URL exists, use RemoteTransport
|
|
79
|
-
if (opts.env) {
|
|
80
|
-
const globalConfig = loadGlobalConfig(resolve(opts.project), opts.env);
|
|
81
|
-
const gatewayUrl = globalConfig.gateway?.url;
|
|
82
|
-
if (gatewayUrl) {
|
|
83
|
-
await executeRemoteChat(opts, gatewayUrl);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
await executeAgentChat(opts);
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
await executeProjectChat(opts);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
// Agent-scoped chat: load agent credentials/environment, interactive session
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
async function executeAgentChat(opts) {
|
|
97
|
-
const projectPath = resolve(opts.project);
|
|
98
|
-
const agentName = opts.agent;
|
|
99
|
-
const globalConfig = loadGlobalConfig(projectPath, opts.env);
|
|
100
|
-
// Validate agent exists
|
|
101
|
-
const agentNames = discoverAgents(projectPath);
|
|
102
|
-
if (!agentNames.includes(agentName)) {
|
|
103
|
-
const available = agentNames.length > 0 ? `Available agents: ${agentNames.join(", ")}` : "No agents found.";
|
|
104
|
-
throw new Error(`Agent "${agentName}" not found. ${available}`);
|
|
105
|
-
}
|
|
106
|
-
const agentConfig = loadAgentConfig(projectPath, agentName);
|
|
107
|
-
// Load and inject credentials as env vars (mirrors container-entry.ts)
|
|
108
|
-
const injectedEnvVars = [];
|
|
109
|
-
const cleanupPaths = [];
|
|
110
|
-
for (const credRef of agentConfig.credentials) {
|
|
111
|
-
const { type, instance } = parseCredentialRef(credRef);
|
|
112
|
-
const fields = await loadCredentialFields(type, instance);
|
|
113
|
-
if (!fields)
|
|
114
|
-
continue;
|
|
115
|
-
const def = builtinCredentials[type];
|
|
116
|
-
if (!def?.envVars)
|
|
117
|
-
continue;
|
|
118
|
-
for (const [fieldName, envVar] of Object.entries(def.envVars)) {
|
|
119
|
-
if (fields[fieldName]) {
|
|
120
|
-
process.env[envVar] = fields[fieldName];
|
|
121
|
-
injectedEnvVars.push(envVar);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// Special case: github_token also sets GH_TOKEN alias
|
|
125
|
-
if (type === "github_token" && fields.token) {
|
|
126
|
-
process.env.GH_TOKEN = fields.token;
|
|
127
|
-
injectedEnvVars.push("GH_TOKEN");
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Configure git HTTPS credential helper
|
|
131
|
-
if (process.env.GITHUB_TOKEN) {
|
|
132
|
-
process.env.GIT_TERMINAL_PROMPT = "0";
|
|
133
|
-
injectedEnvVars.push("GIT_TERMINAL_PROMPT");
|
|
134
|
-
const idx = parseInt(process.env.GIT_CONFIG_COUNT || "0", 10);
|
|
135
|
-
process.env.GIT_CONFIG_COUNT = String(idx + 1);
|
|
136
|
-
process.env[`GIT_CONFIG_KEY_${idx}`] = "credential.helper";
|
|
137
|
-
process.env[`GIT_CONFIG_VALUE_${idx}`] = `!f() { echo username=x-access-token; echo password=$GITHUB_TOKEN; }; f`;
|
|
138
|
-
injectedEnvVars.push("GIT_CONFIG_COUNT", `GIT_CONFIG_KEY_${idx}`, `GIT_CONFIG_VALUE_${idx}`);
|
|
139
|
-
}
|
|
140
|
-
// Set up SSH key for git if git_ssh credential exists
|
|
141
|
-
const gitSshRef = agentConfig.credentials.find((ref) => parseCredentialRef(ref).type === "git_ssh");
|
|
142
|
-
if (gitSshRef) {
|
|
143
|
-
const { instance } = parseCredentialRef(gitSshRef);
|
|
144
|
-
const sshKey = await loadCredentialField("git_ssh", instance, "id_rsa");
|
|
145
|
-
if (sshKey) {
|
|
146
|
-
const sshDir = resolve(tmpdir(), `al-chat-ssh-${process.pid}`);
|
|
147
|
-
mkdirSync(sshDir, { recursive: true, mode: 0o700 });
|
|
148
|
-
const keyPath = resolve(sshDir, "id_rsa");
|
|
149
|
-
writeFileSync(keyPath, sshKey + "\n", { mode: 0o600 });
|
|
150
|
-
process.env.GIT_SSH_COMMAND = `ssh -i "${keyPath}" -o StrictHostKeyChecking=accept-new -o IdentitiesOnly=yes`;
|
|
151
|
-
injectedEnvVars.push("GIT_SSH_COMMAND");
|
|
152
|
-
cleanupPaths.push(sshDir);
|
|
153
|
-
}
|
|
154
|
-
const gitName = await loadCredentialField("git_ssh", instance, "username");
|
|
155
|
-
if (gitName) {
|
|
156
|
-
process.env.GIT_AUTHOR_NAME = gitName;
|
|
157
|
-
process.env.GIT_COMMITTER_NAME = gitName;
|
|
158
|
-
injectedEnvVars.push("GIT_AUTHOR_NAME", "GIT_COMMITTER_NAME");
|
|
159
|
-
}
|
|
160
|
-
const gitEmail = await loadCredentialField("git_ssh", instance, "email");
|
|
161
|
-
if (gitEmail) {
|
|
162
|
-
process.env.GIT_AUTHOR_EMAIL = gitEmail;
|
|
163
|
-
process.env.GIT_COMMITTER_EMAIL = gitEmail;
|
|
164
|
-
injectedEnvVars.push("GIT_AUTHOR_EMAIL", "GIT_COMMITTER_EMAIL");
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// Probe gateway and warn if not reachable
|
|
168
|
-
const gatewayUrl = globalConfig.gateway?.url || `http://localhost:${globalConfig.gateway?.port || 8080}`;
|
|
169
|
-
{
|
|
170
|
-
const reachable = await probeGateway(gatewayUrl);
|
|
171
|
-
if (!reachable) {
|
|
172
|
-
console.log(`\u26a0 No gateway detected at ${gatewayUrl}. Resource locks, agent calls, and signals are unavailable.\n` +
|
|
173
|
-
` Start the scheduler with \`al start\` to enable these features.\n`);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Load SKILL.md body for context (but not as a prompt — user drives the session)
|
|
177
|
-
const skillFile = resolve(projectPath, "agents", agentName, "SKILL.md");
|
|
178
|
-
const skillContent = existsSync(skillFile)
|
|
179
|
-
? readFileSync(skillFile, "utf-8")
|
|
180
|
-
: undefined;
|
|
181
|
-
const credSummary = agentConfig.credentials
|
|
182
|
-
.map((ref) => {
|
|
183
|
-
const { type } = parseCredentialRef(ref);
|
|
184
|
-
const def = builtinCredentials[type];
|
|
185
|
-
return def?.agentContext ? `- ${def.agentContext}` : `- ${ref}`;
|
|
186
|
-
})
|
|
187
|
-
.join("\n");
|
|
188
|
-
let fullContext = `# Agent: ${agentName}\n\nYou are in an interactive session scoped to the "${agentName}" agent's environment.\n`;
|
|
189
|
-
fullContext += `The agent's credentials have been loaded and are available as environment variables.\n\n`;
|
|
190
|
-
fullContext += `## Loaded Credentials\n\n${credSummary}\n`;
|
|
191
|
-
if (agentConfig.params && Object.keys(agentConfig.params).length > 0) {
|
|
192
|
-
fullContext += `\n## Agent Params\n\n\`\`\`json\n${JSON.stringify(agentConfig.params, null, 2)}\n\`\`\`\n`;
|
|
193
|
-
}
|
|
194
|
-
if (skillContent) {
|
|
195
|
-
fullContext += `\n## Agent SKILL.md (reference — not auto-executed)\n\n${skillContent}\n`;
|
|
196
|
-
}
|
|
197
|
-
// Suppress pi-coding-agent's "Update Available" banner
|
|
198
|
-
process.env.PI_SKIP_VERSION_CHECK = "1";
|
|
199
|
-
ensureKeybindings();
|
|
200
|
-
const keybindings = readKeybindings();
|
|
201
|
-
printShortcuts(keybindings);
|
|
202
|
-
const { AuthStorage, createAgentSession, DefaultResourceLoader, SessionManager, SettingsManager, createCodingTools, InteractiveMode, } = await import("@mariozechner/pi-coding-agent");
|
|
203
|
-
const { getModel } = await import("@mariozechner/pi-ai");
|
|
204
|
-
const modelConfig = agentConfig.models[0];
|
|
205
|
-
const authStorage = AuthStorage.create();
|
|
206
|
-
if (modelConfig.authType !== "pi_auth") {
|
|
207
|
-
const credentialType = `${modelConfig.provider}_key`;
|
|
208
|
-
const credential = await loadCredentialField(credentialType, "default", "token");
|
|
209
|
-
if (credential) {
|
|
210
|
-
authStorage.setRuntimeApiKey(modelConfig.provider, credential);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
const model = getModel(modelConfig.provider, modelConfig.model);
|
|
214
|
-
const contextFile = skillFile;
|
|
215
|
-
const resourceLoader = new DefaultResourceLoader({
|
|
216
|
-
noExtensions: true,
|
|
217
|
-
agentsFilesOverride: () => ({
|
|
218
|
-
agentsFiles: [{ path: contextFile, content: fullContext }],
|
|
219
|
-
}),
|
|
220
|
-
});
|
|
221
|
-
await resourceLoader.reload();
|
|
222
|
-
const settingsManager = SettingsManager.inMemory({
|
|
223
|
-
compaction: { enabled: true },
|
|
224
|
-
retry: { enabled: true, maxRetries: 2 },
|
|
225
|
-
quietStartup: true,
|
|
226
|
-
hideThinkingBlock: true,
|
|
227
|
-
});
|
|
228
|
-
// Use the agent's directory as the working directory
|
|
229
|
-
const agentDir = resolve(projectPath, "agents", agentName);
|
|
230
|
-
const { session } = await createAgentSession({
|
|
231
|
-
cwd: agentDir,
|
|
232
|
-
model,
|
|
233
|
-
thinkingLevel: modelConfig.thinkingLevel,
|
|
234
|
-
authStorage,
|
|
235
|
-
resourceLoader,
|
|
236
|
-
tools: createCodingTools(agentDir, {
|
|
237
|
-
bash: { commandPrefix: BASH_COMMAND_PREFIX },
|
|
238
|
-
}),
|
|
239
|
-
sessionManager: SessionManager.inMemory(),
|
|
240
|
-
settingsManager,
|
|
241
|
-
});
|
|
242
|
-
const initialMessage = `Interactive session for agent "${agentName}". What would you like to do?`;
|
|
243
|
-
const mode = new InteractiveMode(session, { initialMessage });
|
|
244
|
-
try {
|
|
245
|
-
await mode.run();
|
|
246
|
-
}
|
|
247
|
-
finally {
|
|
248
|
-
// Clean up injected env vars
|
|
249
|
-
for (const envVar of injectedEnvVars) {
|
|
250
|
-
delete process.env[envVar];
|
|
251
|
-
}
|
|
252
|
-
// Clean up temp SSH keys
|
|
253
|
-
for (const p of cleanupPaths) {
|
|
254
|
-
try {
|
|
255
|
-
rmSync(p, { recursive: true });
|
|
256
|
-
}
|
|
257
|
-
catch { /* best-effort */ }
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// ---------------------------------------------------------------------------
|
|
262
|
-
// Project-level chat: manage agents, create new ones (original behavior)
|
|
263
|
-
// ---------------------------------------------------------------------------
|
|
264
|
-
async function executeProjectChat(opts) {
|
|
265
|
-
const projectPath = resolve(opts.project);
|
|
266
|
-
const agentsFile = resolve(projectPath, "AGENTS.md");
|
|
267
|
-
const agentsContent = existsSync(agentsFile)
|
|
268
|
-
? readFileSync(agentsFile, "utf-8")
|
|
269
|
-
: undefined;
|
|
270
|
-
// Collect agent summaries for context
|
|
271
|
-
const agents = discoverAgents(projectPath);
|
|
272
|
-
const agentSummaries = agents.map((name) => {
|
|
273
|
-
try {
|
|
274
|
-
const config = loadAgentConfig(projectPath, name);
|
|
275
|
-
return `- ${name}: schedule=${config.schedule || "webhook-only"}`;
|
|
276
|
-
}
|
|
277
|
-
catch {
|
|
278
|
-
return `- ${name}: (could not load config)`;
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
// Build initial message based on whether agents exist
|
|
282
|
-
let initialMessage;
|
|
283
|
-
if (agents.length === 0) {
|
|
284
|
-
initialMessage = NO_AGENTS_INITIAL_MESSAGE;
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
const agentList = agentSummaries.map((s) => ` ${s}`).join("\n");
|
|
288
|
-
initialMessage = `I have ${agents.length} agent${agents.length === 1 ? "" : "s"} configured:\n\n${agentList}\n\nWhat would you like to do? I can help you create a new agent, edit an existing agent's config or prompt, or troubleshoot issues.`;
|
|
289
|
-
}
|
|
290
|
-
// Suppress pi-coding-agent's "Update Available" banner — not relevant to al console users
|
|
291
|
-
process.env.PI_SKIP_VERSION_CHECK = "1";
|
|
292
|
-
// Ensure keybindings.json exists with our defaults (Option+Enter = new line)
|
|
293
|
-
ensureKeybindings();
|
|
294
|
-
// Read effective keybindings to display accurate shortcuts
|
|
295
|
-
const keybindings = readKeybindings();
|
|
296
|
-
printShortcuts(keybindings);
|
|
297
|
-
const { AuthStorage, createAgentSession, DefaultResourceLoader, SessionManager, SettingsManager, createCodingTools, InteractiveMode, } = await import("@mariozechner/pi-coding-agent");
|
|
298
|
-
const { getModel } = await import("@mariozechner/pi-ai");
|
|
299
|
-
const globalConfig = loadGlobalConfig(projectPath);
|
|
300
|
-
// Use the first named model for project-level chat
|
|
301
|
-
const modelNames = globalConfig.models ? Object.keys(globalConfig.models) : [];
|
|
302
|
-
const modelConfig = modelNames.length > 0
|
|
303
|
-
? globalConfig.models[modelNames[0]]
|
|
304
|
-
: { provider: "anthropic", model: "claude-sonnet-4-20250514", thinkingLevel: "medium", authType: "api_key" };
|
|
305
|
-
const authStorage = AuthStorage.create();
|
|
306
|
-
if (modelConfig.authType !== "pi_auth") {
|
|
307
|
-
const credentialType = `${modelConfig.provider}_key`;
|
|
308
|
-
const credential = await loadCredentialField(credentialType, "default", "token");
|
|
309
|
-
if (credential) {
|
|
310
|
-
authStorage.setRuntimeApiKey(modelConfig.provider, credential);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
const model = getModel(modelConfig.provider, modelConfig.model);
|
|
314
|
-
// Load AGENTS.md context, appending agent summaries or no-agents guidance
|
|
315
|
-
let fullContext = agentsContent || "";
|
|
316
|
-
if (agents.length === 0) {
|
|
317
|
-
fullContext += buildNoAgentsContext();
|
|
318
|
-
}
|
|
319
|
-
else if (agentSummaries.length > 0) {
|
|
320
|
-
fullContext += `\n\n## Current Agents\n\n${agentSummaries.join("\n")}`;
|
|
321
|
-
}
|
|
322
|
-
const resourceLoader = new DefaultResourceLoader({
|
|
323
|
-
noExtensions: true,
|
|
324
|
-
...(fullContext
|
|
325
|
-
? {
|
|
326
|
-
agentsFilesOverride: () => ({
|
|
327
|
-
agentsFiles: [{ path: agentsFile, content: fullContext }],
|
|
328
|
-
}),
|
|
329
|
-
}
|
|
330
|
-
: {}),
|
|
331
|
-
});
|
|
332
|
-
await resourceLoader.reload();
|
|
333
|
-
const settingsManager = SettingsManager.inMemory({
|
|
334
|
-
compaction: { enabled: true },
|
|
335
|
-
retry: { enabled: true, maxRetries: 2 },
|
|
336
|
-
quietStartup: true,
|
|
337
|
-
hideThinkingBlock: true,
|
|
338
|
-
});
|
|
339
|
-
const { session } = await createAgentSession({
|
|
340
|
-
cwd: projectPath,
|
|
341
|
-
model,
|
|
342
|
-
thinkingLevel: modelConfig.thinkingLevel,
|
|
343
|
-
authStorage,
|
|
344
|
-
resourceLoader,
|
|
345
|
-
tools: createCodingTools(projectPath, {
|
|
346
|
-
bash: { commandPrefix: BASH_COMMAND_PREFIX },
|
|
347
|
-
}),
|
|
348
|
-
sessionManager: SessionManager.inMemory(),
|
|
349
|
-
settingsManager,
|
|
350
|
-
});
|
|
351
|
-
const mode = new InteractiveMode(session, { initialMessage });
|
|
352
|
-
await mode.run();
|
|
353
|
-
}
|
|
354
|
-
// ---------------------------------------------------------------------------
|
|
355
|
-
// Remote chat: connect to gateway via WebSocket
|
|
356
|
-
// ---------------------------------------------------------------------------
|
|
357
|
-
async function executeRemoteChat(opts, gatewayUrl) {
|
|
358
|
-
const { ensureGatewayApiKey } = await import("../../control/api-key.js");
|
|
359
|
-
const { key: apiKey } = await ensureGatewayApiKey();
|
|
360
|
-
if (!apiKey) {
|
|
361
|
-
throw new Error("Gateway API key not found. Run 'al doctor' to configure it.");
|
|
362
|
-
}
|
|
363
|
-
console.log(`Connecting to ${gatewayUrl} for agent "${opts.agent}"...`);
|
|
364
|
-
const { RemoteTransport } = await import("../../chat/remote-transport.js");
|
|
365
|
-
const { runChatTUI } = await import("../../chat/ink-adapter.js");
|
|
366
|
-
const transport = new RemoteTransport({
|
|
367
|
-
gatewayUrl,
|
|
368
|
-
agentName: opts.agent,
|
|
369
|
-
apiKey,
|
|
370
|
-
});
|
|
371
|
-
try {
|
|
372
|
-
await transport.connect();
|
|
373
|
-
console.log("Connected. Waiting for agent container to start...\n");
|
|
374
|
-
await runChatTUI(transport, opts.agent);
|
|
375
|
-
}
|
|
376
|
-
finally {
|
|
377
|
-
await transport.close();
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
// ---------------------------------------------------------------------------
|
|
381
|
-
// Helpers
|
|
382
|
-
// ---------------------------------------------------------------------------
|
|
383
|
-
async function probeGateway(url) {
|
|
384
|
-
try {
|
|
385
|
-
const controller = new AbortController();
|
|
386
|
-
const timeout = setTimeout(() => controller.abort(), 2000);
|
|
387
|
-
const res = await fetch(`${url}/health`, { signal: controller.signal });
|
|
388
|
-
clearTimeout(timeout);
|
|
389
|
-
return res.ok;
|
|
390
|
-
}
|
|
391
|
-
catch {
|
|
392
|
-
return false;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
function printShortcuts(keybindings) {
|
|
396
|
-
const fmt = (keys) => {
|
|
397
|
-
const arr = Array.isArray(keys) ? keys : [keys];
|
|
398
|
-
return arr
|
|
399
|
-
.filter((k) => k)
|
|
400
|
-
.map((k) => k
|
|
401
|
-
.split("+")
|
|
402
|
-
.map((p) => p.charAt(0).toUpperCase() + p.slice(1))
|
|
403
|
-
.join("+"))
|
|
404
|
-
.join(" / ");
|
|
405
|
-
};
|
|
406
|
-
const submitKeys = keybindings.submit || "enter";
|
|
407
|
-
const newLineKeys = keybindings.newLine || "shift+enter";
|
|
408
|
-
const shortcuts = [
|
|
409
|
-
`${fmt(submitKeys)} = send`,
|
|
410
|
-
`${fmt(newLineKeys)} = new line`,
|
|
411
|
-
`Ctrl+C = cancel`,
|
|
412
|
-
`Ctrl+D = exit`,
|
|
413
|
-
];
|
|
414
|
-
console.log(`Shortcuts: ${shortcuts.join(", ")}\n`);
|
|
415
|
-
}
|
|
416
|
-
function keybindingsPath() {
|
|
417
|
-
return join(homedir(), ".pi", "agent", "keybindings.json");
|
|
418
|
-
}
|
|
419
|
-
function ensureKeybindings() {
|
|
420
|
-
const filePath = keybindingsPath();
|
|
421
|
-
if (existsSync(filePath))
|
|
422
|
-
return;
|
|
423
|
-
const dir = join(homedir(), ".pi", "agent");
|
|
424
|
-
mkdirSync(dir, { recursive: true });
|
|
425
|
-
writeFileSync(filePath, JSON.stringify(AL_KEYBINDINGS, null, 2) + "\n");
|
|
426
|
-
}
|
|
427
|
-
function readKeybindings() {
|
|
428
|
-
const filePath = keybindingsPath();
|
|
429
|
-
try {
|
|
430
|
-
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
431
|
-
}
|
|
432
|
-
catch {
|
|
433
|
-
return {};
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
//# sourceMappingURL=chat.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
|