@action-llama/action-llama 0.1.1

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 (153) hide show
  1. package/README.md +448 -0
  2. package/dist/agents/container-entry.d.ts +2 -0
  3. package/dist/agents/container-entry.d.ts.map +1 -0
  4. package/dist/agents/container-entry.js +173 -0
  5. package/dist/agents/container-entry.js.map +1 -0
  6. package/dist/agents/container-runner.d.ts +20 -0
  7. package/dist/agents/container-runner.d.ts.map +1 -0
  8. package/dist/agents/container-runner.js +208 -0
  9. package/dist/agents/container-runner.js.map +1 -0
  10. package/dist/agents/definitions/dev/AGENTS.md +44 -0
  11. package/dist/agents/definitions/dev/config-definition.json +39 -0
  12. package/dist/agents/definitions/devops/AGENTS.md +33 -0
  13. package/dist/agents/definitions/devops/config-definition.json +37 -0
  14. package/dist/agents/definitions/loader.d.ts +18 -0
  15. package/dist/agents/definitions/loader.d.ts.map +1 -0
  16. package/dist/agents/definitions/loader.js +59 -0
  17. package/dist/agents/definitions/loader.js.map +1 -0
  18. package/dist/agents/definitions/reviewer/AGENTS.md +37 -0
  19. package/dist/agents/definitions/reviewer/config-definition.json +24 -0
  20. package/dist/agents/definitions/schema.d.ts +38 -0
  21. package/dist/agents/definitions/schema.d.ts.map +1 -0
  22. package/dist/agents/definitions/schema.js +97 -0
  23. package/dist/agents/definitions/schema.js.map +1 -0
  24. package/dist/agents/prompt.d.ts +6 -0
  25. package/dist/agents/prompt.d.ts.map +1 -0
  26. package/dist/agents/prompt.js +42 -0
  27. package/dist/agents/prompt.js.map +1 -0
  28. package/dist/agents/runner.d.ts +14 -0
  29. package/dist/agents/runner.d.ts.map +1 -0
  30. package/dist/agents/runner.js +148 -0
  31. package/dist/agents/runner.js.map +1 -0
  32. package/dist/broker/index.d.ts +16 -0
  33. package/dist/broker/index.d.ts.map +1 -0
  34. package/dist/broker/index.js +53 -0
  35. package/dist/broker/index.js.map +1 -0
  36. package/dist/broker/router.d.ts +13 -0
  37. package/dist/broker/router.d.ts.map +1 -0
  38. package/dist/broker/router.js +71 -0
  39. package/dist/broker/router.js.map +1 -0
  40. package/dist/broker/routes/shutdown.d.ts +4 -0
  41. package/dist/broker/routes/shutdown.d.ts.map +1 -0
  42. package/dist/broker/routes/shutdown.js +37 -0
  43. package/dist/broker/routes/shutdown.js.map +1 -0
  44. package/dist/broker/routes/webhooks.d.ts +5 -0
  45. package/dist/broker/routes/webhooks.d.ts.map +1 -0
  46. package/dist/broker/routes/webhooks.js +50 -0
  47. package/dist/broker/routes/webhooks.js.map +1 -0
  48. package/dist/cli/commands/agent/add.d.ts +5 -0
  49. package/dist/cli/commands/agent/add.d.ts.map +1 -0
  50. package/dist/cli/commands/agent/add.js +86 -0
  51. package/dist/cli/commands/agent/add.js.map +1 -0
  52. package/dist/cli/commands/init.d.ts +2 -0
  53. package/dist/cli/commands/init.d.ts.map +1 -0
  54. package/dist/cli/commands/init.js +75 -0
  55. package/dist/cli/commands/init.js.map +1 -0
  56. package/dist/cli/commands/logs.d.ts +7 -0
  57. package/dist/cli/commands/logs.d.ts.map +1 -0
  58. package/dist/cli/commands/logs.js +121 -0
  59. package/dist/cli/commands/logs.js.map +1 -0
  60. package/dist/cli/commands/start.d.ts +5 -0
  61. package/dist/cli/commands/start.d.ts.map +1 -0
  62. package/dist/cli/commands/start.js +44 -0
  63. package/dist/cli/commands/start.js.map +1 -0
  64. package/dist/cli/commands/status.d.ts +4 -0
  65. package/dist/cli/commands/status.d.ts.map +1 -0
  66. package/dist/cli/commands/status.js +52 -0
  67. package/dist/cli/commands/status.js.map +1 -0
  68. package/dist/cli/main.d.ts +3 -0
  69. package/dist/cli/main.d.ts.map +1 -0
  70. package/dist/cli/main.js +75 -0
  71. package/dist/cli/main.js.map +1 -0
  72. package/dist/docker/container.d.ts +19 -0
  73. package/dist/docker/container.d.ts.map +1 -0
  74. package/dist/docker/container.js +73 -0
  75. package/dist/docker/container.js.map +1 -0
  76. package/dist/docker/image.d.ts +4 -0
  77. package/dist/docker/image.d.ts.map +1 -0
  78. package/dist/docker/image.js +38 -0
  79. package/dist/docker/image.js.map +1 -0
  80. package/dist/docker/network.d.ts +5 -0
  81. package/dist/docker/network.d.ts.map +1 -0
  82. package/dist/docker/network.js +23 -0
  83. package/dist/docker/network.js.map +1 -0
  84. package/dist/scheduler/event-queue.d.ts +12 -0
  85. package/dist/scheduler/event-queue.d.ts.map +1 -0
  86. package/dist/scheduler/event-queue.js +12 -0
  87. package/dist/scheduler/event-queue.js.map +1 -0
  88. package/dist/scheduler/index.d.ts +19 -0
  89. package/dist/scheduler/index.d.ts.map +1 -0
  90. package/dist/scheduler/index.js +192 -0
  91. package/dist/scheduler/index.js.map +1 -0
  92. package/dist/scheduler/types.d.ts +14 -0
  93. package/dist/scheduler/types.d.ts.map +1 -0
  94. package/dist/scheduler/types.js +2 -0
  95. package/dist/scheduler/types.js.map +1 -0
  96. package/dist/setup/prompts.d.ts +52 -0
  97. package/dist/setup/prompts.d.ts.map +1 -0
  98. package/dist/setup/prompts.js +656 -0
  99. package/dist/setup/prompts.js.map +1 -0
  100. package/dist/setup/scaffold.d.ts +11 -0
  101. package/dist/setup/scaffold.d.ts.map +1 -0
  102. package/dist/setup/scaffold.js +70 -0
  103. package/dist/setup/scaffold.js.map +1 -0
  104. package/dist/setup/validators.d.ts +23 -0
  105. package/dist/setup/validators.d.ts.map +1 -0
  106. package/dist/setup/validators.js +61 -0
  107. package/dist/setup/validators.js.map +1 -0
  108. package/dist/shared/config.d.ts +40 -0
  109. package/dist/shared/config.d.ts.map +1 -0
  110. package/dist/shared/config.js +46 -0
  111. package/dist/shared/config.js.map +1 -0
  112. package/dist/shared/credentials.d.ts +4 -0
  113. package/dist/shared/credentials.d.ts.map +1 -0
  114. package/dist/shared/credentials.js +21 -0
  115. package/dist/shared/credentials.js.map +1 -0
  116. package/dist/shared/git.d.ts +3 -0
  117. package/dist/shared/git.d.ts.map +1 -0
  118. package/dist/shared/git.js +24 -0
  119. package/dist/shared/git.js.map +1 -0
  120. package/dist/shared/logger.d.ts +6 -0
  121. package/dist/shared/logger.d.ts.map +1 -0
  122. package/dist/shared/logger.js +47 -0
  123. package/dist/shared/logger.js.map +1 -0
  124. package/dist/shared/paths.d.ts +8 -0
  125. package/dist/shared/paths.d.ts.map +1 -0
  126. package/dist/shared/paths.js +20 -0
  127. package/dist/shared/paths.js.map +1 -0
  128. package/dist/tui/App.d.ts +5 -0
  129. package/dist/tui/App.d.ts.map +1 -0
  130. package/dist/tui/App.js +85 -0
  131. package/dist/tui/App.js.map +1 -0
  132. package/dist/tui/render.d.ts +5 -0
  133. package/dist/tui/render.d.ts.map +1 -0
  134. package/dist/tui/render.js +9 -0
  135. package/dist/tui/render.js.map +1 -0
  136. package/dist/tui/status-tracker.d.ts +39 -0
  137. package/dist/tui/status-tracker.d.ts.map +1 -0
  138. package/dist/tui/status-tracker.js +73 -0
  139. package/dist/tui/status-tracker.js.map +1 -0
  140. package/dist/webhooks/providers/github.d.ts +9 -0
  141. package/dist/webhooks/providers/github.d.ts.map +1 -0
  142. package/dist/webhooks/providers/github.js +169 -0
  143. package/dist/webhooks/providers/github.js.map +1 -0
  144. package/dist/webhooks/registry.d.ts +13 -0
  145. package/dist/webhooks/registry.d.ts.map +1 -0
  146. package/dist/webhooks/registry.js +82 -0
  147. package/dist/webhooks/registry.js.map +1 -0
  148. package/dist/webhooks/types.d.ts +49 -0
  149. package/dist/webhooks/types.d.ts.map +1 -0
  150. package/dist/webhooks/types.js +2 -0
  151. package/dist/webhooks/types.js.map +1 -0
  152. package/docker/Dockerfile +29 -0
  153. package/package.json +67 -0
