dirac-lang 0.1.94 → 0.1.96

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.
@@ -2,8 +2,8 @@ import {
2
2
  SessionServer,
3
3
  getSocketPath,
4
4
  isSessionRunning
5
- } from "./chunk-3MD2NFUM.js";
6
- import "./chunk-6CVWLZYL.js";
5
+ } from "./chunk-IFBJYN2F.js";
6
+ import "./chunk-NUNYBLVJ.js";
7
7
  import "./chunk-ECAW4X46.js";
8
8
  import "./chunk-SLGJRZ3P.js";
9
9
  import "./chunk-HRHAMPOB.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  integrate
3
- } from "./chunk-6CVWLZYL.js";
3
+ } from "./chunk-NUNYBLVJ.js";
4
4
  import {
5
5
  DiracParser
6
6
  } from "./chunk-HRHAMPOB.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  integrate
3
- } from "./chunk-6CVWLZYL.js";
3
+ } from "./chunk-NUNYBLVJ.js";
4
4
  import {
5
5
  DiracParser
6
6
  } from "./chunk-HRHAMPOB.js";
@@ -487,12 +487,12 @@ async function executeIf(session, element) {
487
487
  const condition = await evaluatePredicate(session, conditionElement);
488
488
  if (condition) {
489
489
  if (thenElement) {
490
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
490
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
491
491
  await integrateChildren2(session, thenElement);
492
492
  }
493
493
  } else {
494
494
  if (elseElement) {
495
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
495
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
496
496
  await integrateChildren2(session, elseElement);
497
497
  }
498
498
  }
@@ -505,7 +505,7 @@ async function evaluatePredicate(session, predicateElement) {
505
505
  return await evaluateCondition(session, predicateElement);
506
506
  }
507
507
  const outputLengthBefore = session.output.length;
508
- const { integrate: integrate2 } = await import("./interpreter-QR2YWK6R.js");
508
+ const { integrate: integrate2 } = await import("./interpreter-WNHDVVDD.js");
509
509
  await integrate2(session, predicateElement);
510
510
  const newOutputChunks = session.output.slice(outputLengthBefore);
511
511
  const result = newOutputChunks.join("").trim();
@@ -528,11 +528,11 @@ async function evaluateCondition(session, condElement) {
528
528
  }
529
529
  const outputLengthBefore = session.output.length;
530
530
  const args = [];
531
- const { integrate: integrate2 } = await import("./interpreter-QR2YWK6R.js");
531
+ const { integrate: integrate2 } = await import("./interpreter-WNHDVVDD.js");
532
532
  for (const child of condElement.children) {
533
533
  if (child.tag.toLowerCase() === "arg") {
534
534
  const argOutputStart = session.output.length;
535
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
535
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
536
536
  await integrateChildren2(session, child);
537
537
  const newChunks = session.output.slice(argOutputStart);
538
538
  const argValue = newChunks.join("");
@@ -1052,7 +1052,8 @@ ${result}
1052
1052
  const autocorrect = element.attributes["autocorrect"] === "true";
1053
1053
  const maxRetries = parseInt(element.attributes["max-retries"] || "0", 10);
1054
1054
  const feedbackMode = element.attributes["feedback"] === "true";
1055
- console.error(`[LLM] Execute mode - validate: ${validateTags}, autocorrect: ${autocorrect}, feedback: ${feedbackMode}, debug: ${session.debug}`);
1055
+ const confirmCorrections = element.attributes["confirm-corrections"] === "true";
1056
+ console.error(`[LLM] Execute mode - validate: ${validateTags}, autocorrect: ${autocorrect}, feedback: ${feedbackMode}, confirm-corrections: ${confirmCorrections}, debug: ${session.debug}`);
1056
1057
  const maxIterationsAttr = substituteAttribute(session, element.attributes["max-iterations"] || "3");
1057
1058
  const maxIterations = parseInt(maxIterationsAttr, 10);
1058
1059
  const replaceTick = element.attributes["replace-tick"] === "true";
@@ -1201,18 +1202,73 @@ ${validation.errorMessages.join("\n")}`);
1201
1202
  }
1202
1203
  }
1203
1204
  const correctedCode = correctedCodeLines.join("\n");
1204
- const correctionFeedback = `System: Auto-corrections applied:
1205
+ if (confirmCorrections) {
1206
+ const correctionFeedback = `System: Your submitted code had errors and was auto-corrected:
1207
+ ${correctionMessages.join("\n")}
1208
+
1209
+ Corrected code:
1210
+ \`\`\`xml
1211
+ ${correctedCode}
1212
+ \`\`\`
1213
+
1214
+ If you resubmit this corrected code, I will execute it for you. Please review and resubmit the corrected code, or provide a different solution.`;
1215
+ dialogHistory.push({ role: "user", content: correctionFeedback });
1216
+ if (contextVar) {
1217
+ setVariable(session, contextVar, JSON.stringify(dialogHistory), true);
1218
+ } else if (saveDialog) {
1219
+ setVariable(session, "__llm_dialog__", JSON.stringify(dialogHistory), true);
1220
+ }
1221
+ console.error("[LLM] Corrections made - waiting for LLM confirmation (not executing yet)");
1222
+ if (isOpenAI) {
1223
+ const response = await llmClient.chat.completions.create({
1224
+ model,
1225
+ max_tokens: maxTokens,
1226
+ temperature,
1227
+ messages: dialogHistory
1228
+ });
1229
+ result = response.choices[0]?.message?.content || "";
1230
+ } else if (isOllama) {
1231
+ const ollamaPrompt = dialogHistory.map((m) => `${m.role.charAt(0).toUpperCase() + m.role.slice(1)}: ${m.content}`).join("\n");
1232
+ result = await llmClient.complete(ollamaPrompt, {
1233
+ model,
1234
+ temperature,
1235
+ max_tokens: maxTokens
1236
+ });
1237
+ } else if (isCustom) {
1238
+ const customPrompt = dialogHistory.map((m) => `${m.role}: ${m.content}`).join("\n");
1239
+ result = await llmClient.complete(customPrompt, {
1240
+ model,
1241
+ temperature,
1242
+ max_tokens: maxTokens,
1243
+ messages: dialogHistory
1244
+ });
1245
+ } else {
1246
+ result = await callAnthropic(llmClient, model, maxTokens, temperature, dialogHistory);
1247
+ }
1248
+ dialogHistory.push({ role: "assistant", content: result });
1249
+ if (contextVar) {
1250
+ setVariable(session, contextVar, JSON.stringify(dialogHistory), true);
1251
+ } else if (saveDialog) {
1252
+ setVariable(session, "__llm_dialog__", JSON.stringify(dialogHistory), true);
1253
+ }
1254
+ console.error(`[LLM] LLM confirmation response:
1255
+ ${result}
1256
+ `);
1257
+ continue;
1258
+ } else {
1259
+ const correctionFeedback = `System: Auto-corrections applied:
1205
1260
  ${correctionMessages.join("\n")}
1206
1261
 
1207
1262
  Actual code executed:
1208
1263
  \`\`\`xml
1209
1264
  ${correctedCode}
1210
1265
  \`\`\``;
1211
- dialogHistory.push({ role: "user", content: correctionFeedback });
1212
- if (contextVar) {
1213
- setVariable(session, contextVar, JSON.stringify(dialogHistory), true);
1214
- } else if (saveDialog) {
1215
- setVariable(session, "__llm_dialog__", JSON.stringify(dialogHistory), true);
1266
+ dialogHistory.push({ role: "user", content: correctionFeedback });
1267
+ if (contextVar) {
1268
+ setVariable(session, contextVar, JSON.stringify(dialogHistory), true);
1269
+ } else if (saveDialog) {
1270
+ setVariable(session, "__llm_dialog__", JSON.stringify(dialogHistory), true);
1271
+ }
1216
1272
  }
1217
1273
  }
1218
1274
  }
@@ -1871,7 +1927,7 @@ async function executeTagCheck(session, element) {
1871
1927
  const executeTag = correctedTag || tagName;
1872
1928
  console.error(`[tag-check] Executing <${executeTag}/> as all checks passed and execute=true.`);
1873
1929
  const elementToExecute = correctedTag ? { ...child, tag: correctedTag } : child;
1874
- const { integrate: integrate2 } = await import("./interpreter-QR2YWK6R.js");
1930
+ const { integrate: integrate2 } = await import("./interpreter-WNHDVVDD.js");
1875
1931
  await integrate2(session, elementToExecute);
1876
1932
  }
1877
1933
  }
@@ -1880,7 +1936,7 @@ async function executeTagCheck(session, element) {
1880
1936
  // src/tags/throw.ts
1881
1937
  async function executeThrow(session, element) {
1882
1938
  const exceptionName = element.attributes?.name || "exception";
1883
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
1939
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
1884
1940
  const exceptionDom = {
1885
1941
  tag: "exception-content",
1886
1942
  attributes: { name: exceptionName },
@@ -1893,7 +1949,7 @@ async function executeThrow(session, element) {
1893
1949
  // src/tags/try.ts
1894
1950
  async function executeTry(session, element) {
1895
1951
  setExceptionBoundary(session);
1896
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
1952
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
1897
1953
  await integrateChildren2(session, element);
1898
1954
  unsetExceptionBoundary(session);
1899
1955
  }
@@ -1903,7 +1959,7 @@ async function executeCatch(session, element) {
1903
1959
  const exceptionName = element.attributes?.name || "exception";
1904
1960
  const caughtCount = lookupException(session, exceptionName);
1905
1961
  if (caughtCount > 0) {
1906
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
1962
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
1907
1963
  await integrateChildren2(session, element);
1908
1964
  }
1909
1965
  flushCurrentException(session);
@@ -1912,7 +1968,7 @@ async function executeCatch(session, element) {
1912
1968
  // src/tags/exception.ts
1913
1969
  async function executeException(session, element) {
1914
1970
  const exceptions = getCurrentExceptions(session);
1915
- const { integrateChildren: integrateChildren2 } = await import("./interpreter-QR2YWK6R.js");
1971
+ const { integrateChildren: integrateChildren2 } = await import("./interpreter-WNHDVVDD.js");
1916
1972
  for (const exceptionDom of exceptions) {
1917
1973
  await integrateChildren2(session, exceptionDom);
1918
1974
  }
@@ -2113,7 +2169,7 @@ async function executeLoadContext(session, element) {
2113
2169
  query = element.text.trim();
2114
2170
  }
2115
2171
  if (!query && element.children.length > 0) {
2116
- const { integrate: integrate2 } = await import("./interpreter-QR2YWK6R.js");
2172
+ const { integrate: integrate2 } = await import("./interpreter-WNHDVVDD.js");
2117
2173
  const beforeOutput = session.output.length;
2118
2174
  for (const child of element.children) {
2119
2175
  await integrate2(session, child);
@@ -2957,7 +3013,7 @@ async function executeForeach(session, element) {
2957
3013
  const parser2 = new DiracParser2();
2958
3014
  try {
2959
3015
  const fromElement = parser2.parse(fromAttr);
2960
- const { integrate: integrate2 } = await import("./interpreter-QR2YWK6R.js");
3016
+ const { integrate: integrate2 } = await import("./interpreter-WNHDVVDD.js");
2961
3017
  await integrate2(session, fromElement);
2962
3018
  } catch (e) {
2963
3019
  session.output = savedOutput;
package/dist/cli.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  execute
4
- } from "./chunk-LHNUYXML.js";
4
+ } from "./chunk-LGFNVEHY.js";
5
5
  import {
6
6
  BraKetParser
7
- } from "./chunk-6CVWLZYL.js";
7
+ } from "./chunk-NUNYBLVJ.js";
8
8
  import "./chunk-ECAW4X46.js";
9
9
  import "./chunk-SLGJRZ3P.js";
10
10
  import "./chunk-HRHAMPOB.js";
@@ -16,7 +16,7 @@ import "dotenv/config";
16
16
  // package.json
17
17
  var package_default = {
18
18
  name: "dirac-lang",
19
- version: "0.1.94",
19
+ version: "0.1.95",
20
20
  description: "LLM-Augmented Declarative Execution",
21
21
  type: "module",
22
22
  main: "dist/index.js",
@@ -150,7 +150,7 @@ async function main() {
150
150
  const args = process.argv.slice(2);
151
151
  const calledAs = process.argv[1];
152
152
  if (calledAs && calledAs.endsWith("/dish")) {
153
- const { DiracShell } = await import("./shell-3FJRBNSJ.js");
153
+ const { DiracShell } = await import("./shell-N3TM23ZB.js");
154
154
  const shellConfig = loadShellConfig(args);
155
155
  const shell = new DiracShell(shellConfig);
156
156
  await shell.start();
@@ -199,11 +199,11 @@ async function main() {
199
199
  if (args[0] === "agent") {
200
200
  const subcommand = args[1];
201
201
  if (subcommand === "daemon") {
202
- const { runAgentDaemon } = await import("./agent-L6C3Z2YG.js");
202
+ const { runAgentDaemon } = await import("./agent-SVKTURXE.js");
203
203
  await runAgentDaemon();
204
204
  return;
205
205
  }
206
- const { AgentCLI } = await import("./agent-L6C3Z2YG.js");
206
+ const { AgentCLI } = await import("./agent-SVKTURXE.js");
207
207
  const agent = new AgentCLI();
208
208
  switch (subcommand) {
209
209
  case "start":
@@ -230,8 +230,8 @@ async function main() {
230
230
  return;
231
231
  }
232
232
  if (args[0] === "shell") {
233
- const { DiracShell } = await import("./shell-3FJRBNSJ.js");
234
- const { SessionServer, isSessionRunning, getSocketPath } = await import("./session-server-H6P4IXUF.js");
233
+ const { DiracShell } = await import("./shell-N3TM23ZB.js");
234
+ const { SessionServer, isSessionRunning, getSocketPath } = await import("./session-server-GPITH5QY.js");
235
235
  const { SessionClient } = await import("./session-client-3VTC5MLO.js");
236
236
  const daemonMode = args.includes("--daemon") || args.includes("-d");
237
237
  const agentMode = args.includes("--agent") || args.includes("-a");
@@ -277,7 +277,7 @@ async function main() {
277
277
  return;
278
278
  }
279
279
  if (args[0] === "daemon") {
280
- const { SessionServer } = await import("./session-server-H6P4IXUF.js");
280
+ const { SessionServer } = await import("./session-server-GPITH5QY.js");
281
281
  const server = new SessionServer();
282
282
  await server.start();
283
283
  console.log("Session daemon started");
@@ -3,7 +3,7 @@ import {
3
3
  listCronJobs,
4
4
  stopAllCronJobs,
5
5
  stopCronJob
6
- } from "./chunk-6CVWLZYL.js";
6
+ } from "./chunk-NUNYBLVJ.js";
7
7
  import "./chunk-ECAW4X46.js";
8
8
  import "./chunk-SLGJRZ3P.js";
9
9
  import "./chunk-HRHAMPOB.js";
package/dist/index.js CHANGED
@@ -2,10 +2,10 @@ import {
2
2
  createLLMAdapter,
3
3
  execute,
4
4
  executeUserCommand
5
- } from "./chunk-LHNUYXML.js";
5
+ } from "./chunk-LGFNVEHY.js";
6
6
  import {
7
7
  integrate
8
- } from "./chunk-6CVWLZYL.js";
8
+ } from "./chunk-NUNYBLVJ.js";
9
9
  import "./chunk-ECAW4X46.js";
10
10
  import "./chunk-SLGJRZ3P.js";
11
11
  import {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  integrate,
3
3
  integrateChildren
4
- } from "./chunk-6CVWLZYL.js";
4
+ } from "./chunk-NUNYBLVJ.js";
5
5
  import "./chunk-ECAW4X46.js";
6
6
  import "./chunk-SLGJRZ3P.js";
7
7
  import "./chunk-HRHAMPOB.js";
@@ -3,7 +3,7 @@ import {
3
3
  cancelScheduledRun,
4
4
  executeRunAt,
5
5
  listScheduledRuns
6
- } from "./chunk-6CVWLZYL.js";
6
+ } from "./chunk-NUNYBLVJ.js";
7
7
  import "./chunk-ECAW4X46.js";
8
8
  import "./chunk-SLGJRZ3P.js";
9
9
  import "./chunk-HRHAMPOB.js";
@@ -3,7 +3,7 @@ import {
3
3
  listScheduledTasks,
4
4
  stopAllScheduledTasks,
5
5
  stopScheduledTask
6
- } from "./chunk-6CVWLZYL.js";
6
+ } from "./chunk-NUNYBLVJ.js";
7
7
  import "./chunk-ECAW4X46.js";
8
8
  import "./chunk-SLGJRZ3P.js";
9
9
  import "./chunk-HRHAMPOB.js";
@@ -2,8 +2,8 @@ import {
2
2
  SessionServer,
3
3
  getSocketPath,
4
4
  isSessionRunning
5
- } from "./chunk-3MD2NFUM.js";
6
- import "./chunk-6CVWLZYL.js";
5
+ } from "./chunk-IFBJYN2F.js";
6
+ import "./chunk-NUNYBLVJ.js";
7
7
  import "./chunk-ECAW4X46.js";
8
8
  import "./chunk-SLGJRZ3P.js";
9
9
  import "./chunk-HRHAMPOB.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  BraKetParser,
4
4
  integrate
5
- } from "./chunk-6CVWLZYL.js";
5
+ } from "./chunk-NUNYBLVJ.js";
6
6
  import "./chunk-ECAW4X46.js";
7
7
  import "./chunk-SLGJRZ3P.js";
8
8
  import {
@@ -358,7 +358,7 @@ var DiracShell = class {
358
358
  if (this.client) {
359
359
  this.client.disconnect();
360
360
  }
361
- import("./schedule-5SRRRO6K.js").then(({ stopAllScheduledTasks }) => {
361
+ import("./schedule-JY54UROJ.js").then(({ stopAllScheduledTasks }) => {
362
362
  stopAllScheduledTasks();
363
363
  console.log("\nGoodbye!");
364
364
  process.exit(0);
@@ -542,7 +542,7 @@ Commands:
542
542
  :scheduled List all scheduled runs (run-at)
543
543
  :cancel <name> Cancel a scheduled run
544
544
  :cancelall Cancel all scheduled runs
545
- :save-training Save LLM dialog as training data (opens in editor)
545
+ :save-training [mode=full|pruned|both] Save LLM dialog as training data (opens in editor)
546
546
  :exit Exit shell
547
547
 
548
548
  Syntax:
@@ -763,7 +763,7 @@ Examples:
763
763
  break;
764
764
  case "tasks":
765
765
  try {
766
- const { listScheduledTasks } = await import("./schedule-5SRRRO6K.js");
766
+ const { listScheduledTasks } = await import("./schedule-JY54UROJ.js");
767
767
  const tasks = listScheduledTasks();
768
768
  if (tasks.length === 0) {
769
769
  console.log("No scheduled tasks running.");
@@ -782,7 +782,7 @@ Examples:
782
782
  console.log("Usage: :stop <task-name>");
783
783
  } else {
784
784
  try {
785
- const { stopScheduledTask } = await import("./schedule-5SRRRO6K.js");
785
+ const { stopScheduledTask } = await import("./schedule-JY54UROJ.js");
786
786
  const taskName = args[0];
787
787
  const stopped = stopScheduledTask(taskName);
788
788
  if (stopped) {
@@ -797,7 +797,7 @@ Examples:
797
797
  break;
798
798
  case "stopall":
799
799
  try {
800
- const { stopAllScheduledTasks } = await import("./schedule-5SRRRO6K.js");
800
+ const { stopAllScheduledTasks } = await import("./schedule-JY54UROJ.js");
801
801
  stopAllScheduledTasks();
802
802
  console.log("All scheduled tasks stopped.");
803
803
  } catch (error) {
@@ -806,7 +806,7 @@ Examples:
806
806
  break;
807
807
  case "crons":
808
808
  try {
809
- const { listCronJobs } = await import("./cron-CI4QNHTO.js");
809
+ const { listCronJobs } = await import("./cron-YIBSPTLT.js");
810
810
  const jobs = listCronJobs();
811
811
  if (jobs.length === 0) {
812
812
  console.log("No cron jobs running.");
@@ -826,7 +826,7 @@ Examples:
826
826
  console.log("Usage: :stopcron <job-name>");
827
827
  } else {
828
828
  try {
829
- const { stopCronJob } = await import("./cron-CI4QNHTO.js");
829
+ const { stopCronJob } = await import("./cron-YIBSPTLT.js");
830
830
  const jobName = args[0];
831
831
  const stopped = stopCronJob(jobName);
832
832
  if (stopped) {
@@ -841,7 +841,7 @@ Examples:
841
841
  break;
842
842
  case "stopallcrons":
843
843
  try {
844
- const { stopAllCronJobs } = await import("./cron-CI4QNHTO.js");
844
+ const { stopAllCronJobs } = await import("./cron-YIBSPTLT.js");
845
845
  stopAllCronJobs();
846
846
  console.log("All cron jobs stopped.");
847
847
  } catch (error) {
@@ -850,7 +850,7 @@ Examples:
850
850
  break;
851
851
  case "scheduled":
852
852
  try {
853
- const { listScheduledRuns } = await import("./run-at-IDE7KGHV.js");
853
+ const { listScheduledRuns } = await import("./run-at-H7RN6DOD.js");
854
854
  const runs = listScheduledRuns();
855
855
  if (runs.length === 0) {
856
856
  console.log("No scheduled runs pending.");
@@ -870,7 +870,7 @@ Examples:
870
870
  console.log("Usage: :cancel <run-name>");
871
871
  } else {
872
872
  try {
873
- const { cancelScheduledRun } = await import("./run-at-IDE7KGHV.js");
873
+ const { cancelScheduledRun } = await import("./run-at-H7RN6DOD.js");
874
874
  const runName = args[0];
875
875
  const cancelled = cancelScheduledRun(runName);
876
876
  if (cancelled) {
@@ -885,7 +885,7 @@ Examples:
885
885
  break;
886
886
  case "cancelall":
887
887
  try {
888
- const { cancelAllScheduledRuns } = await import("./run-at-IDE7KGHV.js");
888
+ const { cancelAllScheduledRuns } = await import("./run-at-H7RN6DOD.js");
889
889
  cancelAllScheduledRuns();
890
890
  console.log("All scheduled runs cancelled.");
891
891
  } catch (error) {
@@ -894,6 +894,21 @@ Examples:
894
894
  break;
895
895
  case "save-training":
896
896
  try {
897
+ const fullCommand = cmd.slice(1);
898
+ const saveArgs = fullCommand.split(/\s+/).slice(1);
899
+ let saveMode = "full";
900
+ console.error(`[DEBUG] Full command: "${fullCommand}"`);
901
+ console.error(`[DEBUG] Args:`, saveArgs);
902
+ for (const arg of saveArgs) {
903
+ if (arg.startsWith("mode=")) {
904
+ saveMode = arg.split("=")[1];
905
+ console.error(`[DEBUG] Set mode to: ${saveMode}`);
906
+ } else if (arg === "prune=true") {
907
+ saveMode = "pruned";
908
+ console.error(`[DEBUG] Set mode to pruned`);
909
+ }
910
+ }
911
+ console.error(`[DEBUG] Final saveMode: ${saveMode}`);
897
912
  const dialogVar = this.client ? (await this.client.getState()).variables.find((v) => v.name === "__llm_dialog__") : this.session.variables.find((v) => v.name === "__llm_dialog__");
898
913
  if (!dialogVar || !dialogVar.value) {
899
914
  console.log("No LLM dialog to save");
@@ -904,10 +919,64 @@ Examples:
904
919
  console.log("Dialog is empty");
905
920
  break;
906
921
  }
907
- const trainingExample = { messages: dialog };
922
+ const pruneCorrections = (msgs) => {
923
+ const pruned = [];
924
+ let skipNext = false;
925
+ let correctionCount = 0;
926
+ for (let i = 0; i < msgs.length; i++) {
927
+ const msg = msgs[i];
928
+ if (msg.role === "system") {
929
+ pruned.push(msg);
930
+ continue;
931
+ }
932
+ if (skipNext) {
933
+ skipNext = false;
934
+ continue;
935
+ }
936
+ if (msg.role === "user" && (msg.content.includes("System: Your submitted code had errors") || msg.content.includes("System: Auto-corrections applied"))) {
937
+ correctionCount++;
938
+ console.error(`[PRUNE] Found correction message at index ${i}`);
939
+ if (pruned.length > 0 && pruned[pruned.length - 1].role === "assistant") {
940
+ console.error(`[PRUNE] Removing wrong assistant response`);
941
+ pruned.pop();
942
+ }
943
+ if (i + 1 < msgs.length && msgs[i + 1].role === "assistant") {
944
+ console.error(`[PRUNE] Keeping corrected assistant response`);
945
+ pruned.push(msgs[i + 1]);
946
+ skipNext = true;
947
+ }
948
+ continue;
949
+ }
950
+ pruned.push(msg);
951
+ }
952
+ console.error(`[PRUNE] Processed ${msgs.length} messages, found ${correctionCount} corrections, result has ${pruned.length} messages`);
953
+ return pruned;
954
+ };
955
+ const fullExample = { messages: dialog };
956
+ const prunedExample = { messages: pruneCorrections(dialog) };
957
+ console.log(`
958
+ Mode: ${saveMode}`);
959
+ if (saveMode === "full" || saveMode === "both") {
960
+ console.log(`Full dialog: ${dialog.length} messages`);
961
+ }
962
+ if (saveMode === "pruned" || saveMode === "both") {
963
+ console.log(`Pruned dialog: ${prunedExample.messages.length} messages (removed ${dialog.length - prunedExample.messages.length} correction messages)`);
964
+ }
908
965
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").split("T")[0] + "-" + Date.now();
909
966
  const tempFile = path.join(os.tmpdir(), `dirac-training-${timestamp}.jsonl`);
910
- fs.writeFileSync(tempFile, JSON.stringify(trainingExample, null, 2), "utf-8");
967
+ let tempContent;
968
+ if (saveMode === "both") {
969
+ tempContent = `// FULL VERSION (with corrections)
970
+ ${JSON.stringify(fullExample, null, 2)}
971
+
972
+ // PRUNED VERSION (mistakes removed)
973
+ ${JSON.stringify(prunedExample, null, 2)}`;
974
+ } else if (saveMode === "pruned") {
975
+ tempContent = JSON.stringify(prunedExample, null, 2);
976
+ } else {
977
+ tempContent = JSON.stringify(fullExample, null, 2);
978
+ }
979
+ fs.writeFileSync(tempFile, tempContent, "utf-8");
911
980
  console.log("Opening in editor...");
912
981
  const editor = process.env.EDITOR || process.env.VISUAL || "vi";
913
982
  const { spawnSync } = await import("child_process");
@@ -944,10 +1013,40 @@ Examples:
944
1013
  savePath = path.join(trainingDir, answer.endsWith(".jsonl") ? answer : `${answer}.jsonl`);
945
1014
  }
946
1015
  const editedContent = fs.readFileSync(tempFile, "utf-8");
947
- const editedData = JSON.parse(editedContent);
948
- fs.appendFileSync(savePath, JSON.stringify(editedData) + "\n");
1016
+ if (saveMode === "both") {
1017
+ const lines = editedContent.split("\n");
1018
+ let fullJson = "";
1019
+ let prunedJson = "";
1020
+ let inFull = false;
1021
+ let inPruned = false;
1022
+ let braceCount = 0;
1023
+ for (const line of lines) {
1024
+ if (line.includes("// FULL VERSION")) {
1025
+ inFull = true;
1026
+ continue;
1027
+ }
1028
+ if (line.includes("// PRUNED VERSION")) {
1029
+ inFull = false;
1030
+ inPruned = true;
1031
+ continue;
1032
+ }
1033
+ if (inFull) {
1034
+ fullJson += line + "\n";
1035
+ } else if (inPruned) {
1036
+ prunedJson += line + "\n";
1037
+ }
1038
+ }
1039
+ const fullData = JSON.parse(fullJson.trim());
1040
+ const prunedData = JSON.parse(prunedJson.trim());
1041
+ fs.appendFileSync(savePath, JSON.stringify(fullData) + "\n");
1042
+ fs.appendFileSync(savePath, JSON.stringify(prunedData) + "\n");
1043
+ console.log(`\u2713 Saved 2 training examples (full + pruned) to ${savePath}`);
1044
+ } else {
1045
+ const editedData = JSON.parse(editedContent);
1046
+ fs.appendFileSync(savePath, JSON.stringify(editedData) + "\n");
1047
+ console.log(`\u2713 Saved training example (${saveMode}) to ${savePath}`);
1048
+ }
949
1049
  fs.unlinkSync(tempFile);
950
- console.log(`\u2713 Saved training example to ${savePath}`);
951
1050
  } catch (error) {
952
1051
  console.error("Error saving training data:", error instanceof Error ? error.message : String(error));
953
1052
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  integrate
3
- } from "./chunk-6CVWLZYL.js";
3
+ } from "./chunk-NUNYBLVJ.js";
4
4
  import "./chunk-ECAW4X46.js";
5
5
  import "./chunk-SLGJRZ3P.js";
6
6
  import {
package/lib/ai.di CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- <llm execute="true" save-dialog="true" show="boundary" feedback="true" validate="true" autocorrect="true">
35
+ <llm execute="true" save-dialog="true" show="boundary" feedback="true" validate="true" autocorrect="true" confirm-corrections="true">
36
36
 
37
37
 
38
38
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dirac-lang",
3
- "version": "0.1.94",
3
+ "version": "0.1.96",
4
4
  "description": "LLM-Augmented Declarative Execution",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",