localptp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +159 -0
  3. package/dist/cli.d.ts +24 -0
  4. package/dist/cli.js +344 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/config.d.ts +14 -0
  7. package/dist/commands/config.js +65 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/context.d.ts +12 -0
  10. package/dist/commands/context.js +176 -0
  11. package/dist/commands/context.js.map +1 -0
  12. package/dist/commands/doctor.d.ts +16 -0
  13. package/dist/commands/doctor.js +54 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/index.d.ts +13 -0
  16. package/dist/commands/index.js +70 -0
  17. package/dist/commands/index.js.map +1 -0
  18. package/dist/commands/init.d.ts +15 -0
  19. package/dist/commands/init.js +46 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/plan.d.ts +17 -0
  22. package/dist/commands/plan.js +170 -0
  23. package/dist/commands/plan.js.map +1 -0
  24. package/dist/commands/resume.d.ts +17 -0
  25. package/dist/commands/resume.js +75 -0
  26. package/dist/commands/resume.js.map +1 -0
  27. package/dist/commands/review.d.ts +17 -0
  28. package/dist/commands/review.js +67 -0
  29. package/dist/commands/review.js.map +1 -0
  30. package/dist/commands/run.d.ts +24 -0
  31. package/dist/commands/run.js +65 -0
  32. package/dist/commands/run.js.map +1 -0
  33. package/dist/commands/step.d.ts +44 -0
  34. package/dist/commands/step.js +50 -0
  35. package/dist/commands/step.js.map +1 -0
  36. package/dist/commands/summarize.d.ts +17 -0
  37. package/dist/commands/summarize.js +276 -0
  38. package/dist/commands/summarize.js.map +1 -0
  39. package/dist/commands/task.d.ts +13 -0
  40. package/dist/commands/task.js +53 -0
  41. package/dist/commands/task.js.map +1 -0
  42. package/dist/core/activePointer.d.ts +28 -0
  43. package/dist/core/activePointer.js +84 -0
  44. package/dist/core/activePointer.js.map +1 -0
  45. package/dist/core/approval.d.ts +12 -0
  46. package/dist/core/approval.js +34 -0
  47. package/dist/core/approval.js.map +1 -0
  48. package/dist/core/configManager.d.ts +32 -0
  49. package/dist/core/configManager.js +177 -0
  50. package/dist/core/configManager.js.map +1 -0
  51. package/dist/core/contextBuilder.d.ts +40 -0
  52. package/dist/core/contextBuilder.js +406 -0
  53. package/dist/core/contextBuilder.js.map +1 -0
  54. package/dist/core/memoryLoader.d.ts +4 -0
  55. package/dist/core/memoryLoader.js +35 -0
  56. package/dist/core/memoryLoader.js.map +1 -0
  57. package/dist/core/memoryManager.d.ts +41 -0
  58. package/dist/core/memoryManager.js +181 -0
  59. package/dist/core/memoryManager.js.map +1 -0
  60. package/dist/core/memoryPolicy.d.ts +23 -0
  61. package/dist/core/memoryPolicy.js +73 -0
  62. package/dist/core/memoryPolicy.js.map +1 -0
  63. package/dist/core/modelClient.d.ts +37 -0
  64. package/dist/core/modelClient.js +160 -0
  65. package/dist/core/modelClient.js.map +1 -0
  66. package/dist/core/patchManager.d.ts +89 -0
  67. package/dist/core/patchManager.js +801 -0
  68. package/dist/core/patchManager.js.map +1 -0
  69. package/dist/core/plannerJson.d.ts +23 -0
  70. package/dist/core/plannerJson.js +118 -0
  71. package/dist/core/plannerJson.js.map +1 -0
  72. package/dist/core/promptManager.d.ts +16 -0
  73. package/dist/core/promptManager.js +35 -0
  74. package/dist/core/promptManager.js.map +1 -0
  75. package/dist/core/prompts.d.ts +8 -0
  76. package/dist/core/prompts.js +18 -0
  77. package/dist/core/prompts.js.map +1 -0
  78. package/dist/core/repoIndexer.d.ts +21 -0
  79. package/dist/core/repoIndexer.js +557 -0
  80. package/dist/core/repoIndexer.js.map +1 -0
  81. package/dist/core/reviewEngine.d.ts +53 -0
  82. package/dist/core/reviewEngine.js +229 -0
  83. package/dist/core/reviewEngine.js.map +1 -0
  84. package/dist/core/runLoop.d.ts +26 -0
  85. package/dist/core/runLoop.js +103 -0
  86. package/dist/core/runLoop.js.map +1 -0
  87. package/dist/core/runStep.d.ts +42 -0
  88. package/dist/core/runStep.js +586 -0
  89. package/dist/core/runStep.js.map +1 -0
  90. package/dist/core/safetyManager.d.ts +7 -0
  91. package/dist/core/safetyManager.js +202 -0
  92. package/dist/core/safetyManager.js.map +1 -0
  93. package/dist/core/sessionManager.d.ts +35 -0
  94. package/dist/core/sessionManager.js +265 -0
  95. package/dist/core/sessionManager.js.map +1 -0
  96. package/dist/core/stopConditions.d.ts +24 -0
  97. package/dist/core/stopConditions.js +18 -0
  98. package/dist/core/stopConditions.js.map +1 -0
  99. package/dist/core/taskManager.d.ts +26 -0
  100. package/dist/core/taskManager.js +312 -0
  101. package/dist/core/taskManager.js.map +1 -0
  102. package/dist/core/testRunner.d.ts +27 -0
  103. package/dist/core/testRunner.js +71 -0
  104. package/dist/core/testRunner.js.map +1 -0
  105. package/dist/prompts/coder.d.ts +3 -0
  106. package/dist/prompts/coder.js +46 -0
  107. package/dist/prompts/coder.js.map +1 -0
  108. package/dist/prompts/planner.d.ts +3 -0
  109. package/dist/prompts/planner.js +44 -0
  110. package/dist/prompts/planner.js.map +1 -0
  111. package/dist/prompts/reviewer.d.ts +3 -0
  112. package/dist/prompts/reviewer.js +41 -0
  113. package/dist/prompts/reviewer.js.map +1 -0
  114. package/dist/prompts/summarizer.d.ts +3 -0
  115. package/dist/prompts/summarizer.js +65 -0
  116. package/dist/prompts/summarizer.js.map +1 -0
  117. package/dist/prompts/testFixer.d.ts +3 -0
  118. package/dist/prompts/testFixer.js +33 -0
  119. package/dist/prompts/testFixer.js.map +1 -0
  120. package/dist/repl/approver.d.ts +15 -0
  121. package/dist/repl/approver.js +21 -0
  122. package/dist/repl/approver.js.map +1 -0
  123. package/dist/repl/dispatch.d.ts +48 -0
  124. package/dist/repl/dispatch.js +164 -0
  125. package/dist/repl/dispatch.js.map +1 -0
  126. package/dist/repl/loop.d.ts +14 -0
  127. package/dist/repl/loop.js +124 -0
  128. package/dist/repl/loop.js.map +1 -0
  129. package/dist/repl/tokenize.d.ts +13 -0
  130. package/dist/repl/tokenize.js +56 -0
  131. package/dist/repl/tokenize.js.map +1 -0
  132. package/dist/templates/memory.d.ts +13 -0
  133. package/dist/templates/memory.js +32 -0
  134. package/dist/templates/memory.js.map +1 -0
  135. package/dist/types/config.d.ts +235 -0
  136. package/dist/types/config.js +66 -0
  137. package/dist/types/config.js.map +1 -0
  138. package/dist/types/context.d.ts +78 -0
  139. package/dist/types/context.js +141 -0
  140. package/dist/types/context.js.map +1 -0
  141. package/dist/types/index.d.ts +117 -0
  142. package/dist/types/index.js +24 -0
  143. package/dist/types/index.js.map +1 -0
  144. package/dist/types/model.d.ts +35 -0
  145. package/dist/types/model.js +16 -0
  146. package/dist/types/model.js.map +1 -0
  147. package/dist/types/patch.d.ts +38 -0
  148. package/dist/types/patch.js +11 -0
  149. package/dist/types/patch.js.map +1 -0
  150. package/dist/types/plan.d.ts +86 -0
  151. package/dist/types/plan.js +27 -0
  152. package/dist/types/plan.js.map +1 -0
  153. package/dist/types/review.d.ts +33 -0
  154. package/dist/types/review.js +24 -0
  155. package/dist/types/review.js.map +1 -0
  156. package/dist/types/run.d.ts +34 -0
  157. package/dist/types/run.js +2 -0
  158. package/dist/types/run.js.map +1 -0
  159. package/dist/types/session.d.ts +21 -0
  160. package/dist/types/session.js +2 -0
  161. package/dist/types/session.js.map +1 -0
  162. package/dist/types/summary.d.ts +65 -0
  163. package/dist/types/summary.js +26 -0
  164. package/dist/types/summary.js.map +1 -0
  165. package/dist/types/task.d.ts +31 -0
  166. package/dist/types/task.js +10 -0
  167. package/dist/types/task.js.map +1 -0
  168. package/dist/types/test.d.ts +16 -0
  169. package/dist/types/test.js +2 -0
  170. package/dist/types/test.js.map +1 -0
  171. package/dist/utils/fs.d.ts +13 -0
  172. package/dist/utils/fs.js +65 -0
  173. package/dist/utils/fs.js.map +1 -0
  174. package/dist/utils/gitRoot.d.ts +5 -0
  175. package/dist/utils/gitRoot.js +21 -0
  176. package/dist/utils/gitRoot.js.map +1 -0
  177. package/dist/utils/logger.d.ts +15 -0
  178. package/dist/utils/logger.js +60 -0
  179. package/dist/utils/logger.js.map +1 -0
  180. package/dist/utils/paths.d.ts +13 -0
  181. package/dist/utils/paths.js +24 -0
  182. package/dist/utils/paths.js.map +1 -0
  183. package/dist/utils/tokenEstimate.d.ts +5 -0
  184. package/dist/utils/tokenEstimate.js +8 -0
  185. package/dist/utils/tokenEstimate.js.map +1 -0
  186. package/package.json +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface TaskOptions {
2
+ cwd: string;
3
+ text: string;
4
+ json?: boolean;
5
+ }
6
+ export interface TaskResult {
7
+ taskPath: string;
8
+ sessionPath: string;
9
+ title: string;
10
+ status: string;
11
+ }
12
+ export declare function runTask(opts: TaskOptions): Promise<TaskResult>;
13
+ export declare function formatTaskResult(result: TaskResult): string;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `localptp task "<text>"` (HLD-SRD §3.5, §3.6; CLI.md).
3
+ *
4
+ * Pure filesystem operation (no model call): create the §3.5 task file + §3.6
5
+ * session file, write the active pointer, and report the created paths +
6
+ * active status. Workflow:
7
+ * 1. Detect repo root.
8
+ * 2. createTask(tasksDir, text) → §3.5 file (collision-suffixed, no clobber).
9
+ * 3. createSession(sessionsDir, task) → §3.6 file referencing the task.
10
+ * 4. writeActive(orchestratorDir, { taskPath, sessionPath }).
11
+ * 5. Return the created paths.
12
+ */
13
+ import { detectGitRoot } from "../utils/gitRoot.js";
14
+ import { layout } from "../utils/paths.js";
15
+ import { createTask } from "../core/taskManager.js";
16
+ import { createSession } from "../core/sessionManager.js";
17
+ import { writeActive } from "../core/activePointer.js";
18
+ class CommandError extends Error {
19
+ exitCode;
20
+ constructor(message, exitCode = 1) {
21
+ super(message);
22
+ this.name = "CommandError";
23
+ this.exitCode = exitCode;
24
+ }
25
+ }
26
+ export async function runTask(opts) {
27
+ const text = opts.text.trim();
28
+ if (text.length === 0) {
29
+ throw new CommandError('Provide a task description, e.g. localptp task "Add severity levels to alerts".');
30
+ }
31
+ const git = await detectGitRoot(opts.cwd);
32
+ const l = layout(git.root ?? opts.cwd);
33
+ const task = await createTask(l.tasksDir, text);
34
+ const session = await createSession(l.sessionsDir, task);
35
+ await writeActive(l.orchestratorDir, {
36
+ taskPath: task.path,
37
+ sessionPath: session.path,
38
+ });
39
+ return {
40
+ taskPath: task.path,
41
+ sessionPath: session.path,
42
+ title: task.title,
43
+ status: task.status,
44
+ };
45
+ }
46
+ export function formatTaskResult(result) {
47
+ return [
48
+ `Created task ${result.taskPath}`,
49
+ `Created session ${result.sessionPath}`,
50
+ `Status: ${result.status}`,
51
+ ].join("\n");
52
+ }
53
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAevD,MAAM,YAAa,SAAQ,KAAK;IACrB,QAAQ,CAAS;IAC1B,YAAY,OAAe,EAAE,QAAQ,GAAG,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,YAAY,CACpB,iFAAiF,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,WAAW,CAAC,CAAC,CAAC,eAAe,EAAE;QACnC,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,WAAW,EAAE,OAAO,CAAC,IAAI;KAC1B,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,OAAO;QACL,mBAAmB,MAAM,CAAC,QAAQ,EAAE;QACpC,mBAAmB,MAAM,CAAC,WAAW,EAAE;QACvC,WAAW,MAAM,CAAC,MAAM,EAAE;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface ActivePointer {
2
+ taskPath: string;
3
+ sessionPath: string;
4
+ }
5
+ /**
6
+ * Write the pointer atomically: write a uniquely-named temp file in the same
7
+ * directory, then rename over the target (rename is atomic on the same volume).
8
+ */
9
+ export declare function writeActive(orchestratorDir: string, pointer: ActivePointer): Promise<void>;
10
+ /** Read + parse the pointer, or undefined when absent/malformed. */
11
+ export declare function readActive(orchestratorDir: string): Promise<ActivePointer | undefined>;
12
+ export type ActiveResolution = {
13
+ kind: "none";
14
+ } | {
15
+ kind: "missing-target";
16
+ pointer: ActivePointer;
17
+ missing: string[];
18
+ } | {
19
+ kind: "ok";
20
+ pointer: ActivePointer;
21
+ };
22
+ /**
23
+ * Resolve the active pointer, verifying both referenced files exist on disk.
24
+ * - `none` — no pointer.
25
+ * - `missing-target` — pointer exists but a referenced file is gone.
26
+ * - `ok` — pointer and both files present.
27
+ */
28
+ export declare function resolveActive(orchestratorDir: string): Promise<ActiveResolution>;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Active pointer (`.ai-orchestrator/active.json`).
3
+ *
4
+ * Records the active `{ taskPath, sessionPath }` pair so downstream commands
5
+ * (`context`, `plan`, `step`, …) resolve the active work in O(1) without a
6
+ * newest-file heuristic. Written atomically (temp file + rename). A pointer to
7
+ * a deleted file is detected by `resolveActive` rather than crashing the caller.
8
+ */
9
+ import { promises as fs } from "node:fs";
10
+ import path from "node:path";
11
+ import { ensureDir, readIfExists } from "../utils/fs.js";
12
+ const FILE_NAME = "active.json";
13
+ function pointerPath(orchestratorDir) {
14
+ return path.join(orchestratorDir, FILE_NAME);
15
+ }
16
+ /**
17
+ * Write the pointer atomically: write a uniquely-named temp file in the same
18
+ * directory, then rename over the target (rename is atomic on the same volume).
19
+ */
20
+ export async function writeActive(orchestratorDir, pointer) {
21
+ await ensureDir(orchestratorDir);
22
+ const target = pointerPath(orchestratorDir);
23
+ const tmp = path.join(orchestratorDir, `.${FILE_NAME}.${process.pid}.${Date.now()}.tmp`);
24
+ const content = JSON.stringify(pointer, null, 2) + "\n";
25
+ await fs.writeFile(tmp, content, "utf8");
26
+ try {
27
+ await fs.rename(tmp, target);
28
+ }
29
+ catch (err) {
30
+ // Best-effort cleanup if the rename failed.
31
+ await fs.rm(tmp, { force: true });
32
+ throw err;
33
+ }
34
+ }
35
+ /** Read + parse the pointer, or undefined when absent/malformed. */
36
+ export async function readActive(orchestratorDir) {
37
+ const raw = await readIfExists(pointerPath(orchestratorDir));
38
+ if (raw === undefined)
39
+ return undefined;
40
+ let parsed;
41
+ try {
42
+ parsed = JSON.parse(raw);
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ if (typeof parsed !== "object" ||
48
+ parsed === null ||
49
+ typeof parsed.taskPath !== "string" ||
50
+ typeof parsed.sessionPath !== "string") {
51
+ return undefined;
52
+ }
53
+ const { taskPath, sessionPath } = parsed;
54
+ return { taskPath, sessionPath };
55
+ }
56
+ async function exists(p) {
57
+ try {
58
+ await fs.access(p);
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Resolve the active pointer, verifying both referenced files exist on disk.
67
+ * - `none` — no pointer.
68
+ * - `missing-target` — pointer exists but a referenced file is gone.
69
+ * - `ok` — pointer and both files present.
70
+ */
71
+ export async function resolveActive(orchestratorDir) {
72
+ const pointer = await readActive(orchestratorDir);
73
+ if (pointer === undefined)
74
+ return { kind: "none" };
75
+ const missing = [];
76
+ if (!(await exists(pointer.taskPath)))
77
+ missing.push(pointer.taskPath);
78
+ if (!(await exists(pointer.sessionPath)))
79
+ missing.push(pointer.sessionPath);
80
+ if (missing.length > 0)
81
+ return { kind: "missing-target", pointer, missing };
82
+ return { kind: "ok", pointer };
83
+ }
84
+ //# sourceMappingURL=activePointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activePointer.js","sourceRoot":"","sources":["../../src/core/activePointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Resolves true to proceed, false to stop. The prompt is the question shown. */
2
+ export type Approver = (prompt: string) => Promise<boolean>;
3
+ /** Test/CI stub: always proceed. */
4
+ export declare const autoApprove: Approver;
5
+ /** Test/CI stub: always stop. */
6
+ export declare const autoDeny: Approver;
7
+ /**
8
+ * Real TTY prompt: ask `prompt` on stdin and resolve true for an affirmative
9
+ * answer (`y`/`yes`, case-insensitive). Any other answer — including EOF or a
10
+ * non-interactive stdin — resolves false (deny-by-default, the safe choice).
11
+ */
12
+ export declare const ttyApprove: Approver;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Approval seam (design.md assumption 2; CLI.md Safety).
3
+ *
4
+ * `Approver` is an injectable async predicate the `step` command awaits before
5
+ * applying a patch (and for each risky/delete confirmation). The seam keeps the
6
+ * whole flow deterministic and offline-testable: tests inject `autoApprove` /
7
+ * `autoDeny` or a custom stub; production uses `ttyApprove`, a readline yes/no
8
+ * prompt behind the same seam.
9
+ */
10
+ import readline from "node:readline";
11
+ /** Test/CI stub: always proceed. */
12
+ export const autoApprove = async () => true;
13
+ /** Test/CI stub: always stop. */
14
+ export const autoDeny = async () => false;
15
+ /**
16
+ * Real TTY prompt: ask `prompt` on stdin and resolve true for an affirmative
17
+ * answer (`y`/`yes`, case-insensitive). Any other answer — including EOF or a
18
+ * non-interactive stdin — resolves false (deny-by-default, the safe choice).
19
+ */
20
+ export const ttyApprove = (prompt) => {
21
+ if (!process.stdin.isTTY)
22
+ return Promise.resolve(false);
23
+ return new Promise((resolve) => {
24
+ const rl = readline.createInterface({
25
+ input: process.stdin,
26
+ output: process.stdout,
27
+ });
28
+ rl.question(`${prompt} [y/N] `, (answer) => {
29
+ rl.close();
30
+ resolve(/^\s*y(es)?\s*$/i.test(answer));
31
+ });
32
+ });
33
+ };
34
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/core/approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,QAAQ,MAAM,eAAe,CAAC;AAKrC,oCAAoC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAa,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;AAEtD,iCAAiC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAa,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAa,CAAC,MAAc,EAAE,EAAE;IACrD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,EAAE,CAAC,QAAQ,CAAC,GAAG,MAAM,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACzC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type AppConfig } from "../types/config.js";
2
+ type Json = unknown;
3
+ export declare function snakeToCamelKeys(value: Json): Json;
4
+ export declare function camelToSnakeKeys(value: Json): Json;
5
+ /**
6
+ * Coerce a string CLI value to boolean | number | string.
7
+ */
8
+ export declare function coerceValue(value: string): boolean | number | string;
9
+ export declare class ConfigManager {
10
+ private readonly configFile;
11
+ constructor(configFile: string);
12
+ /**
13
+ * Load and validate config, filling defaults. Throws a formatted error
14
+ * (field path + hint) on validation failure — never a raw stack.
15
+ */
16
+ load(): Promise<AppConfig>;
17
+ /**
18
+ * Validate and write a config object as snake_case YAML.
19
+ */
20
+ write(config: AppConfig): Promise<void>;
21
+ /**
22
+ * Write the default config only if no config file exists.
23
+ * Returns true if created, false if preserved.
24
+ */
25
+ writeDefaultIfAbsent(): Promise<boolean>;
26
+ /**
27
+ * Set one dotted (camelCase) key, coercing the value, re-validating, then
28
+ * writing. An invalid value is NOT written.
29
+ */
30
+ set(dottedKey: string, value: string): Promise<AppConfig>;
31
+ }
32
+ export {};
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Config Manager (HLD-SRD §3.2, §9).
3
+ *
4
+ * - Defaults + validation live in the zod schema (single source of truth).
5
+ * - On load: read YAML (snake_case) → map to camelCase → zod-parse (fills defaults).
6
+ * - On write: map camelCase → snake_case → serialize with js-yaml.
7
+ * - `set(dottedKey, value)`: coerce, set on the merged object, re-validate, write.
8
+ * - Validation failures surface a `field.path: hint` message, never a raw stack.
9
+ */
10
+ import { promises as fs } from "node:fs";
11
+ import path from "node:path";
12
+ import yaml from "js-yaml";
13
+ import { ZodError } from "zod";
14
+ import { appConfigSchema } from "../types/config.js";
15
+ import { readIfExists } from "../utils/fs.js";
16
+ import { redactSecrets } from "../utils/logger.js";
17
+ const FORBIDDEN_KEYS = new Set(["__proto__", "prototype", "constructor"]);
18
+ function snakeToCamel(key) {
19
+ return key.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());
20
+ }
21
+ function camelToSnake(key) {
22
+ return key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
23
+ }
24
+ function isPlainObject(v) {
25
+ return typeof v === "object" && v !== null && !Array.isArray(v);
26
+ }
27
+ function mapKeysDeep(value, transform) {
28
+ if (Array.isArray(value)) {
29
+ return value.map((v) => mapKeysDeep(v, transform));
30
+ }
31
+ if (isPlainObject(value)) {
32
+ const out = {};
33
+ for (const [k, v] of Object.entries(value)) {
34
+ // Drop prototype-pollution keys from untrusted YAML before assignment so a
35
+ // malicious `__proto__`/`constructor`/`prototype` key cannot mutate a
36
+ // prototype during config load.
37
+ if (FORBIDDEN_KEYS.has(k))
38
+ continue;
39
+ const mapped = transform(k);
40
+ if (FORBIDDEN_KEYS.has(mapped))
41
+ continue;
42
+ Object.defineProperty(out, mapped, {
43
+ value: mapKeysDeep(v, transform),
44
+ writable: true,
45
+ enumerable: true,
46
+ configurable: true,
47
+ });
48
+ }
49
+ return out;
50
+ }
51
+ return value;
52
+ }
53
+ export function snakeToCamelKeys(value) {
54
+ return mapKeysDeep(value, snakeToCamel);
55
+ }
56
+ export function camelToSnakeKeys(value) {
57
+ return mapKeysDeep(value, camelToSnake);
58
+ }
59
+ function formatZodError(err) {
60
+ const lines = err.issues.map((issue) => {
61
+ const where = issue.path.join(".") || "(root)";
62
+ return ` ${where}: ${issue.message}`;
63
+ });
64
+ return `Invalid configuration:\n${lines.join("\n")}`;
65
+ }
66
+ /**
67
+ * Coerce a string CLI value to boolean | number | string.
68
+ */
69
+ export function coerceValue(value) {
70
+ if (value === "true")
71
+ return true;
72
+ if (value === "false")
73
+ return false;
74
+ if (value.trim() !== "" && !Number.isNaN(Number(value))) {
75
+ return Number(value);
76
+ }
77
+ return value;
78
+ }
79
+ /**
80
+ * Set a dotted key on `obj`. Every segment must already exist on the object
81
+ * (no auto-vivification of unknown keys — that would let a typo silently write
82
+ * an orphan key the schema then strips). Rejects prototype-pollution segments.
83
+ * Throws if any segment is unknown.
84
+ */
85
+ function setDottedPath(obj, dotted, value) {
86
+ const parts = dotted.split(".");
87
+ if (parts.some((p) => FORBIDDEN_KEYS.has(p) || p.length === 0)) {
88
+ throw new Error(`Invalid configuration key: ${dotted}`);
89
+ }
90
+ let cursor = obj;
91
+ for (let i = 0; i < parts.length - 1; i++) {
92
+ const part = parts[i];
93
+ if (!isPlainObject(cursor[part])) {
94
+ throw new Error(`Unknown configuration key: ${dotted}`);
95
+ }
96
+ cursor = cursor[part];
97
+ }
98
+ const leaf = parts[parts.length - 1];
99
+ if (!Object.prototype.hasOwnProperty.call(cursor, leaf)) {
100
+ throw new Error(`Unknown configuration key: ${dotted}`);
101
+ }
102
+ cursor[leaf] = value;
103
+ }
104
+ export class ConfigManager {
105
+ configFile;
106
+ constructor(configFile) {
107
+ this.configFile = configFile;
108
+ }
109
+ /**
110
+ * Load and validate config, filling defaults. Throws a formatted error
111
+ * (field path + hint) on validation failure — never a raw stack.
112
+ */
113
+ async load() {
114
+ const raw = await readIfExists(this.configFile);
115
+ let parsed = {};
116
+ if (raw !== undefined && raw.trim().length > 0) {
117
+ try {
118
+ parsed = yaml.load(raw) ?? {};
119
+ }
120
+ catch (err) {
121
+ // js-yaml errors embed a snippet of the offending YAML, which can carry
122
+ // a secret (e.g. `api_key: ...`). Redact before surfacing to stderr.
123
+ throw new Error(redactSecrets(`Invalid YAML in ${this.configFile}: ${err.message}`));
124
+ }
125
+ }
126
+ const camel = snakeToCamelKeys(parsed);
127
+ const result = appConfigSchema.safeParse(camel);
128
+ if (!result.success) {
129
+ throw new Error(formatZodError(result.error));
130
+ }
131
+ return result.data;
132
+ }
133
+ /**
134
+ * Validate and write a config object as snake_case YAML.
135
+ */
136
+ async write(config) {
137
+ const validated = appConfigSchema.parse(config);
138
+ const snake = camelToSnakeKeys(validated);
139
+ const text = yaml.dump(snake, { lineWidth: -1 });
140
+ await fs.mkdir(path.dirname(this.configFile), { recursive: true });
141
+ await fs.writeFile(this.configFile, text, "utf8");
142
+ }
143
+ /**
144
+ * Write the default config only if no config file exists.
145
+ * Returns true if created, false if preserved.
146
+ */
147
+ async writeDefaultIfAbsent() {
148
+ const existing = await readIfExists(this.configFile);
149
+ if (existing !== undefined) {
150
+ return false;
151
+ }
152
+ const defaults = appConfigSchema.parse({});
153
+ await this.write(defaults);
154
+ return true;
155
+ }
156
+ /**
157
+ * Set one dotted (camelCase) key, coercing the value, re-validating, then
158
+ * writing. An invalid value is NOT written.
159
+ */
160
+ async set(dottedKey, value) {
161
+ const current = await this.load();
162
+ const coerced = coerceValue(value);
163
+ const draft = structuredClone(current);
164
+ setDottedPath(draft, dottedKey, coerced);
165
+ const result = appConfigSchema.safeParse(draft);
166
+ if (!result.success) {
167
+ // Filter to issues under the edited key for a focused message; fall back
168
+ // to the full error if the path does not line up.
169
+ const focused = new ZodError(result.error.issues.filter((i) => i.path.join(".") === dottedKey));
170
+ const err = focused.issues.length > 0 ? focused : result.error;
171
+ throw new Error(formatZodError(err));
172
+ }
173
+ await this.write(result.data);
174
+ return result.data;
175
+ }
176
+ }
177
+ //# sourceMappingURL=configManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configManager.js","sourceRoot":"","sources":["../../src/core/configManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type ActiveTask, type ActiveSession, type ContextPackage } from "../types/context.js";
2
+ import type { AgentRole } from "../types/model.js";
3
+ import type { AppConfig } from "../types/config.js";
4
+ import type { RepoFile, RepoIndex } from "../types/index.js";
5
+ import type { MemoryFiles } from "./memoryLoader.js";
6
+ export interface ContextInputs {
7
+ role: AgentRole;
8
+ config: AppConfig;
9
+ index: RepoIndex;
10
+ memory: MemoryFiles;
11
+ task?: ActiveTask;
12
+ session?: ActiveSession;
13
+ /** repo-relative POSIX path → body, preloaded by the caller. */
14
+ fileContents: Record<string, string>;
15
+ }
16
+ /**
17
+ * The import-neighbor source files of a set of seed files: every indexed file
18
+ * a seed's `imports[]` resolves to (by suffix match), excluding the seeds
19
+ * themselves. Deterministic: sorted by size asc then path asc.
20
+ */
21
+ export declare function importNeighbors(seedFiles: string[], index: RepoIndex): string[];
22
+ /**
23
+ * A no-model summary: an index header (path/language/exports/size) followed by
24
+ * the file's first 20 non-blank lines.
25
+ */
26
+ export declare function summarizeFile(entry: RepoFile, body: string): string;
27
+ /**
28
+ * A snippet: the first `floor(maxChars / 2)` characters plus a truncation
29
+ * marker. Bodies already at-or-under the snippet size are returned unchanged.
30
+ */
31
+ export declare function snippetFile(body: string, maxChars: number): string;
32
+ interface Selection {
33
+ editFiles: string[];
34
+ sourceFiles: string[];
35
+ testFiles: string[];
36
+ warnings: string[];
37
+ }
38
+ export declare function selectFiles(inputs: ContextInputs): Selection;
39
+ export declare function buildContext(inputs: ContextInputs): ContextPackage;
40
+ export {};