@@ -0,0 +1,50 @@
1
+ import { readBody, sendJson, sendError } from "../router.js";
2
+ export function registerWebhookRoutes(router, registry, webhookSecrets, logger) {
3
+ router.post("/webhooks/:source", async (req, res, params) => {
4
+ const source = params.source;
5
+ logger.debug({ source }, "webhook request received");
6
+ const provider = registry.getProvider(source);
7
+ if (!provider) {
8
+ logger.warn({ source }, "webhook rejected: unknown source");
9
+ sendError(res, 404, `unknown webhook source: ${source}`);
10
+ return;
11
+ }
12
+ let rawBody;
13
+ try {
14
+ rawBody = await readBody(req);
15
+ }
16
+ catch (err) {
17
+ logger.error({ err, source }, "webhook body read failed");
18
+ sendError(res, 400, "failed to read request body");
19
+ return;
20
+ }
21
+ logger.debug({ source, bodyLength: rawBody.length }, "webhook body read ok");
22
+ // Extract headers as a flat map
23
+ const headers = {};
24
+ for (const [key, value] of Object.entries(req.headers)) {
25
+ headers[key] = Array.isArray(value) ? value[0] : value;
26
+ }
27
+ logger.debug({
28
+ source,
29
+ contentType: headers["content-type"],
30
+ event: headers["x-github-event"],
31
+ delivery: headers["x-github-delivery"],
32
+ hasSignature: !!headers["x-hub-signature-256"],
33
+ }, "webhook headers");
34
+ const secret = webhookSecrets[source];
35
+ const result = registry.dispatch(source, headers, rawBody, secret);
36
+ if (!result.ok) {
37
+ const status = result.errors?.includes("signature validation failed") ? 401 : 400;
38
+ logger.warn({ source, status, errors: result.errors }, "webhook dispatch failed");
39
+ sendError(res, status, result.errors?.[0] || "dispatch failed");
40
+ return;
41
+ }
42
+ logger.info({ source, matched: result.matched, skipped: result.skipped }, "webhook dispatched");
43
+ sendJson(res, 200, {
44
+ ok: true,
45
+ matched: result.matched,
46
+ skipped: result.skipped,
47
+ });
48
+ });
49
+ }
50
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/broker/routes/webhooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function execute(opts: {
2
+ project: string;
3
+ definition?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agent/add.ts"],"names":[],"mappings":"AAWA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8F3F"}
@@ -0,0 +1,86 @@
1
+ import { resolve } from "path";
2
+ import { existsSync, writeFileSync } from "fs";
3
+ import { select } from "@inquirer/prompts";
4
+ import { loadCredential, writeCredential } from "../../../shared/credentials.js";
5
+ import { discoverAgents, loadAgentConfig, loadGlobalConfig } from "../../../shared/config.js";
6
+ import { validateGitHubToken } from "../../../setup/validators.js";
7
+ import { runAddAgent } from "../../../setup/prompts.js";
8
+ import { scaffoldAgent } from "../../../setup/scaffold.js";
9
+ import { CREDENTIALS_DIR } from "../../../shared/paths.js";
10
+ import { loadDefinition, listBuiltinDefinitions } from "../../../agents/definitions/loader.js";
11
+ export async function execute(opts) {
12
+ const projectPath = resolve(opts.project);
13
+ if (!existsSync(projectPath)) {
14
+ throw new Error(`Project not found: ${projectPath}`);
15
+ }
16
+ // Load GitHub token
17
+ const githubToken = loadCredential("github-token");
18
+ if (!githubToken) {
19
+ throw new Error(`GitHub token not found. Run "al init" first or add ${CREDENTIALS_DIR}/github-token.`);
20
+ }
21
+ console.log("Validating GitHub token...");
22
+ const { user: githubUser, repos: availableRepos } = await validateGitHubToken(githubToken);
23
+ console.log(`Authenticated as: ${githubUser} (${availableRepos.length} repos found)\n`);
24
+ // Discover existing agents and load model config from first one
25
+ const existingAgentNames = discoverAgents(projectPath);
26
+ if (existingAgentNames.length === 0) {
27
+ throw new Error(`No existing agents found in ${projectPath}. Use "al init" to set up a new project.`);
28
+ }
29
+ const firstAgent = loadAgentConfig(projectPath, existingAgentNames[0]);
30
+ const modelConfig = firstAgent.model;
31
+ // Load definition — from argument or interactive selection
32
+ let definition;
33
+ if (opts.definition) {
34
+ definition = loadDefinition(opts.definition);
35
+ }
36
+ else {
37
+ const builtinDefs = listBuiltinDefinitions();
38
+ const selectedName = await select({
39
+ message: "Agent type:",
40
+ choices: builtinDefs.map((d) => ({
41
+ name: `${d.name} — ${d.label} (${d.description})`,
42
+ value: d.name,
43
+ })),
44
+ });
45
+ definition = loadDefinition(selectedName);
46
+ }
47
+ // Run interactive prompt
48
+ const { agent, secrets } = await runAddAgent({
49
+ definition,
50
+ availableRepos,
51
+ githubUser,
52
+ modelConfig,
53
+ existingAgentNames,
54
+ });
55
+ console.log("\n--- Writing configuration ---\n");
56
+ // Write new credentials
57
+ if (secrets.sentryToken && secrets.sentryToken !== loadCredential("sentry-token")) {
58
+ writeCredential("sentry-token", secrets.sentryToken);
59
+ console.log(` Wrote ${CREDENTIALS_DIR}/sentry-token`);
60
+ }
61
+ if (secrets.githubWebhookSecret) {
62
+ writeCredential("github-webhook-secret", secrets.githubWebhookSecret);
63
+ console.log(` Wrote ${CREDENTIALS_DIR}/github-webhook-secret`);
64
+ }
65
+ // Update global config if agent uses webhooks and config doesn't reference the secret yet
66
+ if (agent.config.webhooks) {
67
+ const globalConfig = loadGlobalConfig(projectPath);
68
+ if (!globalConfig.webhooks?.githubSecretCredential) {
69
+ globalConfig.webhooks = { ...globalConfig.webhooks, githubSecretCredential: "github-webhook-secret" };
70
+ writeFileSync(resolve(projectPath, "config.json"), JSON.stringify(globalConfig, null, 2) + "\n");
71
+ console.log(` Updated ${projectPath}/config.json`);
72
+ }
73
+ }
74
+ // Scaffold the agent
75
+ scaffoldAgent(projectPath, agent);
76
+ console.log(` Wrote ${projectPath}/${agent.name}/config.json`);
77
+ console.log(` Wrote ${projectPath}/${agent.name}/AGENTS.md`);
78
+ console.log(` Created state directory`);
79
+ console.log(`
80
+ Agent "${agent.name}" added successfully!
81
+
82
+ Edit ${projectPath}/${agent.name}/AGENTS.md to customize agent behavior.
83
+ Restart with: al start -p ${projectPath}
84
+ `);
85
+ }
86
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/cli/commands/agent/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function execute(name: string): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEzD"}
@@ -0,0 +1,75 @@
1
+ import { resolve } from "path";
2
+ import { runSetup } from "../../setup/prompts.js";
3
+ import { writeCredential, loadCredential } from "../../shared/credentials.js";
4
+ import { scaffoldProject } from "../../setup/scaffold.js";
5
+ import { CREDENTIALS_DIR } from "../../shared/paths.js";
6
+ export async function execute(name) {
7
+ const projectPath = resolve(process.cwd(), name);
8
+ const { globalConfig, agents, secrets } = await runSetup();
9
+ console.log("\n--- Writing configuration ---\n");
10
+ // Only write credentials if they're new or changed
11
+ if (secrets.githubToken && secrets.githubToken !== loadCredential("github-token")) {
12
+ writeCredential("github-token", secrets.githubToken);
13
+ console.log(` Wrote ${CREDENTIALS_DIR}/github-token`);
14
+ }
15
+ else {
16
+ console.log(` GitHub token unchanged`);
17
+ }
18
+ if (secrets.sentryToken && secrets.sentryToken !== loadCredential("sentry-token")) {
19
+ writeCredential("sentry-token", secrets.sentryToken);
20
+ console.log(` Wrote ${CREDENTIALS_DIR}/sentry-token`);
21
+ }
22
+ else if (secrets.sentryToken) {
23
+ console.log(` Sentry token unchanged`);
24
+ }
25
+ if (secrets.anthropicKey && secrets.anthropicKey !== loadCredential("anthropic-key")) {
26
+ writeCredential("anthropic-key", secrets.anthropicKey);
27
+ console.log(` Wrote ${CREDENTIALS_DIR}/anthropic-key`);
28
+ }
29
+ else if (secrets.anthropicKey) {
30
+ console.log(` Anthropic key unchanged`);
31
+ }
32
+ else {
33
+ console.log(" Using existing pi auth (no key file needed)");
34
+ }
35
+ if (secrets.sshKey && secrets.sshKey !== loadCredential("id_rsa")) {
36
+ writeCredential("id_rsa", secrets.sshKey.trimEnd());
37
+ console.log(` Wrote ${CREDENTIALS_DIR}/id_rsa`);
38
+ }
39
+ else if (loadCredential("id_rsa")) {
40
+ console.log(` SSH key unchanged`);
41
+ }
42
+ if (secrets.githubWebhookSecret && secrets.githubWebhookSecret !== loadCredential("github-webhook-secret")) {
43
+ writeCredential("github-webhook-secret", secrets.githubWebhookSecret);
44
+ console.log(` Wrote ${CREDENTIALS_DIR}/github-webhook-secret`);
45
+ }
46
+ else if (secrets.githubWebhookSecret) {
47
+ console.log(` GitHub webhook secret unchanged`);
48
+ }
49
+ scaffoldProject(projectPath, globalConfig, agents, name);
50
+ const agentNames = agents.map((a) => a.name);
51
+ console.log(` Wrote ${projectPath}/package.json`);
52
+ if (Object.keys(globalConfig).length > 0) {
53
+ console.log(` Wrote ${projectPath}/config.json`);
54
+ }
55
+ for (const name of agentNames) {
56
+ console.log(` Wrote ${projectPath}/${name}/config.json`);
57
+ console.log(` Wrote ${projectPath}/${name}/AGENTS.md`);
58
+ }
59
+ console.log(` Created state directories`);
60
+ console.log(`
61
+ Setup complete!
62
+
63
+ Credentials: ${CREDENTIALS_DIR}/
64
+ Project: ${projectPath}/
65
+ Agents: ${agentNames.join(", ")}
66
+
67
+ Edit <agent>/AGENTS.md to customize agent behavior.
68
+
69
+ Next steps:
70
+ cd ${name}
71
+ npm install
72
+ npx al start
73
+ `);
74
+ }
75
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function execute(agent: string, opts: {
2
+ project: string;
3
+ lines: string;
4
+ follow?: boolean;
5
+ date?: string;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAiIA,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,121 @@
1
+ import { resolve } from "path";
2
+ import { createReadStream, readdirSync, existsSync, statSync } from "fs";
3
+ import { createInterface } from "readline";
4
+ import { logsDir } from "../../shared/paths.js";
5
+ const LEVEL_COLORS = {
6
+ 10: { label: "TRACE", color: "\x1b[90m" }, // gray
7
+ 20: { label: "DEBUG", color: "\x1b[36m" }, // cyan
8
+ 30: { label: "INFO", color: "\x1b[32m" }, // green
9
+ 40: { label: "WARN", color: "\x1b[33m" }, // yellow
10
+ 50: { label: "ERROR", color: "\x1b[31m" }, // red
11
+ };
12
+ const RESET = "\x1b[0m";
13
+ function formatEntry(entry) {
14
+ const date = new Date(entry.time);
15
+ const time = date.toLocaleTimeString("en-US", { hour12: false });
16
+ const levelInfo = LEVEL_COLORS[entry.level] || { label: `L${entry.level}`, color: "" };
17
+ // Collect extra fields (exclude standard pino fields)
18
+ const { level, time: _t, msg, name: _n, pid: _p, hostname: _h, ...extra } = entry;
19
+ const extraStr = Object.keys(extra).length > 0 ? ` ${JSON.stringify(extra)}` : "";
20
+ return `${levelInfo.color}${time} ${levelInfo.label.padEnd(5)} ${msg}${extraStr}${RESET}`;
21
+ }
22
+ function parseLine(line) {
23
+ if (!line.trim())
24
+ return null;
25
+ try {
26
+ return JSON.parse(line);
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function findLogFile(dir, agent, date) {
33
+ if (date) {
34
+ const file = resolve(dir, `${agent}-${date}.log`);
35
+ return existsSync(file) ? file : null;
36
+ }
37
+ // Default to today
38
+ const today = new Date().toISOString().slice(0, 10);
39
+ const todayFile = resolve(dir, `${agent}-${today}.log`);
40
+ if (existsSync(todayFile))
41
+ return todayFile;
42
+ // Find most recent log file for this agent
43
+ if (!existsSync(dir))
44
+ return null;
45
+ const files = readdirSync(dir)
46
+ .filter((f) => f.startsWith(`${agent}-`) && f.endsWith(".log"))
47
+ .sort()
48
+ .reverse();
49
+ return files.length > 0 ? resolve(dir, files[0]) : null;
50
+ }
51
+ async function readLastN(filePath, n) {
52
+ const entries = [];
53
+ const rl = createInterface({
54
+ input: createReadStream(filePath, { encoding: "utf-8" }),
55
+ crlfDelay: Infinity,
56
+ });
57
+ for await (const line of rl) {
58
+ const entry = parseLine(line);
59
+ if (entry) {
60
+ entries.push(formatEntry(entry));
61
+ if (entries.length > n)
62
+ entries.shift();
63
+ }
64
+ }
65
+ for (const formatted of entries) {
66
+ console.log(formatted);
67
+ }
68
+ }
69
+ async function readNewData(filePath, start) {
70
+ const currentSize = statSync(filePath).size;
71
+ if (currentSize <= start)
72
+ return { newPosition: start };
73
+ const stream = createReadStream(filePath, { encoding: "utf-8", start });
74
+ const rl = createInterface({ input: stream, crlfDelay: Infinity });
75
+ for await (const line of rl) {
76
+ const entry = parseLine(line);
77
+ if (entry) {
78
+ console.log(formatEntry(entry));
79
+ }
80
+ }
81
+ return { newPosition: currentSize };
82
+ }
83
+ async function followFile(filePath, lastN) {
84
+ // Print last N entries first
85
+ await readLastN(filePath, lastN);
86
+ // Start tailing from end of file
87
+ let position = statSync(filePath).size;
88
+ // Poll for new data every 500ms (more reliable than fs.watch)
89
+ const interval = setInterval(async () => {
90
+ try {
91
+ const { newPosition } = await readNewData(filePath, position);
92
+ position = newPosition;
93
+ }
94
+ catch {
95
+ // File may have been rotated or removed — ignore
96
+ }
97
+ }, 500);
98
+ process.on("SIGINT", () => {
99
+ clearInterval(interval);
100
+ process.exit(0);
101
+ });
102
+ await new Promise(() => { });
103
+ }
104
+ export async function execute(agent, opts) {
105
+ const projectPath = resolve(opts.project);
106
+ const dir = logsDir(projectPath);
107
+ const n = parseInt(opts.lines, 10);
108
+ const logFile = findLogFile(dir, agent, opts.date);
109
+ if (!logFile) {
110
+ const dateStr = opts.date || "today";
111
+ console.error(`No log file found for agent "${agent}" (${dateStr}) in ${dir}`);
112
+ process.exit(1);
113
+ }
114
+ if (opts.follow) {
115
+ await followFile(logFile, n);
116
+ }
117
+ else {
118
+ await readLastN(logFile, n);
119
+ }
120
+ }
121
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function execute(opts: {
2
+ project: string;
3
+ dangerousNoDocker?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CnG"}
@@ -0,0 +1,44 @@
1
+ import { resolve } from "path";
2
+ import { loadGlobalConfig } from "../../shared/config.js";
3
+ import { startScheduler } from "../../scheduler/index.js";
4
+ import { StatusTracker } from "../../tui/status-tracker.js";
5
+ export async function execute(opts) {
6
+ const projectPath = resolve(opts.project);
7
+ const globalConfig = loadGlobalConfig(projectPath);
8
+ // Docker is on by default; --dangerous-no-docker disables it
9
+ if (opts.dangerousNoDocker) {
10
+ if (!globalConfig.docker)
11
+ globalConfig.docker = { enabled: false };
12
+ else
13
+ globalConfig.docker.enabled = false;
14
+ }
15
+ else if (!globalConfig.docker) {
16
+ globalConfig.docker = { enabled: true };
17
+ }
18
+ const dockerEnabled = globalConfig.docker?.enabled === true;
19
+ const mode = dockerEnabled ? "docker" : "host";
20
+ const statusTracker = new StatusTracker();
21
+ const { cronJobs, broker, webhookRegistry, webhookUrls } = await startScheduler(projectPath, globalConfig, statusTracker);
22
+ const brokerPort = broker ? (globalConfig.broker?.port || 8080) : null;
23
+ statusTracker.setSchedulerInfo({
24
+ mode,
25
+ brokerPort,
26
+ cronJobCount: cronJobs.length,
27
+ webhooksActive: !!webhookRegistry,
28
+ webhookUrls: webhookUrls || [],
29
+ startedAt: new Date(),
30
+ });
31
+ // Lazy-import TUI to avoid loading React unless needed
32
+ const { renderTUI } = await import("../../tui/render.js");
33
+ const { unmount } = await renderTUI(statusTracker);
34
+ // Coordinate SIGINT: unmount Ink, then exit
35
+ const shutdown = () => {
36
+ unmount();
37
+ process.exit(0);
38
+ };
39
+ process.on("SIGINT", shutdown);
40
+ process.on("SIGTERM", shutdown);
41
+ // Keep process alive
42
+ await new Promise(() => { });
43
+ }
44
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAsD;IAClF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEnD,6DAA6D;IAC7D,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,MAAM;YAAE,YAAY,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;YAC9D,YAAY,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IAC3C,CAAC;SAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAChC,YAAY,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAE/C,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAE1H,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,aAAa,CAAC,gBAAgB,CAAC;QAC7B,IAAI;QACJ,UAAU;QACV,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,cAAc,EAAE,CAAC,CAAC,eAAe;QACjC,WAAW,EAAE,WAAW,IAAI,EAAE;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;IAEnD,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,qBAAqB;IACrB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function execute(opts: {
2
+ project: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAUA,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDtE"}
@@ -0,0 +1,52 @@
1
+ import { resolve } from "path";
2
+ import { existsSync, readFileSync } from "fs";
3
+ import { discoverAgents, loadAgentConfig } from "../../shared/config.js";
4
+ function readStateFile(projectPath, agent, file) {
5
+ const path = resolve(projectPath, ".al", "state", agent, file);
6
+ if (!existsSync(path))
7
+ return {};
8
+ return JSON.parse(readFileSync(path, "utf-8"));
9
+ }
10
+ export async function execute(opts) {
11
+ const projectPath = resolve(opts.project);
12
+ const agentNames = discoverAgents(projectPath);
13
+ console.log(`AL Status — ${projectPath}\n`);
14
+ for (const name of agentNames) {
15
+ const agentConfig = loadAgentConfig(projectPath, name);
16
+ console.log(`${name}:`);
17
+ console.log(` Repos: ${agentConfig.repos.join(", ")}`);
18
+ console.log(` Schedule: ${agentConfig.schedule}`);
19
+ // Show state based on which state files exist
20
+ const stateDir = resolve(projectPath, ".al", "state", name);
21
+ if (existsSync(resolve(stateDir, "active-issues.json"))) {
22
+ const devState = readStateFile(projectPath, name, "active-issues.json");
23
+ const issues = devState.issues || {};
24
+ const inProgress = Object.entries(issues).filter(([_, v]) => v.status === "in_progress");
25
+ const completed = Object.entries(issues).filter(([_, v]) => v.status === "completed");
26
+ console.log(` In progress: ${inProgress.length}`);
27
+ console.log(` Completed: ${completed.length}`);
28
+ for (const [key, val] of inProgress) {
29
+ console.log(` - ${key} (started ${val.startedAt})`);
30
+ }
31
+ }
32
+ if (existsSync(resolve(stateDir, "reviewed-prs.json"))) {
33
+ const reviewerState = readStateFile(projectPath, name, "reviewed-prs.json");
34
+ const prs = reviewerState.prs || {};
35
+ const prCount = Object.keys(prs).length;
36
+ const approved = Object.values(prs).filter((v) => v.verdict === "approved").length;
37
+ const changesRequested = Object.values(prs).filter((v) => v.verdict === "changes_requested").length;
38
+ console.log(` Total reviewed: ${prCount}`);
39
+ console.log(` Approved: ${approved}`);
40
+ console.log(` Changes req: ${changesRequested}`);
41
+ }
42
+ if (existsSync(resolve(stateDir, "known-errors.json"))) {
43
+ const devopsState = readStateFile(projectPath, name, "known-errors.json");
44
+ const errors = devopsState.errors || {};
45
+ const errorCount = Object.keys(errors).length;
46
+ console.log(` Errors filed: ${errorCount}`);
47
+ }
48
+ console.log("");
49
+ }
50
+ console.log(`Agents: ${agentNames.join(", ")}`);
51
+ }
52
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":""}
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { readFileSync } from "fs";
4
+ import { dirname, resolve } from "path";
5
+ import { fileURLToPath } from "url";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const pkg = JSON.parse(readFileSync(resolve(__dirname, "../../package.json"), "utf-8"));
8
+ const program = new Command();
9
+ program
10
+ .name("al")
11
+ .description("Action Llama — automated development agents")
12
+ .version(pkg.version);
13
+ // --- User-facing commands ---
14
+ program
15
+ .command("init")
16
+ .description("Interactive setup, creates project dir + credentials")
17
+ .argument("<name>", "project name")
18
+ .action(async (name) => {
19
+ const { execute } = await import("./commands/init.js");
20
+ await execute(name);
21
+ });
22
+ program
23
+ .command("start")
24
+ .description("Start cron scheduler")
25
+ .option("-p, --project <dir>", "project directory", ".")
26
+ .option("--dangerous-no-docker", "disable Docker container isolation (run agents directly on host)")
27
+ .action(async (opts) => {
28
+ const { execute } = await import("./commands/start.js");
29
+ await execute(opts);
30
+ });
31
+ program
32
+ .command("logs")
33
+ .description("View agent log files")
34
+ .argument("<agent>", "agent name")
35
+ .option("-p, --project <dir>", "project directory", ".")
36
+ .option("-n, --lines <N>", "number of log entries to show", "50")
37
+ .option("-f, --follow", "tail mode — watch for new log entries")
38
+ .option("-d, --date <YYYY-MM-DD>", "specific date's log file")
39
+ .action(async (agent, opts) => {
40
+ const { execute } = await import("./commands/logs.js");
41
+ await execute(agent, opts);
42
+ });
43
+ program
44
+ .command("status")
45
+ .description("Show agent status")
46
+ .option("-p, --project <dir>", "project directory", ".")
47
+ .action(async (opts) => {
48
+ const { execute } = await import("./commands/status.js");
49
+ await execute(opts);
50
+ });
51
+ // --- Agent management commands ---
52
+ const agent = program.command("agent").description("Agent management commands");
53
+ agent
54
+ .command("add")
55
+ .description("Add a new agent to an existing project")
56
+ .argument("[definition]", "built-in name (dev, reviewer, devops) or path to definition directory")
57
+ .option("-p, --project <dir>", "project directory", ".")
58
+ .action(async (definition, opts) => {
59
+ const { execute } = await import("./commands/agent/add.js");
60
+ await execute({ ...opts, definition });
61
+ });
62
+ program.parseAsync().catch((err) => {
63
+ const detail = { error: err.message };
64
+ if (err.cause)
65
+ detail.cause = String(err.cause);
66
+ if (err.code)
67
+ detail.code = err.code;
68
+ if (err.status)
69
+ detail.status = err.status;
70
+ if (err.stack)
71
+ detail.stack = err.stack;
72
+ console.error(JSON.stringify(detail));
73
+ process.exit(1);
74
+ });
75
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}