swarm-engine 1.43.0 → 1.54.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 (165) hide show
  1. package/README.md +145 -42
  2. package/agents/implementer.md +1 -14
  3. package/agents/orchestrator.md +127 -246
  4. package/agents/reviewer.md +3 -18
  5. package/dist/cli/commands/agents.js +13 -1
  6. package/dist/cli/commands/agents.js.map +1 -1
  7. package/dist/cli/commands/dashboard.d.ts +3 -0
  8. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  9. package/dist/cli/commands/dashboard.js +43 -0
  10. package/dist/cli/commands/dashboard.js.map +1 -0
  11. package/dist/cli/commands/orchestrate.d.ts.map +1 -1
  12. package/dist/cli/commands/orchestrate.js +17 -0
  13. package/dist/cli/commands/orchestrate.js.map +1 -1
  14. package/dist/cli/commands/run.d.ts.map +1 -1
  15. package/dist/cli/commands/run.js +20 -1
  16. package/dist/cli/commands/run.js.map +1 -1
  17. package/dist/cli/commands/status.d.ts +1 -0
  18. package/dist/cli/commands/status.d.ts.map +1 -1
  19. package/dist/cli/commands/status.js +5 -2
  20. package/dist/cli/commands/status.js.map +1 -1
  21. package/dist/cli/commands/usage.d.ts +3 -0
  22. package/dist/cli/commands/usage.d.ts.map +1 -0
  23. package/dist/cli/commands/usage.js +85 -0
  24. package/dist/cli/commands/usage.js.map +1 -0
  25. package/dist/cli/index.js +2 -0
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/core/event-bus.d.ts.map +1 -1
  28. package/dist/core/event-bus.js +4 -1
  29. package/dist/core/event-bus.js.map +1 -1
  30. package/dist/core/types.d.ts +44 -1
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/core/types.js +4 -0
  33. package/dist/core/types.js.map +1 -1
  34. package/dist/hooks/cli.js +4 -1
  35. package/dist/hooks/cli.js.map +1 -1
  36. package/dist/hooks/index.d.ts +9 -0
  37. package/dist/hooks/index.d.ts.map +1 -1
  38. package/dist/hooks/index.js +54 -0
  39. package/dist/hooks/index.js.map +1 -1
  40. package/dist/hooks/transcript-parser.d.ts +68 -0
  41. package/dist/hooks/transcript-parser.d.ts.map +1 -0
  42. package/dist/hooks/transcript-parser.js +163 -0
  43. package/dist/hooks/transcript-parser.js.map +1 -0
  44. package/dist/hooks/usage-logger.d.ts +30 -0
  45. package/dist/hooks/usage-logger.d.ts.map +1 -0
  46. package/dist/hooks/usage-logger.js +67 -0
  47. package/dist/hooks/usage-logger.js.map +1 -0
  48. package/dist/index.d.ts +16 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +10 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/memory/index.js +2 -2
  53. package/dist/memory/index.js.map +1 -1
  54. package/dist/runtime/agent-runner.d.ts +9 -0
  55. package/dist/runtime/agent-runner.d.ts.map +1 -1
  56. package/dist/runtime/agent-runner.js +167 -11
  57. package/dist/runtime/agent-runner.js.map +1 -1
  58. package/dist/runtime/backends/claude.d.ts +30 -0
  59. package/dist/runtime/backends/claude.d.ts.map +1 -1
  60. package/dist/runtime/backends/claude.js +112 -2
  61. package/dist/runtime/backends/claude.js.map +1 -1
  62. package/dist/runtime/backends/codex.d.ts.map +1 -1
  63. package/dist/runtime/backends/codex.js +4 -0
  64. package/dist/runtime/backends/codex.js.map +1 -1
  65. package/dist/runtime/backends/gemini.d.ts.map +1 -1
  66. package/dist/runtime/backends/gemini.js +4 -0
  67. package/dist/runtime/backends/gemini.js.map +1 -1
  68. package/dist/runtime/benefits.d.ts +81 -1
  69. package/dist/runtime/benefits.d.ts.map +1 -1
  70. package/dist/runtime/benefits.js +199 -12
  71. package/dist/runtime/benefits.js.map +1 -1
  72. package/dist/runtime/cache-optimizer.d.ts +7 -3
  73. package/dist/runtime/cache-optimizer.d.ts.map +1 -1
  74. package/dist/runtime/cache-optimizer.js +11 -7
  75. package/dist/runtime/cache-optimizer.js.map +1 -1
  76. package/dist/runtime/compaction.d.ts +6 -1
  77. package/dist/runtime/compaction.d.ts.map +1 -1
  78. package/dist/runtime/compaction.js +39 -2
  79. package/dist/runtime/compaction.js.map +1 -1
  80. package/dist/runtime/cost-model.d.ts.map +1 -1
  81. package/dist/runtime/cost-model.js +20 -17
  82. package/dist/runtime/cost-model.js.map +1 -1
  83. package/dist/runtime/engine.d.ts +2 -0
  84. package/dist/runtime/engine.d.ts.map +1 -1
  85. package/dist/runtime/engine.js +162 -3
  86. package/dist/runtime/engine.js.map +1 -1
  87. package/dist/runtime/graph-discovery.js +2 -2
  88. package/dist/runtime/graph-discovery.js.map +1 -1
  89. package/dist/runtime/graph-trajectory.js +3 -3
  90. package/dist/runtime/graph-trajectory.js.map +1 -1
  91. package/dist/runtime/handoff.d.ts +8 -0
  92. package/dist/runtime/handoff.d.ts.map +1 -0
  93. package/dist/runtime/handoff.js +109 -0
  94. package/dist/runtime/handoff.js.map +1 -0
  95. package/dist/runtime/heuristics.d.ts +2 -1
  96. package/dist/runtime/heuristics.d.ts.map +1 -1
  97. package/dist/runtime/heuristics.js +15 -2
  98. package/dist/runtime/heuristics.js.map +1 -1
  99. package/dist/runtime/lsp.d.ts.map +1 -1
  100. package/dist/runtime/lsp.js +4 -0
  101. package/dist/runtime/lsp.js.map +1 -1
  102. package/dist/runtime/mcp.d.ts +1 -0
  103. package/dist/runtime/mcp.d.ts.map +1 -1
  104. package/dist/runtime/mcp.js +38 -0
  105. package/dist/runtime/mcp.js.map +1 -1
  106. package/dist/runtime/model-router.d.ts +2 -1
  107. package/dist/runtime/model-router.d.ts.map +1 -1
  108. package/dist/runtime/model-router.js +8 -1
  109. package/dist/runtime/model-router.js.map +1 -1
  110. package/dist/runtime/output-summarizer.d.ts +45 -0
  111. package/dist/runtime/output-summarizer.d.ts.map +1 -0
  112. package/dist/runtime/output-summarizer.js +171 -0
  113. package/dist/runtime/output-summarizer.js.map +1 -0
  114. package/dist/runtime/plugins.d.ts +5 -1
  115. package/dist/runtime/plugins.d.ts.map +1 -1
  116. package/dist/runtime/plugins.js +14 -2
  117. package/dist/runtime/plugins.js.map +1 -1
  118. package/dist/runtime/prompt-tier.d.ts +33 -0
  119. package/dist/runtime/prompt-tier.d.ts.map +1 -0
  120. package/dist/runtime/prompt-tier.js +105 -0
  121. package/dist/runtime/prompt-tier.js.map +1 -0
  122. package/dist/runtime/savings-manifest.d.ts +66 -0
  123. package/dist/runtime/savings-manifest.d.ts.map +1 -0
  124. package/dist/runtime/savings-manifest.js +103 -0
  125. package/dist/runtime/savings-manifest.js.map +1 -0
  126. package/dist/runtime/sharing.js +2 -1
  127. package/dist/runtime/sharing.js.map +1 -1
  128. package/dist/runtime/stats.d.ts +2 -0
  129. package/dist/runtime/stats.d.ts.map +1 -1
  130. package/dist/runtime/stats.js +23 -3
  131. package/dist/runtime/stats.js.map +1 -1
  132. package/dist/runtime/violation-tracker.d.ts +31 -0
  133. package/dist/runtime/violation-tracker.d.ts.map +1 -0
  134. package/dist/runtime/violation-tracker.js +125 -0
  135. package/dist/runtime/violation-tracker.js.map +1 -0
  136. package/dist/utils/project-config.d.ts +20 -0
  137. package/dist/utils/project-config.d.ts.map +1 -1
  138. package/dist/utils/project-config.js +46 -1
  139. package/dist/utils/project-config.js.map +1 -1
  140. package/dist/utils/redact.d.ts.map +1 -1
  141. package/dist/utils/redact.js +5 -1
  142. package/dist/utils/redact.js.map +1 -1
  143. package/dist/web/bridge.d.ts +47 -0
  144. package/dist/web/bridge.d.ts.map +1 -0
  145. package/dist/web/bridge.js +267 -0
  146. package/dist/web/bridge.js.map +1 -0
  147. package/dist/web/graph-api.d.ts +19 -0
  148. package/dist/web/graph-api.d.ts.map +1 -0
  149. package/dist/web/graph-api.js +157 -0
  150. package/dist/web/graph-api.js.map +1 -0
  151. package/dist/web/index.d.ts +21 -0
  152. package/dist/web/index.d.ts.map +1 -0
  153. package/dist/web/index.js +38 -0
  154. package/dist/web/index.js.map +1 -0
  155. package/dist/web/public/index.html +1304 -0
  156. package/dist/web/public/public/index.html +1307 -0
  157. package/dist/web/server.d.ts +24 -0
  158. package/dist/web/server.d.ts.map +1 -0
  159. package/dist/web/server.js +113 -0
  160. package/dist/web/server.js.map +1 -0
  161. package/dist/web/tray.d.ts +23 -0
  162. package/dist/web/tray.d.ts.map +1 -0
  163. package/dist/web/tray.js +205 -0
  164. package/dist/web/tray.js.map +1 -0
  165. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { z } from 'zod';
