@action-llama/action-llama 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +76 -68
  2. package/dist/agents/container-entry.js +79 -18
  3. package/dist/agents/container-entry.js.map +1 -1
  4. package/dist/agents/container-runner.d.ts +2 -1
  5. package/dist/agents/container-runner.d.ts.map +1 -1
  6. package/dist/agents/container-runner.js +48 -18
  7. package/dist/agents/container-runner.js.map +1 -1
  8. package/dist/agents/prompt.d.ts.map +1 -1
  9. package/dist/agents/prompt.js +18 -7
  10. package/dist/agents/prompt.js.map +1 -1
  11. package/dist/agents/runner.d.ts.map +1 -1
  12. package/dist/agents/runner.js +40 -6
  13. package/dist/agents/runner.js.map +1 -1
  14. package/dist/cli/commands/{agent/add.d.ts → console.d.ts} +1 -2
  15. package/dist/cli/commands/console.d.ts.map +1 -0
  16. package/dist/cli/commands/console.js +173 -0
  17. package/dist/cli/commands/console.js.map +1 -0
  18. package/dist/cli/commands/new.d.ts.map +1 -1
  19. package/dist/cli/commands/new.js +27 -52
  20. package/dist/cli/commands/new.js.map +1 -1
  21. package/dist/cli/commands/setup.d.ts +4 -0
  22. package/dist/cli/commands/setup.d.ts.map +1 -0
  23. package/dist/cli/commands/setup.js +50 -0
  24. package/dist/cli/commands/setup.js.map +1 -0
  25. package/dist/cli/commands/start.d.ts.map +1 -1
  26. package/dist/cli/commands/start.js +3 -0
  27. package/dist/cli/commands/start.js.map +1 -1
  28. package/dist/cli/commands/status.d.ts.map +1 -1
  29. package/dist/cli/commands/status.js +1 -37
  30. package/dist/cli/commands/status.js.map +1 -1
  31. package/dist/cli/main.js +14 -9
  32. package/dist/cli/main.js.map +1 -1
  33. package/dist/credentials/builtins/anthropic-key.d.ts +4 -0
  34. package/dist/credentials/builtins/anthropic-key.d.ts.map +1 -0
  35. package/dist/credentials/builtins/anthropic-key.js +68 -0
  36. package/dist/credentials/builtins/anthropic-key.js.map +1 -0
  37. package/dist/credentials/builtins/github-token.d.ts +4 -0
  38. package/dist/credentials/builtins/github-token.d.ts.map +1 -0
  39. package/dist/credentials/builtins/github-token.js +18 -0
  40. package/dist/credentials/builtins/github-token.js.map +1 -0
  41. package/dist/credentials/builtins/github-webhook-secret.d.ts +4 -0
  42. package/dist/credentials/builtins/github-webhook-secret.d.ts.map +1 -0
  43. package/dist/credentials/builtins/github-webhook-secret.js +11 -0
  44. package/dist/credentials/builtins/github-webhook-secret.js.map +1 -0
  45. package/dist/credentials/builtins/id-rsa.d.ts +4 -0
  46. package/dist/credentials/builtins/id-rsa.d.ts.map +1 -0
  47. package/dist/credentials/builtins/id-rsa.js +95 -0
  48. package/dist/credentials/builtins/id-rsa.js.map +1 -0
  49. package/dist/credentials/builtins/index.d.ts +3 -0
  50. package/dist/credentials/builtins/index.d.ts.map +1 -0
  51. package/dist/credentials/builtins/index.js +15 -0
  52. package/dist/credentials/builtins/index.js.map +1 -0
  53. package/dist/credentials/builtins/sentry-client-secret.d.ts +4 -0
  54. package/dist/credentials/builtins/sentry-client-secret.d.ts.map +1 -0
  55. package/dist/credentials/builtins/sentry-client-secret.js +11 -0
  56. package/dist/credentials/builtins/sentry-client-secret.js.map +1 -0
  57. package/dist/credentials/builtins/sentry-token.d.ts +4 -0
  58. package/dist/credentials/builtins/sentry-token.d.ts.map +1 -0
  59. package/dist/credentials/builtins/sentry-token.js +71 -0
  60. package/dist/credentials/builtins/sentry-token.js.map +1 -0
  61. package/dist/credentials/prompter.d.ts +14 -0
  62. package/dist/credentials/prompter.d.ts.map +1 -0
  63. package/dist/credentials/prompter.js +55 -0
  64. package/dist/credentials/prompter.js.map +1 -0
  65. package/dist/credentials/registry.d.ts +16 -0
  66. package/dist/credentials/registry.d.ts.map +1 -0
  67. package/dist/credentials/registry.js +25 -0
  68. package/dist/credentials/registry.js.map +1 -0
  69. package/dist/credentials/schema.d.ts +22 -0
  70. package/dist/credentials/schema.d.ts.map +1 -0
  71. package/dist/credentials/schema.js +5 -0
  72. package/dist/credentials/schema.js.map +1 -0
  73. package/dist/docker/container.js +1 -1
  74. package/dist/docker/container.js.map +1 -1
  75. package/dist/docker/image.d.ts +8 -0
  76. package/dist/docker/image.d.ts.map +1 -1
  77. package/dist/docker/image.js +26 -2
  78. package/dist/docker/image.js.map +1 -1
  79. package/dist/scheduler/index.d.ts.map +1 -1
  80. package/dist/scheduler/index.js +44 -13
  81. package/dist/scheduler/index.js.map +1 -1
  82. package/dist/setup/prompts.d.ts +1 -43
  83. package/dist/setup/prompts.d.ts.map +1 -1
  84. package/dist/setup/prompts.js +40 -609
  85. package/dist/setup/prompts.js.map +1 -1
  86. package/dist/setup/scaffold.d.ts +3 -4
  87. package/dist/setup/scaffold.d.ts.map +1 -1
  88. package/dist/setup/scaffold.js +347 -32
  89. package/dist/setup/scaffold.js.map +1 -1
  90. package/dist/shared/config.d.ts +1 -2
  91. package/dist/shared/config.d.ts.map +1 -1
  92. package/dist/shared/config.js +16 -6
  93. package/dist/shared/config.js.map +1 -1
  94. package/dist/shared/credentials.d.ts +37 -3
  95. package/dist/shared/credentials.d.ts.map +1 -1
  96. package/dist/shared/credentials.js +68 -11
  97. package/dist/shared/credentials.js.map +1 -1
  98. package/dist/shared/git.js +1 -1
  99. package/dist/shared/git.js.map +1 -1
  100. package/dist/shared/paths.d.ts +0 -1
  101. package/dist/shared/paths.d.ts.map +1 -1
  102. package/dist/shared/paths.js +0 -3
  103. package/dist/shared/paths.js.map +1 -1
  104. package/dist/tui/App.d.ts.map +1 -1
  105. package/dist/tui/App.js +11 -5
  106. package/dist/tui/App.js.map +1 -1
  107. package/dist/tui/status-tracker.d.ts +5 -3
  108. package/dist/tui/status-tracker.d.ts.map +1 -1
  109. package/dist/tui/status-tracker.js +14 -2
  110. package/dist/tui/status-tracker.js.map +1 -1
  111. package/dist/webhooks/definitions/github.d.ts +3 -0
  112. package/dist/webhooks/definitions/github.d.ts.map +1 -0
  113. package/dist/webhooks/definitions/github.js +38 -0
  114. package/dist/webhooks/definitions/github.js.map +1 -0
  115. package/dist/webhooks/definitions/registry.d.ts +4 -0
  116. package/dist/webhooks/definitions/registry.d.ts.map +1 -0
  117. package/dist/webhooks/definitions/registry.js +14 -0
  118. package/dist/webhooks/definitions/registry.js.map +1 -0
  119. package/dist/webhooks/definitions/schema.d.ts +19 -0
  120. package/dist/webhooks/definitions/schema.d.ts.map +1 -0
  121. package/dist/webhooks/definitions/schema.js +2 -0
  122. package/dist/webhooks/definitions/schema.js.map +1 -0
  123. package/dist/webhooks/definitions/sentry.d.ts +3 -0
  124. package/dist/webhooks/definitions/sentry.d.ts.map +1 -0
  125. package/dist/webhooks/definitions/sentry.js +22 -0
  126. package/dist/webhooks/definitions/sentry.js.map +1 -0
  127. package/dist/webhooks/providers/sentry.d.ts +9 -0
  128. package/dist/webhooks/providers/sentry.d.ts.map +1 -0
  129. package/dist/webhooks/providers/sentry.js +108 -0
  130. package/dist/webhooks/providers/sentry.js.map +1 -0
  131. package/dist/webhooks/registry.js +2 -2
  132. package/dist/webhooks/registry.js.map +1 -1
  133. package/dist/webhooks/types.d.ts +5 -1
  134. package/dist/webhooks/types.d.ts.map +1 -1
  135. package/docker/Dockerfile +1 -11
  136. package/package.json +6 -5
  137. package/dist/agents/definitions/dev/AGENTS.md +0 -44
  138. package/dist/agents/definitions/dev/config-definition.json +0 -39
  139. package/dist/agents/definitions/devops/AGENTS.md +0 -33
  140. package/dist/agents/definitions/devops/config-definition.json +0 -37
  141. package/dist/agents/definitions/loader.d.ts +0 -18
  142. package/dist/agents/definitions/loader.d.ts.map +0 -1
  143. package/dist/agents/definitions/loader.js +0 -59
  144. package/dist/agents/definitions/loader.js.map +0 -1
  145. package/dist/agents/definitions/reviewer/AGENTS.md +0 -37
  146. package/dist/agents/definitions/reviewer/config-definition.json +0 -24
  147. package/dist/agents/definitions/schema.d.ts +0 -38
  148. package/dist/agents/definitions/schema.d.ts.map +0 -1
  149. package/dist/agents/definitions/schema.js +0 -97
  150. package/dist/agents/definitions/schema.js.map +0 -1
  151. package/dist/cli/commands/agent/add.d.ts.map +0 -1
  152. package/dist/cli/commands/agent/add.js +0 -86
  153. package/dist/cli/commands/agent/add.js.map +0 -1
