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.
- package/.directory +2 -0
- package/.env.example +3 -0
- package/AUDIT_LANG.md +45 -0
- package/BOXSAFE_VERSION_NOTES.md +14 -0
- package/README.md +4 -0
- package/TODO.md +130 -0
- package/adapters/index.ts +27 -0
- package/adapters/primary/cli-adapter.ts +56 -0
- package/adapters/secondary/filesystem/node-filesystem.ts +307 -0
- package/adapters/secondary/system/configuration.ts +147 -0
- package/ai/caller.ts +42 -0
- package/ai/label.ts +33 -0
- package/ai/modelConfig.ts +236 -0
- package/ai/provider.ts +111 -0
- package/boxsafe.config.json +68 -0
- package/core/auth/dasktop/cred/CRED.md +112 -0
- package/core/auth/dasktop/cred/credLinux.ts +82 -0
- package/core/auth/dasktop/cred/credWin.ts +2 -0
- package/core/config/defaults/boxsafeDefaults.ts +67 -0
- package/core/config/defaults/index.ts +1 -0
- package/core/config/loadConfig.ts +133 -0
- package/core/loop/about.md +13 -0
- package/core/loop/boxConfig.ts +20 -0
- package/core/loop/buildExecCommand.ts +76 -0
- package/core/loop/cmd/execode.ts +121 -0
- package/core/loop/cmd/test.js +3 -0
- package/core/loop/execLoop.ts +341 -0
- package/core/loop/git/VERSIONING.md +17 -0
- package/core/loop/git/commands.ts +11 -0
- package/core/loop/git/gitClient.ts +78 -0
- package/core/loop/git/index.ts +99 -0
- package/core/loop/git/runVersionControlRunner.ts +33 -0
- package/core/loop/initNavigator.ts +44 -0
- package/core/loop/initTasksManager.ts +35 -0
- package/core/loop/runValidation.ts +25 -0
- package/core/loop/tasks/AGENT-TASKS.md +36 -0
- package/core/loop/tasks/index.ts +96 -0
- package/core/loop/toolCalls.ts +168 -0
- package/core/loop/toolDispatcher.ts +146 -0
- package/core/loop/traceLogger.ts +106 -0
- package/core/loop/types.ts +26 -0
- package/core/loop/versionControlAdapter.ts +36 -0
- package/core/loop/waterfall.ts +404 -0
- package/core/loop/writeArtifactAtomically.ts +13 -0
- package/core/navigate/NAVIGATE.md +186 -0
- package/core/navigate/about.md +128 -0
- package/core/navigate/examples.ts +367 -0
- package/core/navigate/handler.ts +148 -0
- package/core/navigate/index.ts +32 -0
- package/core/navigate/navigate.test.ts +372 -0
- package/core/navigate/navigator.ts +437 -0
- package/core/navigate/types.ts +132 -0
- package/core/navigate/utils.ts +146 -0
- package/core/paths/paths.ts +33 -0
- package/core/ports/index.ts +271 -0
- package/core/segments/CONVENTIONS.md +30 -0
- package/core/segments/loop/index.ts +18 -0
- package/core/segments/map.ts +56 -0
- package/core/segments/navigate/index.ts +20 -0
- package/core/segments/versionControl/index.ts +18 -0
- package/core/util/logger.ts +128 -0
- package/docs/AGENT-TASKS.md +36 -0
- package/docs/ARQUITETURA_CORRECAO.md +121 -0
- package/docs/CONVENTIONS.md +30 -0
- package/docs/CRED.md +112 -0
- package/docs/L_RAG.md +567 -0
- package/docs/NAVIGATE.md +186 -0
- package/docs/PRIMARY_ACTORS.md +78 -0
- package/docs/SECONDARY_ACTORS.md +174 -0
- package/docs/VERSIONING.md +17 -0
- package/docs/boxsafe.config.md +472 -0
- package/eslint.config.mts +15 -0
- package/main.ts +53 -0
- package/memo/generated/codelog.md +13 -0
- package/memo/state/tasks/state.json +6 -0
- package/memo/state/tasks/tasks/task_001.md +2 -0
- package/memo/states-logs/logs.txt +7 -0
- package/memo/states-logs/trace-mljvrxvi-9g0k4q.jsonl +11 -0
- package/memo/states-logs/trace-mljvvc9j-pe9ekj.jsonl +11 -0
- package/memo/states-logs/trace-mljvvm1c-wbnqzp.jsonl +11 -0
- package/memo/states-logs/trace-mljxecwn-9xh3nw.jsonl +11 -0
- package/memo/states-logs/trace-mljxqkfm-ipijik.jsonl +11 -0
- package/memo/states-logs/trace-mljxwtrw-3fanky.jsonl +11 -0
- package/memo/states-logs/trace-mljxzen3-m8iinh.jsonl +11 -0
- package/memo/states-logs/trace-mljyucef-td6odn.jsonl +11 -0
- package/memo/states-logs/trace-mljyuprw-b1a6f4.jsonl +11 -0
- package/memo/states-logs/trace-mljyvefl-b6yoce.jsonl +11 -0
- package/memo/states-logs/trace-mljyxjo4-n7ibj2.jsonl +13 -0
- package/memo/states-logs/trace-mljziez5-8drqtn.jsonl +13 -0
- package/memo/states-logs/trace-mljziulp-dtd03z.jsonl +13 -0
- package/memo/states-logs/trace-mljzjwrq-1p2krb.jsonl +13 -0
- package/memo/states-logs/trace-mljzl0i7-b1cqa6.jsonl +13 -0
- package/memo/states-logs/trace-mljzmlk6-7kdyls.jsonl +13 -0
- package/memo/states-logs/trace-mlk0oj25-xa3dcu.jsonl +13 -0
- package/memo/states-logs/trace-mlk1x59q-713huj.jsonl +14 -0
- package/memo/states-logs/trace-mlk22dz8-7fd6hq.jsonl +14 -0
- package/memo/states-logs/trace-mlk241uy-wmx907.jsonl +14 -0
- package/memo/states-logs/trace-mlk2bf5r-yoh1vg.jsonl +15 -0
- package/package.json +44 -0
- package/pnpm-workspace.yaml +4 -0
- package/prompt_improvement_example.md +55 -0
- package/remove.txt +1 -0
- package/tests/adapters.test.ts +128 -0
- package/tests/extractCode.test.ts +26 -0
- package/tests/integration.test.ts +83 -0
- package/tests/loadConfig.test.ts +25 -0
- package/tests/navigatorBoundary.test.ts +17 -0
- package/tests/ports.test.ts +84 -0
- package/tests/runAllTests.ts +49 -0
- package/tests/toolCalls.test.ts +149 -0
- package/tests/waterfall.test.ts +52 -0
- package/tsconfig.json +32 -0
- package/tsup.config.ts +17 -0
- package/types.d.ts +96 -0
- package/util/ANSI.ts +29 -0
- package/util/extractCode.ts +217 -0
- package/util/extractToolCalls.ts +80 -0
- 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,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
|
+
});
|