boxsafe 1.0.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 (118) hide show
  1. package/.directory +2 -0
  2. package/.env.example +3 -0
  3. package/AUDIT_LANG.md +45 -0
  4. package/BOXSAFE_VERSION_NOTES.md +14 -0
  5. package/README.md +4 -0
  6. package/TODO.md +130 -0
  7. package/adapters/index.ts +27 -0
  8. package/adapters/primary/cli-adapter.ts +56 -0
  9. package/adapters/secondary/filesystem/node-filesystem.ts +307 -0
  10. package/adapters/secondary/system/configuration.ts +147 -0
  11. package/ai/caller.ts +42 -0
  12. package/ai/label.ts +33 -0
  13. package/ai/modelConfig.ts +236 -0
  14. package/ai/provider.ts +111 -0
  15. package/boxsafe.config.json +68 -0
  16. package/core/auth/dasktop/cred/CRED.md +112 -0
  17. package/core/auth/dasktop/cred/credLinux.ts +82 -0
  18. package/core/auth/dasktop/cred/credWin.ts +2 -0
  19. package/core/config/defaults/boxsafeDefaults.ts +67 -0
  20. package/core/config/defaults/index.ts +1 -0
  21. package/core/config/loadConfig.ts +133 -0
  22. package/core/loop/about.md +13 -0
  23. package/core/loop/boxConfig.ts +20 -0
  24. package/core/loop/buildExecCommand.ts +76 -0
  25. package/core/loop/cmd/execode.ts +121 -0
  26. package/core/loop/cmd/test.js +3 -0
  27. package/core/loop/execLoop.ts +341 -0
  28. package/core/loop/git/VERSIONING.md +17 -0
  29. package/core/loop/git/commands.ts +11 -0
  30. package/core/loop/git/gitClient.ts +78 -0
  31. package/core/loop/git/index.ts +99 -0
  32. package/core/loop/git/runVersionControlRunner.ts +33 -0
  33. package/core/loop/initNavigator.ts +44 -0
  34. package/core/loop/initTasksManager.ts +35 -0
  35. package/core/loop/runValidation.ts +25 -0
  36. package/core/loop/tasks/AGENT-TASKS.md +36 -0
  37. package/core/loop/tasks/index.ts +96 -0
  38. package/core/loop/toolCalls.ts +168 -0
  39. package/core/loop/toolDispatcher.ts +146 -0
  40. package/core/loop/traceLogger.ts +106 -0
  41. package/core/loop/types.ts +26 -0
  42. package/core/loop/versionControlAdapter.ts +36 -0
  43. package/core/loop/waterfall.ts +404 -0
  44. package/core/loop/writeArtifactAtomically.ts +13 -0
  45. package/core/navigate/NAVIGATE.md +186 -0
  46. package/core/navigate/about.md +128 -0
  47. package/core/navigate/examples.ts +367 -0
  48. package/core/navigate/handler.ts +148 -0
  49. package/core/navigate/index.ts +32 -0
  50. package/core/navigate/navigate.test.ts +372 -0
  51. package/core/navigate/navigator.ts +437 -0
  52. package/core/navigate/types.ts +132 -0
  53. package/core/navigate/utils.ts +146 -0
  54. package/core/paths/paths.ts +33 -0
  55. package/core/ports/index.ts +271 -0
  56. package/core/segments/CONVENTIONS.md +30 -0
  57. package/core/segments/loop/index.ts +18 -0
  58. package/core/segments/map.ts +56 -0
  59. package/core/segments/navigate/index.ts +20 -0
  60. package/core/segments/versionControl/index.ts +18 -0
  61. package/core/util/logger.ts +128 -0
  62. package/docs/AGENT-TASKS.md +36 -0
  63. package/docs/ARQUITETURA_CORRECAO.md +121 -0
  64. package/docs/CONVENTIONS.md +30 -0
  65. package/docs/CRED.md +112 -0
  66. package/docs/L_RAG.md +567 -0
  67. package/docs/NAVIGATE.md +186 -0
  68. package/docs/PRIMARY_ACTORS.md +78 -0
  69. package/docs/SECONDARY_ACTORS.md +174 -0
  70. package/docs/VERSIONING.md +17 -0
  71. package/docs/boxsafe.config.md +472 -0
  72. package/eslint.config.mts +15 -0
  73. package/main.ts +53 -0
  74. package/memo/generated/codelog.md +13 -0
  75. package/memo/state/tasks/state.json +6 -0
  76. package/memo/state/tasks/tasks/task_001.md +2 -0
  77. package/memo/states-logs/logs.txt +7 -0
  78. package/memo/states-logs/trace-mljvrxvi-9g0k4q.jsonl +11 -0
  79. package/memo/states-logs/trace-mljvvc9j-pe9ekj.jsonl +11 -0
  80. package/memo/states-logs/trace-mljvvm1c-wbnqzp.jsonl +11 -0
  81. package/memo/states-logs/trace-mljxecwn-9xh3nw.jsonl +11 -0
  82. package/memo/states-logs/trace-mljxqkfm-ipijik.jsonl +11 -0
  83. package/memo/states-logs/trace-mljxwtrw-3fanky.jsonl +11 -0
  84. package/memo/states-logs/trace-mljxzen3-m8iinh.jsonl +11 -0
  85. package/memo/states-logs/trace-mljyucef-td6odn.jsonl +11 -0
  86. package/memo/states-logs/trace-mljyuprw-b1a6f4.jsonl +11 -0
  87. package/memo/states-logs/trace-mljyvefl-b6yoce.jsonl +11 -0
  88. package/memo/states-logs/trace-mljyxjo4-n7ibj2.jsonl +13 -0
  89. package/memo/states-logs/trace-mljziez5-8drqtn.jsonl +13 -0
  90. package/memo/states-logs/trace-mljziulp-dtd03z.jsonl +13 -0
  91. package/memo/states-logs/trace-mljzjwrq-1p2krb.jsonl +13 -0
  92. package/memo/states-logs/trace-mljzl0i7-b1cqa6.jsonl +13 -0
  93. package/memo/states-logs/trace-mljzmlk6-7kdyls.jsonl +13 -0
  94. package/memo/states-logs/trace-mlk0oj25-xa3dcu.jsonl +13 -0
  95. package/memo/states-logs/trace-mlk1x59q-713huj.jsonl +14 -0
  96. package/memo/states-logs/trace-mlk22dz8-7fd6hq.jsonl +14 -0
  97. package/memo/states-logs/trace-mlk241uy-wmx907.jsonl +14 -0
  98. package/memo/states-logs/trace-mlk2bf5r-yoh1vg.jsonl +15 -0
  99. package/package.json +44 -0
  100. package/pnpm-workspace.yaml +4 -0
  101. package/prompt_improvement_example.md +55 -0
  102. package/remove.txt +1 -0
  103. package/tests/adapters.test.ts +128 -0
  104. package/tests/extractCode.test.ts +26 -0
  105. package/tests/integration.test.ts +83 -0
  106. package/tests/loadConfig.test.ts +25 -0
  107. package/tests/navigatorBoundary.test.ts +17 -0
  108. package/tests/ports.test.ts +84 -0
  109. package/tests/runAllTests.ts +49 -0
  110. package/tests/toolCalls.test.ts +149 -0
  111. package/tests/waterfall.test.ts +52 -0
  112. package/tsconfig.json +32 -0
  113. package/tsup.config.ts +17 -0
  114. package/types.d.ts +96 -0
  115. package/util/ANSI.ts +29 -0
  116. package/util/extractCode.ts +217 -0
  117. package/util/extractToolCalls.ts +80 -0
  118. package/util/logger.ts +125 -0
