@coderbabasi/core 0.0.0-stage → 0.1.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent.d.ts +37 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +74 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/auth.d.ts +35 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +133 -0
  9. package/dist/auth.js.map +1 -0
  10. package/dist/checkpoints.d.ts +22 -0
  11. package/dist/checkpoints.d.ts.map +1 -0
  12. package/dist/checkpoints.js +62 -0
  13. package/dist/checkpoints.js.map +1 -0
  14. package/dist/diff.d.ts +11 -0
  15. package/dist/diff.d.ts.map +1 -0
  16. package/dist/diff.js +63 -0
  17. package/dist/diff.js.map +1 -0
  18. package/dist/edit.d.ts +12 -0
  19. package/dist/edit.d.ts.map +1 -0
  20. package/dist/edit.js +18 -0
  21. package/dist/edit.js.map +1 -0
  22. package/dist/errors.d.ts +10 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +38 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +27 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +31 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/llm.d.ts +23 -0
  31. package/dist/llm.d.ts.map +1 -0
  32. package/dist/llm.js +78 -0
  33. package/dist/llm.js.map +1 -0
  34. package/dist/paths.d.ts +8 -0
  35. package/dist/paths.d.ts.map +1 -0
  36. package/dist/paths.js +27 -0
  37. package/dist/paths.js.map +1 -0
  38. package/dist/permissions.d.ts +16 -0
  39. package/dist/permissions.d.ts.map +1 -0
  40. package/dist/permissions.js +8 -0
  41. package/dist/permissions.js.map +1 -0
  42. package/dist/prompt.d.ts +2 -0
  43. package/dist/prompt.d.ts.map +1 -0
  44. package/dist/prompt.js +8 -0
  45. package/dist/prompt.js.map +1 -0
  46. package/dist/sessions.d.ts +18 -0
  47. package/dist/sessions.d.ts.map +1 -0
  48. package/dist/sessions.js +49 -0
  49. package/dist/sessions.js.map +1 -0
  50. package/dist/sse.d.ts +22 -0
  51. package/dist/sse.d.ts.map +1 -0
  52. package/dist/sse.js +94 -0
  53. package/dist/sse.js.map +1 -0
  54. package/dist/tools.d.ts +115 -0
  55. package/dist/tools.d.ts.map +1 -0
  56. package/dist/tools.js +282 -0
  57. package/dist/tools.js.map +1 -0
  58. package/package.json +36 -3
  59. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CoderBaba
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,37 @@
1
+ import type { ChatMessage } from "@coderbabasi/shared";
2
+ import { Checkpoints } from "./checkpoints.js";
3
+ import type { Llm } from "./llm.js";
4
+ import type { PermissionDecision, PermissionRequest } from "./permissions.js";
5
+ import { type ToolEvent } from "./tools.js";
6
+ export type AgentEvent = {
7
+ type: "text";
8
+ text: string;
9
+ } | {
10
+ type: "tool";
11
+ event: ToolEvent;
12
+ } | {
13
+ type: "error";
14
+ code: string;
15
+ message: string;
16
+ resetAt?: string;
17
+ } | {
18
+ type: "done";
19
+ seconds: number;
20
+ };
21
+ export declare function runTurn(opts: {
22
+ task: string;
23
+ cwd: string;
24
+ model: string;
25
+ taskId: string;
26
+ messages: ChatMessage[];
27
+ llm: Llm;
28
+ askPermission: (request: PermissionRequest) => Promise<PermissionDecision>;
29
+ allows: Set<string>;
30
+ checkpoints: Checkpoints;
31
+ maxSteps: number;
32
+ onEvent: (event: AgentEvent) => void;
33
+ }): Promise<{
34
+ messages: ChatMessage[];
35
+ stopCode?: string;
36
+ }>;
37
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAItC,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,aAAa,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACtC,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoE1D"}
package/dist/agent.js ADDED
@@ -0,0 +1,74 @@
1
+ import { CoderBabaError } from "./errors.js";
2
+ import { SYSTEM_PROMPT } from "./prompt.js";
3
+ import { TOOL_DEFINITIONS, runTool } from "./tools.js";
4
+ const MAX_CONTINUES = 3;
5
+ export async function runTurn(opts) {
6
+ const started = Date.now();
7
+ const messages = opts.messages.slice();
8
+ messages.push({ role: "user", content: opts.task });
9
+ let continues = 0;
10
+ for (let step = 0; step < opts.maxSteps; step++) {
11
+ let result;
12
+ try {
13
+ result = await opts.llm.chat({
14
+ taskId: opts.taskId,
15
+ model: opts.model,
16
+ messages: [{ role: "system", content: SYSTEM_PROMPT }, ...messages],
17
+ tools: TOOL_DEFINITIONS,
18
+ onText: (text) => opts.onEvent({ type: "text", text }),
19
+ });
20
+ }
21
+ catch (error) {
22
+ const known = error instanceof CoderBabaError ? error : new CoderBabaError("BAD_REQUEST", "The model request failed. Try again.");
23
+ opts.onEvent({ type: "error", code: known.code, message: known.message, resetAt: known.resetAt });
24
+ if (step === 0)
25
+ return { messages: opts.messages, stopCode: known.code };
26
+ return { messages, stopCode: known.code };
27
+ }
28
+ if (result.finishReason === "length" && result.toolCalls.length === 0 && continues < MAX_CONTINUES) {
29
+ continues += 1;
30
+ messages.push({ role: "assistant", content: result.content });
31
+ messages.push({ role: "user", content: "Continue from where you left off." });
32
+ continue;
33
+ }
34
+ if (result.toolCalls.length === 0) {
35
+ messages.push({ role: "assistant", content: result.content });
36
+ opts.onEvent({ type: "done", seconds: elapsed(started) });
37
+ return { messages };
38
+ }
39
+ const toolCalls = result.toolCalls.map((call, index) => ({
40
+ id: call.id || `call_${step}_${index}`,
41
+ type: "function",
42
+ function: { name: call.name, arguments: call.arguments },
43
+ }));
44
+ messages.push({ role: "assistant", content: result.content || null, tool_calls: toolCalls });
45
+ for (const call of toolCalls) {
46
+ let args = {};
47
+ try {
48
+ args = JSON.parse(call.function.arguments || "{}");
49
+ }
50
+ catch {
51
+ messages.push({ role: "tool", tool_call_id: call.id, content: "Arguments were not valid JSON." });
52
+ continue;
53
+ }
54
+ const outcome = await runTool({
55
+ name: call.function.name,
56
+ args,
57
+ cwd: opts.cwd,
58
+ turnId: opts.taskId,
59
+ checkpoints: opts.checkpoints,
60
+ allows: opts.allows,
61
+ askPermission: opts.askPermission,
62
+ });
63
+ opts.onEvent({ type: "tool", event: outcome.event });
64
+ messages.push({ role: "tool", tool_call_id: call.id, content: outcome.content });
65
+ }
66
+ }
67
+ opts.onEvent({ type: "error", code: "STEP_LIMIT", message: "Stopped after the step limit." });
68
+ opts.onEvent({ type: "done", seconds: elapsed(started) });
69
+ return { messages };
70
+ }
71
+ function elapsed(started) {
72
+ return Math.max(1, Math.round((Date.now() - started) / 1000));
73
+ }
74
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ import { type UsageResponse } from "@coderbabasi/shared";
2
+ export type AuthFile = {
3
+ type: "anonymous";
4
+ deviceId: string;
5
+ token: string;
6
+ } | {
7
+ type: "user";
8
+ token: string;
9
+ email?: string;
10
+ deviceId?: string;
11
+ };
12
+ export type EnsureAuthResult = {
13
+ ok: true;
14
+ auth: AuthFile | null;
15
+ direct: boolean;
16
+ } | {
17
+ ok: false;
18
+ needsLogin: true;
19
+ message: string;
20
+ };
21
+ export declare function dataDir(): string;
22
+ export declare function authFilePath(): string;
23
+ export declare function readAuth(): Promise<AuthFile | null>;
24
+ export declare function saveAuth(auth: AuthFile): Promise<void>;
25
+ export declare function clearAuth(): Promise<void>;
26
+ export declare function deviceName(): string;
27
+ export declare function maskEmail(email: string): string;
28
+ export declare function ensureAuth(): Promise<EnsureAuthResult>;
29
+ export declare function startEmailLogin(email: string): Promise<{
30
+ masked: string;
31
+ }>;
32
+ export declare function verifyEmailLogin(email: string, code: string, trialToken?: string): Promise<AuthFile>;
33
+ export declare function logoutRemote(token: string): Promise<void>;
34
+ export declare function fetchUsage(token: string): Promise<UsageResponse | null>;
35
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2C,KAAK,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AAIvH,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAWzD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAyB5D;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAahF;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsB1G;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/D;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAU7E"}
package/dist/auth.js ADDED
@@ -0,0 +1,133 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { isErrorResponse } from "@coderbabasi/shared";
5
+ import { CoderBabaError, friendlyMessage } from "./errors.js";
6
+ import { apiBaseUrl, usesDirectOpenRouter } from "./llm.js";
7
+ export function dataDir() {
8
+ return process.env.CODERBABA_HOME ?? path.join(os.homedir(), ".coderbaba");
9
+ }
10
+ export function authFilePath() {
11
+ return path.join(dataDir(), "auth.json");
12
+ }
13
+ export async function readAuth() {
14
+ try {
15
+ const raw = await fs.readFile(authFilePath(), "utf8");
16
+ const parsed = JSON.parse(raw);
17
+ if (!parsed || (parsed.type !== "anonymous" && parsed.type !== "user") || typeof parsed.token !== "string") {
18
+ return null;
19
+ }
20
+ return parsed;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ export async function saveAuth(auth) {
27
+ const file = authFilePath();
28
+ await fs.mkdir(path.dirname(file), { recursive: true });
29
+ await fs.writeFile(file, JSON.stringify(auth, null, 2), "utf8");
30
+ await fs.chmod(file, 0o600);
31
+ }
32
+ export async function clearAuth() {
33
+ await fs.rm(authFilePath(), { force: true });
34
+ }
35
+ export function deviceName() {
36
+ return `${os.hostname()} · ${os.platform()}`;
37
+ }
38
+ export function maskEmail(email) {
39
+ const [name, domain] = email.split("@");
40
+ if (!name || !domain)
41
+ return email;
42
+ return `${name.slice(0, 1)}***@${domain}`;
43
+ }
44
+ export async function ensureAuth() {
45
+ if (usesDirectOpenRouter())
46
+ return { ok: true, auth: null, direct: true };
47
+ const existing = await readAuth();
48
+ if (existing)
49
+ return { ok: true, auth: existing, direct: false };
50
+ const deviceId = crypto.randomUUID();
51
+ let response;
52
+ try {
53
+ response = await fetch(`${apiBaseUrl()}/api/auth/anonymous`, {
54
+ method: "POST",
55
+ headers: { "content-type": "application/json" },
56
+ body: JSON.stringify({ deviceId }),
57
+ });
58
+ }
59
+ catch {
60
+ throw new CoderBabaError("OFFLINE", "No internet connection. Check your network and try again.");
61
+ }
62
+ const payload = (await response.json().catch(() => null));
63
+ if (!response.ok || !payload || !("token" in payload)) {
64
+ if (isErrorResponse(payload)) {
65
+ return { ok: false, needsLogin: true, message: friendlyMessage(payload.error.code, payload.error.message) };
66
+ }
67
+ return { ok: false, needsLogin: true, message: "Enter your email to keep going (still free)" };
68
+ }
69
+ const auth = { type: "anonymous", deviceId: payload.deviceId || deviceId, token: payload.token };
70
+ await saveAuth(auth);
71
+ return { ok: true, auth, direct: false };
72
+ }
73
+ export async function startEmailLogin(email) {
74
+ const response = await fetch(`${apiBaseUrl()}/api/auth/email/start`, {
75
+ method: "POST",
76
+ headers: { "content-type": "application/json" },
77
+ body: JSON.stringify({ email }),
78
+ });
79
+ const payload = await response.json().catch(() => null);
80
+ if (!response.ok) {
81
+ if (isErrorResponse(payload))
82
+ throw new CoderBabaError(payload.error.code, friendlyMessage(payload.error.code, payload.error.message));
83
+ throw new CoderBabaError("BAD_REQUEST", "Could not send a code. Try again.");
84
+ }
85
+ const masked = payload && typeof payload === "object" && "masked" in payload ? String(payload.masked) : maskEmail(email);
86
+ return { masked };
87
+ }
88
+ export async function verifyEmailLogin(email, code, trialToken) {
89
+ const headers = { "content-type": "application/json" };
90
+ if (trialToken)
91
+ headers.authorization = `Bearer ${trialToken}`;
92
+ const response = await fetch(`${apiBaseUrl()}/api/auth/email/verify`, {
93
+ method: "POST",
94
+ headers,
95
+ body: JSON.stringify({ email, code, deviceName: deviceName() }),
96
+ });
97
+ const payload = (await response.json().catch(() => null));
98
+ if (!response.ok || !payload || !("token" in payload)) {
99
+ if (isErrorResponse(payload))
100
+ throw new CoderBabaError(payload.error.code, friendlyMessage(payload.error.code, payload.error.message));
101
+ throw new CoderBabaError("INVALID_CODE", "That code didn't match, try again");
102
+ }
103
+ const previous = await readAuth();
104
+ const auth = {
105
+ type: "user",
106
+ token: payload.token,
107
+ email,
108
+ deviceId: previous?.type === "anonymous" ? previous.deviceId : undefined,
109
+ };
110
+ await saveAuth(auth);
111
+ return auth;
112
+ }
113
+ export async function logoutRemote(token) {
114
+ await fetch(`${apiBaseUrl()}/api/auth/logout`, {
115
+ method: "POST",
116
+ headers: { authorization: `Bearer ${token}` },
117
+ }).catch(() => undefined);
118
+ await clearAuth();
119
+ }
120
+ export async function fetchUsage(token) {
121
+ try {
122
+ const response = await fetch(`${apiBaseUrl()}/api/usage`, {
123
+ headers: { authorization: `Bearer ${token}` },
124
+ });
125
+ if (!response.ok)
126
+ return null;
127
+ return (await response.json());
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type CheckpointFile = {
2
+ path: string;
3
+ existed: boolean;
4
+ content?: string;
5
+ };
6
+ export type TurnCheckpoint = {
7
+ turnId: string;
8
+ files: CheckpointFile[];
9
+ };
10
+ export declare class Checkpoints {
11
+ private readonly dir;
12
+ private turns;
13
+ constructor(dir: string);
14
+ load(): Promise<void>;
15
+ remember(turnId: string, filePath: string): Promise<void>;
16
+ lastTurnId(): string | undefined;
17
+ undoLast(): Promise<{
18
+ restored: string[];
19
+ } | null>;
20
+ private persist;
21
+ }
22
+ //# sourceMappingURL=checkpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoints.d.ts","sourceRoot":"","sources":["../src/checkpoints.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElF,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC;AAEzE,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,KAAK,CAAwB;gBAER,GAAG,EAAE,MAAM;IAElC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/D,UAAU,IAAI,MAAM,GAAG,SAAS;IAI1B,QAAQ,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;YAe1C,OAAO;CAItB"}
@@ -0,0 +1,62 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ export class Checkpoints {
4
+ dir;
5
+ turns = [];
6
+ constructor(dir) {
7
+ this.dir = dir;
8
+ }
9
+ async load() {
10
+ try {
11
+ const raw = await fs.readFile(path.join(this.dir, "turns.json"), "utf8");
12
+ this.turns = JSON.parse(raw);
13
+ }
14
+ catch {
15
+ this.turns = [];
16
+ }
17
+ }
18
+ async remember(turnId, filePath) {
19
+ let turn = this.turns.find((item) => item.turnId === turnId);
20
+ if (!turn) {
21
+ turn = { turnId, files: [] };
22
+ this.turns.push(turn);
23
+ }
24
+ if (turn.files.some((file) => file.path === filePath))
25
+ return;
26
+ let existed = false;
27
+ let content;
28
+ try {
29
+ content = await fs.readFile(filePath, "utf8");
30
+ existed = true;
31
+ }
32
+ catch {
33
+ existed = false;
34
+ }
35
+ turn.files.push({ path: filePath, existed, content });
36
+ await this.persist();
37
+ }
38
+ lastTurnId() {
39
+ return this.turns.at(-1)?.turnId;
40
+ }
41
+ async undoLast() {
42
+ const turn = this.turns.pop();
43
+ if (!turn)
44
+ return null;
45
+ for (const file of [...turn.files].reverse()) {
46
+ if (!file.existed) {
47
+ await fs.rm(file.path, { force: true });
48
+ }
49
+ else {
50
+ await fs.mkdir(path.dirname(file.path), { recursive: true });
51
+ await fs.writeFile(file.path, file.content ?? "", "utf8");
52
+ }
53
+ }
54
+ await this.persist();
55
+ return { restored: turn.files.map((file) => file.path) };
56
+ }
57
+ async persist() {
58
+ await fs.mkdir(this.dir, { recursive: true });
59
+ await fs.writeFile(path.join(this.dir, "turns.json"), JSON.stringify(this.turns), "utf8");
60
+ }
61
+ }
62
+ //# sourceMappingURL=checkpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoints.js","sourceRoot":"","sources":["../src/checkpoints.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export type DiffLine = {
2
+ kind: "add" | "del" | "ctx";
3
+ text: string;
4
+ };
5
+ export type LineDiff = {
6
+ added: number;
7
+ removed: number;
8
+ lines: DiffLine[];
9
+ };
10
+ export declare function lineDiff(before: string, after: string): LineDiff;
11
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC;AAK7E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CA8ChE"}
package/dist/diff.js ADDED
@@ -0,0 +1,63 @@
1
+ const MAX_CELLS = 400_000;
2
+ const MAX_SHOWN = 40;
3
+ export function lineDiff(before, after) {
4
+ const a = before.split("\n");
5
+ const b = after.split("\n");
6
+ if (a.length * b.length > MAX_CELLS) {
7
+ return { added: b.length, removed: a.length, lines: [] };
8
+ }
9
+ const rows = [new Array(b.length + 1).fill(0)];
10
+ for (let i = 1; i <= a.length; i++) {
11
+ const prev = rows[i - 1];
12
+ const cur = new Array(b.length + 1).fill(0);
13
+ for (let j = 1; j <= b.length; j++) {
14
+ cur[j] = a[i - 1] === b[j - 1] ? prev[j - 1] + 1 : Math.max(prev[j], cur[j - 1]);
15
+ }
16
+ rows.push(cur);
17
+ }
18
+ const ops = [];
19
+ let i = a.length;
20
+ let j = b.length;
21
+ while (i > 0 && j > 0) {
22
+ if (a[i - 1] === b[j - 1]) {
23
+ ops.push({ kind: "ctx", text: a[i - 1] });
24
+ i--;
25
+ j--;
26
+ }
27
+ else if (rows[i][j - 1] >= rows[i - 1][j]) {
28
+ ops.push({ kind: "add", text: b[j - 1] });
29
+ j--;
30
+ }
31
+ else {
32
+ ops.push({ kind: "del", text: a[i - 1] });
33
+ i--;
34
+ }
35
+ }
36
+ while (i > 0) {
37
+ ops.push({ kind: "del", text: a[i - 1] });
38
+ i--;
39
+ }
40
+ while (j > 0) {
41
+ ops.push({ kind: "add", text: b[j - 1] });
42
+ j--;
43
+ }
44
+ ops.reverse();
45
+ const added = ops.filter((line) => line.kind === "add").length;
46
+ const removed = ops.filter((line) => line.kind === "del").length;
47
+ return { added, removed, lines: compact(ops) };
48
+ }
49
+ function compact(ops) {
50
+ const changed = ops.some((line) => line.kind !== "ctx");
51
+ if (!changed)
52
+ return [];
53
+ const keep = new Array(ops.length).fill(false);
54
+ for (let i = 0; i < ops.length; i++) {
55
+ if (ops[i].kind === "ctx")
56
+ continue;
57
+ for (let k = Math.max(0, i - 1); k <= Math.min(ops.length - 1, i + 1); k++)
58
+ keep[k] = true;
59
+ }
60
+ const shown = ops.filter((_, index) => keep[index]);
61
+ return shown.slice(0, MAX_SHOWN);
62
+ }
63
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
package/dist/edit.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { type LineDiff } from "./diff.js";
2
+ export type EditResult = {
3
+ ok: true;
4
+ content: string;
5
+ diff: LineDiff;
6
+ } | {
7
+ ok: false;
8
+ error: string;
9
+ };
10
+ /** Replace one exact occurrence. An empty old string creates a new file. */
11
+ export declare function applyExactEdit(content: string, oldString: string, newString: string): EditResult;
12
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../src/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAWhG"}
package/dist/edit.js ADDED
@@ -0,0 +1,18 @@
1
+ import { lineDiff } from "./diff.js";
2
+ /** Replace one exact occurrence. An empty old string creates a new file. */
3
+ export function applyExactEdit(content, oldString, newString) {
4
+ if (oldString === "") {
5
+ if (content.length > 0)
6
+ return { ok: false, error: "old_string is empty, but the file already has content" };
7
+ return { ok: true, content: newString, diff: lineDiff("", newString) };
8
+ }
9
+ const parts = content.split(oldString);
10
+ const count = parts.length - 1;
11
+ if (count === 0)
12
+ return { ok: false, error: "old_string was not found in the file" };
13
+ if (count > 1)
14
+ return { ok: false, error: "old_string matched more than once. Include more surrounding lines." };
15
+ const next = parts.join(newString);
16
+ return { ok: true, content: next, diff: lineDiff(content, next) };
17
+ }
18
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../src/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAiB,MAAM,WAAW,CAAC;AAMpD,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB,EAAE,SAAiB;IAClF,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uDAAuD,EAAE,CAAC;QAC7G,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;IACzE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC;IACrF,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oEAAoE,EAAE,CAAC;IACjH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ErrorCode } from "@coderbabasi/shared";
2
+ export declare class CoderBabaError extends Error {
3
+ readonly code: string;
4
+ readonly resetAt?: string;
5
+ constructor(code: string, message: string, resetAt?: string);
6
+ }
7
+ export declare function friendlyMessage(code: string, serverMessage?: string, resetAt?: string): string;
8
+ export declare function isLoginCode(code: string): boolean;
9
+ export type { ErrorCode };
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEjE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM5D;AAiBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAO9F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,YAAY,EAAE,SAAS,EAAE,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,38 @@
1
+ import { ErrorCodes } from "@coderbabasi/shared";
2
+ export class CoderBabaError extends Error {
3
+ code;
4
+ resetAt;
5
+ constructor(code, message, resetAt) {
6
+ super(message);
7
+ this.name = "CoderBabaError";
8
+ this.code = code;
9
+ this.resetAt = resetAt;
10
+ }
11
+ }
12
+ const FALLBACK = {
13
+ [ErrorCodes.INVALID_CODE]: "That code didn't match, try again",
14
+ [ErrorCodes.CODE_EXPIRED]: "Code expired, sending a new one",
15
+ [ErrorCodes.TOO_MANY_ATTEMPTS]: "Too many tries. Type r to send a new code.",
16
+ [ErrorCodes.QUOTA_EXCEEDED]: "You're out of free usage.",
17
+ [ErrorCodes.TRIAL_EXHAUSTED]: "You've used your 5 free tries. Enter your email to keep going (still free)",
18
+ [ErrorCodes.TRIAL_TASK_CAPPED]: "This free try hit its limit. Log in to continue (free)",
19
+ [ErrorCodes.TRIAL_UNAVAILABLE]: "Free trials are busy right now. Log in to continue (free)",
20
+ [ErrorCodes.MODEL_NOT_ALLOWED]: "That model unlocks after you log in (free). /login",
21
+ [ErrorCodes.RATE_LIMITED]: "Too many requests. Wait a moment and try again.",
22
+ [ErrorCodes.UNAUTHORIZED]: "You're not logged in. Type /login",
23
+ [ErrorCodes.OFFLINE]: "No internet connection. Check your network and try again.",
24
+ [ErrorCodes.BAD_REQUEST]: "That request could not be sent. Try again.",
25
+ };
26
+ export function friendlyMessage(code, serverMessage, resetAt) {
27
+ if (code === ErrorCodes.QUOTA_EXCEEDED) {
28
+ const when = resetAt ? ` It resets ${resetAt}.` : "";
29
+ return `${serverMessage || FALLBACK[code]}${when}`;
30
+ }
31
+ if (serverMessage && code !== ErrorCodes.INVALID_CODE)
32
+ return serverMessage;
33
+ return FALLBACK[code] ?? serverMessage ?? "Something went wrong. Try again.";
34
+ }
35
+ export function isLoginCode(code) {
36
+ return code === ErrorCodes.TRIAL_EXHAUSTED || code === ErrorCodes.TRIAL_UNAVAILABLE || code === ErrorCodes.UNAUTHORIZED;
37
+ }
38
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,qBAAqB,CAAC;AAEjE,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAS;IACb,OAAO,CAAU;IAE1B,YAAY,IAAY,EAAE,OAAe,EAAE,OAAgB;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,QAAQ,GAA2B;IACvC,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,mCAAmC;IAC9D,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,iCAAiC;IAC5D,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,4CAA4C;IAC5E,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,2BAA2B;IACxD,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,4EAA4E;IAC1G,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,wDAAwD;IACxF,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,2DAA2D;IAC3F,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,oDAAoD;IACpF,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,iDAAiD;IAC5E,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,mCAAmC;IAC9D,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,2DAA2D;IACjF,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,4CAA4C;CACvE,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,aAAsB,EAAE,OAAgB;IACpF,IAAI,IAAI,KAAK,UAAU,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,GAAG,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,aAAa,IAAI,IAAI,KAAK,UAAU,CAAC,YAAY;QAAE,OAAO,aAAa,CAAC;IAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,IAAI,kCAAkC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,KAAK,UAAU,CAAC,eAAe,IAAI,IAAI,KAAK,UAAU,CAAC,iBAAiB,IAAI,IAAI,KAAK,UAAU,CAAC,YAAY,CAAC;AAC1H,CAAC"}