epam-ai-conductor 0.1.1 → 0.3.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 CHANGED
@@ -1,8 +1,8 @@
1
- # react-workshop-cli
1
+ # epam-ai-conductor
2
2
 
3
- Socratic mentor CLI for the React Fundamentals course, powered by CodeMie + Claude.
3
+ **EPAM AI Conductor** — a Socratic AI mentor CLI for the **React Fundamentals** course, powered by CodeMie + Claude.
4
4
 
5
- The agent knows the full course content and test expectations but guides students with questions, not answers.
5
+ The mentor knows the full course content and hidden test expectations, but guides students with questions instead of answers — so they learn by doing, never by copy-pasting.
6
6
 
7
7
  ## Student setup
8
8
 
@@ -11,23 +11,38 @@ The agent knows the full course content and test expectations but guides student
11
11
  git clone <template-repo-url> my-react-app
12
12
  cd my-react-app
13
13
 
14
- # 2. Install the workshop CLI
15
- npm install -g react-workshop-cli # once codemie installs claude
14
+ # 2. Install EPAM AI Conductor
15
+ npm install -g epam-ai-conductor
16
16
 
17
17
  # 3. Start a module session
18
- react-workshop start --module 1
18
+ ai-conductor start -m 1
19
19
  ```
20
20
 
21
- On first run it will walk you through CodeMie setup (EPAM SSO login).
21
+ On first run it walks you through CodeMie setup (EPAM SSO login).
22
22
 
23
- ### Slash commands during the session
23
+ ### Commands
24
+
25
+ ```bash
26
+ ai-conductor help # show usage
27
+ ai-conductor start # pick a module interactively
28
+ ai-conductor start -m <1-5> # start a specific module
29
+ ai-conductor start -m <1-5> -d <path> # start in a specific directory
30
+ ```
31
+
32
+ ### Slash commands during a session
24
33
 
25
34
  | Command | What it does |
26
35
  |----------|-------------|
27
36
  | `/hint` | One targeted hint — a question, not code |
28
- | `/check` | Reviews your src/ against task criteria |
37
+ | `/check` | Reviews your `src/` against the task criteria |
29
38
  | `/step` | Suggests the single most logical next step |
30
39
 
40
+ ## Requirements
41
+
42
+ - Node.js >= 20
43
+ - A CodeMie account (EPAM SSO) — set up automatically on first run
44
+ - `codemie-claude` installed (`codemie install claude`)
45
+
31
46
  ---
32
47
 
33
48
  ## Course coordinator — updating content
@@ -43,4 +58,48 @@ npm run sync-content # copies from sibling repos into src/content/
43
58
  npm run build # compiles TS + copies content into dist/
44
59
  ```
45
60
 
