@scanton/phase2s 1.1.0 → 1.9.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 (61) hide show
  1. package/README.md +19 -1
  2. package/dist/src/cli/doctor.d.ts +39 -0
  3. package/dist/src/cli/doctor.d.ts.map +1 -0
  4. package/dist/src/cli/doctor.js +244 -0
  5. package/dist/src/cli/doctor.js.map +1 -0
  6. package/dist/src/cli/goal.d.ts +36 -1
  7. package/dist/src/cli/goal.d.ts.map +1 -1
  8. package/dist/src/cli/goal.js +243 -16
  9. package/dist/src/cli/goal.js.map +1 -1
  10. package/dist/src/cli/index.d.ts.map +1 -1
  11. package/dist/src/cli/index.js +117 -9
  12. package/dist/src/cli/index.js.map +1 -1
  13. package/dist/src/cli/init.d.ts +73 -0
  14. package/dist/src/cli/init.d.ts.map +1 -0
  15. package/dist/src/cli/init.js +366 -0
  16. package/dist/src/cli/init.js.map +1 -0
  17. package/dist/src/cli/lint.d.ts +32 -0
  18. package/dist/src/cli/lint.d.ts.map +1 -0
  19. package/dist/src/cli/lint.js +171 -0
  20. package/dist/src/cli/lint.js.map +1 -0
  21. package/dist/src/cli/report.d.ts +62 -0
  22. package/dist/src/cli/report.d.ts.map +1 -0
  23. package/dist/src/cli/report.js +188 -0
  24. package/dist/src/cli/report.js.map +1 -0
  25. package/dist/src/cli/upgrade.d.ts +35 -0
  26. package/dist/src/cli/upgrade.d.ts.map +1 -0
  27. package/dist/src/cli/upgrade.js +126 -0
  28. package/dist/src/cli/upgrade.js.map +1 -0
  29. package/dist/src/core/config.d.ts +60 -8
  30. package/dist/src/core/config.d.ts.map +1 -1
  31. package/dist/src/core/config.js +31 -1
  32. package/dist/src/core/config.js.map +1 -1
  33. package/dist/src/core/notify.d.ts +41 -0
  34. package/dist/src/core/notify.d.ts.map +1 -0
  35. package/dist/src/core/notify.js +153 -0
  36. package/dist/src/core/notify.js.map +1 -0
  37. package/dist/src/core/run-logger.d.ts +83 -0
  38. package/dist/src/core/run-logger.d.ts.map +1 -0
  39. package/dist/src/core/run-logger.js +70 -0
  40. package/dist/src/core/run-logger.js.map +1 -0
  41. package/dist/src/mcp/server.d.ts +9 -0
  42. package/dist/src/mcp/server.d.ts.map +1 -1
  43. package/dist/src/mcp/server.js +148 -1
  44. package/dist/src/mcp/server.js.map +1 -1
  45. package/dist/src/providers/gemini.d.ts +29 -0
  46. package/dist/src/providers/gemini.d.ts.map +1 -0
  47. package/dist/src/providers/gemini.js +47 -0
  48. package/dist/src/providers/gemini.js.map +1 -0
  49. package/dist/src/providers/index.d.ts +2 -0
  50. package/dist/src/providers/index.d.ts.map +1 -1
  51. package/dist/src/providers/index.js +8 -0
  52. package/dist/src/providers/index.js.map +1 -1
  53. package/dist/src/providers/openrouter.d.ts +25 -0
  54. package/dist/src/providers/openrouter.d.ts.map +1 -0
  55. package/dist/src/providers/openrouter.js +43 -0
  56. package/dist/src/providers/openrouter.js.map +1 -0
  57. package/dist/src/tools/registry.d.ts +5 -3
  58. package/dist/src/tools/registry.d.ts.map +1 -1
  59. package/dist/src/tools/registry.js +35 -12
  60. package/dist/src/tools/registry.js.map +1 -1
  61. package/package.json +1 -1
@@ -1,12 +1,14 @@
1
1
  import { z } from "zod";