1
2
  /**
2
3
  * Project-level config loaded from .swarm.yml / .swarm.yaml (snake_case).
3
4
  *
@@ -23,6 +24,25 @@ export interface ProjectConfig {
23
24
  disabled?: boolean;
24
25
  }>;
25
26
  }
27
+ export declare const ProjectConfigSchema: z.ZodObject<{
28
+ project: z.ZodOptional<z.ZodString>;
29
+ default_backend: z.ZodOptional<z.ZodString>;
30
+ default_pattern: z.ZodOptional<z.ZodString>;
31
+ cost_budget: z.ZodOptional<z.ZodNumber>;
32
+ autonomy: z.ZodOptional<z.ZodEnum<{
33
+ ask: "ask";
34
+ auto: "auto";
35
+ }>>;
36
+ agents: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
37
+ extra_rules: z.ZodOptional<z.ZodArray<z.ZodString>>;
38
+ model: z.ZodOptional<z.ZodString>;
39
+ backend: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strict>>>;
41
+ context_files: z.ZodOptional<z.ZodArray<z.ZodString>>;
42
+ patterns: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
43
+ disabled: z.ZodOptional<z.ZodBoolean>;
44
+ }, z.core.$strict>>>;
45
+ }, z.core.$strip>;
26
46
  export declare function loadProjectConfig(cwd?: string): ProjectConfig | null;
27
47
  /**
28
48
  * Resolve the effective default backend from project config (.swarm.yml).
@@ -1 +1 @@
1
- {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/utils/project-config.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CACb,MAAM,EACN;QAEE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CACF,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN;QAEE,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CACF,CAAC;CACH;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAmBpE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAED,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB1D"}
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/utils/project-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CACb,MAAM,EACN;QAEE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CACF,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN;QAEE,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CACF,CAAC;CACH;AAgBD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;iBAS9B,CAAC;AA2BH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAmBpE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAED,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB1D"}
@@ -1,6 +1,51 @@
1
1
  import { existsSync, readFileSync } from 'fs';
2
2
  import { join } from 'path';
3
3
  import yaml from 'js-yaml';
4
+ import { z } from 'zod';
5
+ const AgentOverrideSchema = z
6
+ .object({
7
+ extra_rules: z.array(z.string()).optional(),
8
+ model: z.string().optional(),
9
+ backend: z.string().optional(),
10
+ })
11
+ .strict();
12
+ const PatternOverrideSchema = z
13
+ .object({
14
+ disabled: z.boolean().optional(),
15
+ })
16
+ .strict();
17
+ export const ProjectConfigSchema = z.object({
18
+ project: z.string().optional(),
19
+ default_backend: z.string().optional(),
20
+ default_pattern: z.string().optional(),
21
+ cost_budget: z.number().optional(),
22
+ autonomy: z.enum(['ask', 'auto']).optional(),
23
+ agents: z.record(z.string(), AgentOverrideSchema).optional(),
24
+ context_files: z.array(z.string()).optional(),
25
+ patterns: z.record(z.string(), PatternOverrideSchema).optional(),
26
+ });
27
+ /** Fields that should never appear in a project config (potential code execution vectors) */
28
+ const DANGEROUS_FIELDS = new Set(['command', 'exec', 'script', 'shell', 'run', 'postinstall']);
29
+ function validateProjectConfig(parsed, path) {
30
+ // Strip dangerous top-level fields
31
+ for (const key of Object.keys(parsed)) {
32
+ if (DANGEROUS_FIELDS.has(key)) {
33
+ console.warn(`[swarm] Stripped dangerous field "${key}" from ${path}`);
34
+ delete parsed[key];
35
+ }
36
+ }
37
+ const result = ProjectConfigSchema.safeParse(parsed);
38
+ if (!result.success) {
39
+ for (const issue of result.error.issues) {
40
+ console.warn(`[swarm] Config warning in ${path}: ${issue.path.join('.')} — ${issue.message}`);
41
+ }
42
+ // Still return the parsed config with unknown fields stripped for safety
43
+ // Use the successfully parsed fields from a partial parse
44
+ const partial = ProjectConfigSchema.partial().safeParse(parsed);
45
+ return (partial.success ? partial.data : parsed);
46
+ }
47
+ return result.data;
48
+ }
4
49
  export function loadProjectConfig(cwd) {
5
50
  const dir = cwd ?? process.cwd();
6
51
  const candidates = [join(dir, '.swarm.yml'), join(dir, '.swarm.yaml'), join(dir, '.swarm', 'config.yml')];
@@ -10,7 +55,7 @@ export function loadProjectConfig(cwd) {
10
55
  const content = readFileSync(path, 'utf-8');
11
56
  const parsed = yaml.load(content, { schema: yaml.DEFAULT_SCHEMA });
12
57
  if (parsed && typeof parsed === 'object') {
13
- return parsed;
58
+ return validateProjectConfig(parsed, path);
14
59
  }
15
60
  }
16
61
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/utils/project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,SAAS,CAAC;AAoC3B,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1G,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;gBACnE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACzC,OAAO,MAAuB,CAAC;gBACjC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,2BAA2B,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvF,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,EAAE,eAAe,IAAI,IAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,uBAAuB;IACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM,EAAE,OAAO;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAE3C,mBAAmB;IACnB,MAAM,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,IAAI;gBAAE,OAAO,GAAG,CAAC,IAAI,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,8BAA8B;IAC9B,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/utils/project-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD"}
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -7,13 +7,17 @@ const SECRET_PATTERNS = [
7
7
  /(?:secret|token)\s*[:=]\s*(?:"[^"]*"|'[^']*'|[^\s"']+)/gi,
8
8
  /(?:postgres|mysql|mongodb|redis):\/\/[^\s"']+/gi,
9
9
  /(?:mongodb\+srv|rediss?|amqps?):\/\/[^\s"']+/gi,
10
- /sk-[a-zA-Z0-9]{20,}/g,
10
+ /sk-[a-zA-Z0-9_-]{20,}/g,
11
11
  /ghp_[a-zA-Z0-9]{36}/g,
12
12
  /github_pat_[a-zA-Z0-9_]{22,}/g,
13
13
  /AKIA[0-9A-Z]{16}/g,
14
14
  /-----BEGIN[A-Z ]*PRIVATE KEY-----/g,
15
15
  /Bearer\s+[^\s"']+/gi,
16
16
  /Authorization:\s*Basic\s+[^\s"']+/gi,
17
+ /xox[bpars]-[a-zA-Z0-9-]{10,}/g,
18
+ /npm_[a-zA-Z0-9]{36}/g,
19
+ /vercel_[a-zA-Z0-9_]{20,}/g,
20
+ /x-api-key:\s*sk-ant[a-zA-Z0-9_-]+/gi,
17
21
  ];
18
22
  export function redactSecrets(text) {
19
23
  let result = text;
@@ -1 +1 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,eAAe,GAAG;IACtB,iEAAiE;IACjE,gEAAgE;IAChE,0DAA0D;IAC1D,iDAAiD;IACjD,gDAAgD;IAChD,sBAAsB;IACtB,sBAAsB;IACtB,+BAA+B;IAC/B,mBAAmB;IACnB,oCAAoC;IACpC,qBAAqB;IACrB,qCAAqC;CACtC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,eAAe,GAAG;IACtB,iEAAiE;IACjE,gEAAgE;IAChE,0DAA0D;IAC1D,iDAAiD;IACjD,gDAAgD;IAChD,wBAAwB;IACxB,sBAAsB;IACtB,+BAA+B;IAC/B,mBAAmB;IACnB,oCAAoC;IACpC,qBAAqB;IACrB,qCAAqC;IACrC,+BAA+B;IAC/B,sBAAsB;IACtB,2BAA2B;IAC3B,qCAAqC;CACtC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { EventBus } from '../core/event-bus.js';
2
+ import type { DashboardServer } from './server.js';
3
+ export interface DashboardState {
4
+ orchestrationName: string;
5
+ pattern: string;
6
+ status: string;
7
+ startedAt: Date | null;
8
+ phases: PhaseState[];
9
+ usage: {
10
+ tokens: number;
11
+ cost: number;
12
+ turns: number;
13
+ toolCalls: number;
14
+ };
15
+ }
16
+ export interface PhaseState {
17
+ name: string;
18
+ status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
19
+ agents: AgentState[];
20
+ startedAt: Date | null;
21
+ completedAt: Date | null;
22
+ }
23
+ export interface AgentState {
24
+ id: string;
25
+ name: string;
26
+ type: string;
27
+ model: string;
28
+ backend: string;
29
+ status: 'waiting' | 'spawning' | 'running' | 'done' | 'error' | 'timeout';
30
+ tokens: number;
31
+ detail: string;
32
+ }
33
+ export declare class DashboardBridge {
34
+ private bus;
35
+ private server;
36
+ private state;
37
+ private handler;
38
+ constructor(bus: EventBus, server: DashboardServer);
39
+ start(): void;
40
+ stop(): void;
41
+ /** Get a readonly copy of the current state (for testing). */
42
+ getState(): Readonly<DashboardState>;
43
+ private updateState;
44
+ private findOrCreatePhase;
45
+ private findOrCreateAgent;
46
+ }
47
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/web/bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnE,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAA8C;gBAEjD,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe;IAalD,KAAK,IAAI,IAAI;IAgBb,IAAI,IAAI,IAAI;IAOZ,8DAA8D;IAC9D,QAAQ,IAAI,QAAQ,CAAC,cAAc,CAAC;IAMpC,OAAO,CAAC,WAAW;IAoJnB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,iBAAiB;CA0E1B"}
@@ -0,0 +1,267 @@
1
+ import { WebSocket } from 'ws';
2
+ // ─── Bridge ────────────────────────────────────────────────────────
3
+ export class DashboardBridge {
4
+ bus;
5
+ server;
6
+ state;
7
+ handler = null;
8
+ constructor(bus, server) {
9
+ this.bus = bus;
10
+ this.server = server;
11
+ this.state = {
12
+ orchestrationName: 'Waiting for orchestration...',
13
+ pattern: '',
14
+ status: 'pending',
15
+ startedAt: null,
16
+ phases: [],
17
+ usage: { tokens: 0, cost: 0, turns: 0, toolCalls: 0 },
18
+ };
19
+ }
20
+ start() {
21
+ // On new WebSocket connection, send current state snapshot
22
+ this.server.setOnConnect((ws) => {
23
+ if (ws.readyState === WebSocket.OPEN) {
24
+ ws.send(JSON.stringify({ type: 'snapshot', data: this.state }));
25
+ }
26
+ });
27
+ // Subscribe to all events via wildcard
28
+ this.handler = (event) => {
29
+ this.updateState(event);
30
+ this.server.broadcast(JSON.stringify({ type: 'event', data: event }));
31
+ };
32
+ this.bus.on('*', this.handler);
33
+ }
34
+ stop() {
35
+ if (this.handler) {
36
+ this.bus.off('*', this.handler);
37
+ this.handler = null;
38
+ }
39
+ }
40
+ /** Get a readonly copy of the current state (for testing). */
41
+ getState() {
42
+ return this.state;
43
+ }
44
+ // ─── State Updates (same logic as TUI dashboard) ─────────────────
45
+ updateState(event) {
46
+ const data = event.data;
47
+ switch (event.type) {
48
+ case 'orchestration:start': {
49
+ this.state.orchestrationName = String(data.name ?? 'Orchestration');
50
+ this.state.pattern = String(data.pattern ?? '');
51
+ this.state.status = 'running';
52
+ this.state.startedAt = new Date();
53
+ const phaseCount = Number(data.phaseCount ?? 0);
54
+ if (this.state.phases.length === 0 && phaseCount > 0) {
55
+ for (let i = 0; i < phaseCount; i++) {
56
+ this.state.phases.push({
57
+ name: `Phase ${i + 1}`,
58
+ status: 'pending',
59
+ agents: [],
60
+ startedAt: null,
61
+ completedAt: null,
62
+ });
63
+ }
64
+ }
65
+ break;
66
+ }
67
+ case 'orchestration:phase-start': {
68
+ const phaseName = String(data.phase ?? '');
69
+ const agentCount = Number(data.agentCount ?? 0);
70
+ const phase = this.findOrCreatePhase(phaseName);
71
+ phase.status = 'running';
72
+ phase.startedAt = new Date();
73
+ if (phase.agents.length === 0 && agentCount > 0) {
74
+ for (let i = 0; i < agentCount; i++) {
75
+ phase.agents.push({
76
+ id: '',
77
+ name: `agent-${i + 1}`,
78
+ type: '',
79
+ model: '',
80
+ backend: '',
81
+ status: 'waiting',
82
+ tokens: 0,
83
+ detail: '',
84
+ });
85
+ }
86
+ }
87
+ break;
88
+ }
89
+ case 'orchestration:phase-complete': {
90
+ const phaseName = String(data.phase ?? '');
91
+ const status = String(data.status ?? 'completed');
92
+ const phase = this.state.phases.find((p) => p.name === phaseName);
93
+ if (phase) {
94
+ phase.status = status === 'failed' ? 'failed' : 'completed';
95
+ phase.completedAt = new Date();
96
+ }
97
+ const usage = data.usage;
98
+ if (usage) {
99
+ this.state.usage.tokens += usage.totalTokens ?? 0;
100
+ this.state.usage.cost += usage.costUsd ?? 0;
101
+ this.state.usage.turns += usage.turns ?? 0;
102
+ this.state.usage.toolCalls += usage.toolCalls ?? 0;
103
+ }
104
+ break;
105
+ }
106
+ case 'orchestration:complete':
107
+ this.state.status = 'completed';
108
+ break;
109
+ case 'orchestration:failed':
110
+ this.state.status = 'failed';
111
+ break;
112
+ case 'agent:spawning': {
113
+ const agent = this.findOrCreateAgent(data);
114
+ agent.status = 'spawning';
115
+ agent.model = String(data.model ?? agent.model);
116
+ break;
117
+ }
118
+ case 'agent:running': {
119
+ const agent = this.findOrCreateAgent(data);
120
+ agent.status = 'running';
121
+ agent.model = String(data.model ?? agent.model);
122
+ agent.backend = String(data.backend ?? agent.backend);
123
+ if (data.task) {
124
+ agent.detail = String(data.task).slice(0, 80);
125
+ }
126
+ break;
127
+ }
128
+ case 'agent:idle': {
129
+ const agent = this.findOrCreateAgent(data);
130
+ agent.status = 'done';
131
+ const usage = data.usage;
132
+ if (usage) {
133
+ agent.tokens = usage.totalTokens ?? 0;
134
+ }
135
+ const result = data.result;
136
+ if (result?.filesTouched) {
137
+ const files = result.filesTouched;
138
+ agent.detail = files.length > 0 ? `${files.length} files` : '';
139
+ }
140
+ break;
141
+ }
142
+ case 'agent:error': {
143
+ const agent = this.findOrCreateAgent(data);
144
+ agent.status = 'error';
145
+ agent.detail = String(data.error ?? 'unknown error').slice(0, 60);
146
+ break;
147
+ }
148
+ case 'agent:timeout': {
149
+ const agent = this.findOrCreateAgent(data);
150
+ agent.status = 'timeout';
151
+ agent.detail = 'timed out';
152
+ break;
153
+ }
154
+ case 'agent:finding': {
155
+ const agent = this.findOrCreateAgent(data);
156
+ const severity = String(data.severity ?? 'info');
157
+ const finding = String(data.finding ?? '').slice(0, 60);
158
+ agent.detail = `[${severity}] ${finding}`;
159
+ break;
160
+ }
161
+ case 'agent:doom-loop': {
162
+ const agent = this.findOrCreateAgent(data);
163
+ agent.status = 'error';
164
+ agent.detail = `doom loop: ${String(data.tool ?? 'unknown')} x${data.callCount ?? '?'}`;
165
+ break;
166
+ }
167
+ case 'system:warning': {
168
+ // system:warning carries various subtypes — store as a detail on the orchestration status
169
+ const warnType = String(data.type ?? data.reason ?? 'warning');
170
+ this.state.status = `running (${warnType})`;
171
+ break;
172
+ }
173
+ }
174
+ }
175
+ // ─── State Helpers (mirrored from TUI dashboard) ─────────────────
176
+ findOrCreatePhase(name) {
177
+ let phase = this.state.phases.find((p) => p.name === name);
178
+ if (!phase) {
179
+ phase = this.state.phases.find((p) => p.name.startsWith('Phase ') && p.status === 'pending');
180
+ if (phase) {
181
+ phase.name = name;
182
+ }
183
+ else {
184
+ phase = {
185
+ name,
186
+ status: 'pending',
187
+ agents: [],
188
+ startedAt: null,
189
+ completedAt: null,
190
+ };
191
+ this.state.phases.push(phase);
192
+ }
193
+ }
194
+ return phase;
195
+ }
196
+ findOrCreateAgent(data) {
197
+ const agentId = String(data.agentId ?? '');
198
+ const agentType = String(data.agentType ?? '');
199
+ // Search across all phases
200
+ for (const phase of this.state.phases) {
201
+ const existing = phase.agents.find((a) => a.id === agentId && agentId !== '');
202
+ if (existing)
203
+ return existing;
204
+ }
205
+ // Find running phase, fill a waiting slot or create one
206
+ const runningPhase = this.state.phases.find((p) => p.status === 'running');
207
+ if (runningPhase) {
208
+ const slot = runningPhase.agents.find((a) => a.status === 'waiting' && a.id === '');
209
+ if (slot) {
210
+ slot.id = agentId;
211
+ slot.name = agentType;
212
+ slot.type = agentType;
213
+ return slot;
214
+ }
215
+ const agent = {
216
+ id: agentId,
217
+ name: agentType,
218
+ type: agentType,
219
+ model: '',
220
+ backend: String(data.backend ?? ''),
221
+ status: 'waiting',
222
+ tokens: 0,
223
+ detail: '',
224
+ };
225
+ runningPhase.agents.push(agent);
226
+ return agent;
227
+ }
228
+ // Fallback: attach to last phase
229
+ const lastPhase = this.state.phases[this.state.phases.length - 1];
230
+ if (lastPhase) {
231
+ const agent = {
232
+ id: agentId,
233
+ name: agentType,
234
+ type: agentType,
235
+ model: '',
236
+ backend: String(data.backend ?? ''),
237
+ status: 'waiting',
238
+ tokens: 0,
239
+ detail: '',
240
+ };
241
+ lastPhase.agents.push(agent);
242
+ return agent;
243
+ }
244
+ // No phases yet — create one
245
+ const phase = {
246
+ name: 'Phase 1',
247
+ status: 'running',
248
+ agents: [],
249
+ startedAt: new Date(),
250
+ completedAt: null,
251
+ };
252
+ this.state.phases.push(phase);
253
+ const agent = {
254
+ id: agentId,
255
+ name: agentType,
256
+ type: agentType,
257
+ model: '',
258
+ backend: String(data.backend ?? ''),
259
+ status: 'waiting',
260
+ tokens: 0,
261
+ detail: '',
262
+ };
263
+ phase.agents.push(agent);
264
+ return agent;
265
+ }
266
+ }
267
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/web/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAmC/B,sEAAsE;AAEtE,MAAM,OAAO,eAAe;IAClB,GAAG,CAAW;IACd,MAAM,CAAkB;IACxB,KAAK,CAAiB;IACtB,OAAO,GAAyC,IAAI,CAAC;IAE7D,YAAY,GAAa,EAAE,MAAuB;QAChD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG;YACX,iBAAiB,EAAE,8BAA8B;YACjD,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;SACtD,CAAC;IACJ,CAAC;IAED,KAAK;QACH,2DAA2D;QAC3D,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAa,EAAE,EAAE;YACzC,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,IAAI,CAAC,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;YACnC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,oEAAoE;IAE5D,WAAW,CAAC,KAAiB;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,IAA+B,CAAC;QAEnD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC;gBACpE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;gBAElC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;gBAChD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;wBACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;4BACrB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE;4BACtB,MAAM,EAAE,SAAS;4BACjB,MAAM,EAAE,EAAE;4BACV,SAAS,EAAE,IAAI;4BACf,WAAW,EAAE,IAAI;yBAClB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,2BAA2B,CAAC,CAAC,CAAC;gBACjC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAChD,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBACzB,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;gBAE7B,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;wBACpC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;4BAChB,EAAE,EAAE,EAAE;4BACN,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE;4BACtB,IAAI,EAAE,EAAE;4BACR,KAAK,EAAE,EAAE;4BACT,OAAO,EAAE,EAAE;4BACX,MAAM,EAAE,SAAS;4BACjB,MAAM,EAAE,CAAC;4BACT,MAAM,EAAE,EAAE;yBACX,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,8BAA8B,CAAC,CAAC,CAAC;gBACpC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;gBAClE,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,MAAM,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;oBAC5D,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;gBACjC,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAwC,CAAC;gBAC5D,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;oBAClD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;oBAC5C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;oBAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;gBACrD,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,wBAAwB;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;gBAChC,MAAM;YAER,KAAK,sBAAsB;gBACzB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAC7B,MAAM;YAER,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC1B,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChD,MAAM;YACR,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBACzB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChD,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAwC,CAAC;gBAC5D,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAA6C,CAAC;gBAClE,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,YAAwB,CAAC;oBAC9C,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;gBACvB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,MAAM;YACR,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBACzB,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC3B,MAAM;YACR,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxD,KAAK,CAAC,MAAM,GAAG,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC1C,MAAM;YACR,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC3C,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC;gBACvB,KAAK,CAAC,MAAM,GAAG,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;gBACxF,MAAM;YACR,CAAC;YAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,0FAA0F;gBAC1F,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;gBAC/D,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,QAAQ,GAAG,CAAC;gBAC5C,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IAE5D,iBAAiB,CAAC,IAAY;QACpC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAC7F,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG;oBACN,IAAI;oBACJ,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,EAAE;oBACV,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,IAAI;iBAClB,CAAC;gBACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,iBAAiB,CAAC,IAA6B;QACrD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAE/C,2BAA2B;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC;YAC9E,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;QAChC,CAAC;QAED,wDAAwD;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC3E,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACpF,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC;gBAClB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;gBACtB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAe;gBACxB,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACnC,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,EAAE;aACX,CAAC;YACF,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAe;gBACxB,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACnC,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,EAAE;aACX,CAAC;YACF,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,6BAA6B;QAC7B,MAAM,KAAK,GAAe;YACxB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,WAAW,EAAE,IAAI;SAClB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAe;YACxB,EAAE,EAAE,OAAO;YACX,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;YACnC,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,EAAE;SACX,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ import type { ExecutionGraph } from '../runtime/execution-graph.js';
3
+ import type { EventBus } from '../core/event-bus.js';
4
+ export declare class GraphApi {
5
+ private graph;
6
+ private bus;
7
+ constructor(graph: ExecutionGraph, bus?: EventBus);
8
+ /** Handle an API request. Returns true if the route was handled. */
9
+ handleRequest(req: IncomingMessage, res: ServerResponse): boolean;
10
+ /**
11
+ * POST /api/events — accept external events and inject into the EventBus.
12
+ * Body: single event { type, data, source? } or array of events.
13
+ * This allows Claude Code, Codex, and other external processes to push
14
+ * orchestration events into a running dashboard.
15
+ */
16
+ private handleEventIngest;
17
+ private json;
18
+ }
19
+ //# sourceMappingURL=graph-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-api.d.ts","sourceRoot":"","sources":["../../src/web/graph-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAmBrD,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,GAAG,CAAkB;gBAEjB,KAAK,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,QAAQ;IAKjD,oEAAoE;IACpE,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO;IAyGjE;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,IAAI;CAIb"}