46
- Then publish the new version of the package.
61
+ ### Publishing a new version
62
+
63
+ ```bash
64
+ # 1. Bump the version
65
+ npm version patch # 0.1.2 → 0.1.3
66
+ # or
67
+ npm version minor # 0.1.2 → 0.2.0
68
+
69
+ # 2. Push the tag — GitLab CI will publish to npm automatically
70
+ git push origin --tags
71
+ ```
72
+
73
+ > Requires `NPM_TOKEN` set in GitLab: **Settings → CI/CD → Variables**
74
+
75
+ ### How the mentor evaluates (and stays grounded)
76
+
77
+ The MCP server exposes these tools to the mentor:
78
+
79
+ | Tool | Purpose |
80
+ |------|---------|
81
+ | `get_criteria` | Graded checklist with stable ids + point weights (parsed from the `## Criteria` section of each module's task). The source of truth for "is it done". |
82
+ | `get_test_expectations` | The objective contract a component's hidden tests assert (expected export/path, props, required output text, queried roles/testids, interactions) — never the raw test code. |
83
+ | `get_module_overview` | The module map linking each component to its criteria and test contract. |
84
+ | `get_theory` | Course theory, filterable by topic. |
85
+ | `scan_project` | A fresh structural snapshot of the student's current code. `/check` and `/hint` call this first so assessments are never stale. |
86
+
87
+ The persona enforces an intake triage (conceptual / debugging / answer-request / progress-check) and a pre-send self-check that strips any task-solving code or quoted test source.
88
+
89
+ ### Curated criteria overrides
90
+
91
+ Auto-extraction follows the coursebook. To hand-tune a module's checklist, add
92
+ `src/content/module-N/criteria.override.json` — an array of
93
+ `{ id, component, points, requirement, details, optional }` — and it fully
94
+ replaces the parsed list for that module.
95
+
96
+ > Note: a few coursebook modules state a "max points" total that doesn't equal
97
+ > the sum of their listed items (e.g. Module 2 lists 56 pts under a "35 max"
98
+ > heading). `get_criteria` reports the actual itemized total; fix the source or
99
+ > add an override to reconcile.
100
+
101
+ ### Session logs
102
+
103
+ Each MCP tool call is appended (locally, anonymous) to
104
+ `~/.ai-conductor/logs/tools-YYYY-MM-DD.jsonl` — useful for spotting where the
105
+ mentor mis-assessed or leaked. Delete the dir to clear.
package/bin/workshop.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import('../dist/cli.js').catch((error) => {
4
- console.error('Error starting workshop:', error.message);
4
+ console.error('Error starting EPAM AI Conductor:', error.message);
5
5
  process.exit(1);
6
6
  });
@@ -10,10 +10,10 @@ export async function ensureAuth() {
10
10
  return;
11
11
  console.log();
12
12
  console.log(chalk.bold.cyan('╔══════════════════════════════════════════════════════╗'));
13
- console.log(chalk.bold.cyan('║ React Workshop — First Time Setup ║'));
13
+ console.log(chalk.bold.cyan('║ EPAM AI Conductor — First Time Setup ║'));
14
14
  console.log(chalk.bold.cyan('╚══════════════════════════════════════════════════════╝'));
15
15
  console.log();
16
- console.log(chalk.white('To use the workshop mentor you need a CodeMie account.'));
16
+ console.log(chalk.white('To use the AI Conductor mentor you need a CodeMie account.'));
17
17
  console.log();
18
18
  console.log(chalk.bold('Steps:'));
19
19
  console.log(chalk.white(' 1. Go to ') + chalk.cyan('https://codemie.ai'));
@@ -27,7 +27,7 @@ export async function ensureAuth() {
27
27
  default: true,
28
28
  }]);
29
29
  if (!ready) {
30
- console.log(chalk.yellow('\nSetup cancelled. Run `react-workshop start` again when ready.'));
30
+ console.log(chalk.yellow('\nSetup cancelled. Run `ai-conductor start` again when ready.'));
31
31
  process.exit(0);
32
32
  }
33
33
  console.log();