@@ -1,21 +1,78 @@
1
- import { readFileSync, existsSync, writeFileSync, mkdirSync } from "fs";
1
+ import { readFileSync, existsSync, writeFileSync, mkdirSync, readdirSync } from "fs";
2
2
  import { resolve } from "path";
3
3
  import { CREDENTIALS_DIR } from "./paths.js";
4
- export function loadCredential(name) {
5
- const filepath = resolve(CREDENTIALS_DIR, name);
4
+ /**
5
+ * Parse a credential reference "type:instance" into its parts.
6
+ * If no instance is specified, defaults to "default".
7
+ */
8
+ export function parseCredentialRef(ref) {
9
+ const sep = ref.indexOf(":");
10
+ if (sep === -1)
11
+ return { type: ref, instance: "default" };
12
+ return { type: ref.slice(0, sep).trim(), instance: ref.slice(sep + 1).trim() };
13
+ }
14
+ /**
15
+ * Get the directory path for a credential instance.
16
+ */
17
+ export function credentialDir(type, instance) {
18
+ return resolve(CREDENTIALS_DIR, type, instance);
19
+ }
20
+ /**
21
+ * Load a single field from a credential instance.
22
+ */
23
+ export function loadCredentialField(type, instance, field) {
24
+ const filepath = resolve(credentialDir(type, instance), field);
6
25
  if (!existsSync(filepath))
7
26
  return undefined;
8
27
  return readFileSync(filepath, "utf-8").trim();
9
28
  }
10
- export function requireCredential(name) {
11
- const value = loadCredential(name);
12
- if (!value) {
13
- throw new Error(`Credential "${name}" not found at ${resolve(CREDENTIALS_DIR, name)}. Run 'al new' first.`);
29
+ /**
30
+ * Load all fields from a credential instance.
31
+ * Returns undefined if the instance directory does not exist.
32
+ */
33
+ export function loadCredentialFields(type, instance) {
34
+ const dir = credentialDir(type, instance);
35
+ if (!existsSync(dir))
36
+ return undefined;
37
+ const result = {};
38
+ for (const file of readdirSync(dir)) {
39
+ const filepath = resolve(dir, file);
40
+ result[file] = readFileSync(filepath, "utf-8").trim();
41
+ }
42
+ return Object.keys(result).length > 0 ? result : undefined;
43
+ }
44
+ /**
45
+ * Write a single field to a credential instance.
46
+ */
47
+ export function writeCredentialField(type, instance, field, value) {
48
+ const dir = credentialDir(type, instance);
49
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
50
+ writeFileSync(resolve(dir, field), value + "\n", { mode: 0o600 });
51
+ }
52
+ /**
53
+ * Write all fields to a credential instance.
54
+ */
55
+ export function writeCredentialFields(type, instance, fields) {
56
+ for (const [field, value] of Object.entries(fields)) {
57
+ writeCredentialField(type, instance, field, value);
14
58
  }
15
- return value;
16
59
  }
17
- export function writeCredential(name, value) {
18
- mkdirSync(CREDENTIALS_DIR, { recursive: true, mode: 0o700 });
19
- writeFileSync(resolve(CREDENTIALS_DIR, name), value + "\n", { mode: 0o600 });
60
+ /**
61
+ * Check if a credential instance exists (has at least one field file).
62
+ */
63
+ export function credentialExists(type, instance) {
64
+ const dir = credentialDir(type, instance);
65
+ if (!existsSync(dir))
66
+ return false;
67
+ return readdirSync(dir).length > 0;
68
+ }
69
+ /**
70
+ * Require that a credential instance exists. Throws if missing.
71
+ */
72
+ export function requireCredentialRef(ref) {
73
+ const { type, instance } = parseCredentialRef(ref);
74
+ if (!credentialExists(type, instance)) {
75
+ throw new Error(`Credential "${ref}" not found at ${credentialDir(type, instance)}. Run 'al setup' to configure it.`);
76
+ }
20
77
  }
21
78
  //# sourceMappingURL=credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,kBAAkB,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,uBAAuB,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/shared/credentials.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { execSync } from "child_process";
2
2
  import { existsSync } from "fs";
3
3
  import { resolve } from "path";
4
4
  import { CREDENTIALS_DIR } from "./paths.js";
5
- const SSH_KEY_PATH = resolve(CREDENTIALS_DIR, "id_rsa");
5
+ const SSH_KEY_PATH = resolve(CREDENTIALS_DIR, "git_ssh", "default", "id_rsa");
6
6
  export function sshUrl(owner, repo) {
7
7
  return `git@github.com:${owner}/${repo}.git`;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/shared/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAExD,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,IAAY;IAChD,OAAO,kBAAkB,KAAK,IAAI,IAAI,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,GAAG,GAA2B,EAAE,GAAG,OAAO,CAAC,GAAG,EAA4B,CAAC;IACjF,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,eAAe,GAAG,WAAW,YAAY,6DAA6D,CAAC;IAC7G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAY;IAC/C,OAAO,QAAQ,CAAC,GAAG,EAAE;QACnB,GAAG;QACH,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,SAAS,EAAE;KACjB,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/shared/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE9E,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,IAAY;IAChD,OAAO,kBAAkB,KAAK,IAAI,IAAI,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,GAAG,GAA2B,EAAE,GAAG,OAAO,CAAC,GAAG,EAA4B,CAAC;IACjF,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,eAAe,GAAG,WAAW,YAAY,6DAA6D,CAAC;IAC7G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAY;IAC/C,OAAO,QAAQ,CAAC,GAAG,EAAE;QACnB,GAAG;QACH,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,SAAS,EAAE;KACjB,CAAC,CAAC,IAAI,EAAE,CAAC;AACZ,CAAC"}
@@ -1,7 +1,6 @@
1
1
  export declare const AL_HOME: string;
2
2
  export declare const CREDENTIALS_DIR: string;
3
3
  export declare function projectDir(projectPath: string): string;
4
- export declare function stateDir(projectPath: string): string;
5
4
  export declare function logsDir(projectPath: string): string;
6
5
  export declare function eventsDir(projectPath: string): string;
7
6
  export declare function agentDir(projectPath: string, agentType: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,QAA4B,CAAC;AACjD,eAAO,MAAM,eAAe,QAAkD,CAAC;AAE/E,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvE"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO,QAA4B,CAAC;AACjD,eAAO,MAAM,eAAe,QAAkD,CAAC;AAE/E,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvE"}
@@ -5,9 +5,6 @@ export const CREDENTIALS_DIR = resolve(homedir(), ".action-llama-credentials");
5
5
  export function projectDir(projectPath) {
6
6
  return resolve(projectPath);
7
7
  }
8
- export function stateDir(projectPath) {
9
- return resolve(projectPath, ".al", "state");
10
- }
11
8
  export function logsDir(projectPath) {
12
9
  return resolve(projectPath, ".al", "logs");
13
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAE/E,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,WAAmB;IAC1C,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,WAAmB;IACzC,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,SAAiB;IAC7D,OAAO,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAE/E,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,WAAmB;IACzC,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,SAAiB;IAC7D,OAAO,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAuC,MAAM,qBAAqB,CAAC;AAkH9F,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE;IAAE,aAAa,EAAE,aAAa,CAAA;CAAE,2CAqC9E"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAuC,MAAM,qBAAqB,CAAC;AA6H9F,MAAM,CAAC,OAAO,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,EAAE;IAAE,aAAa,EAAE,aAAa,CAAA;CAAE,2CAqC9E"}
package/dist/tui/App.js CHANGED
@@ -46,11 +46,17 @@ function Header({ info, agentCount }) {
46
46
  return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Action Llama (", modeLabel, ") \u2014 ", agentCount, " agent", agentCount !== 1 ? "s" : "", ", ", info.cronJobCount, " cron job", info.cronJobCount !== 1 ? "s" : ""] }), _jsxs(Text, { dimColor: true, children: [info.gatewayPort ? `Gateway: :${info.gatewayPort}` : "", info.gatewayPort && info.webhooksActive ? " | " : "", info.webhooksActive ? "Webhooks: active" : ""] }), info.webhookUrls.map((url, i) => (_jsxs(Text, { dimColor: true, children: [" ", url] }, i))), _jsx(Text, { dimColor: true, children: "─".repeat(50) })] }));
47
47
  }
48
48
  function AgentRow({ agent }) {
49
- const stateColor = agent.state === "running" ? "green" : "white";
50
- const stateLabel = agent.state === "running" ? "Running" : "Idle";
51
- return (_jsxs(Box, { children: [_jsx(Box, { width: 12, children: _jsx(Text, { bold: true, children: agent.name }) }), _jsx(Box, { width: 10, children: _jsx(Text, { color: stateColor, children: stateLabel }) }), _jsx(Box, { width: 30, children: _jsx(Text, { dimColor: true, children: agent.statusText ? `"${agent.statusText}"` : "" }) }), _jsx(Box, { width: 20, children: _jsx(Text, { dimColor: true, children: agent.lastRunAt
52
- ? `Last: ${formatRelativeTime(agent.lastRunAt)}${agent.lastRunDuration !== null ? ` (${formatDuration(agent.lastRunDuration)})` : ""}`
53
- : "" }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: agent.nextRunAt ? `Next: ${formatTimeUntil(agent.nextRunAt)}` : "" }) })] }));
49
+ const stateColor = agent.state === "running" ? "green" : agent.state === "error" ? "red" : "white";
50
+ const stateLabel = agent.state === "running" ? "Running" : agent.state === "error" ? "Error" : "Idle";
51
+ // Show status text, or last error for error state
52
+ const detail = agent.statusText
53
+ ? `"${agent.statusText}"`
54
+ : agent.state === "error" && agent.lastError
55
+ ? agent.lastError
56
+ : "";
57
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Box, { width: 12, children: _jsx(Text, { bold: true, children: agent.name }) }), _jsx(Box, { width: 10, children: _jsx(Text, { color: stateColor, children: stateLabel }) }), _jsx(Box, { width: 30, children: _jsx(Text, { dimColor: true, children: agent.lastRunAt
58
+ ? `Last: ${formatRelativeTime(agent.lastRunAt)}${agent.lastRunDuration !== null ? ` (${formatDuration(agent.lastRunDuration)})` : ""}`
59
+ : "" }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: agent.nextRunAt ? `Next: ${formatTimeUntil(agent.nextRunAt)}` : "" }) })] }), detail ? (_jsx(Box, { paddingLeft: 2, children: _jsx(Text, { color: agent.state === "error" ? "red" : undefined, dimColor: agent.state !== "error", wrap: "truncate-end", children: detail.slice(0, 120) }) })) : null] }));
54
60
  }