@@ -0,0 +1,11 @@
1
+ {"ts":"2026-02-12T20:59:35.779Z","runId":"mljxzen3-m8iinh","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T20:59:35.781Z","runId":"mljxzen3-m8iinh","event":"versionControl.before.start"}
3
+ {"ts":"2026-02-12T20:59:35.850Z","runId":"mljxzen3-m8iinh","event":"versionControl.before.ok","data":{"result":{"committed":true,"pushed":false}}}
4
+ {"ts":"2026-02-12T20:59:35.853Z","runId":"mljxzen3-m8iinh","iter":1,"event":"iteration.start"}
5
+ {"ts":"2026-02-12T20:59:35.854Z","runId":"mljxzen3-m8iinh","iter":1,"event":"llm.run.start"}
6
+ {"ts":"2026-02-12T20:59:35.916Z","runId":"mljxzen3-m8iinh","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":1}}
7
+ {"ts":"2026-02-12T20:59:36.117Z","runId":"mljxzen3-m8iinh","iter":1,"event":"llm.run.start"}
8
+ {"ts":"2026-02-12T20:59:36.119Z","runId":"mljxzen3-m8iinh","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":2}}
9
+ {"ts":"2026-02-12T20:59:36.520Z","runId":"mljxzen3-m8iinh","iter":1,"event":"llm.run.start"}
10
+ {"ts":"2026-02-12T20:59:36.521Z","runId":"mljxzen3-m8iinh","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":3}}
11
+ {"ts":"2026-02-12T20:59:36.521Z","runId":"mljxzen3-m8iinh","iter":1,"event":"iteration.failed","data":{"layer":"llm"}}
@@ -0,0 +1,11 @@
1
+ {"ts":"2026-02-12T21:23:39.211Z","runId":"mljyucef-td6odn","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:23:39.213Z","runId":"mljyucef-td6odn","event":"versionControl.before.start"}
3
+ {"ts":"2026-02-12T21:23:39.285Z","runId":"mljyucef-td6odn","event":"versionControl.before.ok","data":{"result":{"committed":true,"pushed":false}}}
4
+ {"ts":"2026-02-12T21:23:39.288Z","runId":"mljyucef-td6odn","iter":1,"event":"iteration.start"}
5
+ {"ts":"2026-02-12T21:23:39.288Z","runId":"mljyucef-td6odn","iter":1,"event":"llm.run.start"}
6
+ {"ts":"2026-02-12T21:23:39.356Z","runId":"mljyucef-td6odn","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":1}}
7
+ {"ts":"2026-02-12T21:23:39.557Z","runId":"mljyucef-td6odn","iter":1,"event":"llm.run.start"}
8
+ {"ts":"2026-02-12T21:23:39.558Z","runId":"mljyucef-td6odn","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":2}}
9
+ {"ts":"2026-02-12T21:23:39.959Z","runId":"mljyucef-td6odn","iter":1,"event":"llm.run.start"}
10
+ {"ts":"2026-02-12T21:23:39.961Z","runId":"mljyucef-td6odn","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":3}}
11
+ {"ts":"2026-02-12T21:23:39.961Z","runId":"mljyucef-td6odn","iter":1,"event":"iteration.failed","data":{"layer":"llm"}}
@@ -0,0 +1,11 @@
1
+ {"ts":"2026-02-12T21:23:56.544Z","runId":"mljyuprw-b1a6f4","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:23:56.546Z","runId":"mljyuprw-b1a6f4","event":"versionControl.before.start"}
3
+ {"ts":"2026-02-12T21:23:56.616Z","runId":"mljyuprw-b1a6f4","event":"versionControl.before.ok","data":{"result":{"committed":true,"pushed":false}}}
4
+ {"ts":"2026-02-12T21:23:56.618Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"iteration.start"}
5
+ {"ts":"2026-02-12T21:23:56.618Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"llm.run.start"}
6
+ {"ts":"2026-02-12T21:23:56.685Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":1}}
7
+ {"ts":"2026-02-12T21:23:56.885Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"llm.run.start"}
8
+ {"ts":"2026-02-12T21:23:56.887Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":2}}
9
+ {"ts":"2026-02-12T21:23:57.288Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"llm.run.start"}
10
+ {"ts":"2026-02-12T21:23:57.289Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":3}}
11
+ {"ts":"2026-02-12T21:23:57.290Z","runId":"mljyuprw-b1a6f4","iter":1,"event":"iteration.failed","data":{"layer":"llm"}}
@@ -0,0 +1,11 @@
1
+ {"ts":"2026-02-12T21:24:28.504Z","runId":"mljyvefl-b6yoce","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:24:28.506Z","runId":"mljyvefl-b6yoce","event":"versionControl.before.start"}
3
+ {"ts":"2026-02-12T21:24:28.577Z","runId":"mljyvefl-b6yoce","event":"versionControl.before.ok","data":{"result":{"committed":true,"pushed":false}}}
4
+ {"ts":"2026-02-12T21:24:28.580Z","runId":"mljyvefl-b6yoce","iter":1,"event":"iteration.start"}
5
+ {"ts":"2026-02-12T21:24:28.580Z","runId":"mljyvefl-b6yoce","iter":1,"event":"llm.run.start"}
6
+ {"ts":"2026-02-12T21:24:28.657Z","runId":"mljyvefl-b6yoce","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":1}}
7
+ {"ts":"2026-02-12T21:24:28.860Z","runId":"mljyvefl-b6yoce","iter":1,"event":"llm.run.start"}
8
+ {"ts":"2026-02-12T21:24:28.861Z","runId":"mljyvefl-b6yoce","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":2}}
9
+ {"ts":"2026-02-12T21:24:29.261Z","runId":"mljyvefl-b6yoce","iter":1,"event":"llm.run.start"}
10
+ {"ts":"2026-02-12T21:24:29.263Z","runId":"mljyvefl-b6yoce","iter":1,"event":"llm.run.error","data":{"error":"Google Generative AI API key is missing. Pass it using the 'apiKey' parameter or the GOOGLE_GENERATIVE_AI_API_KEY environment variable.","attempt":3}}
11
+ {"ts":"2026-02-12T21:24:29.263Z","runId":"mljyvefl-b6yoce","iter":1,"event":"iteration.failed","data":{"layer":"llm"}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T21:26:08.601Z","runId":"mljyxjo4-n7ibj2","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:26:08.604Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T21:26:08.604Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T21:26:09.962Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T21:26:09.963Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":142}}
6
+ {"ts":"2026-02-12T21:26:09.972Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T21:26:09.973Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T21:26:09.974Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
9
+ {"ts":"2026-02-12T21:26:09.975Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T21:26:10.326Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T21:26:10.327Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T21:26:10.329Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T21:26:10.329Z","runId":"mljyxjo4-n7ibj2","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T21:42:22.292Z","runId":"mljziez5-8drqtn","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:42:22.294Z","runId":"mljziez5-8drqtn","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T21:42:22.294Z","runId":"mljziez5-8drqtn","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T21:42:23.574Z","runId":"mljziez5-8drqtn","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T21:42:23.574Z","runId":"mljziez5-8drqtn","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T21:42:23.585Z","runId":"mljziez5-8drqtn","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T21:42:23.585Z","runId":"mljziez5-8drqtn","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T21:42:23.586Z","runId":"mljziez5-8drqtn","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
9
+ {"ts":"2026-02-12T21:42:23.587Z","runId":"mljziez5-8drqtn","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T21:42:23.901Z","runId":"mljziez5-8drqtn","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T21:42:23.901Z","runId":"mljziez5-8drqtn","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T21:42:23.904Z","runId":"mljziez5-8drqtn","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T21:42:23.904Z","runId":"mljziez5-8drqtn","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T21:42:42.546Z","runId":"mljziulp-dtd03z","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:42:42.548Z","runId":"mljziulp-dtd03z","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T21:42:42.549Z","runId":"mljziulp-dtd03z","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T21:42:43.860Z","runId":"mljziulp-dtd03z","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T21:42:43.861Z","runId":"mljziulp-dtd03z","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T21:42:43.874Z","runId":"mljziulp-dtd03z","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T21:42:43.878Z","runId":"mljziulp-dtd03z","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T21:42:43.878Z","runId":"mljziulp-dtd03z","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
9
+ {"ts":"2026-02-12T21:42:43.879Z","runId":"mljziulp-dtd03z","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T21:42:44.158Z","runId":"mljziulp-dtd03z","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T21:42:44.159Z","runId":"mljziulp-dtd03z","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T21:42:44.161Z","runId":"mljziulp-dtd03z","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T21:42:44.161Z","runId":"mljziulp-dtd03z","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T21:43:32.010Z","runId":"mljzjwrq-1p2krb","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:43:32.014Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T21:43:32.014Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T21:43:33.522Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T21:43:33.523Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":204}}
6
+ {"ts":"2026-02-12T21:43:33.537Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T21:43:33.540Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T21:43:33.541Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":41}}
9
+ {"ts":"2026-02-12T21:43:33.542Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T21:43:33.839Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T21:43:33.840Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T21:43:33.842Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T21:43:33.842Z","runId":"mljzjwrq-1p2krb","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T21:44:23.507Z","runId":"mljzl0i7-b1cqa6","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:44:23.511Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T21:44:23.511Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T21:44:24.710Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T21:44:24.711Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T21:44:24.719Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T21:44:24.720Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T21:44:24.722Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
9
+ {"ts":"2026-02-12T21:44:24.722Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T21:44:25.003Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T21:44:25.003Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T21:44:25.005Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T21:44:25.006Z","runId":"mljzl0i7-b1cqa6","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T21:45:37.450Z","runId":"mljzmlk6-7kdyls","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T21:45:37.453Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T21:45:37.454Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T21:45:38.588Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T21:45:38.589Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T21:45:38.599Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T21:45:38.600Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T21:45:38.601Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
9
+ {"ts":"2026-02-12T21:45:38.602Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T21:45:38.882Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T21:45:38.883Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T21:45:38.885Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T21:45:38.885Z","runId":"mljzmlk6-7kdyls","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,13 @@
1
+ {"ts":"2026-02-12T22:15:07.135Z","runId":"mlk0oj25-xa3dcu","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T22:15:07.137Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T22:15:07.137Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T22:15:08.321Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T22:15:08.322Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T22:15:08.327Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T22:15:08.328Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":0}}
8
+ {"ts":"2026-02-12T22:15:08.328Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
9
+ {"ts":"2026-02-12T22:15:08.329Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
10
+ {"ts":"2026-02-12T22:15:08.537Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"exec.ok","data":{"exitCode":0}}
11
+ {"ts":"2026-02-12T22:15:08.538Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"validation.start"}
12
+ {"ts":"2026-02-12T22:15:08.539Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
13
+ {"ts":"2026-02-12T22:15:08.539Z","runId":"mlk0oj25-xa3dcu","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,14 @@
1
+ {"ts":"2026-02-12T22:49:48.785Z","runId":"mlk1x59q-713huj","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T22:49:48.788Z","runId":"mlk1x59q-713huj","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T22:49:48.788Z","runId":"mlk1x59q-713huj","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T22:49:49.934Z","runId":"mlk1x59q-713huj","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T22:49:49.934Z","runId":"mlk1x59q-713huj","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T22:49:49.942Z","runId":"mlk1x59q-713huj","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T22:49:49.945Z","runId":"mlk1x59q-713huj","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":1}}
8
+ {"ts":"2026-02-12T22:49:49.946Z","runId":"mlk1x59q-713huj","iter":1,"event":"toolcall.invalid","data":{"error":"navigate.op=write requires params.content"}}
9
+ {"ts":"2026-02-12T22:49:49.947Z","runId":"mlk1x59q-713huj","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
10
+ {"ts":"2026-02-12T22:49:49.947Z","runId":"mlk1x59q-713huj","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
11
+ {"ts":"2026-02-12T22:49:50.176Z","runId":"mlk1x59q-713huj","iter":1,"event":"exec.ok","data":{"exitCode":0}}
12
+ {"ts":"2026-02-12T22:49:50.177Z","runId":"mlk1x59q-713huj","iter":1,"event":"validation.start"}
13
+ {"ts":"2026-02-12T22:49:50.178Z","runId":"mlk1x59q-713huj","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
14
+ {"ts":"2026-02-12T22:49:50.178Z","runId":"mlk1x59q-713huj","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,14 @@
1
+ {"ts":"2026-02-12T22:53:53.351Z","runId":"mlk22dz8-7fd6hq","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T22:53:53.354Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T22:53:53.355Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T22:53:54.654Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T22:53:54.654Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":124}}
6
+ {"ts":"2026-02-12T22:53:54.662Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T22:53:54.663Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":1}}
8
+ {"ts":"2026-02-12T22:53:54.664Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"toolcall.invalid","data":{"error":"navigate.op=write requires params.content"}}
9
+ {"ts":"2026-02-12T22:53:54.665Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
10
+ {"ts":"2026-02-12T22:53:54.665Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
11
+ {"ts":"2026-02-12T22:53:54.894Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"exec.ok","data":{"exitCode":0}}
12
+ {"ts":"2026-02-12T22:53:54.895Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"validation.start"}
13
+ {"ts":"2026-02-12T22:53:54.896Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
14
+ {"ts":"2026-02-12T22:53:54.896Z","runId":"mlk22dz8-7fd6hq","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,14 @@
1
+ {"ts":"2026-02-12T22:55:10.956Z","runId":"mlk241uy-wmx907","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T22:55:10.961Z","runId":"mlk241uy-wmx907","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T22:55:10.961Z","runId":"mlk241uy-wmx907","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T22:55:13.085Z","runId":"mlk241uy-wmx907","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T22:55:13.086Z","runId":"mlk241uy-wmx907","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":142}}
6
+ {"ts":"2026-02-12T22:55:13.092Z","runId":"mlk241uy-wmx907","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T22:55:13.093Z","runId":"mlk241uy-wmx907","iter":1,"event":"toolcalls.parsed","data":{"calls":0,"errors":1}}
8
+ {"ts":"2026-02-12T22:55:13.094Z","runId":"mlk241uy-wmx907","iter":1,"event":"toolcall.invalid","data":{"error":"navigate.op=write requires params.content"}}
9
+ {"ts":"2026-02-12T22:55:13.095Z","runId":"mlk241uy-wmx907","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
10
+ {"ts":"2026-02-12T22:55:13.095Z","runId":"mlk241uy-wmx907","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
11
+ {"ts":"2026-02-12T22:55:13.337Z","runId":"mlk241uy-wmx907","iter":1,"event":"exec.ok","data":{"exitCode":0}}
12
+ {"ts":"2026-02-12T22:55:13.337Z","runId":"mlk241uy-wmx907","iter":1,"event":"validation.start"}
13
+ {"ts":"2026-02-12T22:55:13.339Z","runId":"mlk241uy-wmx907","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
14
+ {"ts":"2026-02-12T22:55:13.339Z","runId":"mlk241uy-wmx907","iter":1,"event":"iteration.success","data":{"score":70}}
@@ -0,0 +1,15 @@
1
+ {"ts":"2026-02-12T23:00:54.786Z","runId":"mlk2bf5r-yoh1vg","event":"loop.start","data":{"service":"google","model":"gemini-2.5-flash","lang":"ts","maxIterations":1}}
2
+ {"ts":"2026-02-12T23:00:54.788Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"iteration.start"}
3
+ {"ts":"2026-02-12T23:00:54.789Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"llm.run.start"}
4
+ {"ts":"2026-02-12T23:00:56.178Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"llm.run.ok","data":{"outputPath":"./memo/generated/codelog.md"}}
5
+ {"ts":"2026-02-12T23:00:56.179Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"markdown.read.ok","data":{"path":"./memo/generated/codelog.md","bytes":190}}
6
+ {"ts":"2026-02-12T23:00:56.186Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"extractCode.ok","data":{"blocks":1,"lang":"ts"}}
7
+ {"ts":"2026-02-12T23:00:56.188Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"toolcalls.parsed","data":{"calls":1,"errors":0}}
8
+ {"ts":"2026-02-12T23:00:56.189Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"toolcall.detected","data":{"tool":"navigate"}}
9
+ {"ts":"2026-02-12T23:00:56.189Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"toolcall.navigate.result","data":{"op":"write","ok":true}}
10
+ {"ts":"2026-02-12T23:00:56.190Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"artifact.write.ok","data":{"path":"./out.ts","bytes":27}}
11
+ {"ts":"2026-02-12T23:00:56.190Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"exec.start","data":{"cmd":"tsx"}}
12
+ {"ts":"2026-02-12T23:00:56.381Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"exec.ok","data":{"exitCode":0}}
13
+ {"ts":"2026-02-12T23:00:56.382Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"validation.start"}
14
+ {"ts":"2026-02-12T23:00:56.383Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"validation.ok","data":{"ok":true,"score":70}}
15
+ {"ts":"2026-02-12T23:00:56.383Z","runId":"mlk2bf5r-yoh1vg","iter":1,"event":"iteration.success","data":{"score":70}}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "boxsafe",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "",
6
+ "main": "index.js",
7
+ "scripts": {
8
+ "test": "tsx ./tests/runAllTests.ts",
9
+ "build": "tsup",
10
+ "dev": "tsup --watch",
11
+ "start": "node -r tsconfig-paths/register dist/index.js"
12
+ },
13
+ "keywords": [],
14
+ "author": "",
15
+ "license": "ISC",
16
+ "packageManager": "pnpm@10.28.0",
17
+ "devDependencies": {
18
+ "@eslint/js": "^9.39.2",
19
+ "@types/node": "^25.2.0",
20
+ "eslint": "^9.39.2",
21
+ "globals": "^17.3.0",
22
+ "jiti": "^2.6.1",
23
+ "tsconfig-paths": "^4.2.0",
24
+ "tsup": "^8.5.1",
25
+ "tsx": "^4.21.0",
26
+ "typescript": "^5.9.3",
27
+ "typescript-eslint": "^8.54.0"
28
+ },
29
+ "dependencies": {
30
+ "@ai-sdk/anthropic": "^3.0.35",
31
+ "@ai-sdk/gateway": "^3.0.32",
32
+ "@ai-sdk/google": "^3.0.20",
33
+ "@ai-sdk/openai": "^3.0.25",
34
+ "@qdrant/js-client-rest": "^1.16.2",
35
+ "ai": "^6.0.68",
36
+ "dotenv": "^17.2.3",
37
+ "keytar": "^7.9.0",
38
+ "remark": "^15.0.1",
39
+ "remark-parse": "^11.0.0",
40
+ "remark-stringify": "^11.0.0",
41
+ "unified": "^11.0.5",
42
+ "unist-util-visit": "^5.1.0"
43
+ }
44
+ }
@@ -0,0 +1,4 @@
1
+ ignoredBuiltDependencies:
2
+ - esbuild
3
+ - keytar
4
+ - protobufjs
@@ -0,0 +1,55 @@
1
+ # Improved Prompt Example - BoxSafe
2
+
3
+ ## Current Prompt (PROBLEMATIC):
4
+ ```typescript
5
+ const promptToSend = `${feedback}\n\nYou may optionally emit tool calls as JSON fenced blocks (\`\`\`json-tool ...\`\`\`) BEFORE the final code block. If you do, set tool=\"navigate\" and params.op=\"write\" to create files. Then, ALWAYS end your response with exactly ONE code block in the language: ${lang}`;
6
+ ```
7
+
8
+ ## Improved Prompt (COMPLETE):
9
+
10
+ ```typescript
11
+ const promptToSend = `${feedback}\n\nYou may optionally emit tool calls as JSON fenced blocks (\`\`\`json-tool ...\`\`\`) BEFORE the final code block.
12
+
13
+ ## Tool Calls Available:
14
+
15
+ ### File Operations (tool="navigate"):
16
+ - **Read file**: \`{"tool": "navigate", "params": {"op": "read", "path": "path/to/file"}}\`
17
+ - **Write file**: \`{"tool": "navigate", "params": {"op": "write", "path": "path/to/file", "content": "file content here"}}\`
18
+ - **Create directory**: \`{"tool": "navigate", "params": {"op": "mkdir", "path": "path/to/dir"}}\`
19
+ - **Delete**: \`{"tool": "navigate", "params": {"op": "delete", "path": "path/to/file"}}\`
20
+ - **List directory**: \`{"tool": "navigate", "params": {"op": "list", "path": "path/to/dir"}}\`
21
+
22
+ ### Version Control (tool="versionControl"):
23
+ - \`{"tool": "versionControl", "params": {"autoPush": true}}\`
24
+
25
+ ## Complete Example:
26
+ \`\`\`json-tool
27
+ {"tool": "navigate", "params": {"op": "write", "path": "example.ts", "content": "console.log('Hello World');"}}
28
+ \`\`\`
29
+
30
+ \`\`\`ts
31
+ // Regular code block continues here
32
+ export const x = 1;
33
+ \`\`\`
34
+
35
+ IMPORTANT: Always end your response with exactly ONE code block in the language: ${lang}`;
36
+ ```
37
+
38
+ ## Key Differences:
39
+
40
+ 1. ✅ **Complete Example**: Shows all parameters including `content`
41
+ 2. ✅ **Documentation**: Lists all available operations
42
+ 3. ✅ **Context**: Explains what each parameter does
43
+ 4. ✅ **Example**: Demonstrates real usage format
44
+ 5. ✅ **Structure**: Organized and easy to understand
45
+
46
+ ## Expected Result:
47
+ With this improved prompt, the agent would generate:
48
+ ```json
49
+ {"tool": "navigate", "params": {"op": "write", "path": "lv_test.ts", "content": "console.log('hello world');"}}
50
+ ```
51
+
52
+ Instead of the current (incomplete):
53
+ ```json
54
+ {"tool": "navigate", "params": {"op": "write", "path": "lv_test.ts"}}
55
+ ```
package/remove.txt ADDED
@@ -0,0 +1 @@
1
+ tsx
@@ -0,0 +1,128 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from './runAllTests';
3
+ import { SystemConfigurationAdapter } from '@adapters/secondary/system/configuration';
4
+ import { FileSystemAdapter } from '@adapters/secondary/filesystem/node-filesystem';
5
+ import { CLIAdapter } from '@adapters/primary/cli-adapter';
6
+ import type { NavigatorConfig } from '@core/navigate/types';
7
+
8
+ test('SystemConfigurationAdapter: loads configuration correctly', async () => {
9
+ const adapter = new SystemConfigurationAdapter();
10
+ const result = await adapter.loadConfiguration();
11
+
12
+ assert.ok(result.config);
13
+ assert.equal(typeof result.source.loaded, 'boolean');
14
+ assert.ok(result.source.path);
15
+ });
16
+
17
+ test('SystemConfigurationAdapter: validates configuration', async () => {
18
+ const adapter = new SystemConfigurationAdapter();
19
+ const result = await adapter.validateConfiguration({
20
+ project: { workspace: '/tmp' },
21
+ model: { primary: { provider: 'google', name: 'gemini' } },
22
+ commands: { run: 'echo test' },
23
+ interface: { prompt: 'test prompt' },
24
+ limits: { loops: 3 }
25
+ });
26
+
27
+ assert.equal(result.valid, true);
28
+ assert.equal(result.errors.length, 0);
29
+ });
30
+
31
+ test('SystemConfigurationAdapter: fails validation with missing required fields', async () => {
32
+ const adapter = new SystemConfigurationAdapter();
33
+ const result = await adapter.validateConfiguration({
34
+ // Missing required fields
35
+ });
36
+
37
+ assert.equal(result.valid, false);
38
+ assert.ok(result.errors.length > 0);
39
+ assert.ok(result.errors.some(e => e.includes('project.workspace is required')));
40
+ });
41
+
42
+ test('FileSystemAdapter: initializes with config', async () => {
43
+ const config: NavigatorConfig = {
44
+ workspace: '/tmp',
45
+ followSymlinks: false,
46
+ maxFileSize: 1024 * 1024
47
+ };
48
+
49
+ const adapter = new FileSystemAdapter(config);
50
+ assert.equal(adapter['workspace'], '/tmp');
51
+ assert.equal(adapter['followSymlinks'], false);
52
+ assert.equal(adapter['maxFileSize'], 1024 * 1024);
53
+ });
54
+
55
+ test('FileSystemAdapter: lists directory', async () => {
56
+ const config: NavigatorConfig = {
57
+ workspace: '/tmp',
58
+ followSymlinks: false,
59
+ maxFileSize: 1024 * 1024
60
+ };
61
+
62
+ const adapter = new FileSystemAdapter(config);
63
+ const result = await adapter.listDirectory('.');
64
+
65
+ assert.ok(result.ok);
66
+ assert.ok((result as any).path);
67
+ assert.ok(Array.isArray((result as any).entries));
68
+ });
69
+
70
+ test('FileSystemAdapter: rejects paths outside workspace', async () => {
71
+ const config: NavigatorConfig = {
72
+ workspace: '/tmp',
73
+ followSymlinks: false,
74
+ maxFileSize: 1024 * 1024
75
+ };
76
+
77
+ const adapter = new FileSystemAdapter(config);
78
+
79
+ try {
80
+ await adapter.readFile('../../../etc/passwd');
81
+ assert.fail('Should have thrown an error for path outside workspace');
82
+ } catch (error) {
83
+ assert.ok(error instanceof Error);
84
+ // Check for either message (different implementations might use different messages)
85
+ const message = error.message;
86
+ const isSecurityError = message.includes('outside workspace') ||
87
+ message.includes('Access denied') ||
88
+ message.includes('boundary');
89
+ assert.ok(isSecurityError, `Expected security error message, got: ${message}`);
90
+ }
91
+ });
92
+
93
+ test('CLIAdapter: initializes and lists segments', async () => {
94
+ const adapter = new CLIAdapter();
95
+
96
+ // Wait a bit for initialization
97
+ await new Promise(resolve => setTimeout(resolve, 100));
98
+
99
+ const segments = adapter.listSegments();
100
+ assert.ok(segments.loop);
101
+ assert.ok(segments.navigate);
102
+ assert.ok(segments.versionControl);
103
+
104
+ assert.equal(segments.loop.implemented, true);
105
+ assert.equal(segments.navigate.implemented, true);
106
+ assert.equal(segments.versionControl.implemented, true);
107
+ });
108
+
109
+ test('CLIAdapter: executes segments', async () => {
110
+ const adapter = new CLIAdapter();
111
+
112
+ // Wait a bit for initialization
113
+ await new Promise(resolve => setTimeout(resolve, 100));
114
+
115
+ try {
116
+ // Test navigate segment with a simple operation
117
+ const result = await adapter.executeSegment('navigate', {
118
+ operation: 'listDirectory',
119
+ path: '.'
120
+ });
121
+
122
+ // Should return a valid result structure
123
+ assert.ok(result !== undefined);
124
+ } catch (error) {
125
+ // Expected - navigate might need more setup, but adapter should not crash
126
+ assert.ok(error instanceof Error);
127
+ }
128
+ });
@@ -0,0 +1,26 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from './runAllTests';
3
+ import { extractCode } from '@/util/extractCode';
4
+
5
+ test('extractCode: extracts explicit ts fenced block', async () => {
6
+ const md = 'before\n\n```ts\nconsole.log("ok");\n```\n\nafter';
7
+ const res = await extractCode(md, 'ts', { throwOnNotFound: true });
8
+ assert.deepEqual(res, ['console.log("ok");']);
9
+ });
10
+
11
+ test('extractCode: uses alias typescript for ts fences', async () => {
12
+ const md = '```typescript\nexport const x = 1;\n```';
13
+ const res = await extractCode(md, 'ts', { throwOnNotFound: true });
14
+ assert.deepEqual(res, ['export const x = 1;']);
15
+ });
16
+
17
+ test('extractCode: heuristic detects ts when fence has no language', async () => {
18
+ const md = '```\ninterface A { x: number }\n```';
19
+ const res = await extractCode(md, 'ts', { throwOnNotFound: true });
20
+ assert.deepEqual(res, ['interface A { x: number }']);
21
+ });
22
+
23
+ test('extractCode: throwOnNotFound throws when no code present', async () => {
24
+ const md = 'hello world';
25
+ await assert.rejects(() => extractCode(md, 'ts', { throwOnNotFound: true }));
26
+ });
@@ -0,0 +1,83 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from './runAllTests';
3
+ import { parseToolCallsFromMarkdown } from '@/core/loop/toolCalls';
4
+
5
+ test('integration: end-to-end json-tool parsing validation', async () => {
6
+ // Test the exact scenario from the real problem
7
+ const realWorldMarkdown = '```json-tool\n{"tool": "navigate", "params": {"op": "write", "path": "lv_test.ts"}}\n```\n```ts\nconsole.log("hello world");\n```';
8
+
9
+ const result = parseToolCallsFromMarkdown(realWorldMarkdown);
10
+
11
+ // Should detect the json-tool but report error due to missing content
12
+ assert.equal(result.ok, true);
13
+ assert.equal(result.calls.length, 0, 'Should have no valid calls due to missing content');
14
+ assert.equal(result.errors.length, 1, 'Should have one error for incomplete json-tool');
15
+
16
+ const error = result.errors[0];
17
+ if (!error) throw new Error('Error should be defined');
18
+ assert.equal(error.ok, false);
19
+ assert.match(error.error, /navigate\.op=write requires params\.content/);
20
+ assert.match(error.fence, /lv_test\.ts/);
21
+ });
22
+
23
+ test('integration: complete valid json-tool workflow', async () => {
24
+ // Test with a complete, valid json-tool
25
+ const validMarkdown = '```json-tool\n{"tool": "navigate", "params": {"op": "write", "path": "test.ts", "content": "console.log(\\"hello\\");"}}\n```\n```ts\nconsole.log("regular code");\n```';
26
+
27
+ const result = parseToolCallsFromMarkdown(validMarkdown);
28
+
29
+ // Should successfully parse the valid json-tool
30
+ assert.equal(result.ok, true);
31
+ assert.equal(result.calls.length, 1, 'Should have one valid call');
32
+ assert.equal(result.errors.length, 0, 'Should have no errors');
33
+
34
+ const call = result.calls[0];
35
+ if (!call) throw new Error('Call should be defined');
36
+ assert.equal(call.tool, 'navigate');
37
+ assert.equal(call.params.op, 'write');
38
+ assert.equal(call.params.path, 'test.ts');
39
+ assert.equal(call.params.content, 'console.log("hello");');
40
+ });
41
+
42
+ test('integration: multiple mixed tool calls', async () => {
43
+ // Test with multiple tool calls including different operations
44
+ const complexMarkdown = `
45
+ \`\`\`json-tool
46
+ {"tool": "navigate", "params": {"op": "read", "path": "config.json"}}
47
+ \`\`\`
48
+
49
+ Some documentation text
50
+
51
+ \`\`\`json-tool
52
+ {"tool": "navigate", "params": {"op": "write", "path": "output.ts", "content": "export const x = 1;"}}
53
+ \`\`\`
54
+
55
+ \`\`\`json-tool
56
+ {"tool": "versionControl", "params": {"autoPush": false}}
57
+ \`\`\`
58
+
59
+ \`\`\`ts
60
+ // Regular code block
61
+ const y = 2;
62
+ \`\`\`
63
+ `;
64
+
65
+ const result = parseToolCallsFromMarkdown(complexMarkdown);
66
+
67
+ // Should parse all valid tool calls
68
+ assert.equal(result.ok, true);
69
+ assert.equal(result.calls.length, 3, 'Should have three valid calls');
70
+ assert.equal(result.errors.length, 0, 'Should have no errors');
71
+
72
+ // Verify each call
73
+ const readCall = result.calls.find(c => c.params.op === 'read');
74
+ const writeCall = result.calls.find(c => c.params.op === 'write');
75
+ const vcCall = result.calls.find(c => c.tool === 'versionControl');
76
+
77
+ if (!readCall || !writeCall || !vcCall) throw new Error('All calls should be defined');
78
+
79
+ assert.equal(readCall.params.path, 'config.json');
80
+ assert.equal(writeCall.params.path, 'output.ts');
81
+ assert.equal(writeCall.params.content, 'export const x = 1;');
82
+ assert.equal((vcCall.params as any).autoPush, false);
83
+ });