joonecli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +56 -0
- package/Handover.md +115 -0
- package/LICENSE +201 -0
- package/PROGRESS.md +160 -0
- package/README.md +114 -0
- package/dist/__tests__/bootstrap.test.d.ts +1 -0
- package/dist/__tests__/bootstrap.test.js +76 -0
- package/dist/__tests__/bootstrap.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +84 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/m55.test.d.ts +1 -0
- package/dist/__tests__/m55.test.js +160 -0
- package/dist/__tests__/m55.test.js.map +1 -0
- package/dist/__tests__/middleware.test.d.ts +1 -0
- package/dist/__tests__/middleware.test.js +169 -0
- package/dist/__tests__/middleware.test.js.map +1 -0
- package/dist/__tests__/modelFactory.test.d.ts +1 -0
- package/dist/__tests__/modelFactory.test.js +50 -0
- package/dist/__tests__/modelFactory.test.js.map +1 -0
- package/dist/__tests__/optimizations.test.d.ts +1 -0
- package/dist/__tests__/optimizations.test.js +136 -0
- package/dist/__tests__/optimizations.test.js.map +1 -0
- package/dist/__tests__/promptBuilder.test.d.ts +1 -0
- package/dist/__tests__/promptBuilder.test.js +108 -0
- package/dist/__tests__/promptBuilder.test.js.map +1 -0
- package/dist/__tests__/sandbox.test.d.ts +1 -0
- package/dist/__tests__/sandbox.test.js +78 -0
- package/dist/__tests__/sandbox.test.js.map +1 -0
- package/dist/__tests__/security.test.d.ts +1 -0
- package/dist/__tests__/security.test.js +86 -0
- package/dist/__tests__/security.test.js.map +1 -0
- package/dist/__tests__/streaming.test.d.ts +1 -0
- package/dist/__tests__/streaming.test.js +71 -0
- package/dist/__tests__/streaming.test.js.map +1 -0
- package/dist/__tests__/toolRouter.test.d.ts +1 -0
- package/dist/__tests__/toolRouter.test.js +37 -0
- package/dist/__tests__/toolRouter.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +1 -0
- package/dist/__tests__/tools.test.js +112 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/__tests__/tracing.test.d.ts +1 -0
- package/dist/__tests__/tracing.test.js +147 -0
- package/dist/__tests__/tracing.test.js.map +1 -0
- package/dist/cli/config.d.ts +49 -0
- package/dist/cli/config.js +86 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +625 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/modelFactory.d.ts +9 -0
- package/dist/cli/modelFactory.js +154 -0
- package/dist/cli/modelFactory.js.map +1 -0
- package/dist/cli/providers.d.ts +18 -0
- package/dist/cli/providers.js +94 -0
- package/dist/cli/providers.js.map +1 -0
- package/dist/core/agentLoop.d.ts +43 -0
- package/dist/core/agentLoop.js +245 -0
- package/dist/core/agentLoop.js.map +1 -0
- package/dist/core/errors.d.ts +62 -0
- package/dist/core/errors.js +139 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/promptBuilder.d.ts +49 -0
- package/dist/core/promptBuilder.js +84 -0
- package/dist/core/promptBuilder.js.map +1 -0
- package/dist/core/reasoningRouter.d.ts +62 -0
- package/dist/core/reasoningRouter.js +102 -0
- package/dist/core/reasoningRouter.js.map +1 -0
- package/dist/core/retry.d.ts +25 -0
- package/dist/core/retry.js +49 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/sessionResumer.d.ts +17 -0
- package/dist/core/sessionResumer.js +78 -0
- package/dist/core/sessionResumer.js.map +1 -0
- package/dist/core/sessionStore.d.ts +45 -0
- package/dist/core/sessionStore.js +167 -0
- package/dist/core/sessionStore.js.map +1 -0
- package/dist/core/tokenCounter.d.ts +17 -0
- package/dist/core/tokenCounter.js +54 -0
- package/dist/core/tokenCounter.js.map +1 -0
- package/dist/evals/dataset.d.ts +4 -0
- package/dist/evals/dataset.js +61 -0
- package/dist/evals/dataset.js.map +1 -0
- package/dist/evals/evaluator.d.ts +21 -0
- package/dist/evals/evaluator.js +68 -0
- package/dist/evals/evaluator.js.map +1 -0
- package/dist/hitl/bridge.d.ts +65 -0
- package/dist/hitl/bridge.js +120 -0
- package/dist/hitl/bridge.js.map +1 -0
- package/dist/middleware/commandSanitizer.d.ts +18 -0
- package/dist/middleware/commandSanitizer.js +50 -0
- package/dist/middleware/commandSanitizer.js.map +1 -0
- package/dist/middleware/loopDetection.d.ts +28 -0
- package/dist/middleware/loopDetection.js +49 -0
- package/dist/middleware/loopDetection.js.map +1 -0
- package/dist/middleware/permission.d.ts +17 -0
- package/dist/middleware/permission.js +59 -0
- package/dist/middleware/permission.js.map +1 -0
- package/dist/middleware/pipeline.d.ts +31 -0
- package/dist/middleware/pipeline.js +62 -0
- package/dist/middleware/pipeline.js.map +1 -0
- package/dist/middleware/preCompletion.d.ts +29 -0
- package/dist/middleware/preCompletion.js +82 -0
- package/dist/middleware/preCompletion.js.map +1 -0
- package/dist/middleware/types.d.ts +40 -0
- package/dist/middleware/types.js +8 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/sandbox/bootstrap.d.ts +38 -0
- package/dist/sandbox/bootstrap.js +107 -0
- package/dist/sandbox/bootstrap.js.map +1 -0
- package/dist/sandbox/manager.d.ts +72 -0
- package/dist/sandbox/manager.js +180 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/sync.d.ts +55 -0
- package/dist/sandbox/sync.js +135 -0
- package/dist/sandbox/sync.js.map +1 -0
- package/dist/skills/loader.d.ts +55 -0
- package/dist/skills/loader.js +132 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/tools.d.ts +5 -0
- package/dist/skills/tools.js +78 -0
- package/dist/skills/tools.js.map +1 -0
- package/dist/skills/types.d.ts +13 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/test_cache.d.ts +1 -0
- package/dist/test_cache.js +55 -0
- package/dist/test_cache.js.map +1 -0
- package/dist/test_google.js +93 -0
- package/dist/tools/askUser.d.ts +10 -0
- package/dist/tools/askUser.js +42 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/browser.d.ts +19 -0
- package/dist/tools/browser.js +111 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/index.d.ts +27 -0
- package/dist/tools/index.js +184 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +31 -0
- package/dist/tools/registry.js +168 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/router.d.ts +34 -0
- package/dist/tools/router.js +73 -0
- package/dist/tools/router.js.map +1 -0
- package/dist/tools/security.d.ts +28 -0
- package/dist/tools/security.js +183 -0
- package/dist/tools/security.js.map +1 -0
- package/dist/tools/webSearch.d.ts +6 -0
- package/dist/tools/webSearch.js +120 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/tracing/analyzer.d.ts +58 -0
- package/dist/tracing/analyzer.js +190 -0
- package/dist/tracing/analyzer.js.map +1 -0
- package/dist/tracing/langsmith.d.ts +38 -0
- package/dist/tracing/langsmith.js +50 -0
- package/dist/tracing/langsmith.js.map +1 -0
- package/dist/tracing/sessionTracer.d.ts +73 -0
- package/dist/tracing/sessionTracer.js +157 -0
- package/dist/tracing/sessionTracer.js.map +1 -0
- package/dist/tracing/types.d.ts +46 -0
- package/dist/tracing/types.js +5 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/ui/App.d.ts +24 -0
- package/dist/ui/App.js +172 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/components/HITLPrompt.d.ts +15 -0
- package/dist/ui/components/HITLPrompt.js +35 -0
- package/dist/ui/components/HITLPrompt.js.map +1 -0
- package/dist/ui/components/Header.d.ts +8 -0
- package/dist/ui/components/Header.js +6 -0
- package/dist/ui/components/Header.js.map +1 -0
- package/dist/ui/components/MessageBubble.d.ts +13 -0
- package/dist/ui/components/MessageBubble.js +17 -0
- package/dist/ui/components/MessageBubble.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +21 -0
- package/dist/ui/components/StatusBar.js +34 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/StreamingText.d.ts +13 -0
- package/dist/ui/components/StreamingText.js +24 -0
- package/dist/ui/components/StreamingText.js.map +1 -0
- package/dist/ui/components/ToolCallPanel.d.ts +15 -0
- package/dist/ui/components/ToolCallPanel.js +18 -0
- package/dist/ui/components/ToolCallPanel.js.map +1 -0
- package/docs/01_insights_and_patterns.md +27 -0
- package/docs/02_edge_cases_and_mitigations.md +143 -0
- package/docs/03_initial_implementation_plan.md +66 -0
- package/docs/04_tech_stack_proposal.md +20 -0
- package/docs/05_prd.md +87 -0
- package/docs/06_user_stories.md +72 -0
- package/docs/07_system_architecture.md +138 -0
- package/docs/08_roadmap.md +200 -0
- package/e2b/Dockerfile +26 -0
- package/package.json +57 -0
- package/src/__tests__/bootstrap.test.ts +111 -0
- package/src/__tests__/config.test.ts +97 -0
- package/src/__tests__/m55.test.ts +238 -0
- package/src/__tests__/middleware.test.ts +219 -0
- package/src/__tests__/modelFactory.test.ts +63 -0
- package/src/__tests__/optimizations.test.ts +201 -0
- package/src/__tests__/promptBuilder.test.ts +141 -0
- package/src/__tests__/sandbox.test.ts +102 -0
- package/src/__tests__/security.test.ts +122 -0
- package/src/__tests__/streaming.test.ts +82 -0
- package/src/__tests__/toolRouter.test.ts +52 -0
- package/src/__tests__/tools.test.ts +146 -0
- package/src/__tests__/tracing.test.ts +196 -0
- package/src/agents/agentRegistry.ts +69 -0
- package/src/agents/agentSpec.ts +67 -0
- package/src/agents/builtinAgents.ts +142 -0
- package/src/cli/config.ts +124 -0
- package/src/cli/index.ts +730 -0
- package/src/cli/modelFactory.ts +174 -0
- package/src/cli/providers.ts +107 -0
- package/src/commands/builtinCommands.ts +293 -0
- package/src/commands/commandRegistry.ts +194 -0
- package/src/core/agentLoop.d.ts.map +1 -0
- package/src/core/agentLoop.ts +312 -0
- package/src/core/autoSave.ts +95 -0
- package/src/core/compactor.ts +252 -0
- package/src/core/contextGuard.ts +129 -0
- package/src/core/errors.ts +202 -0
- package/src/core/promptBuilder.d.ts.map +1 -0
- package/src/core/promptBuilder.ts +139 -0
- package/src/core/reasoningRouter.ts +121 -0
- package/src/core/retry.ts +75 -0
- package/src/core/sessionResumer.ts +90 -0
- package/src/core/sessionStore.ts +215 -0
- package/src/core/subAgent.ts +339 -0
- package/src/core/tokenCounter.ts +64 -0
- package/src/evals/dataset.ts +67 -0
- package/src/evals/evaluator.ts +81 -0
- package/src/hitl/bridge.ts +160 -0
- package/src/middleware/commandSanitizer.ts +60 -0
- package/src/middleware/loopDetection.ts +63 -0
- package/src/middleware/permission.ts +72 -0
- package/src/middleware/pipeline.ts +75 -0
- package/src/middleware/preCompletion.ts +94 -0
- package/src/middleware/types.ts +45 -0
- package/src/sandbox/bootstrap.ts +121 -0
- package/src/sandbox/manager.ts +239 -0
- package/src/sandbox/sync.ts +157 -0
- package/src/skills/loader.ts +143 -0
- package/src/skills/tools.ts +99 -0
- package/src/skills/types.ts +13 -0
- package/src/test_cache.ts +72 -0
- package/src/test_google.js +40 -0
- package/src/test_google.ts +40 -0
- package/src/tools/askUser.ts +47 -0
- package/src/tools/browser.ts +137 -0
- package/src/tools/index.d.ts.map +1 -0
- package/src/tools/index.ts +237 -0
- package/src/tools/registry.ts +198 -0
- package/src/tools/router.ts +78 -0
- package/src/tools/security.ts +220 -0
- package/src/tools/spawnAgent.ts +158 -0
- package/src/tools/webSearch.ts +142 -0
- package/src/tracing/analyzer.ts +265 -0
- package/src/tracing/langsmith.ts +63 -0
- package/src/tracing/sessionTracer.ts +202 -0
- package/src/tracing/types.ts +49 -0
- package/src/types/valyu.d.ts +37 -0
- package/src/ui/App.tsx +404 -0
- package/src/ui/components/HITLPrompt.tsx +119 -0
- package/src/ui/components/Header.tsx +51 -0
- package/src/ui/components/MessageBubble.tsx +46 -0
- package/src/ui/components/StatusBar.tsx +138 -0
- package/src/ui/components/StreamingText.tsx +48 -0
- package/src/ui/components/ToolCallPanel.tsx +80 -0
- package/tests/commands/commands.test.ts +356 -0
- package/tests/core/compactor.test.ts +217 -0
- package/tests/core/retryAndErrors.test.ts +164 -0
- package/tests/core/sessionResumer.test.ts +95 -0
- package/tests/core/sessionStore.test.ts +84 -0
- package/tests/core/stability.test.ts +165 -0
- package/tests/core/subAgent.test.ts +238 -0
- package/tests/hitl/hitlBridge.test.ts +115 -0
- package/tsconfig.json +16 -0
- package/vitest.config.ts +10 -0
- package/vitest.out +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentLoop.js","sourceRoot":"","sources":["../../src/core/agentLoop.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,SAAS,EAAE,WAAW,EAAkB,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7G,OAAO,EAAE,2BAA2B,EAAgB,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAOzD,MAAM,OAAO,gBAAgB;IACjB,GAAG,CAAgD;IACnD,aAAa,CAA8B;IAC3C,cAAc,CAAyB;IACvC,QAAQ,CAAqB;IAC9B,MAAM,CAAgB;IACrB,YAAY,CAAe;IAC5B,SAAS,CAAS;IACjB,QAAQ,CAAS;IACjB,KAAK,CAAS;IAEtB;;;OAGG;IACH,YACI,QAAuD,EACvD,QAAgC,EAAE,EAClC,QAA6B,EAC7B,MAAsB,EACtB,WAAmB,SAAS,EAC5B,QAAgB,SAAS,EACzB,SAAkB;QAElB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI,2BAA2B,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,IAAI,CAAC,KAAmB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACnC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EACvF;gBACI,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,cAAc,OAAO,KAAK,KAAK,CAAC,OAAO,aAAa,KAAK,KAAK,EAAE,CAAC,CAAC;gBACzG,CAAC;aACJ,CACJ,CAAC;YAEF,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,QAAqB,CAAC,CAAC,CAAC;YAErE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;gBACtB,YAAY;gBACZ,gBAAgB;gBAChB,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtF,OAAO,QAAqB,CAAC;QACjC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,+DAA+D;YAC/D,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,0BAA0B,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAChF,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBAC1E,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtF,0DAA0D;gBAC1D,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,KAAK,CAAC,CAAC,0CAA0C;QAC3D,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,UAAU,CACnB,KAAmB,EACnB,OAA0B;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACjC,KAAK,IAAI,EAAE;gBACP,IAAI,WAAW,GAAG,EAAE,CAAC;gBACrB,MAAM,eAAe,GAAgE,IAAI,GAAG,EAAE,CAAC;gBAE/F,IAAI,MAA0B,CAAC;gBAC/B,IAAI,CAAC;oBACD,MAAM,GAAG,MAAO,IAAI,CAAC,GAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACT,MAAM,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC;gBAED,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC/B,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;wBACrD,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC;wBAC7B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;4BAClB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACnC,CAAC;oBACL,CAAC;oBAED,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9D,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;4BACtC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;4BAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC5B,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE;oCACrB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE;oCACf,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;oCACnB,QAAQ,EAAE,EAAE;iCACf,CAAC,CAAC;4BACP,CAAC;4BACD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;4BACtC,IAAI,EAAE,CAAC,EAAE;gCAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;4BAC1B,IAAI,EAAE,CAAC,IAAI;gCAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;4BAChC,IAAI,EAAE,CAAC,IAAI;gCAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC;wBACzC,CAAC;oBACL,CAAC;gBACL,CAAC;gBAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACjE,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,CAAC,GAAG,EAAE;wBACR,IAAI,CAAC;4BACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;wBAC5C,CAAC;wBAAC,MAAM,CAAC;4BACL,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;wBACxD,CAAC;oBACL,CAAC,CAAC,EAAE;oBACJ,IAAI,EAAE,WAAoB;iBAC7B,CAAC,CAAC,CAAC;gBAEJ,OAAO,IAAI,SAAS,CAAC;oBACjB,OAAO,EAAE,WAAW;oBACpB,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC;YACP,CAAC,EACD;gBACI,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,qBAAqB,OAAO,KAAK,KAAK,CAAC,OAAO,aAAa,KAAK,KAAK,EAAE,CAAC,CAAC;gBAChH,CAAC;aACJ,CACJ,CAAC;YAEF,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAEtD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;gBACtB,YAAY;gBACZ,gBAAgB;gBAChB,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtF,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,8BAA8B;YAC9B,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,iCAAkC,KAAoB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACvG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,aAAa,CAAE,KAAoB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;gBAC1F,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtF,OAAO,IAAI,SAAS,CAAE,KAAoB,CAAC,cAAc,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,SAAoB,EAAE,KAAmB;QACnE,MAAM,OAAO,GAAmC,EAAE,CAAC;QAEnD,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,OAAO,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACtC,mFAAmF;YACnF,iFAAiF;YACjF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,uCAAuC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1G,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,CACzB,mCAAmC,IAAI,CAAC,IAAI,6CAA6C;oBACzF,kFAAkF,CACrF,CAAC,CAAC;gBACH,SAAS;YACb,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;YAE3B,oDAAoD;YACpD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxF,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;oBACzB,OAAO,EAAE,4EAA4E,IAAI,CAAC,IAAI,CAAC,OAAO,iDAAiD;oBACvJ,YAAY,EAAE,UAAU;iBAC3B,CAAC,CAAC,CAAC;gBACJ,SAAS;YACb,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrF,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;oBACzB,OAAO,EAAE,eAAe,IAAI,CAAC,IAAI,aAAa;oBAC9C,YAAY,EAAE,UAAU;iBAC3B,CAAC,CAAC,CAAC;gBACJ,SAAS;YACb,CAAC;YAED,MAAM,GAAG,GAAoB;gBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,UAAU;aACrB,CAAC;YAEF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAClC,GAAG,EACH,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CACpC,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;oBACtF,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBAC5B,OAAO,EAAE,IAAI;iBAChB,CAAC,CAAC;gBAEH,MAAM,iBAAiB,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACvF,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;oBACzB,OAAO,EAAE,iBAAiB;oBAC1B,YAAY,EAAE,UAAU;iBAC3B,CAAC,CAAC,CAAC;YACR,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE;oBACpD,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,KAAK;oBAChB,KAAK,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBAC5B,OAAO,EAAE,KAAK;iBACjB,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;oBACzB,OAAO,EAAE,SAAS,CAAC,cAAc,EAAE;oBACnC,YAAY,EAAE,UAAU;iBAC3B,CAAC,CAAC,CAAC;YACR,CAAC;QACL,CAAC;QAED,8DAA8D;QAC9D,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtF,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JooneError — Structured error hierarchy for the Joone agent.
|
|
3
|
+
*
|
|
4
|
+
* Every error in the system carries:
|
|
5
|
+
* - `category`: A machine-readable classification (e.g., "llm_api", "sandbox", "tool").
|
|
6
|
+
* - `retryable`: Whether the operation that caused this error is safe to retry.
|
|
7
|
+
* - `context`: Arbitrary structured metadata for debugging.
|
|
8
|
+
* - `toRecoveryHint()`: A human-readable string the LLM can use to self-correct.
|
|
9
|
+
*/
|
|
10
|
+
export type ErrorCategory = "llm_api" | "sandbox" | "tool" | "config" | "network" | "unknown";
|
|
11
|
+
export declare class JooneError extends Error {
|
|
12
|
+
readonly category: ErrorCategory;
|
|
13
|
+
readonly retryable: boolean;
|
|
14
|
+
readonly context: Record<string, unknown>;
|
|
15
|
+
constructor(message: string, opts: {
|
|
16
|
+
category: ErrorCategory;
|
|
17
|
+
retryable: boolean;
|
|
18
|
+
context?: Record<string, unknown>;
|
|
19
|
+
cause?: Error;
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Returns a hint string that can be injected into the LLM's conversation
|
|
23
|
+
* so it can adapt its behavior instead of crashing.
|
|
24
|
+
*/
|
|
25
|
+
toRecoveryHint(): string;
|
|
26
|
+
}
|
|
27
|
+
export declare class LLMApiError extends JooneError {
|
|
28
|
+
readonly statusCode: number | undefined;
|
|
29
|
+
readonly provider: string;
|
|
30
|
+
constructor(message: string, opts: {
|
|
31
|
+
statusCode?: number;
|
|
32
|
+
provider: string;
|
|
33
|
+
retryable: boolean;
|
|
34
|
+
headers?: Record<string, string>;
|
|
35
|
+
cause?: Error;
|
|
36
|
+
});
|
|
37
|
+
toRecoveryHint(): string;
|
|
38
|
+
}
|
|
39
|
+
export declare class SandboxError extends JooneError {
|
|
40
|
+
readonly sandboxProvider: string;
|
|
41
|
+
constructor(message: string, opts: {
|
|
42
|
+
sandboxProvider: string;
|
|
43
|
+
retryable: boolean;
|
|
44
|
+
cause?: Error;
|
|
45
|
+
});
|
|
46
|
+
toRecoveryHint(): string;
|
|
47
|
+
}
|
|
48
|
+
export declare class ToolExecutionError extends JooneError {
|
|
49
|
+
readonly toolName: string;
|
|
50
|
+
constructor(message: string, opts: {
|
|
51
|
+
toolName: string;
|
|
52
|
+
args?: Record<string, unknown>;
|
|
53
|
+
retryable: boolean;
|
|
54
|
+
cause?: Error;
|
|
55
|
+
});
|
|
56
|
+
toRecoveryHint(): string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Wraps a raw provider error into a structured `LLMApiError`.
|
|
60
|
+
* Inspects the error for HTTP status codes, network error codes, etc.
|
|
61
|
+
*/
|
|
62
|
+
export declare function wrapLLMError(error: unknown, provider: string): LLMApiError;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JooneError — Structured error hierarchy for the Joone agent.
|
|
3
|
+
*
|
|
4
|
+
* Every error in the system carries:
|
|
5
|
+
* - `category`: A machine-readable classification (e.g., "llm_api", "sandbox", "tool").
|
|
6
|
+
* - `retryable`: Whether the operation that caused this error is safe to retry.
|
|
7
|
+
* - `context`: Arbitrary structured metadata for debugging.
|
|
8
|
+
* - `toRecoveryHint()`: A human-readable string the LLM can use to self-correct.
|
|
9
|
+
*/
|
|
10
|
+
export class JooneError extends Error {
|
|
11
|
+
category;
|
|
12
|
+
retryable;
|
|
13
|
+
context;
|
|
14
|
+
constructor(message, opts) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "JooneError";
|
|
17
|
+
this.category = opts.category;
|
|
18
|
+
this.retryable = opts.retryable;
|
|
19
|
+
this.context = opts.context ?? {};
|
|
20
|
+
if (opts.cause) {
|
|
21
|
+
this.cause = opts.cause;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns a hint string that can be injected into the LLM's conversation
|
|
26
|
+
* so it can adapt its behavior instead of crashing.
|
|
27
|
+
*/
|
|
28
|
+
toRecoveryHint() {
|
|
29
|
+
return `[SYSTEM ERROR — ${this.category.toUpperCase()}]: ${this.message}`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ─── LLM API Errors ─────────────────────────────────────────────────────────────
|
|
33
|
+
export class LLMApiError extends JooneError {
|
|
34
|
+
statusCode;
|
|
35
|
+
provider;
|
|
36
|
+
constructor(message, opts) {
|
|
37
|
+
super(message, {
|
|
38
|
+
category: "llm_api",
|
|
39
|
+
retryable: opts.retryable,
|
|
40
|
+
context: {
|
|
41
|
+
statusCode: opts.statusCode,
|
|
42
|
+
provider: opts.provider,
|
|
43
|
+
retryAfter: opts.headers?.["retry-after"],
|
|
44
|
+
},
|
|
45
|
+
cause: opts.cause,
|
|
46
|
+
});
|
|
47
|
+
this.name = "LLMApiError";
|
|
48
|
+
this.statusCode = opts.statusCode;
|
|
49
|
+
this.provider = opts.provider;
|
|
50
|
+
}
|
|
51
|
+
toRecoveryHint() {
|
|
52
|
+
if (this.statusCode === 429) {
|
|
53
|
+
const retryAfter = this.context.retryAfter;
|
|
54
|
+
return (`[SYSTEM ERROR — RATE LIMITED]: The ${this.provider} API returned a 429 rate limit error. ` +
|
|
55
|
+
(retryAfter
|
|
56
|
+
? `Retry after ${retryAfter} seconds. `
|
|
57
|
+
: "Wait a moment before trying again. ") +
|
|
58
|
+
"Consider simplifying your request or reducing the number of tool calls per turn.");
|
|
59
|
+
}
|
|
60
|
+
if (this.statusCode === 401 || this.statusCode === 403) {
|
|
61
|
+
return (`[SYSTEM ERROR — AUTH FAILURE]: The ${this.provider} API rejected the credentials (HTTP ${this.statusCode}). ` +
|
|
62
|
+
"This is a fatal configuration error. Ask the user to verify their API key.");
|
|
63
|
+
}
|
|
64
|
+
return (`[SYSTEM ERROR — LLM API]: The ${this.provider} API returned an error` +
|
|
65
|
+
(this.statusCode ? ` (HTTP ${this.statusCode})` : "") +
|
|
66
|
+
`. ${this.message}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ─── Sandbox Errors ──────────────────────────────────────────────────────────────
|
|
70
|
+
export class SandboxError extends JooneError {
|
|
71
|
+
sandboxProvider;
|
|
72
|
+
constructor(message, opts) {
|
|
73
|
+
super(message, {
|
|
74
|
+
category: "sandbox",
|
|
75
|
+
retryable: opts.retryable,
|
|
76
|
+
context: { sandboxProvider: opts.sandboxProvider },
|
|
77
|
+
cause: opts.cause,
|
|
78
|
+
});
|
|
79
|
+
this.name = "SandboxError";
|
|
80
|
+
this.sandboxProvider = opts.sandboxProvider;
|
|
81
|
+
}
|
|
82
|
+
toRecoveryHint() {
|
|
83
|
+
return (`[SYSTEM ERROR — SANDBOX]: The ${this.sandboxProvider} sandbox encountered an error: ${this.message}. ` +
|
|
84
|
+
"The sandbox may have been recycled. Try running the command again.");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// ─── Tool Execution Errors ───────────────────────────────────────────────────────
|
|
88
|
+
export class ToolExecutionError extends JooneError {
|
|
89
|
+
toolName;
|
|
90
|
+
constructor(message, opts) {
|
|
91
|
+
super(message, {
|
|
92
|
+
category: "tool",
|
|
93
|
+
retryable: opts.retryable,
|
|
94
|
+
context: { toolName: opts.toolName, args: opts.args },
|
|
95
|
+
cause: opts.cause,
|
|
96
|
+
});
|
|
97
|
+
this.name = "ToolExecutionError";
|
|
98
|
+
this.toolName = opts.toolName;
|
|
99
|
+
}
|
|
100
|
+
toRecoveryHint() {
|
|
101
|
+
return (`[SYSTEM ERROR — TOOL]: The tool "${this.toolName}" failed: ${this.message}. ` +
|
|
102
|
+
"Try a different approach or check the arguments you passed.");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────────
|
|
106
|
+
const RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503]);
|
|
107
|
+
const RETRYABLE_ERROR_CODES = new Set(["ECONNRESET", "ETIMEDOUT", "ECONNREFUSED", "UND_ERR_CONNECT_TIMEOUT"]);
|
|
108
|
+
const NON_RETRYABLE_STATUS_CODES = new Set([400, 401, 403, 404]);
|
|
109
|
+
/**
|
|
110
|
+
* Wraps a raw provider error into a structured `LLMApiError`.
|
|
111
|
+
* Inspects the error for HTTP status codes, network error codes, etc.
|
|
112
|
+
*/
|
|
113
|
+
export function wrapLLMError(error, provider) {
|
|
114
|
+
if (error instanceof LLMApiError)
|
|
115
|
+
return error;
|
|
116
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
117
|
+
const statusCode = err.status ?? err.statusCode ?? err.response?.status;
|
|
118
|
+
const headers = err.response?.headers ?? {};
|
|
119
|
+
const code = err.code;
|
|
120
|
+
let retryable = false;
|
|
121
|
+
if (typeof statusCode === "number") {
|
|
122
|
+
retryable = RETRYABLE_STATUS_CODES.has(statusCode);
|
|
123
|
+
}
|
|
124
|
+
else if (code && RETRYABLE_ERROR_CODES.has(code)) {
|
|
125
|
+
retryable = true;
|
|
126
|
+
}
|
|
127
|
+
// Non-retryable overrides
|
|
128
|
+
if (typeof statusCode === "number" && NON_RETRYABLE_STATUS_CODES.has(statusCode)) {
|
|
129
|
+
retryable = false;
|
|
130
|
+
}
|
|
131
|
+
return new LLMApiError(err.message, {
|
|
132
|
+
statusCode,
|
|
133
|
+
provider,
|
|
134
|
+
retryable,
|
|
135
|
+
headers,
|
|
136
|
+
cause: err,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseMessage } from "@langchain/core/messages";
|
|
2
|
+
export interface ContextState {
|
|
3
|
+
globalSystemInstructions: string;
|
|
4
|
+
projectMemory: string;
|
|
5
|
+
sessionContext: string;
|
|
6
|
+
conversationHistory: BaseMessage[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* CacheOptimizedPromptBuilder
|
|
10
|
+
*
|
|
11
|
+
* Enforces strict prefix ordering to maximize Claude's Prompt Caching.
|
|
12
|
+
*
|
|
13
|
+
* Order of Prefix (Static to Dynamic):
|
|
14
|
+
* 1. Base System Instructions + Tool Definitions (Globally Cached)
|
|
15
|
+
* 2. Project Memory (e.g., CLAUDE.md) (Cached per project)
|
|
16
|
+
* 3. Session State (Environment variables) (Cached per session)
|
|
17
|
+
* 4. Conversation Messages (Grows iteratively)
|
|
18
|
+
*/
|
|
19
|
+
export declare class CacheOptimizedPromptBuilder {
|
|
20
|
+
/**
|
|
21
|
+
* Compiles the full message array for the LLM request.
|
|
22
|
+
* The first messages are static, and subsequent ones are dynamic.
|
|
23
|
+
*/
|
|
24
|
+
buildPrompt(state: ContextState): BaseMessage[];
|
|
25
|
+
/**
|
|
26
|
+
* The System Reminder Pattern
|
|
27
|
+
* Instead of replacing the System Prompt (which breaks cache),
|
|
28
|
+
* use this to inject state updates into the Conversation History.
|
|
29
|
+
*/
|
|
30
|
+
injectSystemReminder(history: BaseMessage[], reminder: string): BaseMessage[];
|
|
31
|
+
/**
|
|
32
|
+
* Cache-Safe Compaction
|
|
33
|
+
* When history gets too long, we preserve the last N messages (recent context)
|
|
34
|
+
* and replace older messages with a summary. The static system prefix is untouched.
|
|
35
|
+
*
|
|
36
|
+
* @param history - The full conversation history.
|
|
37
|
+
* @param summary - A text summary of the older messages.
|
|
38
|
+
* @param keepLastN - Number of recent messages to preserve (default: 6).
|
|
39
|
+
*/
|
|
40
|
+
compactHistory(history: BaseMessage[], summary: string, keepLastN?: number): BaseMessage[];
|
|
41
|
+
/**
|
|
42
|
+
* Checks if the conversation should be compacted based on token usage.
|
|
43
|
+
*
|
|
44
|
+
* @param state - The current context state.
|
|
45
|
+
* @param maxTokens - The model's context window.
|
|
46
|
+
* @param threshold - Fraction of capacity to trigger (default: 0.8).
|
|
47
|
+
*/
|
|
48
|
+
shouldCompact(state: ContextState, maxTokens: number, threshold?: number): boolean;
|
|
49
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { SystemMessage, HumanMessage, } from "@langchain/core/messages";
|
|
2
|
+
import { countMessageTokens } from "./tokenCounter.js";
|
|
3
|
+
/**
|
|
4
|
+
* CacheOptimizedPromptBuilder
|
|
5
|
+
*
|
|
6
|
+
* Enforces strict prefix ordering to maximize Claude's Prompt Caching.
|
|
7
|
+
*
|
|
8
|
+
* Order of Prefix (Static to Dynamic):
|
|
9
|
+
* 1. Base System Instructions + Tool Definitions (Globally Cached)
|
|
10
|
+
* 2. Project Memory (e.g., CLAUDE.md) (Cached per project)
|
|
11
|
+
* 3. Session State (Environment variables) (Cached per session)
|
|
12
|
+
* 4. Conversation Messages (Grows iteratively)
|
|
13
|
+
*/
|
|
14
|
+
export class CacheOptimizedPromptBuilder {
|
|
15
|
+
/**
|
|
16
|
+
* Compiles the full message array for the LLM request.
|
|
17
|
+
* The first messages are static, and subsequent ones are dynamic.
|
|
18
|
+
*/
|
|
19
|
+
buildPrompt(state) {
|
|
20
|
+
// We use SystemMessages for the static prefix.
|
|
21
|
+
// In @langchain/anthropic, to use cache_control, we can inject it into the final message of each tier if needed,
|
|
22
|
+
// but preserving the exact order of the system prompts is the main requirement.
|
|
23
|
+
const systemMessages = [
|
|
24
|
+
new SystemMessage({
|
|
25
|
+
content: state.globalSystemInstructions,
|
|
26
|
+
name: "global_instructions",
|
|
27
|
+
}),
|
|
28
|
+
new SystemMessage({
|
|
29
|
+
content: `--- Project Context ---\n${state.projectMemory}`,
|
|
30
|
+
name: "project_context",
|
|
31
|
+
}),
|
|
32
|
+
new SystemMessage({
|
|
33
|
+
content: `--- Session Rules ---\n${state.sessionContext}`,
|
|
34
|
+
name: "session_context",
|
|
35
|
+
}),
|
|
36
|
+
];
|
|
37
|
+
// Combine the static prefix with the dynamic conversation history
|
|
38
|
+
return [...systemMessages, ...state.conversationHistory];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The System Reminder Pattern
|
|
42
|
+
* Instead of replacing the System Prompt (which breaks cache),
|
|
43
|
+
* use this to inject state updates into the Conversation History.
|
|
44
|
+
*/
|
|
45
|
+
injectSystemReminder(history, reminder) {
|
|
46
|
+
const reminderMsg = new HumanMessage({
|
|
47
|
+
content: `<system-reminder>\n${reminder}\n</system-reminder>`,
|
|
48
|
+
});
|
|
49
|
+
return [...history, reminderMsg];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Cache-Safe Compaction
|
|
53
|
+
* When history gets too long, we preserve the last N messages (recent context)
|
|
54
|
+
* and replace older messages with a summary. The static system prefix is untouched.
|
|
55
|
+
*
|
|
56
|
+
* @param history - The full conversation history.
|
|
57
|
+
* @param summary - A text summary of the older messages.
|
|
58
|
+
* @param keepLastN - Number of recent messages to preserve (default: 6).
|
|
59
|
+
*/
|
|
60
|
+
compactHistory(history, summary, keepLastN = 6) {
|
|
61
|
+
if (history.length === 0) {
|
|
62
|
+
return history;
|
|
63
|
+
}
|
|
64
|
+
// Use SystemMessage (not AIMessage) to avoid breaking user/assistant
|
|
65
|
+
// alternation rules enforced by some providers (e.g. Anthropic).
|
|
66
|
+
const compactedMessage = new SystemMessage(`[The previous conversation history has been compacted.]\nSummary:\n${summary}`);
|
|
67
|
+
// Preserve recent messages for continuity
|
|
68
|
+
const recentMessages = history.slice(-keepLastN);
|
|
69
|
+
return [compactedMessage, ...recentMessages];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Checks if the conversation should be compacted based on token usage.
|
|
73
|
+
*
|
|
74
|
+
* @param state - The current context state.
|
|
75
|
+
* @param maxTokens - The model's context window.
|
|
76
|
+
* @param threshold - Fraction of capacity to trigger (default: 0.8).
|
|
77
|
+
*/
|
|
78
|
+
shouldCompact(state, maxTokens, threshold = 0.8) {
|
|
79
|
+
const allMessages = this.buildPrompt(state);
|
|
80
|
+
const usage = countMessageTokens(allMessages);
|
|
81
|
+
return usage >= maxTokens * threshold;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=promptBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptBuilder.js","sourceRoot":"","sources":["../../src/core/promptBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,YAAY,GAEb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AASvD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,2BAA2B;IACtC;;;OAGG;IACI,WAAW,CAAC,KAAmB;QACpC,+CAA+C;QAC/C,iHAAiH;QACjH,gFAAgF;QAEhF,MAAM,cAAc,GAAkB;YACpC,IAAI,aAAa,CAAC;gBAChB,OAAO,EAAE,KAAK,CAAC,wBAAwB;gBACvC,IAAI,EAAE,qBAAqB;aAC5B,CAAC;YACF,IAAI,aAAa,CAAC;gBAChB,OAAO,EAAE,4BAA4B,KAAK,CAAC,aAAa,EAAE;gBAC1D,IAAI,EAAE,iBAAiB;aACxB,CAAC;YACF,IAAI,aAAa,CAAC;gBAChB,OAAO,EAAE,0BAA0B,KAAK,CAAC,cAAc,EAAE;gBACzD,IAAI,EAAE,iBAAiB;aACxB,CAAC;SACH,CAAC;QAEF,kEAAkE;QAClE,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CACzB,OAAsB,EACtB,QAAgB;QAEhB,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC;YACnC,OAAO,EAAE,sBAAsB,QAAQ,sBAAsB;SAC9D,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;OAQG;IACI,cAAc,CACnB,OAAsB,EACtB,OAAe,EACf,SAAS,GAAG,CAAC;QAEb,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,gBAAgB,GAAG,IAAI,aAAa,CACxC,sEAAsE,OAAO,EAAE,CAChF,CAAC;QAEF,0CAA0C;QAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;QAEjD,OAAO,CAAC,gBAAgB,EAAE,GAAG,cAAc,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;OAMG;IACI,aAAa,CAClB,KAAmB,EACnB,SAAiB,EACjB,SAAS,GAAG,GAAG;QAEf,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC9C,OAAO,KAAK,IAAI,SAAS,GAAG,SAAS,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reasoning Sandwich — Dynamic Reasoning Router
|
|
3
|
+
*
|
|
4
|
+
* Adjusts the reasoning intensity per turn:
|
|
5
|
+
* - HIGH: Planning, recovery after errors, final verification
|
|
6
|
+
* - MEDIUM: Mechanical code writing, tool-heavy turns
|
|
7
|
+
*
|
|
8
|
+
* We adjust temperature only (not model variant) to preserve prompt cache prefix.
|
|
9
|
+
* See docs/02_edge_cases_and_mitigations.md — "The Mid-Session Model Switch."
|
|
10
|
+
*/
|
|
11
|
+
export declare enum ReasoningLevel {
|
|
12
|
+
HIGH = "high",
|
|
13
|
+
MEDIUM = "medium"
|
|
14
|
+
}
|
|
15
|
+
export interface ReasoningConfig {
|
|
16
|
+
/** Temperature for HIGH reasoning (default: 0). */
|
|
17
|
+
highTemp: number;
|
|
18
|
+
/** Temperature for MEDIUM reasoning (default: 0.2). */
|
|
19
|
+
mediumTemp: number;
|
|
20
|
+
/** Number of initial turns that always use HIGH reasoning (default: 2). */
|
|
21
|
+
planningTurns: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Tracks turn context and decides the reasoning level for each step.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ReasoningRouter {
|
|
27
|
+
private config;
|
|
28
|
+
private turnCount;
|
|
29
|
+
private lastTurnHadError;
|
|
30
|
+
private consecutiveToolTurns;
|
|
31
|
+
constructor(config?: Partial<ReasoningConfig>);
|
|
32
|
+
/**
|
|
33
|
+
* Advances to the next turn and records the outcome of the previous one.
|
|
34
|
+
* Call exactly once per turn BEFORE querying the level for the new turn.
|
|
35
|
+
*
|
|
36
|
+
* @param hasToolCalls - Whether the previous response contained tool calls.
|
|
37
|
+
* @param hadError - Whether the previous turn resulted in an error.
|
|
38
|
+
*/
|
|
39
|
+
advanceTurn(hasToolCalls?: boolean, hadError?: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* Determines the reasoning level for the current turn based on state.
|
|
42
|
+
*
|
|
43
|
+
* @returns The recommended reasoning level.
|
|
44
|
+
*/
|
|
45
|
+
getLevel(): ReasoningLevel;
|
|
46
|
+
/**
|
|
47
|
+
* Returns the temperature setting for a given reasoning level.
|
|
48
|
+
*/
|
|
49
|
+
getTemperature(level: ReasoningLevel): number;
|
|
50
|
+
/**
|
|
51
|
+
* Convenience: get the recommended temperature for the current turn.
|
|
52
|
+
*/
|
|
53
|
+
getRecommendedTemperature(): number;
|
|
54
|
+
/**
|
|
55
|
+
* Returns the current turn count.
|
|
56
|
+
*/
|
|
57
|
+
getTurnCount(): number;
|
|
58
|
+
/**
|
|
59
|
+
* Resets state. For testing or new sessions.
|
|
60
|
+
*/
|
|
61
|
+
reset(): void;
|
|
62
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reasoning Sandwich — Dynamic Reasoning Router
|
|
3
|
+
*
|
|
4
|
+
* Adjusts the reasoning intensity per turn:
|
|
5
|
+
* - HIGH: Planning, recovery after errors, final verification
|
|
6
|
+
* - MEDIUM: Mechanical code writing, tool-heavy turns
|
|
7
|
+
*
|
|
8
|
+
* We adjust temperature only (not model variant) to preserve prompt cache prefix.
|
|
9
|
+
* See docs/02_edge_cases_and_mitigations.md — "The Mid-Session Model Switch."
|
|
10
|
+
*/
|
|
11
|
+
export var ReasoningLevel;
|
|
12
|
+
(function (ReasoningLevel) {
|
|
13
|
+
ReasoningLevel["HIGH"] = "high";
|
|
14
|
+
ReasoningLevel["MEDIUM"] = "medium";
|
|
15
|
+
})(ReasoningLevel || (ReasoningLevel = {}));
|
|
16
|
+
const DEFAULT_CONFIG = {
|
|
17
|
+
highTemp: 0,
|
|
18
|
+
mediumTemp: 0.2,
|
|
19
|
+
planningTurns: 2,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Tracks turn context and decides the reasoning level for each step.
|
|
23
|
+
*/
|
|
24
|
+
export class ReasoningRouter {
|
|
25
|
+
config;
|
|
26
|
+
turnCount = 0;
|
|
27
|
+
lastTurnHadError = false;
|
|
28
|
+
consecutiveToolTurns = 0;
|
|
29
|
+
constructor(config) {
|
|
30
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Advances to the next turn and records the outcome of the previous one.
|
|
34
|
+
* Call exactly once per turn BEFORE querying the level for the new turn.
|
|
35
|
+
*
|
|
36
|
+
* @param hasToolCalls - Whether the previous response contained tool calls.
|
|
37
|
+
* @param hadError - Whether the previous turn resulted in an error.
|
|
38
|
+
*/
|
|
39
|
+
advanceTurn(hasToolCalls = false, hadError = false) {
|
|
40
|
+
this.turnCount++;
|
|
41
|
+
this.lastTurnHadError = hadError;
|
|
42
|
+
if (hadError) {
|
|
43
|
+
this.consecutiveToolTurns = 0;
|
|
44
|
+
}
|
|
45
|
+
else if (hasToolCalls) {
|
|
46
|
+
this.consecutiveToolTurns++;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.consecutiveToolTurns = 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Determines the reasoning level for the current turn based on state.
|
|
54
|
+
*
|
|
55
|
+
* @returns The recommended reasoning level.
|
|
56
|
+
*/
|
|
57
|
+
getLevel() {
|
|
58
|
+
// First N turns → always HIGH (planning phase)
|
|
59
|
+
if (this.turnCount <= this.config.planningTurns) {
|
|
60
|
+
return ReasoningLevel.HIGH;
|
|
61
|
+
}
|
|
62
|
+
// Post-error → HIGH (recovery)
|
|
63
|
+
if (this.lastTurnHadError) {
|
|
64
|
+
return ReasoningLevel.HIGH;
|
|
65
|
+
}
|
|
66
|
+
// Tool-heavy turn → MEDIUM (mechanical work)
|
|
67
|
+
if (this.consecutiveToolTurns > 0) {
|
|
68
|
+
return ReasoningLevel.MEDIUM;
|
|
69
|
+
}
|
|
70
|
+
// No tool calls previously (agent is thinking/planning) → HIGH
|
|
71
|
+
return ReasoningLevel.HIGH;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns the temperature setting for a given reasoning level.
|
|
75
|
+
*/
|
|
76
|
+
getTemperature(level) {
|
|
77
|
+
return level === ReasoningLevel.HIGH
|
|
78
|
+
? this.config.highTemp
|
|
79
|
+
: this.config.mediumTemp;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Convenience: get the recommended temperature for the current turn.
|
|
83
|
+
*/
|
|
84
|
+
getRecommendedTemperature() {
|
|
85
|
+
return this.getTemperature(this.getLevel());
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Returns the current turn count.
|
|
89
|
+
*/
|
|
90
|
+
getTurnCount() {
|
|
91
|
+
return this.turnCount;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resets state. For testing or new sessions.
|
|
95
|
+
*/
|
|
96
|
+
reset() {
|
|
97
|
+
this.turnCount = 0;
|
|
98
|
+
this.lastTurnHadError = false;
|
|
99
|
+
this.consecutiveToolTurns = 0;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=reasoningRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoningRouter.js","sourceRoot":"","sources":["../../src/core/reasoningRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,mCAAiB,CAAA;AACnB,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAWD,MAAM,cAAc,GAAoB;IACtC,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,GAAG;IACf,aAAa,EAAE,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAkB;IACxB,SAAS,GAAG,CAAC,CAAC;IACd,gBAAgB,GAAG,KAAK,CAAC;IACzB,oBAAoB,GAAG,CAAC,CAAC;IAEjC,YAAY,MAAiC;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,YAAY,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK;QAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QAEjC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,+CAA+C;QAC/C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAChD,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,cAAc,CAAC,IAAI,CAAC;QAC7B,CAAC;QAED,6CAA6C;QAC7C,IAAI,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,cAAc,CAAC,MAAM,CAAC;QAC/B,CAAC;QAED,+DAA+D;QAC/D,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAqB;QAClC,OAAO,KAAK,KAAK,cAAc,CAAC,IAAI;YAClC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YACtB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,yBAAyB;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { JooneError } from "./errors.js";
|
|
2
|
+
export interface RetryOptions {
|
|
3
|
+
/** Maximum number of retry attempts. Default: 3. */
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
/** Initial delay in milliseconds before the first retry. Default: 1000. */
|
|
6
|
+
initialDelayMs?: number;
|
|
7
|
+
/** Maximum jitter in milliseconds added/subtracted from each delay. Default: 500. */
|
|
8
|
+
maxJitterMs?: number;
|
|
9
|
+
/** Optional callback invoked before each retry. */
|
|
10
|
+
onRetry?: (attempt: number, error: JooneError, delayMs: number) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Executes an async function with exponential backoff retry logic.
|
|
14
|
+
*
|
|
15
|
+
* - Retries only if the caught error is a `JooneError` with `retryable === true`.
|
|
16
|
+
* - Non-retryable errors are re-thrown immediately.
|
|
17
|
+
* - Raw (non-JooneError) errors are re-thrown immediately.
|
|
18
|
+
* - Delays double with each attempt: 1s → 2s → 4s (+ random jitter).
|
|
19
|
+
*
|
|
20
|
+
* @param fn - The async function to execute.
|
|
21
|
+
* @param opts - Retry configuration.
|
|
22
|
+
* @returns The result of `fn` on success.
|
|
23
|
+
* @throws The last error encountered after all retries are exhausted, or any non-retryable error.
|
|
24
|
+
*/
|
|
25
|
+
export declare function retryWithBackoff<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { JooneError } from "./errors.js";
|
|
2
|
+
/**
|
|
3
|
+
* Executes an async function with exponential backoff retry logic.
|
|
4
|
+
*
|
|
5
|
+
* - Retries only if the caught error is a `JooneError` with `retryable === true`.
|
|
6
|
+
* - Non-retryable errors are re-thrown immediately.
|
|
7
|
+
* - Raw (non-JooneError) errors are re-thrown immediately.
|
|
8
|
+
* - Delays double with each attempt: 1s → 2s → 4s (+ random jitter).
|
|
9
|
+
*
|
|
10
|
+
* @param fn - The async function to execute.
|
|
11
|
+
* @param opts - Retry configuration.
|
|
12
|
+
* @returns The result of `fn` on success.
|
|
13
|
+
* @throws The last error encountered after all retries are exhausted, or any non-retryable error.
|
|
14
|
+
*/
|
|
15
|
+
export async function retryWithBackoff(fn, opts = {}) {
|
|
16
|
+
const { maxRetries = 3, initialDelayMs = 1000, maxJitterMs = 500, onRetry, } = opts;
|
|
17
|
+
let lastError;
|
|
18
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
19
|
+
try {
|
|
20
|
+
return await fn();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
// Only retry JooneErrors that are explicitly marked retryable
|
|
24
|
+
if (error instanceof JooneError && error.retryable) {
|
|
25
|
+
lastError = error;
|
|
26
|
+
if (attempt < maxRetries) {
|
|
27
|
+
const baseDelay = initialDelayMs * Math.pow(2, attempt);
|
|
28
|
+
const jitter = Math.floor(Math.random() * maxJitterMs * 2) - maxJitterMs;
|
|
29
|
+
const delay = Math.max(0, baseDelay + jitter);
|
|
30
|
+
if (onRetry) {
|
|
31
|
+
onRetry(attempt + 1, error, delay);
|
|
32
|
+
}
|
|
33
|
+
await sleep(delay);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Non-retryable or non-JooneError: propagate immediately
|
|
38
|
+
if (!(error instanceof JooneError) || !error.retryable) {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// All retries exhausted
|
|
44
|
+
throw lastError;
|
|
45
|
+
}
|
|
46
|
+
function sleep(ms) {
|
|
47
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/core/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAazC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,EAAoB,EACpB,OAAqB,EAAE;IAEvB,MAAM,EACF,UAAU,GAAG,CAAC,EACd,cAAc,GAAG,IAAI,EACrB,WAAW,GAAG,GAAG,EACjB,OAAO,GACV,GAAG,IAAI,CAAC;IAET,IAAI,SAAiC,CAAC;IAEtC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,8DAA8D;YAC9D,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACjD,SAAS,GAAG,KAAK,CAAC;gBAElB,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACvB,MAAM,SAAS,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;oBACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC;oBAE9C,IAAI,OAAO,EAAE,CAAC;wBACV,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBACvC,CAAC;oBAED,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;oBACnB,SAAS;gBACb,CAAC;YACL,CAAC;YAED,yDAAyD;YACzD,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrD,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAU,CAAC;AACrB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ContextState } from "./promptBuilder.js";
|
|
2
|
+
import { SessionStatePayload } from "./sessionStore.js";
|
|
3
|
+
export declare class SessionResumer {
|
|
4
|
+
private workspaceDir;
|
|
5
|
+
constructor(workspaceDir: string);
|
|
6
|
+
/**
|
|
7
|
+
* Prepares a loaded session state for execution by detecting external drift
|
|
8
|
+
* and injecting the Wakeup prompt so the LLM knows it is inside a fresh sandbox.
|
|
9
|
+
*/
|
|
10
|
+
prepareForResume(payload: SessionStatePayload): ContextState;
|
|
11
|
+
/**
|
|
12
|
+
* Analyzes the conversation history for any files the agent has interacted with.
|
|
13
|
+
* Checks their `mtime` against the session `lastSavedAt`.
|
|
14
|
+
* If the file on disk is newer, it has drifted.
|
|
15
|
+
*/
|
|
16
|
+
detectFileDrift(state: ContextState, lastSavedAt: number): string[];
|
|
17
|
+
}
|