@almightygpt/core 0.9.2 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/factory.d.ts +12 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +40 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/auth/__tests__/keychain.test.d.ts +18 -0
- package/dist/auth/__tests__/keychain.test.d.ts.map +1 -0
- package/dist/auth/__tests__/keychain.test.js +155 -0
- package/dist/auth/__tests__/keychain.test.js.map +1 -0
- package/dist/auth/__tests__/resolver.test.d.ts +13 -0
- package/dist/auth/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/auth/__tests__/resolver.test.js +182 -0
- package/dist/auth/__tests__/resolver.test.js.map +1 -0
- package/dist/auth/__tests__/validator.test.d.ts +15 -0
- package/dist/auth/__tests__/validator.test.d.ts.map +1 -0
- package/dist/auth/__tests__/validator.test.js +197 -0
- package/dist/auth/__tests__/validator.test.js.map +1 -0
- package/dist/auth/validator.js +19 -14
- package/dist/auth/validator.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/plan/run-plan-review.d.ts +40 -0
- package/dist/plan/run-plan-review.d.ts.map +1 -0
- package/dist/plan/run-plan-review.js +224 -0
- package/dist/plan/run-plan-review.js.map +1 -0
- package/dist/plan/run-plan.d.ts +42 -0
- package/dist/plan/run-plan.d.ts.map +1 -0
- package/dist/plan/run-plan.js +193 -0
- package/dist/plan/run-plan.js.map +1 -0
- package/dist/runs/types.d.ts +1 -1
- package/dist/runs/types.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/adapters/factory.ts +45 -0
- package/src/auth/__tests__/keychain.test.ts +171 -0
- package/src/auth/__tests__/resolver.test.ts +231 -0
- package/src/auth/__tests__/validator.test.ts +241 -0
- package/src/auth/validator.ts +27 -14
- package/src/index.ts +13 -1
- package/src/plan/run-plan-review.ts +302 -0
- package/src/plan/run-plan.ts +247 -0
- package/src/runs/types.ts +3 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator tests with mocked fetch.
|
|
3
|
+
*
|
|
4
|
+
* Covers Codex's v0.8 security review demand:
|
|
5
|
+
* "Add a regression test that failed validation never logs or returns
|
|
6
|
+
* a URL containing the key."
|
|
7
|
+
*
|
|
8
|
+
* Plus the broader contract:
|
|
9
|
+
* - happy path → ok: true with model
|
|
10
|
+
* - timeout → ok: false with friendly message
|
|
11
|
+
* - non-OK response → normalized error with statusCode, never raw body
|
|
12
|
+
* - submitted key NEVER appears in error / model field for ANY provider
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
15
|
+
import { validateKey } from "../validator.js";
|
|
16
|
+
const fetchMock = vi.fn();
|
|
17
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
18
|
+
// Keys with recognizable patterns so we can grep for them in any output.
|
|
19
|
+
const KEYS = {
|
|
20
|
+
openai: "sk-test-openai-CANARY-VALUE-12345",
|
|
21
|
+
anthropic: "sk-ant-test-anthropic-CANARY-VALUE-67890",
|
|
22
|
+
google: "AIza-test-google-CANARY-VALUE-abcde",
|
|
23
|
+
};
|
|
24
|
+
function jsonResponse(status, body) {
|
|
25
|
+
return new Response(typeof body === "string" ? body : JSON.stringify(body), {
|
|
26
|
+
status,
|
|
27
|
+
headers: { "content-type": "application/json" },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
fetchMock.mockReset();
|
|
32
|
+
});
|
|
33
|
+
describe("validator — OpenAI", () => {
|
|
34
|
+
it("happy path returns ok with model name from response", async () => {
|
|
35
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, { model: "gpt-4o-2024-08-06", choices: [] }));
|
|
36
|
+
const r = await validateKey("openai", KEYS.openai);
|
|
37
|
+
expect(r.ok).toBe(true);
|
|
38
|
+
expect(r.model).toBe("gpt-4o-2024-08-06");
|
|
39
|
+
expect(r.latencyMs).toBeGreaterThanOrEqual(0);
|
|
40
|
+
});
|
|
41
|
+
it("posts to /v1/chat/completions with the key as Bearer header (NOT in URL)", async () => {
|
|
42
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, { model: "gpt-4o" }));
|
|
43
|
+
await validateKey("openai", KEYS.openai);
|
|
44
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
45
|
+
expect(String(url)).toBe("https://api.openai.com/v1/chat/completions");
|
|
46
|
+
expect(String(url)).not.toContain(KEYS.openai);
|
|
47
|
+
expect(init.headers).toMatchObject({
|
|
48
|
+
authorization: `Bearer ${KEYS.openai}`,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
it("non-OK response returns normalized error with statusCode and no raw body in error", async () => {
|
|
52
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(401, {
|
|
53
|
+
error: {
|
|
54
|
+
message: "Incorrect API key provided",
|
|
55
|
+
type: "invalid_request_error",
|
|
56
|
+
code: "invalid_api_key",
|
|
57
|
+
},
|
|
58
|
+
}));
|
|
59
|
+
const r = await validateKey("openai", KEYS.openai);
|
|
60
|
+
expect(r.ok).toBe(false);
|
|
61
|
+
expect(r.statusCode).toBe(401);
|
|
62
|
+
expect(r.error).toContain("Incorrect API key provided");
|
|
63
|
+
// The error string should be short — not the raw JSON body.
|
|
64
|
+
expect(r.error.length).toBeLessThan(200);
|
|
65
|
+
// rawBody is preserved separately for explicit debug use.
|
|
66
|
+
expect(r.rawBody).toBeDefined();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("validator — Anthropic", () => {
|
|
70
|
+
it("happy path returns ok with model from response", async () => {
|
|
71
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, { model: "claude-sonnet-4-6", content: [] }));
|
|
72
|
+
const r = await validateKey("anthropic", KEYS.anthropic);
|
|
73
|
+
expect(r.ok).toBe(true);
|
|
74
|
+
expect(r.model).toBe("claude-sonnet-4-6");
|
|
75
|
+
});
|
|
76
|
+
it("posts to /v1/messages with x-api-key header (NOT in URL)", async () => {
|
|
77
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, { model: "claude-sonnet-4-6" }));
|
|
78
|
+
await validateKey("anthropic", KEYS.anthropic);
|
|
79
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
80
|
+
expect(String(url)).toBe("https://api.anthropic.com/v1/messages");
|
|
81
|
+
expect(String(url)).not.toContain(KEYS.anthropic);
|
|
82
|
+
expect(init.headers).toMatchObject({
|
|
83
|
+
"x-api-key": KEYS.anthropic,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
it("non-OK response returns normalized error with parsed message", async () => {
|
|
87
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(400, {
|
|
88
|
+
type: "error",
|
|
89
|
+
error: {
|
|
90
|
+
type: "authentication_error",
|
|
91
|
+
message: "invalid x-api-key",
|
|
92
|
+
},
|
|
93
|
+
}));
|
|
94
|
+
const r = await validateKey("anthropic", KEYS.anthropic);
|
|
95
|
+
expect(r.ok).toBe(false);
|
|
96
|
+
expect(r.statusCode).toBe(400);
|
|
97
|
+
expect(r.error).toContain("invalid x-api-key");
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe("validator — Google", () => {
|
|
101
|
+
it("happy path returns ok with the configured model name", async () => {
|
|
102
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, { candidates: [{ content: { parts: [] } }] }));
|
|
103
|
+
const r = await validateKey("google", KEYS.google);
|
|
104
|
+
expect(r.ok).toBe(true);
|
|
105
|
+
expect(r.model).toBe("gemini-2.5-flash");
|
|
106
|
+
});
|
|
107
|
+
it("CODEX V0.8 P1: uses x-goog-api-key header — NEVER puts the key in the URL", async () => {
|
|
108
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(200, { candidates: [] }));
|
|
109
|
+
await validateKey("google", KEYS.google);
|
|
110
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
111
|
+
// This is the regression-test Codex specifically requested.
|
|
112
|
+
expect(String(url)).not.toContain(KEYS.google);
|
|
113
|
+
expect(String(url)).not.toContain("?key=");
|
|
114
|
+
// And the key MUST be in the header instead.
|
|
115
|
+
expect(init.headers).toMatchObject({
|
|
116
|
+
"x-goog-api-key": KEYS.google,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
it("non-OK response returns normalized error with statusCode", async () => {
|
|
120
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(403, {
|
|
121
|
+
error: {
|
|
122
|
+
code: 403,
|
|
123
|
+
message: "API key not valid",
|
|
124
|
+
status: "PERMISSION_DENIED",
|
|
125
|
+
},
|
|
126
|
+
}));
|
|
127
|
+
const r = await validateKey("google", KEYS.google);
|
|
128
|
+
expect(r.ok).toBe(false);
|
|
129
|
+
expect(r.statusCode).toBe(403);
|
|
130
|
+
expect(r.error).toContain("API key not valid");
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe("validator — KEY-LEAK REGRESSION (Codex v0.8 P2 #6)", () => {
|
|
134
|
+
/**
|
|
135
|
+
* The submitted key must never appear in `error` or `model` for
|
|
136
|
+
* ANY provider, in ANY failure path. Tests every provider × every
|
|
137
|
+
* failure mode we care about.
|
|
138
|
+
*/
|
|
139
|
+
const failureModes = [
|
|
140
|
+
{ status: 400, body: { error: { message: "bad request" } } },
|
|
141
|
+
{ status: 401, body: { error: { message: "unauthorized" } } },
|
|
142
|
+
{ status: 403, body: { error: { message: "forbidden" } } },
|
|
143
|
+
{ status: 429, body: { error: { message: "rate limited" } } },
|
|
144
|
+
{ status: 500, body: "Internal Server Error (plain text body)" },
|
|
145
|
+
{
|
|
146
|
+
status: 200,
|
|
147
|
+
body: "malformed-not-json{{{",
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
for (const provider of ["openai", "anthropic", "google"]) {
|
|
151
|
+
for (const mode of failureModes) {
|
|
152
|
+
it(`${provider} ${mode.status}: error message never contains the submitted key verbatim`, async () => {
|
|
153
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(mode.status, mode.body));
|
|
154
|
+
const key = KEYS[provider];
|
|
155
|
+
const r = await validateKey(provider, key);
|
|
156
|
+
// Check every string-shaped field we expose to users.
|
|
157
|
+
for (const field of [r.error, r.model]) {
|
|
158
|
+
if (field) {
|
|
159
|
+
expect(field).not.toContain(key);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
it("if a provider echoes the key in its error body, the normalized error MUST NOT include the key", async () => {
|
|
166
|
+
// Worst-case: provider literally echoes the key in the response.
|
|
167
|
+
// Could happen with poorly-written upstream tooling.
|
|
168
|
+
fetchMock.mockResolvedValueOnce(jsonResponse(400, {
|
|
169
|
+
error: {
|
|
170
|
+
message: `key ${KEYS.openai} is malformed`,
|
|
171
|
+
},
|
|
172
|
+
}));
|
|
173
|
+
const r = await validateKey("openai", KEYS.openai);
|
|
174
|
+
expect(r.ok).toBe(false);
|
|
175
|
+
// The normalized error MUST redact the key.
|
|
176
|
+
expect(r.error).not.toContain(KEYS.openai);
|
|
177
|
+
expect(r.error).toContain("<redacted-key>");
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe("validator — network failure handling", () => {
|
|
181
|
+
it("network throw returns ok:false with friendly message (not stack trace)", async () => {
|
|
182
|
+
fetchMock.mockRejectedValueOnce(new TypeError("fetch failed: ECONNREFUSED"));
|
|
183
|
+
const r = await validateKey("openai", KEYS.openai);
|
|
184
|
+
expect(r.ok).toBe(false);
|
|
185
|
+
expect(r.error).toBeDefined();
|
|
186
|
+
expect(r.error).not.toContain(KEYS.openai);
|
|
187
|
+
// friendlyNetworkError should produce a short message
|
|
188
|
+
expect(r.error.length).toBeLessThan(150);
|
|
189
|
+
});
|
|
190
|
+
it("abort (timeout) returns ok:false with friendly message", async () => {
|
|
191
|
+
fetchMock.mockRejectedValueOnce(Object.assign(new Error("aborted"), { name: "AbortError" }));
|
|
192
|
+
const r = await validateKey("openai", KEYS.openai);
|
|
193
|
+
expect(r.ok).toBe(false);
|
|
194
|
+
expect(r.error).toMatch(/timed out|abort/i);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=validator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../../../src/auth/__tests__/validator.test.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/validator.js
CHANGED
|
@@ -82,7 +82,7 @@ async function validateOpenAI(key) {
|
|
|
82
82
|
return {
|
|
83
83
|
ok: false,
|
|
84
84
|
statusCode: res.status,
|
|
85
|
-
error: normalizeOpenAIError(res.status, rawBody),
|
|
85
|
+
error: normalizeOpenAIError(res.status, rawBody, key),
|
|
86
86
|
rawBody,
|
|
87
87
|
};
|
|
88
88
|
}
|
|
@@ -117,7 +117,7 @@ async function validateAnthropic(key) {
|
|
|
117
117
|
return {
|
|
118
118
|
ok: false,
|
|
119
119
|
statusCode: res.status,
|
|
120
|
-
error: normalizeAnthropicError(res.status, rawBody),
|
|
120
|
+
error: normalizeAnthropicError(res.status, rawBody, key),
|
|
121
121
|
rawBody,
|
|
122
122
|
};
|
|
123
123
|
}
|
|
@@ -167,26 +167,26 @@ async function validateGoogle(key) {
|
|
|
167
167
|
// Parse known provider JSON error shapes into short, user-safe messages.
|
|
168
168
|
// Never echo the raw key back even by accident (defense in depth: we
|
|
169
169
|
// also redact anything that looks like the submitted key).
|
|
170
|
-
function normalizeOpenAIError(status, rawBody) {
|
|
170
|
+
function normalizeOpenAIError(status, rawBody, submittedKey) {
|
|
171
171
|
// OpenAI shape: { "error": { "message": "...", "type": "...", "code": "..." } }
|
|
172
172
|
try {
|
|
173
173
|
const parsed = JSON.parse(rawBody);
|
|
174
174
|
const msg = parsed.error?.message;
|
|
175
175
|
if (msg)
|
|
176
|
-
return `[${status}] OpenAI: ${truncate(msg, 200)}`;
|
|
176
|
+
return `[${status}] OpenAI: ${truncate(redactKey(msg, submittedKey), 200)}`;
|
|
177
177
|
}
|
|
178
178
|
catch {
|
|
179
179
|
/* fall through */
|
|
180
180
|
}
|
|
181
181
|
return statusOnlyMessage("OpenAI", status);
|
|
182
182
|
}
|
|
183
|
-
function normalizeAnthropicError(status, rawBody) {
|
|
183
|
+
function normalizeAnthropicError(status, rawBody, submittedKey) {
|
|
184
184
|
// Anthropic shape: { "type": "error", "error": { "type": "...", "message": "..." } }
|
|
185
185
|
try {
|
|
186
186
|
const parsed = JSON.parse(rawBody);
|
|
187
187
|
const msg = parsed.error?.message;
|
|
188
188
|
if (msg)
|
|
189
|
-
return `[${status}] Anthropic: ${truncate(msg, 200)}`;
|
|
189
|
+
return `[${status}] Anthropic: ${truncate(redactKey(msg, submittedKey), 200)}`;
|
|
190
190
|
}
|
|
191
191
|
catch {
|
|
192
192
|
/* fall through */
|
|
@@ -197,21 +197,26 @@ function normalizeGoogleError(status, rawBody, submittedKey) {
|
|
|
197
197
|
// Google shape: { "error": { "code": N, "message": "...", "status": "..." } }
|
|
198
198
|
try {
|
|
199
199
|
const parsed = JSON.parse(rawBody);
|
|
200
|
-
|
|
201
|
-
// Belt-and-braces redaction: Google sometimes echoes the key in
|
|
202
|
-
// error messages (e.g. "API key not valid. Pass a valid API key.")
|
|
203
|
-
// — we don't ship the actual key value if it ever ends up here.
|
|
204
|
-
if (submittedKey && msg.includes(submittedKey)) {
|
|
205
|
-
msg = msg.replace(submittedKey, "<redacted-key>");
|
|
206
|
-
}
|
|
200
|
+
const msg = parsed.error?.message ?? "";
|
|
207
201
|
if (msg)
|
|
208
|
-
return `[${status}] Google: ${truncate(msg, 200)}`;
|
|
202
|
+
return `[${status}] Google: ${truncate(redactKey(msg, submittedKey), 200)}`;
|
|
209
203
|
}
|
|
210
204
|
catch {
|
|
211
205
|
/* fall through */
|
|
212
206
|
}
|
|
213
207
|
return statusOnlyMessage("Google", status);
|
|
214
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Belt-and-braces: if a provider echoes the submitted key in its
|
|
211
|
+
* error body, redact before surfacing to the user. Codex's v0.8 P2 #6
|
|
212
|
+
* found this gap (originally Google-only); now applied to all three
|
|
213
|
+
* providers via this shared helper.
|
|
214
|
+
*/
|
|
215
|
+
function redactKey(msg, key) {
|
|
216
|
+
if (!key || !msg.includes(key))
|
|
217
|
+
return msg;
|
|
218
|
+
return msg.split(key).join("<redacted-key>");
|
|
219
|
+
}
|
|
215
220
|
function statusOnlyMessage(provider, status) {
|
|
216
221
|
if (status === 401 || status === 403) {
|
|
217
222
|
return `[${status}] ${provider} rejected the key (unauthorized).`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/auth/validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAoBzD,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAoB,EACpB,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,MAAwB,CAAC;QAC7B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM;QACV,CAAC;QACD,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC9B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,4CAA4C,EAAE;YACpE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,GAAG,EAAE;aAC/B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3C,UAAU,EAAE,CAAC;aACd,CAAC;YACF,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,UAAU,EAAE,GAAG,CAAC,MAAM;gBACtB,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/auth/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - review/ ✅ task #11 diff review pipeline (with #12/#13/#14 wiring)
|
|
13
13
|
* - budget/ ✅ task #14 BudgetTracker + BudgetExceededError
|
|
14
14
|
*/
|
|
15
|
-
export declare const VERSION = "0.
|
|
15
|
+
export declare const VERSION = "0.10.0";
|
|
16
16
|
export { startMcpServer } from "./mcp/server.js";
|
|
17
17
|
export { checkGitStatus, assertSafeToWrite, GitStatusDirtyError, type GitStatusCheck, } from "./git/status.js";
|
|
18
18
|
export { installTemplate, hasExistingConfig, type InstallOptions, type InstallResult, } from "./templates/install.js";
|
|
@@ -34,5 +34,7 @@ export type { ReviewEvent, ReviewEventHandler, AgentRoleInRun, } from "./review/
|
|
|
34
34
|
export { resolveApiKey, requireApiKey, type ResolveOptions, } from "./auth/resolver.js";
|
|
35
35
|
export { getKeychain, _resetKeychainCache, type KeychainAdapter, } from "./auth/keychain.js";
|
|
36
36
|
export { validateKey, type ValidationResult } from "./auth/validator.js";
|
|
37
|
+
export { runWorkerPlan, type PlanOptions, type PlanResult, } from "./plan/run-plan.js";
|
|
38
|
+
export { runPlanReview, type PlanReviewOptions, type PlanReviewResult, } from "./plan/run-plan-review.js";
|
|
37
39
|
export { AuthMissingError, PROVIDER_ENV_VARS, PROVIDER_KEY_URLS, type ProviderId, type KeySource, type KeyResolution, } from "./auth/types.js";
|
|
38
40
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - review/ ✅ task #11 diff review pipeline (with #12/#13/#14 wiring)
|
|
13
13
|
* - budget/ ✅ task #14 BudgetTracker + BudgetExceededError
|
|
14
14
|
*/
|
|
15
|
-
export const VERSION = "0.
|
|
15
|
+
export const VERSION = "0.10.0";
|
|
16
16
|
// MCP server (v0.9.0+) — exposes AlmightyGPT's review surface as MCP tools.
|
|
17
17
|
export { startMcpServer } from "./mcp/server.js";
|
|
18
18
|
// Git safety primitives
|
|
@@ -41,5 +41,8 @@ export { BudgetTracker, BudgetExceededError, } from "./review/budget.js";
|
|
|
41
41
|
export { resolveApiKey, requireApiKey, } from "./auth/resolver.js";
|
|
42
42
|
export { getKeychain, _resetKeychainCache, } from "./auth/keychain.js";
|
|
43
43
|
export { validateKey } from "./auth/validator.js";
|
|
44
|
+
// Plan subsystem (v0.10.0+) — Worker plan + Reviewer plan-review
|
|
45
|
+
export { runWorkerPlan, } from "./plan/run-plan.js";
|
|
46
|
+
export { runPlanReview, } from "./plan/run-plan-review.js";
|
|
44
47
|
export { AuthMissingError, PROVIDER_ENV_VARS, PROVIDER_KEY_URLS, } from "./auth/types.js";
|
|
45
48
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEhC,4EAA4E;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAwB;AACxB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,iBAAiB,CAAC;AAEzB,qBAAqB;AACrB,OAAO,EACL,eAAe,EACf,iBAAiB,GAGlB,MAAM,wBAAwB,CAAC;AAEhC,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAGhB,MAAM,oBAAoB,CAAC;AAE5B,WAAW;AACX,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,GAQd,MAAM,qBAAqB,CAAC;AAE7B,sBAAsB;AACtB,OAAO,EAAE,aAAa,EAA6C,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAGrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO;AACP,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,cAAc,GAIf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAE1B,kBAAkB;AAClB,OAAO,EACL,aAAa,GAGd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,uBAAuB,GAGxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,cAAc,EAAqC,MAAM,kBAAkB,CAAC;AACrF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,aAAa,EACb,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAO5B,2DAA2D;AAC3D,OAAO,EACL,aAAa,EACb,aAAa,GAEd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,WAAW,EACX,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAyB,MAAM,qBAAqB,CAAC;AACzE,iEAAiE;AACjE,OAAO,EACL,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,GAGd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAIlB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `almightygpt review --plan <file>` — Reviewer AI critiques a PLAN
|
|
3
|
+
* doc (not a git diff). Same review primitives as runDiffReview but
|
|
4
|
+
* the input is the plan markdown and the framing tells the Reviewer
|
|
5
|
+
* to critique the plan's structure, completeness, and risks rather
|
|
6
|
+
* than line-by-line code.
|
|
7
|
+
*
|
|
8
|
+
* Output lands at `<reviewsDir>/plan-<topic>.md` (prefix distinguishes
|
|
9
|
+
* plan reviews from diff reviews when they share the same topic name).
|
|
10
|
+
*/
|
|
11
|
+
export interface PlanReviewOptions {
|
|
12
|
+
repoRoot: string;
|
|
13
|
+
topic: string;
|
|
14
|
+
/** Path (relative to repoRoot) to the plan markdown to review. */
|
|
15
|
+
planPath: string;
|
|
16
|
+
reviewer?: string;
|
|
17
|
+
force?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface PlanReviewResult {
|
|
20
|
+
reviewPath: string;
|
|
21
|
+
reviewBytes: number;
|
|
22
|
+
reviewer: string;
|
|
23
|
+
provider: string;
|
|
24
|
+
modelUsed: string;
|
|
25
|
+
tokensIn: number;
|
|
26
|
+
cachedTokensIn: number;
|
|
27
|
+
tokensOut: number;
|
|
28
|
+
costUsd: number;
|
|
29
|
+
latencyMs: number;
|
|
30
|
+
memorySources: {
|
|
31
|
+
path: string;
|
|
32
|
+
bytes: number;
|
|
33
|
+
}[];
|
|
34
|
+
memoryMissing: string[];
|
|
35
|
+
runId: string;
|
|
36
|
+
runFolder: string;
|
|
37
|
+
shallowWarning?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function runPlanReview(opts: PlanReviewOptions): Promise<PlanReviewResult>;
|
|
40
|
+
//# sourceMappingURL=run-plan-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-plan-review.d.ts","sourceRoot":"","sources":["../../src/plan/run-plan-review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoBH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+DD,wBAAsB,aAAa,CACjC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAgK3B"}
|