@@ -1 +1 @@
1
- {"version":3,"file":"auth-check.js","sourceRoot":"","sources":["../src/auth-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-check.js","sourceRoot":"","sources":["../src/auth-check.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -9,8 +9,10 @@ import ora from 'ora';
9
9
  import inquirer from 'inquirer';
10
10
  import * as pty from 'node-pty';
11
11
  import { ensureAuth } from './auth-check.js';
12
+ import { ensureSupportedClaude } from './version-pin.js';
12
13
  import { buildContext, MODULE_TITLES } from './context-builder.js';
13
14
  import { TOTAL_MODULES } from './content-loader.js';
15
+ import { startMcpServer } from './mcp-server.js';
14
16
  const __dirname = dirname(fileURLToPath(import.meta.url));
15
17
  function readVersion() {
16
18
  try {
@@ -45,7 +47,7 @@ function launchMentor(moduleNum, targetDir, execPath) {
45
47
  const titleLine = ` Module ${moduleNum}: ${rawTitle}`;
46
48
  const banner = '\r\n' +
47
49
  chalk.bold.cyan(` ╔${'═'.repeat(BOX)}╗`) + '\r\n' +
48
- chalk.bold.cyan(' ║') + chalk.bold.white(pad(' ⚛ React Course Workshop')) + chalk.bold.cyan('║') + '\r\n' +
50
+ chalk.bold.cyan(' ║') + chalk.bold.white(pad(' ⚛ EPAM AI Conductor')) + chalk.bold.cyan('║') + '\r\n' +
49
51
  chalk.bold.cyan(' ║') + chalk.cyan(pad(titleLine)) + chalk.bold.cyan('║') + '\r\n' +
50
52
  chalk.bold.cyan(' ║') + chalk.gray(pad(' /hint · /check · /step')) + chalk.bold.cyan('║') + '\r\n' +
51
53
  chalk.bold.cyan(` ╚${'═'.repeat(BOX)}╝`) + '\r\n';
@@ -81,8 +83,8 @@ function launchMentor(moduleNum, targetDir, execPath) {
81
83
  }
82
84
  const program = new Command();
83
85
  program
84
- .name('react-workshop')
85
- .description('React course workshop — Socratic mentor powered by CodeMie')
86
+ .name('ai-conductor')
87
+ .description('EPAM AI Conductor — Socratic mentor for the React Fundamentals course, powered by CodeMie')
86
88
  .version(readVersion());
87
89
  program
88
90
  .command('start')
@@ -91,7 +93,7 @@ program
91
93
  .option('-d, --dir <path>', 'Path to your React project (default: current directory)', process.cwd())
92
94
  .action(async (opts) => {
93
95
  console.log();
94
- console.log(chalk.bold.cyan(' React Course Workshop'));
96
+ console.log(chalk.bold.cyan(' EPAM AI Conductor'));
95
97
  console.log(chalk.gray(' Powered by CodeMie + Claude\n'));
96
98
  // 1. Auth check
97
99
  await ensureAuth();
@@ -125,6 +127,9 @@ program
125
127
  console.log(chalk.white(' Install it with:'), chalk.cyan('codemie install claude'));
126
128
  process.exit(1);
127
129
  }
130
+ // 3.5. Align Claude Code with the CodeMie-supported version (best-effort,
131
+ // avoids CodeMie's interactive version-mismatch menu mid-launch).
132
+ ensureSupportedClaude();
128
133
  // 4. Build context into target dir
129
134
  const spinner = ora(`Preparing Module ${moduleNum} mentor context...`).start();
130
135
  try {
@@ -161,7 +166,7 @@ program
161
166
  console.log();
162
167
  console.log(chalk.bold.cyan(` ╔${'═'.repeat(BOX)}╗`));
163
168
  console.log(chalk.bold.cyan(' ║') + chalk.bold.white(pad(' ⚛ EPAM AI Conductor')) + chalk.bold.cyan('║'));
164
- console.log(chalk.bold.cyan(' ║') + chalk.gray(pad(' React Course Workshop Mentor')) + chalk.bold.cyan('║'));
169
+ console.log(chalk.bold.cyan(' ║') + chalk.gray(pad(' React Fundamentals Course Mentor')) + chalk.bold.cyan('║'));
165
170
  console.log(chalk.bold.cyan(` ╚${'═'.repeat(BOX)}╝`));
166
171
  console.log();
167
172
  console.log(chalk.bold(' Commands:'));
@@ -182,5 +187,13 @@ program
182
187
  console.log(' ' + chalk.cyan('/step') + chalk.gray(' — move to the next step'));
183
188
  console.log();
184
189
  });
190
+ program
191
+ .command('mcp')
192
+ .description('Start MCP server for a module (used internally by Claude Code)')
193
+ .requiredOption('-m, --module <number>', 'Module number')
194
+ .action(async (opts) => {
195
+ const moduleNum = parseInt(opts.module, 10);
196
+ await startMcpServer(moduleNum);
197
+ });
185
198
  program.parse(process.argv);
186
199
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { writeFileSync, mkdirSync } from 'fs';
2
2
  import { join } from 'path';
3
- import { loadModule } from './content-loader.js';
3
+ import { hintCommand, checkCommand, stepCommand } from './prompts.js';
4
4
  export const MODULE_TITLES = {
5
5
  1: 'React Components & Project Structure',
6
6
  2: 'Routing, Forms & Custom Hooks',
@@ -9,106 +9,48 @@ export const MODULE_TITLES = {
9
9
  5: 'Testing with React Testing Library',
10
10
  };
11
11
  export function buildContext(moduleNum, targetDir) {
12
- const { theory, task, tests } = loadModule(moduleNum);
13
- const title = MODULE_TITLES[moduleNum] ?? `Module ${moduleNum}`;
14
- // CLAUDE.md: persona + rules only (~2k chars), heavy content in @-imported files
15
- const claudeMd = `# React Course — Module ${moduleNum}: ${title}
16
-
17
- You are a Socratic mentor for a React fundamentals course.
18
- The student is working on Module ${moduleNum} in their local project.
19
-
20
- ## Working Directory
21
-
22
- You are running inside the student's React project at: \`${targetDir}\`
23
- The student's source code lives in the \`src/\` subdirectory of this folder.
24
- The project is a pre-configured React template — the student already has it set up locally.
25
- Always use the Read tool to inspect the student's actual files — do not assume what they have written.
26
- When referencing files, use paths relative to \`${targetDir}\` (e.g. \`src/components/Header.tsx\`).
27
-
28
- ## Mentor Rules — follow these strictly
29
-
30
- - NEVER write working component code for the student.
31
- - NEVER paste or quote from the test files.
32
- - NEVER reveal expected test output directly.
33
- - When the student is stuck: ask a targeted question — "What should this component return when the list is empty?"
34
- - When code is wrong: point to the specific file/line and ask "What does this return right now?"
35
- - When something is missing: ask "Which criterion from the task do you think isn't covered yet?"
36
- - After the student writes or updates code: silently validate it against the task criteria and test expectations, then ask if they feel it's complete.
37
- - Use the Read tool freely to look at the student's actual src/ files before commenting.
38
- - NEVER ask the student to run terminal commands (find, ls, cat, etc.) to show you their files — you already have the Read tool and you know where the project is.
39
- - NEVER ask the student to show you file contents, paste code, or tell you what's in a file — read it yourself with the Read tool.
40
- - Keep responses concise — one point at a time.
41
-
42
- ## On module completion
43
-
44
- When ALL criteria for Module ${moduleNum} are met (you verified with Read tool), congratulate the student and say exactly:
45
-
46
- "🎉 Module ${moduleNum} complete! To start Module ${moduleNum + 1}, run this in your terminal:
47
- \`react-workshop start --module ${moduleNum + 1}\`
48
- This will load the new module context. See you there!"
49
-
50
- Then do not continue the conversation — the session for this module is done.
51
-
52
- ## On session start
53
-
54
- Greet the student warmly. Ask whether they have already read the task or if they'd like a quick overview.
55
- Then ask: "Where would you like to start?"
56
-
57
- Do NOT dump all criteria at once. Guide step by step.
58
-
59
- ---
60
-
61
- @.claude/module-theory.md
62
- @.claude/module-task.md
63
- @.claude/module-tests.md
64
- `;
65
- const theoryMd = `## MODULE ${moduleNum} THEORY\n\n${theory}`;
66
- const taskMd = `## MODULE ${moduleNum} TASK & CRITERIA\n\n${task}`;
67
- const testsMd = `## TEST EXPECTATIONS — MENTOR EYES ONLY
68
-
69
- > These are the automated tests that will validate the student's submission on AutoCode.
70
- > Use this section as your private knowledge to guide the student accurately.
71
- > NEVER quote, paraphrase, or reveal the test source code to the student.
72
- > You may say things like "The tests check that this component renders X" without showing the test.
73
-
74
- ${tests}`;
75
- const hintCmd = `Read the student's current src/ directory with the Read tool.
76
- Based on what you see and the task requirements, give ONE specific hint.
77
- The hint must be a guiding question or direction — never a code snippet or direct answer.
78
-
79
- Good hint: "Your CourseCard receives duration in minutes — how would you display that as hours and minutes?"
80
- Bad hint: "Use Math.floor(duration / 60) to get the hours."
81
-
82
- After the hint, ask: "Does that point you in the right direction?"`;
83
- const checkCmd = `Read all files in src/ with the Read tool.
84
- Compare the student's implementation against each task criterion one by one.
85
-
86
- For each criterion output one line:
87
- ✓ <criterion> — done
88
- ✗ <criterion> — missing
89
- ⚠ <criterion> — partially done, then explain what's missing in one sentence
90
-
91
- For items marked ✗ or ⚠: ask the student what they think is needed — do not explain directly.
92
- End with a summary: "X of Y criteria complete."
93
-
94
- If ALL criteria are ✓, say:
95
- "🎉 Module ${moduleNum} complete! To start Module ${moduleNum + 1}, run this in your terminal:
96
- \`react-workshop start --module ${moduleNum + 1}\`
97
- This will load the new module context. See you there!"`;
98
- const stepCmd = `Read src/ with the Read tool.
99
- Based on the task criteria and what the student has already implemented, identify the single most logical next step.
100
-
101
- Present it as a question:
102
- "It looks like Header is done. What component would you work on next according to the project architecture?"
103
-
104
- Do not list multiple steps — one at a time only.`;
105
12
  const claudeDir = join(targetDir, '.claude');
106
13
  const commandsDir = join(claudeDir, 'commands');
107
14
  mkdirSync(commandsDir, { recursive: true });
15
+ // Minimal CLAUDE.md — slash commands only, no persona (persona lives in MCP server instructions)
16
+ const claudeMd = `## Slash Commands
17
+
18
+ - \`/hint\` — get a targeted hint without spoiling the solution
19
+ - \`/check\` — check your current progress against all criteria
20
+ - \`/step\` — find out the single most logical next step
21
+ `;
22
+ const hintCmd = hintCommand(moduleNum);
23
+ const checkCmd = checkCommand(moduleNum);
24
+ const stepCmd = stepCommand(moduleNum);
25
+ // .mcp.json (project root) — Claude Code reads MCP servers from here (and
26
+ // ~/.claude.json), NOT from .claude/settings.json. This is what actually
27
+ // wires up the mentor's tools.
28
+ const mcpConfig = {
29
+ mcpServers: {
30
+ 'ai-conductor': {
31
+ type: 'stdio',
32
+ command: 'ai-conductor',
33
+ args: ['mcp', '--module', String(moduleNum)],
34
+ },
35
+ },
36
+ };
37
+ // settings.json — trust the project .mcp.json server automatically and
38
+ // pre-approve the tools the mentor needs, so the student is never
39
+ // interrupted by permission prompts. Only the MCP tools + read-only tools
40
+ // are allowed; Edit/Write/Bash still prompt (the mentor must never modify
41
+ // the student's code).
42
+ const settings = {
43
+ enableAllProjectMcpServers: true,
44
+ permissions: {
45
+ allow: [
46
+ 'mcp__ai-conductor', // all ai-conductor MCP tools (criteria, scan_project, etc.)
47
+ 'Read', // also covers Grep/Glob read operations
48
+ ],
49
+ },
50
+ };
108
51
  writeFileSync(join(claudeDir, 'CLAUDE.md'), claudeMd, 'utf-8');
109
- writeFileSync(join(claudeDir, 'module-theory.md'), theoryMd, 'utf-8');
110
- writeFileSync(join(claudeDir, 'module-task.md'), taskMd, 'utf-8');
111
- writeFileSync(join(claudeDir, 'module-tests.md'), testsMd, 'utf-8');
52
+ writeFileSync(join(targetDir, '.mcp.json'), JSON.stringify(mcpConfig, null, 2), 'utf-8');
53
+ writeFileSync(join(claudeDir, 'settings.json'), JSON.stringify(settings, null, 2), 'utf-8');
112
54
  writeFileSync(join(commandsDir, 'hint.md'), hintCmd, 'utf-8');
113
55
  writeFileSync(join(commandsDir, 'check.md'), checkCmd, 'utf-8');
114
56
  writeFileSync(join(commandsDir, 'step.md'), stepCmd, 'utf-8');
@@ -1 +1 @@
1
- {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../src/context-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,CAAC,EAAE,sCAAsC;IACzC,CAAC,EAAE,+BAA+B;IAClC,CAAC,EAAE,wBAAwB;IAC3B,CAAC,EAAE,8BAA8B;IACjC,CAAC,EAAE,oCAAoC;CACxC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,SAAiB;IAC/D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,UAAU,SAAS,EAAE,CAAC;IAEhE,iFAAiF;IACjF,MAAM,QAAQ,GAAG,2BAA2B,SAAS,KAAK,KAAK;;;mCAG9B,SAAS;;;;2DAIe,SAAS;;;;kDAIlB,SAAS;;;;;;;;;;;;;;;;;;+BAkB5B,SAAS;;aAE3B,SAAS,8BAA8B,SAAS,GAAG,CAAC;kCAC/B,SAAS,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiB9C,CAAC;IAEA,MAAM,QAAQ,GAAG,aAAa,SAAS,cAAc,MAAM,EAAE,CAAC;IAE9D,MAAM,MAAM,GAAG,aAAa,SAAS,uBAAuB,IAAI,EAAE,CAAC;IAEnE,MAAM,OAAO,GAAG;;;;;;;EAOhB,KAAK,EAAE,CAAC;IAER,MAAM,OAAO,GAAG;;;;;;;mEAOiD,CAAC;IAElE,MAAM,QAAQ,GAAG;;;;;;;;;;;;aAYN,SAAS,8BAA8B,SAAS,GAAG,CAAC;kCAC/B,SAAS,GAAG,CAAC;uDACQ,CAAC;IAEtD,MAAM,OAAO,GAAG;;;;;;iDAM+B,CAAC;IAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/D,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClE,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"context-builder.js","sourceRoot":"","sources":["../src/context-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEtE,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,CAAC,EAAE,sCAAsC;IACzC,CAAC,EAAE,+BAA+B;IAClC,CAAC,EAAE,wBAAwB;IAC3B,CAAC,EAAE,8BAA8B;IACjC,CAAC,EAAE,oCAAoC;CACxC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,SAAiB;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,iGAAiG;IACjG,MAAM,QAAQ,GAAG;;;;;CAKlB,CAAC;IAEA,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEvC,0EAA0E;IAC1E,yEAAyE;IACzE,+BAA+B;IAC/B,MAAM,SAAS,GAAG;QAChB,UAAU,EAAE;YACV,cAAc,EAAE;gBACd,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,cAAc;gBACvB,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;aAC7C;SACF;KACF,CAAC;IAEF,uEAAuE;IACvE,kEAAkE;IAClE,0EAA0E;IAC1E,0EAA0E;IAC1E,uBAAuB;IACvB,MAAM,QAAQ,GAAG;QACf,0BAA0B,EAAE,IAAI;QAChC,WAAW,EAAE;YACX,KAAK,EAAE;gBACL,mBAAmB,EAAE,4DAA4D;gBACjF,MAAM,EAAe,wCAAwC;aAC9D;SACF;KACF,CAAC;IAEF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/D,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzF,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5F,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,35 @@
1
+ export interface Criterion {
2
+ /** Stable id, e.g. "m1-coursecard-2" */
3
+ id: string;
4
+ /** Component / section this criterion belongs to */
5
+ component: string;
6
+ /** Point value (0 for ungraded extra-task items) */
7
+ points: number;
8
+ /** The requirement text */
9
+ requirement: string;
10
+ /** Indented sub-bullets that detail the requirement */
11
+ details: string[];
12
+ /** True for "Extra Task" items that are not part of the graded total */
13
+ optional: boolean;
14
+ }
15
+ /**
16
+ * Extract structured, graded criteria from a module's task markdown.
17
+ *
18
+ * Anchors to the "## Criteria" section so setup steps, project-structure
19
+ * trees and code samples earlier in the file are never mistaken for
20
+ * criteria. Captures point weights and indented sub-requirements, and
21
+ * marks everything under an "Extra Task" heading as optional.
22
+ */
23
+ export declare function extractCriteria(taskMd: string, moduleNum: number): Criterion[];
24
+ /**
25
+ * Load criteria for a module. If a curated `criteria.override.json` exists in
26
+ * the module's content dir, it fully replaces the auto-extracted list — this
27
+ * lets a coordinator hand-tune criteria without changing the parser.
28
+ */
29
+ export declare function loadCriteria(moduleNum: number, taskMd: string): Criterion[];
30
+ /** Group criteria by component for display. */
31
+ export declare function groupByComponent(criteria: Criterion[]): Map<string, Criterion[]>;
32
+ /** Total graded points (excludes optional extra-task items). */
33
+ export declare function totalPoints(criteria: Criterion[]): number;
34
+ /** Render a single criterion as one human-readable line. */
35
+ export declare function formatCriterion(c: Criterion): string;
@@ -0,0 +1,151 @@
1
+ import { readFileSync, existsSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ const CONTENT_DIR = join(__dirname, 'content');
6
+ function slugify(s) {
7
+ return s
8
+ .toLowerCase()
9
+ .replace(/[^a-z0-9]+/g, '-')
10
+ .replace(/^-+|-+$/g, '') || 'general';
11
+ }
12
+ /** Clean a "### ..." heading into a component/section label. */
13
+ function cleanComponentHeading(raw) {
14
+ let s = raw.trim();
15
+ // Strip markdown link: [Header component](url) -> Header component
16
+ s = s.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1');
17
+ // Prefer a bold token if present (modules 3 & 5 bold the component name)
18
+ const bold = s.match(/\*\*([^*]+)\*\*/);
19
+ if (bold)
20
+ return stripComponentWord(bold[1]);
21
+ // Otherwise strip formatting and trailing punctuation
22
+ s = s.replace(/\*\*/g, '').replace(/[:.\s]+$/g, '').trim();
23
+ return stripComponentWord(s) || 'General';
24
+ }
25
+ /** Drop a trailing "Component"/"components" word so headings match test names. */
26
+ function stripComponentWord(s) {
27
+ return s.replace(/\s+components?\s*$/i, '').trim() || s.trim();
28
+ }
29
+ const CRITERIA_HEADING = /^##\s+Criteria\b/i;
30
+ const EXTRA_HEADING = /^#{2,4}\s+.*\bExtra\s+Task\b/i;
31
+ const SUBHEADING = /^###\s+(.+)/;
32
+ const POINT_LINE = /^[*-]\s*\[\s*(\d+)\s*points?\s*\]\s*-?\s*(.+)$/i;
33
+ const TOP_BULLET = /^[*-]\s+(.+)$/;
34
+ const SUB_BULLET = /^\s+[*-]\s+(.+)$/;
35
+ /**
36
+ * Extract structured, graded criteria from a module's task markdown.
37
+ *
38
+ * Anchors to the "## Criteria" section so setup steps, project-structure
39
+ * trees and code samples earlier in the file are never mistaken for
40
+ * criteria. Captures point weights and indented sub-requirements, and
41
+ * marks everything under an "Extra Task" heading as optional.
42
+ */
43
+ export function extractCriteria(taskMd, moduleNum) {
44
+ const lines = taskMd.split('\n');
45
+ // Find the start of the graded criteria section.
46
+ const start = lines.findIndex(l => CRITERIA_HEADING.test(l));
47
+ const scan = start === -1 ? lines : lines.slice(start + 1);
48
+ const criteria = [];
49
+ let component = 'Common';
50
+ let optional = false;
51
+ const seq = new Map();
52
+ const pushCriterion = (points, requirement) => {
53
+ const slug = slugify(component);
54
+ const n = (seq.get(slug) ?? 0) + 1;
55
+ seq.set(slug, n);
56
+ const c = {
57
+ id: `m${moduleNum}-${slug}-${n}`,
58
+ component,
59
+ points,
60
+ requirement: requirement.trim(),
61
+ details: [],
62
+ optional,
63
+ };
64
+ criteria.push(c);
65
+ return c;
66
+ };
67
+ let current = null;
68
+ for (const line of scan) {
69
+ if (EXTRA_HEADING.test(line)) {
70
+ optional = true;
71
+ const m = line.match(SUBHEADING);
72
+ if (m)
73
+ component = cleanComponentHeading(m[1]);
74
+ current = null;
75
+ continue;
76
+ }
77
+ const heading = line.match(SUBHEADING);
78
+ if (heading) {
79
+ component = cleanComponentHeading(heading[1]);
80
+ current = null;
81
+ continue;
82
+ }
83
+ const sub = line.match(SUB_BULLET);
84
+ if (sub && current) {
85
+ current.details.push(sub[1].trim());
86
+ continue;
87
+ }
88
+ const pts = line.match(POINT_LINE);
89
+ if (pts) {
90
+ current = pushCriterion(parseInt(pts[1], 10), pts[2]);
91
+ continue;
92
+ }
93
+ // Top-level bullet without a point value (e.g. optional extra-task items)
94
+ const bullet = line.match(TOP_BULLET);
95
+ if (bullet && !/^\s*\[/.test(bullet[1])) {
96
+ current = pushCriterion(0, bullet[1]);
97
+ continue;
98
+ }
99
+ }
100
+ return criteria;
101
+ }
102
+ /**
103
+ * Load criteria for a module. If a curated `criteria.override.json` exists in
104
+ * the module's content dir, it fully replaces the auto-extracted list — this
105
+ * lets a coordinator hand-tune criteria without changing the parser.
106
+ */
107
+ export function loadCriteria(moduleNum, taskMd) {
108
+ const overridePath = join(CONTENT_DIR, `module-${moduleNum}`, 'criteria.override.json');
109
+ if (existsSync(overridePath)) {
110
+ try {
111
+ const parsed = JSON.parse(readFileSync(overridePath, 'utf-8'));
112
+ if (Array.isArray(parsed) && parsed.length > 0) {
113
+ return parsed.map((c, i) => ({
114
+ id: c.id ?? `m${moduleNum}-override-${i + 1}`,
115
+ component: c.component ?? 'General',
116
+ points: c.points ?? 0,
117
+ requirement: c.requirement ?? '',
118
+ details: c.details ?? [],
119
+ optional: c.optional ?? false,
120
+ }));
121
+ }
122
+ }
123
+ catch {
124
+ // Fall through to auto-extraction on malformed override.
125
+ }
126
+ }
127
+ return extractCriteria(taskMd, moduleNum);
128
+ }
129
+ /** Group criteria by component for display. */
130
+ export function groupByComponent(criteria) {
131
+ const map = new Map();
132
+ for (const c of criteria) {
133
+ const list = map.get(c.component) ?? [];
134
+ list.push(c);
135
+ map.set(c.component, list);
136
+ }
137
+ return map;
138
+ }
139
+ /** Total graded points (excludes optional extra-task items). */
140
+ export function totalPoints(criteria) {
141
+ return criteria.filter(c => !c.optional).reduce((sum, c) => sum + c.points, 0);
142
+ }
143
+ /** Render a single criterion as one human-readable line. */
144
+ export function formatCriterion(c) {
145
+ const pts = c.optional ? 'extra' : `${c.points} pt${c.points === 1 ? '' : 's'}`;
146
+ const head = `[${c.id}] (${pts}) ${c.requirement}`;
147
+ if (c.details.length === 0)
148
+ return head;
149
+ return head + '\n' + c.details.map(d => ` • ${d}`).join('\n');
150
+ }
151
+ //# sourceMappingURL=criteria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria.js","sourceRoot":"","sources":["../src/criteria.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAiB/C,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AAC1C,CAAC;AAED,gEAAgE;AAChE,SAAS,qBAAqB,CAAC,GAAW;IACxC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,mEAAmE;IACnE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;IAC9C,yEAAyE;IACzE,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxC,IAAI,IAAI;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,sDAAsD;IACtD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,kBAAkB,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC5C,CAAC;AAED,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAC7C,MAAM,aAAa,GAAG,+BAA+B,CAAC;AACtD,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,UAAU,GAAG,iDAAiD,CAAC;AACrE,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,SAAiB;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,iDAAiD;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,IAAI,SAAS,GAAG,QAAQ,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,WAAmB,EAAa,EAAE;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjB,MAAM,CAAC,GAAc;YACnB,EAAE,EAAE,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,EAAE;YAChC,SAAS;YACT,MAAM;YACN,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE,EAAE;YACX,QAAQ;SACT,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,IAAI,OAAO,GAAqB,IAAI,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjC,IAAI,CAAC;gBAAE,SAAS,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,0EAA0E;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,MAAc;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,SAAS,EAAE,EAAE,wBAAwB,CAAC,CAAC;IACxF,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAqB,EAAE,CAAS,EAAa,EAAE,CAAC,CAAC;oBAClE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE;oBAC7C,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS;oBACnC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;oBACrB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;oBAChC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;oBACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;iBAC9B,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,QAAqB;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,WAAW,CAAC,QAAqB;IAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,CAAY;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getLogDir(): string;
2
+ export declare function logToolCall(moduleNum: number, tool: string, args: Record<string, unknown>, resultSummary?: string): void;