55
61
  function RecentActivity({ logs }) {
56
62
  if (logs.length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { EventEmitter } from "events";
2
2
  export interface AgentStatus {
3
3
  name: string;
4
- state: "idle" | "running";
4
+ state: "idle" | "running" | "error";
5
5
  statusText: string | null;
6
+ lastError: string | null;
6
7
  lastRunAt: Date | null;
7
8
  lastRunDuration: number | null;
8
9
  nextRunAt: Date | null;
@@ -26,9 +27,10 @@ export declare class StatusTracker extends EventEmitter {
26
27
  private recentLogs;
27
28
  private maxLogs;
28
29
  registerAgent(name: string): void;
29
- setAgentState(name: string, state: "idle" | "running"): void;
30
+ setAgentState(name: string, state: "idle" | "running" | "error"): void;
30
31
  setAgentStatusText(name: string, text: string): void;
31
- completeRun(name: string, durationMs: number): void;
32
+ setAgentError(name: string, error: string): void;
33
+ completeRun(name: string, durationMs: number, error?: string): void;
32
34
  setNextRunAt(name: string, nextRunAt: Date | null): void;
33
35
  setSchedulerInfo(info: SchedulerInfo): void;
34
36
  addLogLine(agent: string, message: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"status-tracker.d.ts","sourceRoot":"","sources":["../../src/tui/status-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,OAAO,CAAO;IAEtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAYjC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAU5D,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOpD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUnD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;IAOxD,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAK3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQhD,YAAY,IAAI,WAAW,EAAE;IAI7B,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC,aAAa,CAAC,CAAC,SAAK,GAAG,OAAO,EAAE;CAGjC"}
1
+ {"version":3,"file":"status-tracker.d.ts","sourceRoot":"","sources":["../../src/tui/status-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,OAAO,CAAO;IAEtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAajC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI;IAWtE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOpD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOhD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAanE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;IAOxD,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAK3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQhD,YAAY,IAAI,WAAW,EAAE;IAI7B,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC,aAAa,CAAC,CAAC,SAAK,GAAG,OAAO,EAAE;CAGjC"}
@@ -9,6 +9,7 @@ export class StatusTracker extends EventEmitter {
9
9
  name,
10
10
  state: "idle",
11
11
  statusText: null,
12
+ lastError: null,
12
13
  lastRunAt: null,
13
14
  lastRunDuration: null,
14
15
  nextRunAt: null,
@@ -22,6 +23,7 @@ export class StatusTracker extends EventEmitter {
22
23
  agent.state = state;
23
24
  if (state === "running") {
24
25
  agent.statusText = null;
26
+ agent.lastError = null;
25
27
  }
26
28
  this.emit("update");
27
29
  }
@@ -32,14 +34,24 @@ export class StatusTracker extends EventEmitter {
32
34
  agent.statusText = text;
33
35
  this.emit("update");
34
36
  }
35
- completeRun(name, durationMs) {
37
+ setAgentError(name, error) {
36
38
  const agent = this.agents.get(name);
37
39
  if (!agent)
38
40
  return;
39
- agent.state = "idle";
41
+ agent.lastError = error;
42
+ this.emit("update");
43
+ }
44
+ completeRun(name, durationMs, error) {
45
+ const agent = this.agents.get(name);
46
+ if (!agent)
47
+ return;
48
+ agent.state = error ? "error" : "idle";
40
49
  agent.lastRunAt = new Date();
41
50
  agent.lastRunDuration = durationMs;
42
51
  agent.statusText = null;
52
+ if (error) {
53
+ agent.lastError = error;
54
+ }
43
55
  this.emit("update");
44
56
  }
45
57
  setNextRunAt(name, nextRunAt) {
@@ -1 +1 @@
1
- {"version":3,"file":"status-tracker.js","sourceRoot":"","sources":["../../src/tui/status-tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status-tracker.js","sourceRoot":"","sources":["../../src/tui/status-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WebhookDefinition } from "./schema.js";
2
+ export declare const github: WebhookDefinition;
3
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/webhooks/definitions/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,MAAM,EAAE,iBAoCpB,CAAC"}
@@ -0,0 +1,38 @@
1
+ export const github = {
2
+ id: "github",
3
+ label: "GitHub",
4
+ description: "GitHub webhook events",
5
+ secretCredential: "github_webhook_secret:default",
6
+ filterSpec: [
7
+ {
8
+ field: "events",
9
+ label: "Events",
10
+ type: "multi-select",
11
+ required: true,
12
+ options: [
13
+ { value: "issues", label: "Issues" },
14
+ { value: "pull_request", label: "Pull requests" },
15
+ { value: "issue_comment", label: "Issue comments" },
16
+ { value: "push", label: "Push" },
17
+ { value: "workflow_run", label: "Workflow runs" },
18
+ ],
19
+ },
20
+ {
21
+ field: "actions",
22
+ label: "Actions",
23
+ type: "multi-select",
24
+ options: [
25
+ { value: "opened", label: "Opened" },
26
+ { value: "closed", label: "Closed" },
27
+ { value: "labeled", label: "Labeled" },
28
+ { value: "synchronize", label: "Synchronized" },
29
+ { value: "completed", label: "Completed" },
30
+ { value: "created", label: "Created" },
31
+ ],
32
+ },
33
+ { field: "labels", label: "Labels", type: "text[]" },
34
+ { field: "assignee", label: "Assignee", type: "text" },
35
+ { field: "branches", label: "Branches", type: "text[]" },
36
+ ],
37
+ };
38
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/webhooks/definitions/github.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAsB;IACvC,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,uBAAuB;IACpC,gBAAgB,EAAE,+BAA+B;IACjD,UAAU,EAAE;QACV;YACE,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE;gBACjD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBACnD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAChC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE;aAClD;SACF;QACD;YACE,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;gBACtC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE;gBAC/C,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC1C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;aACvC;SACF;QACD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;QACtD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzD;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { WebhookDefinition } from "./schema.js";
2
+ export declare function resolveWebhookDefinition(id: string): WebhookDefinition;
3
+ export declare function listWebhookDefinitions(): WebhookDefinition[];
4
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/webhooks/definitions/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAMrD,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAMtE;AAED,wBAAgB,sBAAsB,IAAI,iBAAiB,EAAE,CAE5D"}
@@ -0,0 +1,14 @@
1
+ import { github } from "./github.js";
2
+ import { sentry } from "./sentry.js";
3
+ const definitions = [github, sentry];
4
+ export function resolveWebhookDefinition(id) {
5
+ const def = definitions.find((d) => d.id === id);
6
+ if (!def) {
7
+ throw new Error(`Unknown webhook definition: "${id}". Available: ${definitions.map((d) => d.id).join(", ")}`);
8
+ }
9
+ return def;
10
+ }
11
+ export function listWebhookDefinitions() {
12
+ return [...definitions];
13
+ }
14
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/webhooks/definitions/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,GAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,EAAE,iBAAiB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface FilterFieldOption {
2
+ value: string;
3
+ label: string;
4
+ }
5
+ export interface FilterFieldSpec {
6
+ field: string;
7
+ label: string;
8
+ type: "multi-select" | "text" | "text[]";
9
+ options?: FilterFieldOption[];
10
+ required?: boolean;
11
+ }
12
+ export interface WebhookDefinition {
13
+ id: string;
14
+ label: string;
15
+ description: string;
16
+ secretCredential?: string;
17
+ filterSpec: FilterFieldSpec[];
18
+ }
19
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/webhooks/definitions/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/webhooks/definitions/schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { WebhookDefinition } from "./schema.js";
2
+ export declare const sentry: WebhookDefinition;
3
+ //# sourceMappingURL=sentry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../../src/webhooks/definitions/sentry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,MAAM,EAAE,iBAoBpB,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const sentry = {
2
+ id: "sentry",
3
+ label: "Sentry",
4
+ description: "Sentry webhook events",
5
+ secretCredential: "sentry_client_secret:default",
6
+ filterSpec: [
7
+ {
8
+ field: "resources",
9
+ label: "Event types",
10
+ type: "multi-select",
11
+ required: true,
12
+ options: [
13
+ { value: "event_alert", label: "Issue alerts" },
14
+ { value: "metric_alert", label: "Metric alerts" },
15
+ { value: "issue", label: "Issues" },
16
+ { value: "error", label: "Errors" },
17
+ { value: "comment", label: "Comments" },
18
+ ],
19
+ },
20
+ ],
21
+ };
22
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../../src/webhooks/definitions/sentry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAsB;IACvC,EAAE,EAAE,QAAQ;IACZ,KAAK,EAAE,QAAQ;IACf,WAAW,EAAE,uBAAuB;IACpC,gBAAgB,EAAE,8BAA8B;IAChD,UAAU,EAAE;QACV;YACE,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE;gBAC/C,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE;gBACjD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACnC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;aACxC;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { WebhookProvider, WebhookContext, WebhookFilter } from "../types.js";
2
+ export declare class SentryWebhookProvider implements WebhookProvider {
3
+ source: string;
4
+ validateRequest(headers: Record<string, string | undefined>, rawBody: string, secret?: string): boolean;
5
+ parseEvent(headers: Record<string, string | undefined>, body: any): WebhookContext | null;
6
+ private extractContext;
7
+ matchesFilter(context: WebhookContext, filter: WebhookFilter): boolean;
8
+ }
9
+ //# sourceMappingURL=sentry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../../src/webhooks/providers/sentry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AASvG,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,MAAM,SAAY;IAElB,eAAe,CACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC3C,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO;IAaV,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,cAAc,GAAG,IAAI;IAezF,OAAO,CAAC,cAAc;IA2EtB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;CASvE"}
@@ -0,0 +1,108 @@
1
+ import { createHmac, timingSafeEqual } from "crypto";
2
+ const MAX_TEXT_LENGTH = 4000;
3
+ function truncate(text, max = MAX_TEXT_LENGTH) {
4
+ if (!text)
5
+ return undefined;
6
+ return text.length > max ? text.slice(0, max) + "..." : text;
7
+ }
8
+ export class SentryWebhookProvider {
9
+ source = "sentry";
10
+ validateRequest(headers, rawBody, secret) {
11
+ // If no secret configured, skip validation
12
+ if (!secret)
13
+ return true;
14
+ const signature = headers["sentry-hook-signature"];
15
+ if (!signature)
16
+ return false;
17
+ const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
18
+ if (signature.length !== expected.length)
19
+ return false;
20
+ return timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
21
+ }
22
+ parseEvent(headers, body) {
23
+ const resource = headers["sentry-hook-resource"];
24
+ if (!resource)
25
+ return null;
26
+ const base = {
27
+ source: "sentry",
28
+ event: resource,
29
+ action: body.action,
30
+ sender: body.actor?.name || body.actor?.type || "unknown",
31
+ timestamp: new Date().toISOString(),
32
+ };
33
+ return this.extractContext(resource, body, base);
34
+ }
35
+ extractContext(resource, body, base) {
36
+ switch (resource) {
37
+ case "event_alert": {
38
+ const data = body.data || {};
39
+ const event = data.event || {};
40
+ return {
41
+ ...base,
42
+ repo: data.triggered_rule || "",
43
+ title: truncate(event.title),
44
+ url: event.web_url,
45
+ body: truncate(event.message),
46
+ };
47
+ }
48
+ case "metric_alert": {
49
+ const data = body.data || {};
50
+ const alert = data.metric_alert || {};
51
+ return {
52
+ ...base,
53
+ repo: alert.organization?.slug || "",
54
+ title: truncate(alert.title),
55
+ url: alert.web_url,
56
+ };
57
+ }
58
+ case "issue": {
59
+ const data = body.data || {};
60
+ const issue = data.issue || {};
61
+ return {
62
+ ...base,
63
+ repo: issue.project?.slug || "",
64
+ title: truncate(issue.title),
65
+ url: issue.web_url,
66
+ assignee: issue.assignedTo?.name,
67
+ };
68
+ }
69
+ case "error": {
70
+ const data = body.data || {};
71
+ const error = data.error || {};
72
+ return {
73
+ ...base,
74
+ repo: error.project?.slug || "",
75
+ title: truncate(error.title),
76
+ url: error.web_url,
77
+ body: truncate(error.message),
78
+ };
79
+ }
80
+ case "comment": {
81
+ const data = body.data || {};
82
+ const comment = data.comment || {};
83
+ const issue = data.issue || {};
84
+ return {
85
+ ...base,
86
+ repo: issue.project?.slug || "",
87
+ title: truncate(issue.title),
88
+ url: issue.web_url,
89
+ comment: truncate(comment.text),
90
+ };
91
+ }
92
+ default:
93
+ return {
94
+ ...base,
95
+ repo: "",
96
+ title: body.action || resource,
97
+ };
98
+ }
99
+ }
100
+ matchesFilter(context, filter) {
101
+ const f = filter;
102
+ if (f.resources?.length && !f.resources.includes(context.event)) {
103
+ return false;
104
+ }
105
+ return true;
106
+ }
107
+ }
108
+ //# sourceMappingURL=sentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.js","sourceRoot":"","sources":["../../../src/webhooks/providers/sentry.ts"],"names":[],"mappings":"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"}
@@ -24,7 +24,7 @@ export class WebhookRegistry {
24
24
  }
25
25
  // Validate request signature
26
26
  if (!provider.validateRequest(headers, rawBody, secret)) {
27
- this.logger.warn({ source, hasSecret: !!secret, hasSignatureHeader: !!headers["x-hub-signature-256"] }, "webhook signature validation failed");
27
+ this.logger.warn({ source, hasSecret: !!secret }, "webhook signature validation failed");
28
28
  return { ok: false, matched: 0, skipped: 0, errors: ["signature validation failed"] };
29
29
  }
30
30
  // Parse the event — handle both JSON and form-encoded payloads
@@ -50,7 +50,7 @@ export class WebhookRegistry {
50
50
  }
51
51
  const context = provider.parseEvent(headers, body);
52
52
  if (!context) {
53
- this.logger.warn({ source, event: headers["x-github-event"], hasRepo: !!body.repository?.full_name }, "webhook event could not be parsed (parseEvent returned null)");
53
+ this.logger.warn({ source }, "webhook event could not be parsed (parseEvent returned null)");
54
54
  return { ok: true, matched: 0, skipped: 0 };
55
55
  }
56
56
  this.logger.debug({ source, event: context.event, action: context.action, repo: context.repo, sender: context.sender }, "webhook event parsed");