2
2
  declare const configSchema: z.ZodObject<{
3
- provider: z.ZodDefault<z.ZodEnum<["codex-cli", "openai-api", "anthropic", "ollama"]>>;
3
+ provider: z.ZodDefault<z.ZodEnum<["codex-cli", "openai-api", "anthropic", "ollama", "openrouter", "gemini"]>>;
4
4
  /**
5
5
  * Model to use. For codex-cli provider, defaults to whatever is in
6
6
  * ~/.codex/config.toml so the user's existing Codex setup is respected.
7
7
  * For openai-api, defaults to "gpt-4o".
8
8
  * For anthropic, defaults to "claude-3-5-sonnet-20241022".
9
9
  * For ollama, defaults to "llama3.1:8b" (user must have it pulled).
10
+ * For openrouter, defaults to "openai/gpt-4o".
11
+ * For gemini, defaults to "gemini-2.0-flash".
10
12
  */
11
13
  model: z.ZodOptional<z.ZodString>;
12
14
  fast_model: z.ZodOptional<z.ZodString>;
@@ -17,6 +19,14 @@ declare const configSchema: z.ZodObject<{
17
19
  anthropicMaxTokens: z.ZodOptional<z.ZodNumber>;
18
20
  /** Ollama base URL (default http://localhost:11434/v1). */
19
21
  ollamaBaseUrl: z.ZodOptional<z.ZodString>;
22
+ /** OpenRouter API key. Falls back to OPENROUTER_API_KEY environment variable. */
23
+ openrouterApiKey: z.ZodOptional<z.ZodString>;
24
+ /** OpenRouter base URL (default https://openrouter.ai/api/v1). Override for custom deployments. */
25
+ openrouterBaseUrl: z.ZodOptional<z.ZodString>;
26
+ /** Gemini API key. Falls back to GEMINI_API_KEY environment variable. Get a free key at https://aistudio.google.com/apikey */
27
+ geminiApiKey: z.ZodOptional<z.ZodString>;
28
+ /** Gemini base URL (default https://generativelanguage.googleapis.com/v1beta/openai/). Override for custom endpoints. */
29
+ geminiBaseUrl: z.ZodOptional<z.ZodString>;
20
30
  codexPath: z.ZodDefault<z.ZodString>;
21
31
  systemPrompt: z.ZodOptional<z.ZodString>;
22
32
  maxTurns: z.ZodDefault<z.ZodNumber>;
@@ -39,8 +49,30 @@ declare const configSchema: z.ZodObject<{
39
49
  * Default false — opt-in to avoid requiring playwright on every install.
40
50
  */
41
51
  browser: z.ZodDefault<z.ZodBoolean>;
52
+ /**
53
+ * Notification settings for dark factory runs.
54
+ * `mac: true` sends a macOS system notification via osascript (macOS only).
55
+ * `slack` is a Slack incoming webhook URL.
56
+ * Both are also configurable via PHASE2S_SLACK_WEBHOOK env var.
57
+ */
58
+ notify: z.ZodOptional<z.ZodObject<{
59
+ mac: z.ZodOptional<z.ZodBoolean>;
60
+ slack: z.ZodOptional<z.ZodString>;
61
+ discord: z.ZodOptional<z.ZodString>;
62
+ teams: z.ZodOptional<z.ZodString>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ mac?: boolean | undefined;
65
+ slack?: string | undefined;
66
+ discord?: string | undefined;
67
+ teams?: string | undefined;
68
+ }, {
69
+ mac?: boolean | undefined;
70
+ slack?: string | undefined;
71
+ discord?: string | undefined;
72
+ teams?: string | undefined;
73
+ }>>;
42
74
  }, "strip", z.ZodTypeAny, {
43
- provider: "codex-cli" | "openai-api" | "anthropic" | "ollama";
75
+ provider: "codex-cli" | "ollama" | "openai-api" | "anthropic" | "openrouter" | "gemini";
44
76
  codexPath: string;
45
77
  maxTurns: number;
46
78
  timeout: number;
@@ -48,26 +80,40 @@ declare const configSchema: z.ZodObject<{
48
80
  verifyCommand: string;
49
81
  requireSpecification: boolean;
50
82
  browser: boolean;
83
+ apiKey?: string | undefined;
84
+ anthropicApiKey?: string | undefined;
85
+ openrouterApiKey?: string | undefined;
86
+ geminiApiKey?: string | undefined;
51
87
  model?: string | undefined;
52
88
  fast_model?: string | undefined;
53
89
  smart_model?: string | undefined;
54
- apiKey?: string | undefined;
55
- anthropicApiKey?: string | undefined;
56
90
  anthropicMaxTokens?: number | undefined;
57
91
  ollamaBaseUrl?: string | undefined;
92
+ openrouterBaseUrl?: string | undefined;
93
+ geminiBaseUrl?: string | undefined;
58
94
  systemPrompt?: string | undefined;
59
95
  tools?: string[] | undefined;
60
96
  deny?: string[] | undefined;
97
+ notify?: {
98
+ mac?: boolean | undefined;
99
+ slack?: string | undefined;
100
+ discord?: string | undefined;
101
+ teams?: string | undefined;
102
+ } | undefined;
61
103
  }, {
62
- provider?: "codex-cli" | "openai-api" | "anthropic" | "ollama" | undefined;
104
+ apiKey?: string | undefined;
105
+ anthropicApiKey?: string | undefined;
106
+ openrouterApiKey?: string | undefined;
107
+ geminiApiKey?: string | undefined;
108
+ provider?: "codex-cli" | "ollama" | "openai-api" | "anthropic" | "openrouter" | "gemini" | undefined;
109
+ codexPath?: string | undefined;
63
110
  model?: string | undefined;
64
111
  fast_model?: string | undefined;
65
112
  smart_model?: string | undefined;
66
- apiKey?: string | undefined;
67
- anthropicApiKey?: string | undefined;
68
113
  anthropicMaxTokens?: number | undefined;
69
114
  ollamaBaseUrl?: string | undefined;
70
- codexPath?: string | undefined;
115
+ openrouterBaseUrl?: string | undefined;
116
+ geminiBaseUrl?: string | undefined;
71
117
  systemPrompt?: string | undefined;
72
118
  maxTurns?: number | undefined;
73
119
  timeout?: number | undefined;
@@ -77,6 +123,12 @@ declare const configSchema: z.ZodObject<{
77
123
  tools?: string[] | undefined;
78
124
  deny?: string[] | undefined;
79
125
  browser?: boolean | undefined;
126
+ notify?: {
127
+ mac?: boolean | undefined;
128
+ slack?: string | undefined;
129
+ discord?: string | undefined;
130
+ teams?: string | undefined;
131
+ } | undefined;
80
132
  }>;
81
133
  export type Config = z.infer<typeof configSchema> & {
82
134
  model: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,YAAY;;IAEhB;;;;;;OAMG;;;;;;IAMH,kFAAkF;;IAElF,2DAA2D;;;;;;;;;IAS3D;;;OAGG;;IAEH;;;OAGG;;IAEH;;;OAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDnG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,YAAY;;IAEhB;;;;;;;;OAQG;;;;;;IAMH,kFAAkF;;IAElF,2DAA2D;;IAE3D,iFAAiF;;IAEjF,mGAAmG;;IAEnG,8HAA8H;;IAE9H,yHAAyH;;;;;;;;;IASzH;;;OAGG;;IAEH;;;OAGG;;IAEH;;;OAGG;;IAEH;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyDnG"}
@@ -4,13 +4,15 @@ import { resolve, join } from "node:path";
4
4
  import { parse as parseYaml } from "yaml";
5
5
  import { parse as parseToml } from "@iarna/toml";
6
6
  const configSchema = z.object({
7
- provider: z.enum(["codex-cli", "openai-api", "anthropic", "ollama"]).default("codex-cli"),
7
+ provider: z.enum(["codex-cli", "openai-api", "anthropic", "ollama", "openrouter", "gemini"]).default("codex-cli"),
8
8
  /**
9
9
  * Model to use. For codex-cli provider, defaults to whatever is in
10
10
  * ~/.codex/config.toml so the user's existing Codex setup is respected.
11
11
  * For openai-api, defaults to "gpt-4o".
12
12
  * For anthropic, defaults to "claude-3-5-sonnet-20241022".
13
13
  * For ollama, defaults to "llama3.1:8b" (user must have it pulled).
14
+ * For openrouter, defaults to "openai/gpt-4o".
15
+ * For gemini, defaults to "gemini-2.0-flash".
14
16
  */
15
17
  model: z.string().optional(),
16
18
  fast_model: z.string().optional(),
@@ -21,6 +23,14 @@ const configSchema = z.object({
21
23
  anthropicMaxTokens: z.number().int().min(1).optional(),
22
24
  /** Ollama base URL (default http://localhost:11434/v1). */
23
25
  ollamaBaseUrl: z.string().optional(),
26
+ /** OpenRouter API key. Falls back to OPENROUTER_API_KEY environment variable. */
27
+ openrouterApiKey: z.string().optional(),
28
+ /** OpenRouter base URL (default https://openrouter.ai/api/v1). Override for custom deployments. */
29
+ openrouterBaseUrl: z.string().optional(),
30
+ /** Gemini API key. Falls back to GEMINI_API_KEY environment variable. Get a free key at https://aistudio.google.com/apikey */
31
+ geminiApiKey: z.string().optional(),
32
+ /** Gemini base URL (default https://generativelanguage.googleapis.com/v1beta/openai/). Override for custom endpoints. */
33
+ geminiBaseUrl: z.string().optional(),
24
34
  codexPath: z.string().default("codex"),
25
35
  systemPrompt: z.string().optional(),
26
36
  maxTurns: z.number().default(50),
@@ -43,6 +53,18 @@ const configSchema = z.object({
43
53
  * Default false — opt-in to avoid requiring playwright on every install.
44
54
  */
45
55
  browser: z.boolean().default(false),
56
+ /**
57
+ * Notification settings for dark factory runs.
58
+ * `mac: true` sends a macOS system notification via osascript (macOS only).
59
+ * `slack` is a Slack incoming webhook URL.
60
+ * Both are also configurable via PHASE2S_SLACK_WEBHOOK env var.
61
+ */
62
+ notify: z.object({
63
+ mac: z.boolean().optional(),
64
+ slack: z.string().optional(),
65
+ discord: z.string().optional(),
66
+ teams: z.string().optional(),
67
+ }).optional(),
46
68
  });
47
69
  export async function loadConfig(overrides) {
48
70
  let fileConfig = {};
@@ -78,6 +100,10 @@ export async function loadConfig(overrides) {
78
100
  envConfig.apiKey = process.env.OPENAI_API_KEY;
79
101
  if (process.env.ANTHROPIC_API_KEY)
80
102
  envConfig.anthropicApiKey = process.env.ANTHROPIC_API_KEY;
103
+ if (process.env.OPENROUTER_API_KEY)
104
+ envConfig.openrouterApiKey = process.env.OPENROUTER_API_KEY;
105
+ if (process.env.GEMINI_API_KEY)
106
+ envConfig.geminiApiKey = process.env.GEMINI_API_KEY;
81
107
  if (process.env.PHASE2S_PROVIDER)
82
108
  envConfig.provider = process.env.PHASE2S_PROVIDER;
83
109
  if (process.env.PHASE2S_MODEL)
@@ -131,6 +157,10 @@ async function resolveDefaultModel(provider) {
131
157
  return "claude-3-5-sonnet-20241022";
132
158
  if (provider === "ollama")
133
159
  return "llama3.1:8b"; // user must have this model pulled
160
+ if (provider === "openrouter")
161
+ return "openai/gpt-4o"; // most common OpenRouter model
162
+ if (provider === "gemini")
163
+ return "gemini-2.0-flash"; // fast default; gemini-2.5-pro for smart tier
134
164
  return "gpt-4o"; // openai-api default
135
165
  }
136
166
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Notification gateway.
3
+ *
4
+ * Sends a post-run notification via:
5
+ * 1. macOS system notification (osascript, zero deps, macOS-only)
6
+ * 2. Slack webhook (PHASE2S_SLACK_WEBHOOK env var or config, uses native fetch)
7
+ * 3. Discord webhook (PHASE2S_DISCORD_WEBHOOK env var or config, uses native fetch)
8
+ * 4. Microsoft Teams webhook (PHASE2S_TEAMS_WEBHOOK env var or config, uses native fetch)
9
+ *
10
+ * All channels are fail-safe: errors are logged to stderr but never thrown.
11
+ * Notifications should never block or fail a dark factory run.
12
+ */
13
+ export interface NotifyOptions {
14
+ /** Show macOS system notification. Defaults to true on darwin, false elsewhere. */
15
+ mac?: boolean;
16
+ /** Slack incoming webhook URL. Overrides PHASE2S_SLACK_WEBHOOK env var. */
17
+ slack?: string;
18
+ /** Discord incoming webhook URL. Overrides PHASE2S_DISCORD_WEBHOOK env var. */
19
+ discord?: string;
20
+ /** Microsoft Teams incoming webhook URL. Overrides PHASE2S_TEAMS_WEBHOOK env var. */
21
+ teams?: string;
22
+ }
23
+ export interface NotifyPayload {
24
+ /** Short title line shown in the notification. */
25
+ title: string;
26
+ /** Optional body / subtitle text. */
27
+ body?: string;
28
+ /** true = success run, false = failure or challenge. */
29
+ success: boolean;
30
+ }
31
+ /**
32
+ * Send a notification via all configured channels.
33
+ * Errors from any channel are logged to stderr and do not propagate.
34
+ */
35
+ export declare function sendNotification(payload: NotifyPayload, options?: NotifyOptions): Promise<void>;
36
+ /**
37
+ * Build a notification payload from a completed dark factory run.
38
+ */
39
+ export declare function buildNotifyPayload(specFile: string, success: boolean, attempts: number, challenged: boolean, durationMs?: number): NotifyPayload;
40
+ export declare function formatDurationMs(ms: number): string;
41
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../../src/core/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CA0Bf;AA0ED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMnD"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Notification gateway.
3
+ *
4
+ * Sends a post-run notification via:
5
+ * 1. macOS system notification (osascript, zero deps, macOS-only)
6
+ * 2. Slack webhook (PHASE2S_SLACK_WEBHOOK env var or config, uses native fetch)
7
+ * 3. Discord webhook (PHASE2S_DISCORD_WEBHOOK env var or config, uses native fetch)
8
+ * 4. Microsoft Teams webhook (PHASE2S_TEAMS_WEBHOOK env var or config, uses native fetch)
9
+ *
10
+ * All channels are fail-safe: errors are logged to stderr but never thrown.
11
+ * Notifications should never block or fail a dark factory run.
12
+ */
13
+ import { spawnSync } from "node:child_process";
14
+ import { basename } from "node:path";
15
+ // ---------------------------------------------------------------------------
16
+ // Public API
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Send a notification via all configured channels.
20
+ * Errors from any channel are logged to stderr and do not propagate.
21
+ */
22
+ export async function sendNotification(payload, options = {}) {
23
+ const useMac = options.mac ?? process.platform === "darwin";
24
+ const slackUrl = options.slack ?? process.env.PHASE2S_SLACK_WEBHOOK;
25
+ const discordUrl = options.discord ?? process.env.PHASE2S_DISCORD_WEBHOOK;
26
+ const teamsUrl = options.teams ?? process.env.PHASE2S_TEAMS_WEBHOOK;
27
+ const promises = [];
28
+ if (useMac)
29
+ promises.push(sendMacNotification(payload));
30
+ if (slackUrl)
31
+ promises.push(sendSlackNotification(payload, slackUrl));
32
+ if (discordUrl)
33
+ promises.push(sendDiscordNotification(payload, discordUrl));
34
+ if (teamsUrl)
35
+ promises.push(sendTeamsNotification(payload, teamsUrl));
36
+ if (promises.length === 0) {
37
+ console.warn("[phase2s notify] --notify set but no channels are active." +
38
+ " Set PHASE2S_SLACK_WEBHOOK, PHASE2S_DISCORD_WEBHOOK, or PHASE2S_TEAMS_WEBHOOK" +
39
+ " for cross-platform notifications.");
40
+ return;
41
+ }
42
+ const results = await Promise.allSettled(promises);
43
+ for (const result of results) {
44
+ if (result.status === "rejected") {
45
+ console.error(`[phase2s notify] ${String(result.reason)}`);
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Build a notification payload from a completed dark factory run.
51
+ */
52
+ export function buildNotifyPayload(specFile, success, attempts, challenged, durationMs) {
53
+ // Strip path and .md extension for a clean display name
54
+ const name = basename(specFile).replace(/\.md$/i, "");
55
+ const durationStr = durationMs !== undefined ? ` (${formatDurationMs(durationMs)})` : "";
56
+ const attemptsStr = `${attempts} attempt${attempts !== 1 ? "s" : ""}`;
57
+ if (challenged) {
58
+ return {
59
+ title: `⚠ ${name}: CHALLENGED — review required`,
60
+ success: false,
61
+ };
62
+ }
63
+ if (success) {
64
+ return {
65
+ title: `✓ ${name}: complete`,
66
+ body: `${attemptsStr}${durationStr}`,
67
+ success: true,
68
+ };
69
+ }
70
+ return {
71
+ title: `✗ ${name}: failed`,
72
+ body: `${attemptsStr}${durationStr}`,
73
+ success: false,
74
+ };
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Channels
78
+ // ---------------------------------------------------------------------------
79
+ async function sendMacNotification(payload) {
80
+ const message = payload.body
81
+ ? `${payload.title}\n${payload.body}`
82
+ : payload.title;
83
+ const script = `display notification ${JSON.stringify(message)} with title "Phase2S"`;
84
+ const result = spawnSync("osascript", ["-e", script]);
85
+ if (result.error)
86
+ throw result.error;
87
+ if (result.status !== 0) {
88
+ const stderr = result.stderr?.toString().trim();
89
+ throw new Error(`osascript exited ${result.status}${stderr ? `: ${stderr}` : ""}`);
90
+ }
91
+ }
92
+ async function sendSlackNotification(payload, webhookUrl) {
93
+ const icon = payload.success ? ":white_check_mark:" : ":x:";
94
+ const text = payload.body
95
+ ? `${icon} *${payload.title}*\n${payload.body}`
96
+ : `${icon} *${payload.title}*`;
97
+ const response = await fetch(webhookUrl, {
98
+ method: "POST",
99
+ headers: { "Content-Type": "application/json" },
100
+ body: JSON.stringify({ text }),
101
+ });
102
+ if (!response.ok) {
103
+ throw new Error(`Slack webhook returned ${response.status} ${response.statusText}`);
104
+ }
105
+ }
106
+ async function sendDiscordNotification(payload, webhookUrl) {
107
+ // Use embeds for rich formatting: green (#2ECC71) on success, red (#E74C3C) on failure
108
+ const color = payload.success ? 0x2ECC71 : 0xE74C3C;
109
+ const embed = { title: payload.title, color };
110
+ if (payload.body)
111
+ embed.description = payload.body;
112
+ const response = await fetch(webhookUrl, {
113
+ method: "POST",
114
+ headers: { "Content-Type": "application/json" },
115
+ body: JSON.stringify({ embeds: [embed] }),
116
+ });
117
+ if (!response.ok) {
118
+ throw new Error(`Discord webhook returned ${response.status} ${response.statusText}`);
119
+ }
120
+ }
121
+ async function sendTeamsNotification(payload, webhookUrl) {
122
+ // MessageCard format — supported by all Teams incoming webhook connectors
123
+ const themeColor = payload.success ? "2ECC71" : "E74C3C";
124
+ const card = {
125
+ "@type": "MessageCard",
126
+ "@context": "https://schema.org/extensions",
127
+ themeColor,
128
+ summary: payload.title,
129
+ title: payload.title,
130
+ };
131
+ if (payload.body)
132
+ card.text = payload.body;
133
+ const response = await fetch(webhookUrl, {
134
+ method: "POST",
135
+ headers: { "Content-Type": "application/json" },
136
+ body: JSON.stringify(card),
137
+ });
138
+ if (!response.ok) {
139
+ throw new Error(`Teams webhook returned ${response.status} ${response.statusText}`);
140
+ }
141
+ }
142
+ // ---------------------------------------------------------------------------
143
+ // Duration helpers
144
+ // ---------------------------------------------------------------------------
145
+ export function formatDurationMs(ms) {
146
+ const totalSeconds = Math.floor(ms / 1000);
147
+ const minutes = Math.floor(totalSeconds / 60);
148
+ const seconds = totalSeconds % 60;
149
+ if (minutes === 0)
150
+ return `${seconds}s`;
151
+ return `${minutes}m ${seconds}s`;
152
+ }
153
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/core/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * RunLogger — structured JSONL event log for dark factory runs.
3
+ *
4
+ * Writes one JSONL event per log() call to:
5
+ * <specDir>/.phase2s/runs/<YYYY-MM-DDTHH-MM-SS>-<hash.slice(0,8)>.jsonl
6
+ *
7
+ * Directory is created lazily on first write.
8
+ * Write errors are thrown (never silently dropped).
9
+ */
10
+ export type RunEvent = {
11
+ event: "goal_started";
12
+ specFile: string;
13
+ specHash: string;
14
+ subTaskCount: number;
15
+ maxAttempts: number;
16
+ resuming: boolean;
17
+ } | {
18
+ event: "plan_review_started";
19
+ } | {
20
+ event: "plan_review_completed";
21
+ verdict: "APPROVED" | "CHALLENGED" | "NEEDS_CLARIFICATION";
22
+ response: string;
23
+ } | {
24
+ event: "attempt_started";
25
+ attempt: number;
26
+ } | {
27
+ event: "subtask_started";
28
+ attempt: number;
29
+ index: number;
30
+ name: string;
31
+ } | {
32
+ event: "subtask_completed";
33
+ attempt: number;
34
+ index: number;
35
+ status: "passed" | "failed";
36
+ failureContext?: string;
37
+ } | {
38
+ event: "eval_started";
39
+ command: string;
40
+ } | {
41
+ event: "eval_completed";
42
+ output: string;
43
+ } | {
44
+ event: "criteria_checked";
45
+ results: Record<string, boolean>;
46
+ failing: string[];
47
+ } | {
48
+ event: "goal_completed";
49
+ success: boolean;
50
+ attempts: number;
51
+ } | {
52
+ event: "goal_error";
53
+ message: string;
54
+ };
55
+ export declare class RunLogger {
56
+ private readonly specDir;
57
+ private readonly specHash;
58
+ private readonly logPath;
59
+ private initialized;
60
+ constructor(specDir: string, specHash: string);
61
+ /**
62
+ * Append a structured event to the JSONL log file.
63
+ * Creates the runs directory on first call (lazy init).
64
+ * Throws on write failure.
65
+ */
66
+ log(event: RunEvent): void;
67
+ /**
68
+ * Return the absolute path to the log file.
69
+ * The file may or may not exist yet (if log() was never called).
70
+ */
71
+ close(): string;
72
+ }
73
+ /**
74
+ * Build the absolute path to the log file.
75
+ * Filename: <YYYY-MM-DDTHH-MM-SS>-<hash.slice(0,8)>.jsonl
76
+ */
77
+ export declare function buildLogPath(specDir: string, specHash: string): string;
78
+ /**
79
+ * Format a Date as YYYY-MM-DDTHH-MM-SS (colons replaced with hyphens for
80
+ * filesystem-safe filenames).
81
+ */
82
+ export declare function formatTimestamp(d: Date): string;
83
+ //# sourceMappingURL=run-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-logger.d.ts","sourceRoot":"","sources":["../../../src/core/run-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,MAAM,QAAQ,GAChB;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC3H;IAAE,KAAK,EAAE,qBAAqB,CAAA;CAAE,GAChC;IAAE,KAAK,EAAE,uBAAuB,CAAC;IAAC,OAAO,EAAE,UAAU,GAAG,YAAY,GAAG,qBAAqB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChH;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACpH;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAClF;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAM7C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAM7C;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAW1B;;;OAGG;IACH,KAAK,IAAI,MAAM;CAGhB;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAM/C"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * RunLogger — structured JSONL event log for dark factory runs.
3
+ *
4
+ * Writes one JSONL event per log() call to:
5
+ * <specDir>/.phase2s/runs/<YYYY-MM-DDTHH-MM-SS>-<hash.slice(0,8)>.jsonl
6
+ *
7
+ * Directory is created lazily on first write.
8
+ * Write errors are thrown (never silently dropped).
9
+ */
10
+ import { appendFileSync, mkdirSync } from "node:fs";
11
+ import { join, resolve } from "node:path";
12
+ // ---------------------------------------------------------------------------
13
+ // RunLogger
14
+ // ---------------------------------------------------------------------------
15
+ export class RunLogger {
16
+ specDir;
17
+ specHash;
18
+ logPath;
19
+ initialized = false;
20
+ constructor(specDir, specHash) {
21
+ this.specDir = resolve(specDir);
22
+ this.specHash = specHash;
23
+ this.logPath = buildLogPath(this.specDir, specHash);
24
+ }
25
+ /**
26
+ * Append a structured event to the JSONL log file.
27
+ * Creates the runs directory on first call (lazy init).
28
+ * Throws on write failure.
29
+ */
30
+ log(event) {
31
+ if (!this.initialized) {
32
+ const runsDir = join(this.specDir, ".phase2s", "runs");
33
+ mkdirSync(runsDir, { recursive: true });
34
+ this.initialized = true;
35
+ }
36
+ const line = JSON.stringify({ ...event, ts: new Date().toISOString() }) + "\n";
37
+ appendFileSync(this.logPath, line, "utf8");
38
+ }
39
+ /**
40
+ * Return the absolute path to the log file.
41
+ * The file may or may not exist yet (if log() was never called).
42
+ */
43
+ close() {
44
+ return this.logPath;
45
+ }
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Filename helpers
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Build the absolute path to the log file.
52
+ * Filename: <YYYY-MM-DDTHH-MM-SS>-<hash.slice(0,8)>.jsonl
53
+ */
54
+ export function buildLogPath(specDir, specHash) {
55
+ const now = new Date();
56
+ const ts = formatTimestamp(now);
57
+ const shortHash = specHash.slice(0, 8);
58
+ const filename = `${ts}-${shortHash}.jsonl`;
59
+ return resolve(join(specDir, ".phase2s", "runs", filename));
60
+ }
61
+ /**
62
+ * Format a Date as YYYY-MM-DDTHH-MM-SS (colons replaced with hyphens for
63
+ * filesystem-safe filenames).
64
+ */
65
+ export function formatTimestamp(d) {
66
+ const pad = (n) => String(n).padStart(2, "0");
67
+ return (`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}` +
68
+ `T${pad(d.getHours())}-${pad(d.getMinutes())}-${pad(d.getSeconds())}`);
69
+ }
70
+ //# sourceMappingURL=run-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-logger.js","sourceRoot":"","sources":["../../../src/core/run-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmB1C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IAChB,QAAQ,CAAS;IACjB,OAAO,CAAS;IACzB,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,OAAe,EAAE,QAAgB;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,KAAe;QACjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACvD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC/E,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,SAAS,QAAQ,CAAC;IAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,CAAO;IACrC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,CACL,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE;QACjE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CACtE,CAAC;AACJ,CAAC"}
@@ -68,6 +68,15 @@ export declare function toolNameToSkillName(toolName: string): string;
68
68
  * .phase2s/state/<key>.json relative to process.cwd() at server startup.
69
69
  */
70
70
  export declare const STATE_TOOLS: MCPTool[];
71
+ /**
72
+ * MCP tool descriptor for the dark factory goal executor.
73
+ *
74
+ * LONG-RUNNING: dark factory runs can take 20+ minutes. The MCP 2024-11-05
75
+ * spec has no timeout requirement at the transport level, so synchronous
76
+ * execution is safe. Claude Code should not expect a fast response.
77
+ */
78
+ export declare const GOAL_TOOL: MCPTool;
79
+ export declare const REPORT_TOOL: MCPTool;
71
80
  /**
72
81
  * Build a JSON-RPC notification (no `id` field — this is a server push, not
73
82
  * a response to a request).
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAM3C,UAAU,cAAc;IACtB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAqCjD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,EAwChC,CAAC;AAMF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,eAAe,CAInF;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,EACnC,MAAM,EAAE,MAAM,IAAI,GACjB,IAAI,CAsBN;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,MAAM,EACX,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC/C,OAAO,CAAC,eAAe,CAAC,CAwK1B;AAMD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF7D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAM3C,UAAU,cAAc;IACtB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAMD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAqCjD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,EAwChC,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,OAiCvB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAgBzB,CAAC;AAMF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,eAAe,CAInF;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,EACnC,MAAM,EAAE,MAAM,IAAI,GACjB,IAAI,CAsBN;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,MAAM,EACX,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC/C,OAAO,CAAC,eAAe,CAAC,CAkQ1B;AAMD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF7D"}