@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.
Files changed (156) hide show
  1. package/dist/agents/bash-prefix.d.ts +1 -1
  2. package/dist/agents/bash-prefix.js +2 -2
  3. package/dist/agents/container-entry.d.ts.map +1 -1
  4. package/dist/agents/container-entry.js +12 -16
  5. package/dist/agents/container-entry.js.map +1 -1
  6. package/dist/agents/credential-setup.d.ts +1 -0
  7. package/dist/agents/credential-setup.d.ts.map +1 -1
  8. package/dist/agents/credential-setup.js +21 -0
  9. package/dist/agents/credential-setup.js.map +1 -1
  10. package/dist/agents/harness/claude-cli-harness.d.ts +15 -0
  11. package/dist/agents/harness/claude-cli-harness.d.ts.map +1 -0
  12. package/dist/agents/harness/claude-cli-harness.js +229 -0
  13. package/dist/agents/harness/claude-cli-harness.js.map +1 -0
  14. package/dist/agents/harness/consumer.d.ts +15 -0
  15. package/dist/agents/harness/consumer.d.ts.map +1 -0
  16. package/dist/agents/harness/consumer.js +115 -0
  17. package/dist/agents/harness/consumer.js.map +1 -0
  18. package/dist/agents/harness/factory.d.ts +9 -0
  19. package/dist/agents/harness/factory.d.ts.map +1 -0
  20. package/dist/agents/harness/factory.js +25 -0
  21. package/dist/agents/harness/factory.js.map +1 -0
  22. package/dist/agents/harness/index.d.ts +9 -0
  23. package/dist/agents/harness/index.d.ts.map +1 -0
  24. package/dist/agents/harness/index.js +5 -0
  25. package/dist/agents/harness/index.js.map +1 -0
  26. package/dist/agents/harness/pi-harness.d.ts +18 -0
  27. package/dist/agents/harness/pi-harness.d.ts.map +1 -0
  28. package/dist/agents/harness/pi-harness.js +203 -0
  29. package/dist/agents/harness/pi-harness.js.map +1 -0
  30. package/dist/agents/harness/types.d.ts +54 -0
  31. package/dist/agents/harness/types.d.ts.map +1 -0
  32. package/dist/agents/harness/types.js +2 -0
  33. package/dist/{chat → agents/harness}/types.js.map +1 -1
  34. package/dist/build-info.json +1 -1
  35. package/dist/cli/commands/run-agent.d.ts.map +1 -1
  36. package/dist/cli/commands/run-agent.js +12 -9
  37. package/dist/cli/commands/run-agent.js.map +1 -1
  38. package/dist/cli/commands/webhook.js +1 -5
  39. package/dist/cli/commands/webhook.js.map +1 -1
  40. package/dist/cli/main.js +0 -10
  41. package/dist/cli/main.js.map +1 -1
  42. package/dist/control/routes/stats.d.ts.map +1 -1
  43. package/dist/control/routes/stats.js +1 -4
  44. package/dist/control/routes/stats.js.map +1 -1
  45. package/dist/events/webhook-setup.d.ts.map +1 -1
  46. package/dist/events/webhook-setup.js +16 -1
  47. package/dist/events/webhook-setup.js.map +1 -1
  48. package/dist/execution/execution.d.ts.map +1 -1
  49. package/dist/execution/execution.js +10 -0
  50. package/dist/execution/execution.js.map +1 -1
  51. package/dist/execution/lock-store.d.ts +4 -2
  52. package/dist/execution/lock-store.d.ts.map +1 -1
  53. package/dist/execution/lock-store.js +6 -8
  54. package/dist/execution/lock-store.js.map +1 -1
  55. package/dist/frontend/assets/index-CLzpDcLm.css +2 -0
  56. package/dist/frontend/assets/{index-CDp1ALeQ.js → index-Dx2aJ_Db.js} +2 -2
  57. package/dist/frontend/assets/index-Dx2aJ_Db.js.map +1 -0
  58. package/dist/frontend/index.html +2 -2
  59. package/dist/gateway/frontend.d.ts +2 -2
  60. package/dist/gateway/frontend.d.ts.map +1 -1
  61. package/dist/gateway/frontend.js +2 -4
  62. package/dist/gateway/frontend.js.map +1 -1
  63. package/dist/gateway/index.d.ts.map +1 -1
  64. package/dist/gateway/index.js +3 -29
  65. package/dist/gateway/index.js.map +1 -1
  66. package/dist/gateway/middleware/auth.d.ts +1 -1
  67. package/dist/gateway/middleware/auth.d.ts.map +1 -1
  68. package/dist/gateway/middleware/auth.js +2 -3
  69. package/dist/gateway/middleware/auth.js.map +1 -1
  70. package/dist/gateway/types.d.ts +0 -11
  71. package/dist/gateway/types.d.ts.map +1 -1
  72. package/dist/scheduler/gateway-setup.d.ts +0 -3
  73. package/dist/scheduler/gateway-setup.d.ts.map +1 -1
  74. package/dist/scheduler/gateway-setup.js +1 -43
  75. package/dist/scheduler/gateway-setup.js.map +1 -1
  76. package/dist/scheduler/index.js +4 -3
  77. package/dist/scheduler/index.js.map +1 -1
  78. package/dist/shared/config/load-agent.d.ts.map +1 -1
  79. package/dist/shared/config/load-agent.js +10 -0
  80. package/dist/shared/config/load-agent.js.map +1 -1
  81. package/dist/shared/config/load-project.d.ts.map +1 -1
  82. package/dist/shared/config/load-project.js +8 -0
  83. package/dist/shared/config/load-project.js.map +1 -1
  84. package/dist/shared/config/types.d.ts +7 -1
  85. package/dist/shared/config/types.d.ts.map +1 -1
  86. package/dist/shared/validation.d.ts.map +1 -1
  87. package/dist/shared/validation.js +18 -3
  88. package/dist/shared/validation.js.map +1 -1
  89. package/dist/tui/App.d.ts.map +1 -1
  90. package/dist/tui/App.js +0 -4
  91. package/dist/tui/App.js.map +1 -1
  92. package/dist/webhooks/types.d.ts +1 -0
  93. package/dist/webhooks/types.d.ts.map +1 -1
  94. package/docker/Dockerfile +2 -1
  95. package/package.json +1 -1
  96. package/dist/agents/chat-entry.d.ts +0 -9
  97. package/dist/agents/chat-entry.d.ts.map +0 -1
  98. package/dist/agents/chat-entry.js +0 -165
  99. package/dist/agents/chat-entry.js.map +0 -1
  100. package/dist/agents/session-factory.d.ts +0 -13
  101. package/dist/agents/session-factory.d.ts.map +0 -1
  102. package/dist/agents/session-factory.js +0 -28
  103. package/dist/agents/session-factory.js.map +0 -1
  104. package/dist/chat/container-launcher.d.ts +0 -38
  105. package/dist/chat/container-launcher.d.ts.map +0 -1
  106. package/dist/chat/container-launcher.js +0 -120
  107. package/dist/chat/container-launcher.js.map +0 -1
  108. package/dist/chat/event-mapper.d.ts +0 -27
  109. package/dist/chat/event-mapper.d.ts.map +0 -1
  110. package/dist/chat/event-mapper.js +0 -56
  111. package/dist/chat/event-mapper.js.map +0 -1
  112. package/dist/chat/ink-adapter.d.ts +0 -9
  113. package/dist/chat/ink-adapter.d.ts.map +0 -1
  114. package/dist/chat/ink-adapter.js +0 -120
  115. package/dist/chat/ink-adapter.js.map +0 -1
  116. package/dist/chat/local-transport.d.ts +0 -28
  117. package/dist/chat/local-transport.d.ts.map +0 -1
  118. package/dist/chat/local-transport.js +0 -68
  119. package/dist/chat/local-transport.js.map +0 -1
  120. package/dist/chat/remote-transport.d.ts +0 -30
  121. package/dist/chat/remote-transport.d.ts.map +0 -1
  122. package/dist/chat/remote-transport.js +0 -110
  123. package/dist/chat/remote-transport.js.map +0 -1
  124. package/dist/chat/routes.d.ts +0 -10
  125. package/dist/chat/routes.d.ts.map +0 -1
  126. package/dist/chat/routes.js +0 -94
  127. package/dist/chat/routes.js.map +0 -1
  128. package/dist/chat/session-manager.d.ts +0 -22
  129. package/dist/chat/session-manager.d.ts.map +0 -1
  130. package/dist/chat/session-manager.js +0 -77
  131. package/dist/chat/session-manager.js.map +0 -1
  132. package/dist/chat/transport.d.ts +0 -15
  133. package/dist/chat/transport.d.ts.map +0 -1
  134. package/dist/chat/transport.js +0 -5
  135. package/dist/chat/transport.js.map +0 -1
  136. package/dist/chat/types.d.ts +0 -51
  137. package/dist/chat/types.d.ts.map +0 -1
  138. package/dist/chat/types.js +0 -7
  139. package/dist/chat/validation.d.ts +0 -30
  140. package/dist/chat/validation.d.ts.map +0 -1
  141. package/dist/chat/validation.js +0 -79
  142. package/dist/chat/validation.js.map +0 -1
  143. package/dist/chat/ws-handler.d.ts +0 -32
  144. package/dist/chat/ws-handler.d.ts.map +0 -1
  145. package/dist/chat/ws-handler.js +0 -234
  146. package/dist/chat/ws-handler.js.map +0 -1
  147. package/dist/cli/commands/chat.d.ts +0 -7
  148. package/dist/cli/commands/chat.d.ts.map +0 -1
  149. package/dist/cli/commands/chat.js +0 -436
  150. package/dist/cli/commands/chat.js.map +0 -1
  151. package/dist/frontend/assets/index-CDp1ALeQ.js.map +0 -1
  152. package/dist/frontend/assets/index-EMdmdqAZ.css +0 -2
  153. package/dist/gateway/routes/chat.d.ts +0 -32
  154. package/dist/gateway/routes/chat.d.ts.map +0 -1
  155. package/dist/gateway/routes/chat.js +0 -24
  156. 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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"}