@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.
- package/README.md +19 -1
- package/dist/src/cli/doctor.d.ts +39 -0
- package/dist/src/cli/doctor.d.ts.map +1 -0
- package/dist/src/cli/doctor.js +244 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/goal.d.ts +36 -1
- package/dist/src/cli/goal.d.ts.map +1 -1
- package/dist/src/cli/goal.js +243 -16
- package/dist/src/cli/goal.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +117 -9
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/init.d.ts +73 -0
- package/dist/src/cli/init.d.ts.map +1 -0
- package/dist/src/cli/init.js +366 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/lint.d.ts +32 -0
- package/dist/src/cli/lint.d.ts.map +1 -0
- package/dist/src/cli/lint.js +171 -0
- package/dist/src/cli/lint.js.map +1 -0
- package/dist/src/cli/report.d.ts +62 -0
- package/dist/src/cli/report.d.ts.map +1 -0
- package/dist/src/cli/report.js +188 -0
- package/dist/src/cli/report.js.map +1 -0
- package/dist/src/cli/upgrade.d.ts +35 -0
- package/dist/src/cli/upgrade.d.ts.map +1 -0
- package/dist/src/cli/upgrade.js +126 -0
- package/dist/src/cli/upgrade.js.map +1 -0
- package/dist/src/core/config.d.ts +60 -8
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +31 -1
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/notify.d.ts +41 -0
- package/dist/src/core/notify.d.ts.map +1 -0
- package/dist/src/core/notify.js +153 -0
- package/dist/src/core/notify.js.map +1 -0
- package/dist/src/core/run-logger.d.ts +83 -0
- package/dist/src/core/run-logger.d.ts.map +1 -0
- package/dist/src/core/run-logger.js +70 -0
- package/dist/src/core/run-logger.js.map +1 -0
- package/dist/src/mcp/server.d.ts +9 -0
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +148 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/providers/gemini.d.ts +29 -0
- package/dist/src/providers/gemini.d.ts.map +1 -0
- package/dist/src/providers/gemini.js +47 -0
- package/dist/src/providers/gemini.js.map +1 -0
- package/dist/src/providers/index.d.ts +2 -0
- package/dist/src/providers/index.d.ts.map +1 -1
- package/dist/src/providers/index.js +8 -0
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/openrouter.d.ts +25 -0
- package/dist/src/providers/openrouter.d.ts.map +1 -0
- package/dist/src/providers/openrouter.js +43 -0
- package/dist/src/providers/openrouter.js.map +1 -0
- package/dist/src/tools/registry.d.ts +5 -3
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +35 -12
- package/dist/src/tools/registry.js.map +1 -1
- 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" | "
|
|
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
|
-
|
|
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
|
-
|
|
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;;;;;;
|
|
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"}
|
package/dist/src/core/config.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;
|
|
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"}
|
package/dist/src/mcp/server.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|