@itphx/synth-core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/definitions/protected-paths.json +36 -0
- package/definitions/shell-policy.json +36 -0
- package/dist/definitions/protected-paths.json +36 -0
- package/dist/definitions/shell-policy.json +36 -0
- package/dist/engine/agents/definitions/admin.json +3 -1
- package/dist/engine/agents/definitions/analyst.json +3 -1
- package/dist/engine/agents/definitions/assistant.json +2 -2
- package/dist/engine/agents/definitions/auditor.json +4 -1
- package/dist/engine/agents/definitions/developer.json +4 -1
- package/dist/engine/agents/definitions/devops.json +4 -1
- package/dist/engine/agents/definitions/explore.json +3 -3
- package/dist/engine/agents/definitions/general.json +2 -2
- package/dist/engine/agents/definitions/pm.json +5 -1
- package/dist/engine/agents/definitions/qa.json +4 -1
- package/dist/engine/agents/definitions/title.json +2 -2
- package/dist/engine/agents/index.d.ts +4 -0
- package/dist/engine/agents/index.d.ts.map +1 -1
- package/dist/engine/agents/index.js +9 -3
- package/dist/engine/agents/index.js.map +1 -1
- package/dist/engine/agents/mode.d.ts +5 -3
- package/dist/engine/agents/mode.d.ts.map +1 -1
- package/dist/engine/agents/mode.js +6 -6
- package/dist/engine/agents/mode.js.map +1 -1
- package/dist/engine/agents/mode.test.js +9 -3
- package/dist/engine/agents/mode.test.js.map +1 -1
- package/dist/engine/agents/normalize.d.ts +9 -0
- package/dist/engine/agents/normalize.d.ts.map +1 -0
- package/dist/engine/agents/normalize.js +22 -0
- package/dist/engine/agents/normalize.js.map +1 -0
- package/dist/engine/agents/normalize.test.d.ts +2 -0
- package/dist/engine/agents/normalize.test.d.ts.map +1 -0
- package/dist/engine/agents/normalize.test.js +37 -0
- package/dist/engine/agents/normalize.test.js.map +1 -0
- package/dist/engine/agents/registry.d.ts +2 -1
- package/dist/engine/agents/registry.d.ts.map +1 -1
- package/dist/engine/agents/registry.js +7 -6
- package/dist/engine/agents/registry.js.map +1 -1
- package/dist/engine/agents/registry.test.js +24 -0
- package/dist/engine/agents/registry.test.js.map +1 -1
- package/dist/engine/context/config.d.ts +43 -6
- package/dist/engine/context/config.d.ts.map +1 -1
- package/dist/engine/context/config.js +123 -26
- package/dist/engine/context/config.js.map +1 -1
- package/dist/engine/context/config.security.test.d.ts +2 -0
- package/dist/engine/context/config.security.test.d.ts.map +1 -0
- package/dist/engine/context/config.security.test.js +82 -0
- package/dist/engine/context/config.security.test.js.map +1 -0
- package/dist/engine/context/config.test.js +199 -10
- package/dist/engine/context/config.test.js.map +1 -1
- package/dist/engine/context/optimizer.d.ts +20 -1
- package/dist/engine/context/optimizer.d.ts.map +1 -1
- package/dist/engine/context/optimizer.js +63 -29
- package/dist/engine/context/optimizer.js.map +1 -1
- package/dist/engine/context/optimizer.test.js +156 -0
- package/dist/engine/context/optimizer.test.js.map +1 -1
- package/dist/engine/gateway/gateway-provider.d.ts +4 -0
- package/dist/engine/gateway/gateway-provider.d.ts.map +1 -1
- package/dist/engine/gateway/gateway-provider.js +7 -2
- package/dist/engine/gateway/gateway-provider.js.map +1 -1
- package/dist/engine/gateway/gateway-provider.test.js +3 -3
- package/dist/engine/gateway/gateway-provider.test.js.map +1 -1
- package/dist/engine/gateway/input-guard.d.ts.map +1 -1
- package/dist/engine/gateway/input-guard.js +2 -1
- package/dist/engine/gateway/input-guard.js.map +1 -1
- package/dist/engine/gateway/secret-detector.d.ts.map +1 -1
- package/dist/engine/gateway/secret-detector.js +2 -3
- package/dist/engine/gateway/secret-detector.js.map +1 -1
- package/dist/engine/gateway/secret-detector.test.js +4 -4
- package/dist/engine/gateway/secret-detector.test.js.map +1 -1
- package/dist/engine/llm-error.d.ts +23 -0
- package/dist/engine/llm-error.d.ts.map +1 -0
- package/dist/engine/llm-error.js +86 -0
- package/dist/engine/llm-error.js.map +1 -0
- package/dist/engine/llm-error.test.d.ts +2 -0
- package/dist/engine/llm-error.test.d.ts.map +1 -0
- package/dist/engine/llm-error.test.js +101 -0
- package/dist/engine/llm-error.test.js.map +1 -0
- package/dist/engine/orchestrator-deny-abort.test.d.ts +2 -0
- package/dist/engine/orchestrator-deny-abort.test.d.ts.map +1 -0
- package/dist/engine/orchestrator-deny-abort.test.js +414 -0
- package/dist/engine/orchestrator-deny-abort.test.js.map +1 -0
- package/dist/engine/orchestrator-error.test.d.ts +2 -0
- package/dist/engine/orchestrator-error.test.d.ts.map +1 -0
- package/dist/engine/orchestrator-error.test.js +136 -0
- package/dist/engine/orchestrator-error.test.js.map +1 -0
- package/dist/engine/orchestrator.d.ts +123 -10
- package/dist/engine/orchestrator.d.ts.map +1 -1
- package/dist/engine/orchestrator.js +791 -181
- package/dist/engine/orchestrator.js.map +1 -1
- package/dist/engine/orchestrator.test.js +723 -0
- package/dist/engine/orchestrator.test.js.map +1 -1
- package/dist/engine/permission/approval.d.ts.map +1 -1
- package/dist/engine/permission/approval.js +29 -10
- package/dist/engine/permission/approval.js.map +1 -1
- package/dist/engine/permission/approval.test.js +57 -0
- package/dist/engine/permission/approval.test.js.map +1 -1
- package/dist/engine/permission/evaluator.d.ts +13 -0
- package/dist/engine/permission/evaluator.d.ts.map +1 -1
- package/dist/engine/permission/evaluator.js +121 -22
- package/dist/engine/permission/evaluator.js.map +1 -1
- package/dist/engine/permission/evaluator.test.js +188 -4
- package/dist/engine/permission/evaluator.test.js.map +1 -1
- package/dist/engine/permission/groups.d.ts.map +1 -1
- package/dist/engine/permission/groups.js +19 -1
- package/dist/engine/permission/groups.js.map +1 -1
- package/dist/engine/permission/integration.test.js +165 -4
- package/dist/engine/permission/integration.test.js.map +1 -1
- package/dist/engine/plan.integration.test.js +142 -33
- package/dist/engine/plan.integration.test.js.map +1 -1
- package/dist/engine/router/micro/tasks/classify-intent.d.ts.map +1 -1
- package/dist/engine/router/micro/tasks/classify-intent.js +24 -18
- package/dist/engine/router/micro/tasks/classify-intent.js.map +1 -1
- package/dist/engine/router/micro/tasks/classify-intent.test.js +4 -4
- package/dist/engine/router/micro/tasks/classify-intent.test.js.map +1 -1
- package/dist/engine/router/micro/tasks/enum-decision.d.ts.map +1 -1
- package/dist/engine/router/micro/tasks/enum-decision.js +14 -8
- package/dist/engine/router/micro/tasks/enum-decision.js.map +1 -1
- package/dist/engine/router/micro/tasks/enum-decision.test.js +2 -2
- package/dist/engine/router/micro/tasks/enum-decision.test.js.map +1 -1
- package/dist/engine/router/micro/tasks/small-talk.d.ts.map +1 -1
- package/dist/engine/router/micro/tasks/small-talk.js +20 -17
- package/dist/engine/router/micro/tasks/small-talk.js.map +1 -1
- package/dist/engine/router/micro/types.d.ts +2 -0
- package/dist/engine/router/micro/types.d.ts.map +1 -1
- package/dist/engine/router/provider-pool.d.ts +2 -2
- package/dist/engine/router/provider-pool.d.ts.map +1 -1
- package/dist/engine/router/provider-pool.js +5 -3
- package/dist/engine/router/provider-pool.js.map +1 -1
- package/dist/engine/router/quality-checker.d.ts.map +1 -1
- package/dist/engine/router/quality-checker.js +15 -14
- package/dist/engine/router/quality-checker.js.map +1 -1
- package/dist/engine/router/router.d.ts +2 -2
- package/dist/engine/router/router.d.ts.map +1 -1
- package/dist/engine/router/router.js +8 -5
- package/dist/engine/router/router.js.map +1 -1
- package/dist/engine/router/utils.d.ts +2 -2
- package/dist/engine/router/utils.d.ts.map +1 -1
- package/dist/engine/router/utils.js +2 -1
- package/dist/engine/router/utils.js.map +1 -1
- package/dist/engine/security/index.d.ts +6 -0
- package/dist/engine/security/index.d.ts.map +1 -1
- package/dist/engine/security/index.js +3 -0
- package/dist/engine/security/index.js.map +1 -1
- package/dist/engine/security/integration.test.js +11 -11
- package/dist/engine/security/integration.test.js.map +1 -1
- package/dist/engine/security/prompt-injection.d.ts +1 -1
- package/dist/engine/security/prompt-injection.d.ts.map +1 -1
- package/dist/engine/security/prompt-injection.js +2 -1
- package/dist/engine/security/prompt-injection.js.map +1 -1
- package/dist/engine/security/prompt-injection.test.js +1 -1
- package/dist/engine/security/prompt-injection.test.js.map +1 -1
- package/dist/engine/security/protected-paths-store.d.ts +56 -0
- package/dist/engine/security/protected-paths-store.d.ts.map +1 -0
- package/dist/engine/security/protected-paths-store.js +239 -0
- package/dist/engine/security/protected-paths-store.js.map +1 -0
- package/dist/engine/security/protected-paths.d.ts +54 -0
- package/dist/engine/security/protected-paths.d.ts.map +1 -0
- package/dist/engine/security/protected-paths.js +193 -0
- package/dist/engine/security/protected-paths.js.map +1 -0
- package/dist/engine/security/protected-paths.test.d.ts +2 -0
- package/dist/engine/security/protected-paths.test.d.ts.map +1 -0
- package/dist/engine/security/protected-paths.test.js +166 -0
- package/dist/engine/security/protected-paths.test.js.map +1 -0
- package/dist/engine/security/shell-guard.d.ts +117 -0
- package/dist/engine/security/shell-guard.d.ts.map +1 -0
- package/dist/engine/security/shell-guard.js +578 -0
- package/dist/engine/security/shell-guard.js.map +1 -0
- package/dist/engine/security/shell-guard.test.d.ts +2 -0
- package/dist/engine/security/shell-guard.test.d.ts.map +1 -0
- package/dist/engine/security/shell-guard.test.js +378 -0
- package/dist/engine/security/shell-guard.test.js.map +1 -0
- package/dist/engine/system-messages.d.ts +237 -0
- package/dist/engine/system-messages.d.ts.map +1 -0
- package/dist/engine/system-messages.js +276 -0
- package/dist/engine/system-messages.js.map +1 -0
- package/dist/engine/system-messages.test.d.ts +2 -0
- package/dist/engine/system-messages.test.d.ts.map +1 -0
- package/dist/engine/system-messages.test.js +81 -0
- package/dist/engine/system-messages.test.js.map +1 -0
- package/dist/engine/tools/abort.d.ts +21 -0
- package/dist/engine/tools/abort.d.ts.map +1 -0
- package/dist/engine/tools/abort.js +44 -0
- package/dist/engine/tools/abort.js.map +1 -0
- package/dist/engine/tools/classify-conversation.d.ts.map +1 -1
- package/dist/engine/tools/classify-conversation.js +7 -2
- package/dist/engine/tools/classify-conversation.js.map +1 -1
- package/dist/engine/tools/fs-read.d.ts.map +1 -1
- package/dist/engine/tools/fs-read.js +17 -6
- package/dist/engine/tools/fs-read.js.map +1 -1
- package/dist/engine/tools/fs-read.test.js +43 -0
- package/dist/engine/tools/fs-read.test.js.map +1 -1
- package/dist/engine/tools/fs-write.d.ts.map +1 -1
- package/dist/engine/tools/fs-write.js +47 -17
- package/dist/engine/tools/fs-write.js.map +1 -1
- package/dist/engine/tools/git.d.ts +2 -1
- package/dist/engine/tools/git.d.ts.map +1 -1
- package/dist/engine/tools/git.js +85 -17
- package/dist/engine/tools/git.js.map +1 -1
- package/dist/engine/tools/git.test.js +39 -0
- package/dist/engine/tools/git.test.js.map +1 -1
- package/dist/engine/tools/index.d.ts.map +1 -1
- package/dist/engine/tools/index.js +16 -2
- package/dist/engine/tools/index.js.map +1 -1
- package/dist/engine/tools/json-schema.js +38 -0
- package/dist/engine/tools/json-schema.js.map +1 -1
- package/dist/engine/tools/json-schema.test.d.ts +2 -0
- package/dist/engine/tools/json-schema.test.d.ts.map +1 -0
- package/dist/engine/tools/json-schema.test.js +40 -0
- package/dist/engine/tools/json-schema.test.js.map +1 -0
- package/dist/engine/tools/path-utils.d.ts.map +1 -1
- package/dist/engine/tools/path-utils.js +24 -0
- package/dist/engine/tools/path-utils.js.map +1 -1
- package/dist/engine/tools/path-utils.test.js +15 -0
- package/dist/engine/tools/path-utils.test.js.map +1 -1
- package/dist/engine/tools/plan.d.ts +11 -3
- package/dist/engine/tools/plan.d.ts.map +1 -1
- package/dist/engine/tools/plan.js +326 -95
- package/dist/engine/tools/plan.js.map +1 -1
- package/dist/engine/tools/plan.test.js +161 -47
- package/dist/engine/tools/plan.test.js.map +1 -1
- package/dist/engine/tools/project-context.d.ts.map +1 -1
- package/dist/engine/tools/project-context.js +54 -42
- package/dist/engine/tools/project-context.js.map +1 -1
- package/dist/engine/tools/project-context.test.js +37 -22
- package/dist/engine/tools/project-context.test.js.map +1 -1
- package/dist/engine/tools/project-manage.d.ts +24 -0
- package/dist/engine/tools/project-manage.d.ts.map +1 -0
- package/dist/engine/tools/project-manage.js +311 -0
- package/dist/engine/tools/project-manage.js.map +1 -0
- package/dist/engine/tools/project-manage.test.d.ts +2 -0
- package/dist/engine/tools/project-manage.test.d.ts.map +1 -0
- package/dist/engine/tools/project-manage.test.js +196 -0
- package/dist/engine/tools/project-manage.test.js.map +1 -0
- package/dist/engine/tools/read-reference.d.ts.map +1 -1
- package/dist/engine/tools/read-reference.js +10 -5
- package/dist/engine/tools/read-reference.js.map +1 -1
- package/dist/engine/tools/read-reference.test.js +5 -2
- package/dist/engine/tools/read-reference.test.js.map +1 -1
- package/dist/engine/tools/search.d.ts.map +1 -1
- package/dist/engine/tools/search.js +16 -6
- package/dist/engine/tools/search.js.map +1 -1
- package/dist/engine/tools/shell.d.ts.map +1 -1
- package/dist/engine/tools/shell.js +17 -4
- package/dist/engine/tools/shell.js.map +1 -1
- package/dist/engine/tools/shell.test.js +63 -1
- package/dist/engine/tools/shell.test.js.map +1 -1
- package/dist/engine/tools/task-resume.d.ts +93 -0
- package/dist/engine/tools/task-resume.d.ts.map +1 -0
- package/dist/engine/tools/task-resume.js +269 -0
- package/dist/engine/tools/task-resume.js.map +1 -0
- package/dist/engine/tools/task-resume.test.d.ts +2 -0
- package/dist/engine/tools/task-resume.test.d.ts.map +1 -0
- package/dist/engine/tools/task-resume.test.js +423 -0
- package/dist/engine/tools/task-resume.test.js.map +1 -0
- package/dist/engine/tools/task.d.ts +81 -2
- package/dist/engine/tools/task.d.ts.map +1 -1
- package/dist/engine/tools/task.js +898 -471
- package/dist/engine/tools/task.js.map +1 -1
- package/dist/engine/tools/task.test.js +371 -3
- package/dist/engine/tools/task.test.js.map +1 -1
- package/dist/engine/tools/todo.d.ts +27 -1
- package/dist/engine/tools/todo.d.ts.map +1 -1
- package/dist/engine/tools/todo.js +320 -14
- package/dist/engine/tools/todo.js.map +1 -1
- package/dist/engine/tools/todo.test.js +150 -48
- package/dist/engine/tools/todo.test.js.map +1 -1
- package/dist/engine/tools/web.d.ts.map +1 -1
- package/dist/engine/tools/web.js +65 -18
- package/dist/engine/tools/web.js.map +1 -1
- package/dist/engine/tools/web.test.js +94 -2
- package/dist/engine/tools/web.test.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +0 -1
- package/dist/logger.js.map +1 -1
- package/dist/main.js +3 -2
- package/dist/main.js.map +1 -1
- package/dist/prompts/roles/ADMIN.en.md +12 -11
- package/dist/prompts/roles/ADMIN.ru.md +12 -11
- package/dist/prompts/roles/ANALYST.en.md +12 -11
- package/dist/prompts/roles/ANALYST.ru.md +12 -11
- package/dist/prompts/roles/ASSISTANT.en.md +12 -11
- package/dist/prompts/roles/ASSISTANT.ru.md +12 -11
- package/dist/prompts/roles/AUDITOR.en.md +12 -11
- package/dist/prompts/roles/AUDITOR.ru.md +12 -11
- package/dist/prompts/roles/DEVELOPER.en.md +12 -11
- package/dist/prompts/roles/DEVELOPER.ru.md +12 -11
- package/dist/prompts/roles/DEVOPS.en.md +12 -11
- package/dist/prompts/roles/DEVOPS.ru.md +12 -11
- package/dist/prompts/roles/PM.en.md +12 -11
- package/dist/prompts/roles/PM.ru.md +12 -11
- package/dist/prompts/roles/QA.en.md +12 -11
- package/dist/prompts/roles/QA.ru.md +12 -11
- package/dist/prompts/roles/TITLE.en.md +30 -0
- package/dist/prompts/roles/TITLE.ru.md +3 -11
- package/dist/prompts/security/ask-protected-path.en.md +1 -0
- package/dist/prompts/security/ask-protected-path.ru.md +1 -0
- package/dist/prompts/security/deny-command.en.md +1 -0
- package/dist/prompts/security/deny-command.ru.md +1 -0
- package/dist/prompts/security/deny-protected-dir.en.md +1 -0
- package/dist/prompts/security/deny-protected-dir.ru.md +1 -0
- package/dist/prompts/security/deny-protected-path.en.md +1 -0
- package/dist/prompts/security/deny-protected-path.ru.md +1 -0
- package/dist/prompts/subagents/explore.en.md +23 -0
- package/dist/prompts/subagents/general.en.md +19 -0
- package/dist/prompts/system/MODE_ACT.en.md +20 -0
- package/{prompts/modes/act.md → dist/prompts/system/MODE_ACT.ru.md} +2 -0
- package/dist/prompts/system/MODE_PLAN.en.md +22 -0
- package/dist/prompts/{modes/plan.md → system/MODE_PLAN.ru.md} +4 -3
- package/dist/prompts/system/MODE_YOLO.en.md +22 -0
- package/{prompts/modes/yolo.md → dist/prompts/system/MODE_YOLO.ru.md} +2 -0
- package/dist/prompts/system/PLAN_GUIDE.en.md +36 -0
- package/dist/prompts/system/PLAN_GUIDE.ru.md +33 -0
- package/dist/prompts/system/PLAN_MODE_AUTO.en.md +11 -0
- package/dist/prompts/system/PLAN_MODE_AUTO.ru.md +12 -0
- package/dist/prompts/system/PLAN_MODE_STRICT_APPROVED.en.md +8 -0
- package/dist/prompts/system/PLAN_MODE_STRICT_APPROVED.ru.md +8 -0
- package/dist/prompts/system/PLAN_MODE_STRICT_NOT_APPROVED.en.md +7 -0
- package/dist/prompts/system/PLAN_MODE_STRICT_NOT_APPROVED.ru.md +7 -0
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +28 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/base.d.ts +20 -1
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +17 -0
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/exceptions.d.ts.map +1 -1
- package/dist/providers/exceptions.js +3 -2
- package/dist/providers/exceptions.js.map +1 -1
- package/dist/providers/ollama.d.ts +23 -0
- package/dist/providers/ollama.d.ts.map +1 -1
- package/dist/providers/ollama.js +128 -12
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/ollama.test.d.ts +2 -0
- package/dist/providers/ollama.test.d.ts.map +1 -0
- package/dist/providers/ollama.test.js +129 -0
- package/dist/providers/ollama.test.js.map +1 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +82 -9
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openai.test.d.ts +2 -0
- package/dist/providers/openai.test.d.ts.map +1 -0
- package/dist/providers/openai.test.js +84 -0
- package/dist/providers/openai.test.js.map +1 -0
- package/dist/providers/stream-error.test.d.ts +2 -0
- package/dist/providers/stream-error.test.d.ts.map +1 -0
- package/dist/providers/stream-error.test.js +63 -0
- package/dist/providers/stream-error.test.js.map +1 -0
- package/dist/providers/timeout.test.d.ts +2 -0
- package/dist/providers/timeout.test.d.ts.map +1 -0
- package/dist/providers/timeout.test.js +129 -0
- package/dist/providers/timeout.test.js.map +1 -0
- package/dist/queue/processor.d.ts +22 -0
- package/dist/queue/processor.d.ts.map +1 -1
- package/dist/queue/processor.js +150 -25
- package/dist/queue/processor.js.map +1 -1
- package/dist/queue/processor.test.d.ts +2 -0
- package/dist/queue/processor.test.d.ts.map +1 -0
- package/dist/queue/processor.test.js +211 -0
- package/dist/queue/processor.test.js.map +1 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +30 -8
- package/dist/server/app.js.map +1 -1
- package/dist/server/chat.d.ts.map +1 -1
- package/dist/server/chat.js +18 -2
- package/dist/server/chat.js.map +1 -1
- package/dist/server/routes/agents.d.ts.map +1 -1
- package/dist/server/routes/agents.js +39 -23
- package/dist/server/routes/agents.js.map +1 -1
- package/dist/server/routes/fs.d.ts.map +1 -1
- package/dist/server/routes/fs.js +185 -6
- package/dist/server/routes/fs.js.map +1 -1
- package/dist/server/routes/models.d.ts.map +1 -1
- package/dist/server/routes/models.js +3 -1
- package/dist/server/routes/models.js.map +1 -1
- package/dist/server/routes/queue.d.ts.map +1 -1
- package/dist/server/routes/queue.js +91 -17
- package/dist/server/routes/queue.js.map +1 -1
- package/dist/server/routes/sessions.d.ts +2 -1
- package/dist/server/routes/sessions.d.ts.map +1 -1
- package/dist/server/routes/sessions.js +68 -10
- package/dist/server/routes/sessions.js.map +1 -1
- package/dist/server/routes/sessions.test.js +102 -2
- package/dist/server/routes/sessions.test.js.map +1 -1
- package/dist/server/routes/settings.d.ts +6 -1
- package/dist/server/routes/settings.d.ts.map +1 -1
- package/dist/server/routes/settings.js +138 -0
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/settings.test.js +65 -1
- package/dist/server/routes/settings.test.js.map +1 -1
- package/dist/server/serialize.d.ts +9 -3
- package/dist/server/serialize.d.ts.map +1 -1
- package/dist/server/serialize.js +9 -3
- package/dist/server/serialize.js.map +1 -1
- package/dist/sessions/auto-title.d.ts +1 -1
- package/dist/sessions/auto-title.d.ts.map +1 -1
- package/dist/sessions/auto-title.js +24 -13
- package/dist/sessions/auto-title.js.map +1 -1
- package/dist/sessions/manager.d.ts +1 -2
- package/dist/sessions/manager.d.ts.map +1 -1
- package/dist/sessions/manager.js +11 -36
- package/dist/sessions/manager.js.map +1 -1
- package/dist/sessions/manager.test.js +2 -10
- package/dist/sessions/manager.test.js.map +1 -1
- package/dist/storage/file-store.d.ts.map +1 -1
- package/dist/storage/file-store.js +2 -6
- package/dist/storage/file-store.js.map +1 -1
- package/dist/storage/file-store.test.js +1 -6
- package/dist/storage/file-store.test.js.map +1 -1
- package/dist/storage/project-store.d.ts.map +1 -1
- package/dist/storage/project-store.js +12 -0
- package/dist/storage/project-store.js.map +1 -1
- package/dist/storage/runtime-settings.d.ts +25 -1
- package/dist/storage/runtime-settings.d.ts.map +1 -1
- package/dist/storage/runtime-settings.js +31 -0
- package/dist/storage/runtime-settings.js.map +1 -1
- package/package.json +6 -5
- package/prompts/roles/TITLE.en.md +30 -0
- package/prompts/security/ask-protected-path.en.md +1 -0
- package/prompts/security/ask-protected-path.ru.md +1 -0
- package/prompts/security/deny-command.en.md +1 -0
- package/prompts/security/deny-command.ru.md +1 -0
- package/prompts/security/deny-protected-dir.en.md +1 -0
- package/prompts/security/deny-protected-dir.ru.md +1 -0
- package/prompts/security/deny-protected-path.en.md +1 -0
- package/prompts/security/deny-protected-path.ru.md +1 -0
- package/prompts/subagents/explore.en.md +23 -0
- package/prompts/subagents/general.en.md +19 -0
- package/prompts/system/MODE_ACT.en.md +20 -0
- package/{dist/prompts/modes/act.md → prompts/system/MODE_ACT.ru.md} +2 -0
- package/prompts/system/MODE_PLAN.en.md +22 -0
- package/{dist/prompts/prompts/modes/plan.md → prompts/system/MODE_PLAN.ru.md} +4 -3
- package/prompts/system/MODE_YOLO.en.md +22 -0
- package/{dist/prompts/prompts/modes/yolo.md → prompts/system/MODE_YOLO.ru.md} +2 -0
- package/prompts/system/PLAN_GUIDE.en.md +36 -0
- package/prompts/system/PLAN_GUIDE.ru.md +33 -0
- package/prompts/system/PLAN_MODE_AUTO.en.md +11 -0
- package/prompts/system/PLAN_MODE_AUTO.ru.md +12 -0
- package/prompts/system/PLAN_MODE_STRICT_APPROVED.en.md +8 -0
- package/prompts/system/PLAN_MODE_STRICT_APPROVED.ru.md +8 -0
- package/prompts/system/PLAN_MODE_STRICT_NOT_APPROVED.en.md +7 -0
- package/prompts/system/PLAN_MODE_STRICT_NOT_APPROVED.ru.md +7 -0
- package/dist/dictionaries/dictionaries/coding.en.yaml +0 -20
- package/dist/dictionaries/dictionaries/coding.ru.yaml +0 -22
- package/dist/dictionaries/dictionaries/coding.tools.yaml +0 -12
- package/dist/dictionaries/dictionaries/enum.en.yaml +0 -54
- package/dist/dictionaries/dictionaries/enum.ru.yaml +0 -67
- package/dist/dictionaries/dictionaries/injection.en.yaml +0 -51
- package/dist/dictionaries/dictionaries/injection.ru.yaml +0 -51
- package/dist/dictionaries/dictionaries/intents.en.yaml +0 -68
- package/dist/dictionaries/dictionaries/intents.ru.yaml +0 -78
- package/dist/dictionaries/dictionaries/research.en.yaml +0 -17
- package/dist/dictionaries/dictionaries/research.ru.yaml +0 -17
- package/dist/dictionaries/dictionaries/small-talk.en.yaml +0 -67
- package/dist/dictionaries/dictionaries/small-talk.ru.yaml +0 -81
- package/dist/prompts/modes/yolo.md +0 -20
- package/dist/prompts/prompts/modes/act.md +0 -18
- package/dist/prompts/prompts/roles/ADMIN.en.md +0 -33
- package/dist/prompts/prompts/roles/ADMIN.ru.md +0 -33
- package/dist/prompts/prompts/roles/ANALYST.en.md +0 -33
- package/dist/prompts/prompts/roles/ANALYST.ru.md +0 -33
- package/dist/prompts/prompts/roles/ASSISTANT.en.md +0 -38
- package/dist/prompts/prompts/roles/ASSISTANT.ru.md +0 -38
- package/dist/prompts/prompts/roles/AUDITOR.en.md +0 -33
- package/dist/prompts/prompts/roles/AUDITOR.ru.md +0 -33
- package/dist/prompts/prompts/roles/DEVELOPER.en.md +0 -42
- package/dist/prompts/prompts/roles/DEVELOPER.ru.md +0 -42
- package/dist/prompts/prompts/roles/DEVOPS.en.md +0 -35
- package/dist/prompts/prompts/roles/DEVOPS.ru.md +0 -35
- package/dist/prompts/prompts/roles/PM.en.md +0 -33
- package/dist/prompts/prompts/roles/PM.ru.md +0 -33
- package/dist/prompts/prompts/roles/QA.en.md +0 -33
- package/dist/prompts/prompts/roles/QA.ru.md +0 -33
- package/dist/prompts/prompts/roles/TITLE.ru.md +0 -30
- package/dist/prompts/prompts/subagents/explore.ru.md +0 -23
- package/dist/prompts/prompts/subagents/general.ru.md +0 -19
- package/dist/prompts/prompts/system/COMPRESSED_DIALOG.en.md +0 -5
- package/dist/prompts/prompts/system/COMPRESSED_DIALOG.ru.md +0 -5
- package/dist/prompts/prompts/system/INTERVIEW.en.md +0 -18
- package/dist/prompts/prompts/system/INTERVIEW.ru.md +0 -18
- package/dist/prompts/prompts/system/PARTICIPANTS_NOTICE.en.md +0 -7
- package/dist/prompts/prompts/system/PARTICIPANTS_NOTICE.ru.md +0 -7
- package/dist/prompts/prompts/system/ROLES_DESCRIPTION.en.md +0 -16
- package/dist/prompts/prompts/system/ROLES_DESCRIPTION.ru.md +0 -16
- package/dist/prompts/prompts/system/ROUTING.en.md +0 -13
- package/dist/prompts/prompts/system/ROUTING.md +0 -6
- package/dist/prompts/prompts/system/ROUTING.ru.md +0 -13
- package/dist/prompts/prompts/system/RULES.en.md +0 -10
- package/dist/prompts/prompts/system/RULES.md +0 -10
- package/dist/prompts/prompts/system/RULES.ru.md +0 -10
- package/dist/prompts/prompts/system/STICKY_NOTES.en.md +0 -6
- package/dist/prompts/prompts/system/STICKY_NOTES.ru.md +0 -6
- package/dist/prompts/prompts/system/SUMMARIZER.en.md +0 -54
- package/dist/prompts/prompts/system/SUMMARIZER.ru.md +0 -54
- package/dist/prompts/prompts/system/USER_CONTEXT.en.md +0 -5
- package/dist/prompts/prompts/system/USER_CONTEXT.ru.md +0 -5
- package/dist/prompts/system/ROUTING.md +0 -6
- package/dist/prompts/system/RULES.md +0 -10
- package/dist/server/routes/i18n.d.ts +0 -3
- package/dist/server/routes/i18n.d.ts.map +0 -1
- package/dist/server/routes/i18n.js +0 -83
- package/dist/server/routes/i18n.js.map +0 -1
- package/prompts/modes/plan.md +0 -20
- package/prompts/system/ROUTING.md +0 -6
- package/prompts/system/RULES.md +0 -10
- /package/dist/prompts/{prompts/system → system}/GATEWAY.en.md +0 -0
- /package/dist/prompts/{prompts/system → system}/GATEWAY.ru.md +0 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { taskTool } from './task.js';
|
|
6
|
+
import { runSubagentResume, validateSubagentResume, } from './task-resume.js';
|
|
7
|
+
import { ChatOrchestrator } from '../orchestrator.js';
|
|
8
|
+
import { SessionManager } from '../../sessions/manager.js';
|
|
9
|
+
import { FileStore } from '../../storage/file-store.js';
|
|
10
|
+
import { EventBus } from '../../events/bus.js';
|
|
11
|
+
import { createToolRegistry } from './index.js';
|
|
12
|
+
import { BaseProvider, ProviderFactory } from '../../providers/base.js';
|
|
13
|
+
import { MessageRole, generateId, makeTextPart, nowISO } from '@itphx/synth-shared';
|
|
14
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
15
|
+
// B1: Retry саб-агента при ошибках провайдера (taskTool)
|
|
16
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
17
|
+
function makeMockAgentRegistry() {
|
|
18
|
+
return {
|
|
19
|
+
get: (id) => {
|
|
20
|
+
if (id === 'explore') {
|
|
21
|
+
return { id, agentMode: ['subagent'], subagentPrompt: 'You are a test subagent.', maxSteps: 1 };
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
},
|
|
25
|
+
getSubagents: () => [{ id: 'explore' }],
|
|
26
|
+
getToolsForAgent: () => [],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
describe('taskTool retry — recoverable/unrecoverable/abort (B1)', () => {
|
|
30
|
+
let store;
|
|
31
|
+
let sessionManager;
|
|
32
|
+
let eventBus;
|
|
33
|
+
let tmpDir;
|
|
34
|
+
beforeEach(async () => {
|
|
35
|
+
tmpDir = await mkdtemp(join(tmpdir(), 'synth-task-retry-'));
|
|
36
|
+
store = new FileStore({ dataDir: tmpDir });
|
|
37
|
+
sessionManager = new SessionManager(store);
|
|
38
|
+
eventBus = new EventBus();
|
|
39
|
+
});
|
|
40
|
+
afterEach(async () => {
|
|
41
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
42
|
+
});
|
|
43
|
+
const FAST_RETRY = { maxRetries: 3, delaysMs: [10, 10, 10] };
|
|
44
|
+
function makeCtx(extra, abortSignal) {
|
|
45
|
+
return {
|
|
46
|
+
sessionId: 's',
|
|
47
|
+
messageId: 'm1',
|
|
48
|
+
abortSignal: abortSignal ?? new AbortController().signal,
|
|
49
|
+
workingDir: tmpDir,
|
|
50
|
+
extra,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
it('recoverable ошибка: успех на 2-й попытке, tool_result нормальный, публикуется subagent.retry', async () => {
|
|
54
|
+
const parent = await sessionManager.createSession({ title: 'Parent' });
|
|
55
|
+
let calls = 0;
|
|
56
|
+
const provider = {
|
|
57
|
+
model: 'test-model',
|
|
58
|
+
name: 'test-provider',
|
|
59
|
+
chatAsync: vi.fn().mockImplementation(async function* () {
|
|
60
|
+
calls++;
|
|
61
|
+
if (calls === 1)
|
|
62
|
+
throw new Error('fetch failed: ECONNREFUSED');
|
|
63
|
+
yield { isFinal: true, content: 'готово со второй попытки', toolCalls: [] };
|
|
64
|
+
}),
|
|
65
|
+
};
|
|
66
|
+
const events = [];
|
|
67
|
+
const result = await taskTool.execute({ description: 'flaky', prompt: 'hello', subagent_type: 'explore' }, makeCtx({
|
|
68
|
+
provider,
|
|
69
|
+
sessionManager,
|
|
70
|
+
eventBus,
|
|
71
|
+
sessionId: parent.id,
|
|
72
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
73
|
+
retry: FAST_RETRY,
|
|
74
|
+
publish: (type, data) => events.push({ type, data }),
|
|
75
|
+
}));
|
|
76
|
+
expect(result.isError).toBeFalsy();
|
|
77
|
+
expect(result.content).toContain('готово со второй попытки');
|
|
78
|
+
expect(provider.chatAsync).toHaveBeenCalledTimes(2);
|
|
79
|
+
const retryEvent = events.find((e) => e.type === 'subagent.retry');
|
|
80
|
+
expect(retryEvent).toBeDefined();
|
|
81
|
+
expect(retryEvent.data.attempt).toBe(1);
|
|
82
|
+
expect(retryEvent.data.max_retries).toBe(3);
|
|
83
|
+
expect(retryEvent.data.retry_in).toBe(10);
|
|
84
|
+
expect(retryEvent.data.error_type).toBe('network_error');
|
|
85
|
+
expect(retryEvent.data.child_session_id).toBe(result.metadata.child_session_id);
|
|
86
|
+
// Мусорных ERROR-сообщений в истории дочерней сессии нет — только финал
|
|
87
|
+
const childId = result.metadata.child_session_id;
|
|
88
|
+
const child = (await sessionManager.getSession(childId));
|
|
89
|
+
expect(child.messages.some((m) => m.metadata?.error === true)).toBe(false);
|
|
90
|
+
expect(child.messages.some((m) => m.role === MessageRole.ASSISTANT && m.content.includes('готово со второй'))).toBe(true);
|
|
91
|
+
});
|
|
92
|
+
it('исчерпание ретраев: isError + metadata.attempts=3, две публикации subagent.retry, ERROR в истории ребёнка один', async () => {
|
|
93
|
+
const parent = await sessionManager.createSession({ title: 'Parent' });
|
|
94
|
+
const provider = {
|
|
95
|
+
model: 'test-model',
|
|
96
|
+
name: 'test-provider',
|
|
97
|
+
chatAsync: vi.fn().mockImplementation(async function* () {
|
|
98
|
+
yield { isFinal: false, content: '' };
|
|
99
|
+
throw new Error('503 Service Unavailable');
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
const events = [];
|
|
103
|
+
const result = await taskTool.execute({ description: 'down', prompt: 'hello', subagent_type: 'explore' }, makeCtx({
|
|
104
|
+
provider,
|
|
105
|
+
sessionManager,
|
|
106
|
+
eventBus,
|
|
107
|
+
sessionId: parent.id,
|
|
108
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
109
|
+
retry: FAST_RETRY,
|
|
110
|
+
publish: (type, data) => events.push({ type, data }),
|
|
111
|
+
}));
|
|
112
|
+
expect(result.isError).toBe(true);
|
|
113
|
+
expect(provider.chatAsync).toHaveBeenCalledTimes(3);
|
|
114
|
+
expect(result.content).toContain('<attempts>3</attempts>');
|
|
115
|
+
expect(result.metadata.attempts).toBe(3);
|
|
116
|
+
expect(result.metadata.max_retries).toBe(3);
|
|
117
|
+
expect(result.metadata.error_type).toBe('server_error');
|
|
118
|
+
const retryEvents = events.filter((e) => e.type === 'subagent.retry');
|
|
119
|
+
expect(retryEvents).toHaveLength(2);
|
|
120
|
+
expect(retryEvents.map((e) => e.data.attempt)).toEqual([1, 2]);
|
|
121
|
+
const childId = result.metadata.child_session_id;
|
|
122
|
+
const child = (await sessionManager.getSession(childId));
|
|
123
|
+
const errors = child.messages.filter((m) => m.metadata?.error === true);
|
|
124
|
+
expect(errors).toHaveLength(1);
|
|
125
|
+
expect(errors[0].metadata.attempts).toBe(3);
|
|
126
|
+
});
|
|
127
|
+
it('unrecoverable ошибка (invalid api key): сразу финал, без ретраев и subagent.retry', async () => {
|
|
128
|
+
const parent = await sessionManager.createSession({ title: 'Parent' });
|
|
129
|
+
const provider = {
|
|
130
|
+
model: 'test-model',
|
|
131
|
+
name: 'test-provider',
|
|
132
|
+
chatAsync: vi.fn().mockImplementation(async function* () {
|
|
133
|
+
yield { isFinal: false, content: '' };
|
|
134
|
+
throw new Error('401 Unauthorized: invalid api key');
|
|
135
|
+
}),
|
|
136
|
+
};
|
|
137
|
+
const events = [];
|
|
138
|
+
const result = await taskTool.execute({ description: 'auth', prompt: 'hello', subagent_type: 'explore' }, makeCtx({
|
|
139
|
+
provider,
|
|
140
|
+
sessionManager,
|
|
141
|
+
eventBus,
|
|
142
|
+
sessionId: parent.id,
|
|
143
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
144
|
+
retry: FAST_RETRY,
|
|
145
|
+
publish: (type, data) => events.push({ type, data }),
|
|
146
|
+
}));
|
|
147
|
+
expect(result.isError).toBe(true);
|
|
148
|
+
expect(provider.chatAsync).toHaveBeenCalledTimes(1);
|
|
149
|
+
expect(events.filter((e) => e.type === 'subagent.retry')).toHaveLength(0);
|
|
150
|
+
expect(result.metadata.attempts).toBe(1);
|
|
151
|
+
expect(result.metadata.error_type).toBe('auth_error');
|
|
152
|
+
expect(result.content).toContain('<attempts>1</attempts>');
|
|
153
|
+
});
|
|
154
|
+
it('abort во время backoff-паузы: отмена без второй попытки, tool_result — stopped_by_user', async () => {
|
|
155
|
+
const parent = await sessionManager.createSession({ title: 'Parent' });
|
|
156
|
+
const provider = {
|
|
157
|
+
model: 'test-model',
|
|
158
|
+
name: 'test-provider',
|
|
159
|
+
chatAsync: vi.fn().mockImplementation(async function* () {
|
|
160
|
+
yield { isFinal: false, content: 'частичный текст до падения ' };
|
|
161
|
+
throw new Error('network error: connection reset');
|
|
162
|
+
}),
|
|
163
|
+
};
|
|
164
|
+
const ac = new AbortController();
|
|
165
|
+
const events = [];
|
|
166
|
+
const promise = taskTool.execute({ description: 'slow retry', prompt: 'hello', subagent_type: 'explore' }, makeCtx({
|
|
167
|
+
provider,
|
|
168
|
+
sessionManager,
|
|
169
|
+
eventBus,
|
|
170
|
+
sessionId: parent.id,
|
|
171
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
172
|
+
// Длинная backoff-пауза — отмена должна прервать её, не дожидаясь
|
|
173
|
+
retry: { maxRetries: 3, delaysMs: [10_000, 10_000, 10_000] },
|
|
174
|
+
publish: (type, data) => events.push({ type, data }),
|
|
175
|
+
}, ac.signal));
|
|
176
|
+
// Ждём публикации subagent.retry (начался backoff), затем «Стоп»
|
|
177
|
+
await vi.waitFor(() => {
|
|
178
|
+
expect(events.some((e) => e.type === 'subagent.retry')).toBe(true);
|
|
179
|
+
}, { timeout: 3000 });
|
|
180
|
+
ac.abort();
|
|
181
|
+
const result = await promise;
|
|
182
|
+
expect(provider.chatAsync).toHaveBeenCalledTimes(1);
|
|
183
|
+
expect(result.isError).toBeFalsy();
|
|
184
|
+
expect(result.content).toContain('<status>stopped_by_user</status>');
|
|
185
|
+
expect(result.metadata.stopped_by).toBe('user');
|
|
186
|
+
expect(result.metadata.interrupted).toBe(true);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
190
|
+
// B2: Resume прерванной/ошибочной дочерней сессии
|
|
191
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
192
|
+
/** Успешный провайдер для resume: финальный ответ без tool-calls. */
|
|
193
|
+
class MockResumeOkProvider extends BaseProvider {
|
|
194
|
+
constructor() {
|
|
195
|
+
super({ url: '', apiKey: '', model: 'm', name: 'mockres', type: 'mockres' });
|
|
196
|
+
}
|
|
197
|
+
async chat() {
|
|
198
|
+
return { content: 'RESUMED OK', model: this.model, usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 } };
|
|
199
|
+
}
|
|
200
|
+
async *chatAsync() {
|
|
201
|
+
yield { isFinal: true, content: 'RESUMED OK', toolCalls: [] };
|
|
202
|
+
}
|
|
203
|
+
getProviderName() { return 'mockres'; }
|
|
204
|
+
}
|
|
205
|
+
/** Медленный провайдер: висит в стриме, пока не отменят. */
|
|
206
|
+
class MockResumeSlowProvider extends BaseProvider {
|
|
207
|
+
constructor() {
|
|
208
|
+
super({ url: '', apiKey: '', model: 'm', name: 'mockslow', type: 'mockslow' });
|
|
209
|
+
}
|
|
210
|
+
async chat() {
|
|
211
|
+
throw new Error('not used');
|
|
212
|
+
}
|
|
213
|
+
async *chatAsync(_m, _s, _t, _d, ct) {
|
|
214
|
+
yield { isFinal: false, content: 'работаю... ' };
|
|
215
|
+
for (let i = 0; i < 500; i++) {
|
|
216
|
+
if (ct?.cancelled)
|
|
217
|
+
return;
|
|
218
|
+
yield { isFinal: false, content: `шаг-${i} ` };
|
|
219
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
getProviderName() { return 'mockslow'; }
|
|
223
|
+
}
|
|
224
|
+
describe('resume дочерней сессии саб-агента (B2)', () => {
|
|
225
|
+
let store;
|
|
226
|
+
let sessionManager;
|
|
227
|
+
let eventBus;
|
|
228
|
+
let tmpDir;
|
|
229
|
+
let orchestrator;
|
|
230
|
+
let events;
|
|
231
|
+
beforeEach(async () => {
|
|
232
|
+
tmpDir = await mkdtemp(join(tmpdir(), 'synth-task-resume-'));
|
|
233
|
+
store = new FileStore({ dataDir: tmpDir });
|
|
234
|
+
sessionManager = new SessionManager(store);
|
|
235
|
+
eventBus = new EventBus();
|
|
236
|
+
ProviderFactory.register('mockres', MockResumeOkProvider);
|
|
237
|
+
ProviderFactory.register('mockslow', MockResumeSlowProvider);
|
|
238
|
+
events = [];
|
|
239
|
+
// Перехват publish для сбора всех событий всех сессий
|
|
240
|
+
const origPublish = eventBus.publish.bind(eventBus);
|
|
241
|
+
eventBus.publish = ((sessionId, type, data) => {
|
|
242
|
+
events.push({ sessionId, type, data });
|
|
243
|
+
return origPublish(sessionId, type, data);
|
|
244
|
+
});
|
|
245
|
+
orchestrator = new ChatOrchestrator({
|
|
246
|
+
sessionManager,
|
|
247
|
+
eventBus,
|
|
248
|
+
contextBuilder: { buildSystemPrompt: async () => 'system prompt' },
|
|
249
|
+
providerLoader: (name) => {
|
|
250
|
+
return { name, type: name, baseUrl: '', apiKey: '', defaultModel: 'm' };
|
|
251
|
+
},
|
|
252
|
+
defaultWorkingDir: tmpDir,
|
|
253
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
254
|
+
toolRegistry: createToolRegistry(),
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
afterEach(async () => {
|
|
258
|
+
ProviderFactory['_providers'].delete('mockres');
|
|
259
|
+
ProviderFactory['_providers'].delete('mockslow');
|
|
260
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
261
|
+
});
|
|
262
|
+
/** Родитель + дочерняя сессия саб-агента с оборванной историей. */
|
|
263
|
+
async function createInterruptedChild(providerType = 'mockres') {
|
|
264
|
+
const parent = await sessionManager.createSession({
|
|
265
|
+
title: 'Parent',
|
|
266
|
+
settings: { provider: providerType, model: 'm' },
|
|
267
|
+
});
|
|
268
|
+
const child = await sessionManager.createSession({
|
|
269
|
+
title: 'Subtask: analyse',
|
|
270
|
+
parentId: parent.id,
|
|
271
|
+
sessionOrigin: 'subagent',
|
|
272
|
+
settings: { provider: providerType, model: 'm', agentRole: 'explore' },
|
|
273
|
+
});
|
|
274
|
+
const userMsg = {
|
|
275
|
+
id: generateId(), role: MessageRole.USER, seq: 1, origin: 'local',
|
|
276
|
+
parts: [makeTextPart('проанализируй код')], content: 'проанализируй код',
|
|
277
|
+
createdAt: nowISO(), disabled: false, pinned: false, hidden: false,
|
|
278
|
+
};
|
|
279
|
+
const partialMsg = {
|
|
280
|
+
id: generateId(), role: MessageRole.ASSISTANT, seq: 2, origin: 'local',
|
|
281
|
+
parts: [makeTextPart('начал анализ...')], content: 'начал анализ...',
|
|
282
|
+
createdAt: nowISO(), disabled: false, pinned: false, hidden: false,
|
|
283
|
+
metadata: { partial: true, interrupted: true },
|
|
284
|
+
};
|
|
285
|
+
const stopMarker = {
|
|
286
|
+
id: generateId(), role: MessageRole.INFO, seq: 3, origin: 'local',
|
|
287
|
+
parts: [makeTextPart('Task stopped by the user')], content: 'Task stopped by the user',
|
|
288
|
+
createdAt: nowISO(), disabled: false, pinned: false, hidden: false,
|
|
289
|
+
metadata: { stopped_by: 'user', interrupted: true },
|
|
290
|
+
};
|
|
291
|
+
for (const m of [userMsg, partialMsg, stopMarker]) {
|
|
292
|
+
await sessionManager.addMessage(child.id, m);
|
|
293
|
+
}
|
|
294
|
+
return { parent: parent.id, child: child.id };
|
|
295
|
+
}
|
|
296
|
+
it('validateSubagentResume: не найденная сессия → NOT_FOUND, без родителя → NO_PARENT', async () => {
|
|
297
|
+
await expect(validateSubagentResume({ sessionManager }, 'missing-id'))
|
|
298
|
+
.rejects.toMatchObject({ code: 'NOT_FOUND', httpStatus: 404 });
|
|
299
|
+
const orphan = await sessionManager.createSession({ title: 'Orphan' });
|
|
300
|
+
await expect(validateSubagentResume({ sessionManager }, orphan.id))
|
|
301
|
+
.rejects.toMatchObject({ code: 'NO_PARENT', httpStatus: 400 });
|
|
302
|
+
});
|
|
303
|
+
it('startSubagentResume: активная (заблокированная) сессия → LOCKED (409), двойной resume → LOCKED', async () => {
|
|
304
|
+
const { child } = await createInterruptedChild();
|
|
305
|
+
// Захватываем блокировку — имитация активной обработки
|
|
306
|
+
const acquired = await sessionManager.acquireLock(child, 'other-process');
|
|
307
|
+
expect(acquired).toBe(true);
|
|
308
|
+
await expect(orchestrator.startSubagentResume(child))
|
|
309
|
+
.rejects.toMatchObject({ code: 'LOCKED', httpStatus: 409 });
|
|
310
|
+
await sessionManager.releaseLock(child, 'other-process');
|
|
311
|
+
// Двойной resume: первый захватил лок, второй получает 409
|
|
312
|
+
const first = await orchestrator.startSubagentResume(child);
|
|
313
|
+
await expect(orchestrator.startSubagentResume(child))
|
|
314
|
+
.rejects.toMatchObject({ code: 'LOCKED', httpStatus: 409 });
|
|
315
|
+
// Останавливаем первый прогон
|
|
316
|
+
orchestrator.cancel(first.stream_id);
|
|
317
|
+
await vi.waitFor(async () => {
|
|
318
|
+
const s = await sessionManager.getSession(child);
|
|
319
|
+
expect(s?.status.blocked).toBeFalsy();
|
|
320
|
+
}, { timeout: 5000 });
|
|
321
|
+
});
|
|
322
|
+
it('happy path: маркер resume в истории ребёнка, итог — в родителе, события опубликованы, лок снят', async () => {
|
|
323
|
+
const { parent, child } = await createInterruptedChild();
|
|
324
|
+
const eventsBefore = events.length;
|
|
325
|
+
const started = await orchestrator.startSubagentResume(child);
|
|
326
|
+
expect(started.status).toBe('started');
|
|
327
|
+
expect(started.child_session_id).toBe(child);
|
|
328
|
+
expect(started.parent_session_id).toBe(parent);
|
|
329
|
+
// Ждём завершения фонового прогона: итоговое сообщение в родителе
|
|
330
|
+
await vi.waitFor(async () => {
|
|
331
|
+
const p = await sessionManager.getSession(parent);
|
|
332
|
+
expect(p.messages.some((m) => m.metadata?.type === 'subagent_resumed_result')).toBe(true);
|
|
333
|
+
}, { timeout: 5000 });
|
|
334
|
+
// Synthetic user-маркер в истории дочерней сессии
|
|
335
|
+
const c = (await sessionManager.getSession(child));
|
|
336
|
+
const marker = c.messages.find((m) => m.metadata?.resume === true);
|
|
337
|
+
expect(marker).toBeDefined();
|
|
338
|
+
expect(marker.role).toBe(MessageRole.USER);
|
|
339
|
+
expect(marker.content).toContain('Resume the interrupted task');
|
|
340
|
+
// Финальный ответ саб-агента сохранён в дочерней сессии
|
|
341
|
+
expect(c.messages.some((m) => m.role === MessageRole.ASSISTANT && m.content === 'RESUMED OK')).toBe(true);
|
|
342
|
+
// Итог в родительской сессии: INFO + metadata
|
|
343
|
+
const p = (await sessionManager.getSession(parent));
|
|
344
|
+
const resumeResultMsg = p.messages.find((m) => m.metadata?.type === 'subagent_resumed_result');
|
|
345
|
+
expect(resumeResultMsg).toBeDefined();
|
|
346
|
+
expect(resumeResultMsg.role).toBe(MessageRole.INFO);
|
|
347
|
+
expect(resumeResultMsg.metadata.child_session_id).toBe(child);
|
|
348
|
+
expect(resumeResultMsg.metadata.resume_status).toBe('completed');
|
|
349
|
+
expect(resumeResultMsg.content).toContain('RESUMED OK');
|
|
350
|
+
// События: resume.started у ребёнка, message.added/session.updated у родителя
|
|
351
|
+
const newEvents = events.slice(eventsBefore);
|
|
352
|
+
expect(newEvents.some((e) => e.sessionId === child && e.type === 'subagent.resume.started')).toBe(true);
|
|
353
|
+
expect(newEvents.some((e) => e.sessionId === parent && e.type === 'message.added')).toBe(true);
|
|
354
|
+
expect(newEvents.some((e) => e.sessionId === parent && e.type === 'session.updated')).toBe(true);
|
|
355
|
+
expect(newEvents.some((e) => e.sessionId === child && e.type === 'subagent.resume.finished')).toBe(true);
|
|
356
|
+
// Блокировка и currentStream сняты
|
|
357
|
+
expect(c.status.blocked).toBeFalsy();
|
|
358
|
+
expect(c.currentStream).toBeUndefined();
|
|
359
|
+
});
|
|
360
|
+
it('abort resume (orchestrator.cancel по stream_id): статус aborted, итог в родителе — resume_aborted', async () => {
|
|
361
|
+
const { parent, child } = await createInterruptedChild('mockslow');
|
|
362
|
+
const started = await orchestrator.startSubagentResume(child);
|
|
363
|
+
// Даём стриму начаться (маркер resume записан → message.added у ребёнка),
|
|
364
|
+
// затем «Стоп» — тем же путём, что POST /sessions/:id/abort
|
|
365
|
+
await vi.waitFor(() => {
|
|
366
|
+
expect(events.some((e) => e.sessionId === child && e.type === 'message.added')).toBe(true);
|
|
367
|
+
}, { timeout: 5000 });
|
|
368
|
+
orchestrator.cancel(started.stream_id);
|
|
369
|
+
await vi.waitFor(async () => {
|
|
370
|
+
const p = await sessionManager.getSession(parent);
|
|
371
|
+
expect(p.messages.some((m) => m.metadata?.type === 'subagent_resumed_result')).toBe(true);
|
|
372
|
+
}, { timeout: 5000 });
|
|
373
|
+
const p = (await sessionManager.getSession(parent));
|
|
374
|
+
const resumeResultMsg = p.messages.find((m) => m.metadata?.type === 'subagent_resumed_result');
|
|
375
|
+
expect(resumeResultMsg.metadata.resume_status).toBe('aborted');
|
|
376
|
+
const s = (await sessionManager.getSession(child));
|
|
377
|
+
expect(s.status.blocked).toBeFalsy();
|
|
378
|
+
expect(s.currentStream).toBeUndefined();
|
|
379
|
+
});
|
|
380
|
+
it('runSubagentResume напрямую: провайдер недоступен → failed, ошибка записана в родителя', async () => {
|
|
381
|
+
const { parent, child } = await createInterruptedChild();
|
|
382
|
+
// Сессия с несуществующим провайдером: getProvider вернёт null
|
|
383
|
+
const result = await runSubagentResume({
|
|
384
|
+
sessionManager,
|
|
385
|
+
eventBus,
|
|
386
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
387
|
+
getProvider: () => null,
|
|
388
|
+
getWorkingDir: async () => tmpDir,
|
|
389
|
+
}, { child: (await sessionManager.getSession(child)), parent: (await sessionManager.getSession(parent)), streamId: 'st-1', abortSignal: new AbortController().signal });
|
|
390
|
+
expect(result.status).toBe('failed');
|
|
391
|
+
expect(result.error).toContain('Provider is not configured');
|
|
392
|
+
const p = (await sessionManager.getSession(parent));
|
|
393
|
+
const resumeResultMsg = p.messages.find((m) => m.metadata?.type === 'subagent_resumed_result');
|
|
394
|
+
expect(resumeResultMsg.metadata.resume_status).toBe('failed');
|
|
395
|
+
});
|
|
396
|
+
it('LLMMessage-история resume содержит маркер последним user-сообщением', async () => {
|
|
397
|
+
const { parent, child } = await createInterruptedChild();
|
|
398
|
+
let captured = [];
|
|
399
|
+
const provider = {
|
|
400
|
+
model: 'm',
|
|
401
|
+
name: 'mockres',
|
|
402
|
+
chatAsync: vi.fn().mockImplementation(async function* (messages) {
|
|
403
|
+
captured = messages;
|
|
404
|
+
yield { isFinal: true, content: 'ok', toolCalls: [] };
|
|
405
|
+
}),
|
|
406
|
+
};
|
|
407
|
+
await runSubagentResume({
|
|
408
|
+
sessionManager,
|
|
409
|
+
eventBus,
|
|
410
|
+
agentRegistry: makeMockAgentRegistry(),
|
|
411
|
+
getProvider: () => provider,
|
|
412
|
+
getWorkingDir: async () => tmpDir,
|
|
413
|
+
}, { child: (await sessionManager.getSession(child)), parent: (await sessionManager.getSession(parent)), streamId: 'st-2', abortSignal: new AbortController().signal });
|
|
414
|
+
// system + user(промпт) + assistant(частичный) + user(маркер resume)
|
|
415
|
+
const roles = captured.map((m) => m.role);
|
|
416
|
+
expect(roles[0]).toBe('system');
|
|
417
|
+
expect(roles[roles.length - 1]).toBe('user');
|
|
418
|
+
expect(captured[captured.length - 1].content).toContain('Resume the interrupted task');
|
|
419
|
+
// Частичный ответ саб-агента в контексте
|
|
420
|
+
expect(captured.some((m) => m.role === 'assistant' && m.content === 'начал анализ...')).toBe(true);
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
//# sourceMappingURL=task-resume.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-resume.test.js","sourceRoot":"","sources":["../../../src/engine/tools/task-resume.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import type { ToolDefinition, SessionSettings, RouterConfig, PermissionConfig, SecurityConfig } from '@itphx/synth-shared';
|
|
1
|
+
import type { ToolDefinition, ToolResult, Message, Session, SessionSettings, RouterConfig, PermissionConfig, SecurityConfig, ToolForLLM, ToolContext } from '@itphx/synth-shared';
|
|
2
2
|
import type { AgentRegistry } from '../agents/registry.js';
|
|
3
|
-
import type { BaseProvider } from '../../providers/base.js';
|
|
3
|
+
import type { BaseProvider, LLMMessage } from '../../providers/base.js';
|
|
4
4
|
import type { ToolRegistry } from './registry.js';
|
|
5
5
|
import type { SessionManager } from '../../sessions/manager.js';
|
|
6
6
|
import { EventBus } from '../../events/bus.js';
|
|
7
7
|
import type { ContextOptimizer } from '../context/optimizer.js';
|
|
8
8
|
import type { ContextConfig } from '../context/config.js';
|
|
9
9
|
import type { ModelRouter } from '../router/router.js';
|
|
10
|
+
import type { ShellPolicy } from '../security/shell-guard.js';
|
|
11
|
+
import type { ProtectedPathsPolicy } from '../security/protected-paths.js';
|
|
10
12
|
export interface TaskExtra {
|
|
11
13
|
provider: BaseProvider;
|
|
12
14
|
agentRegistry: AgentRegistry;
|
|
@@ -25,11 +27,88 @@ export interface TaskExtra {
|
|
|
25
27
|
publish?: (type: string, data: Record<string, unknown>) => void;
|
|
26
28
|
streamId?: string;
|
|
27
29
|
sessionId?: string;
|
|
30
|
+
/** ID собственного tool-вызова `task` — как parent_call_id для внутренних вызовов саб-агента. */
|
|
31
|
+
callId?: string;
|
|
28
32
|
callerAgentRole?: string;
|
|
29
33
|
/** Permissions родительской сессии (AD-029) — наследуются саб-агентом с deny-дополнениями. */
|
|
30
34
|
permissionConfig?: PermissionConfig;
|
|
31
35
|
/** Секция безопасности (защита от Indirect Prompt Injection) из config.yaml. */
|
|
32
36
|
securityConfig?: SecurityConfig;
|
|
37
|
+
/** Язык сессии (для локализованных сообщений безопасности). */
|
|
38
|
+
language?: string;
|
|
39
|
+
/** Политика безопасности execute_shell (денлист путей/команд) родительской сессии. */
|
|
40
|
+
shellPolicy?: ShellPolicy;
|
|
41
|
+
/** Единая политика защищённых путей (СКВОЗНАЯ проверка файловых тулов) родительской сессии. */
|
|
42
|
+
protectedPaths?: ProtectedPathsPolicy;
|
|
43
|
+
/** Тумблер полного отключения защищённых путей (default true). */
|
|
44
|
+
protectedPathsEnabled?: boolean;
|
|
45
|
+
/** Override retry-параметров саб-агента (по умолчанию 3 попытки, backoff 5/15/30с). */
|
|
46
|
+
retry?: SubagentRetryConfig;
|
|
33
47
|
}
|
|
48
|
+
type ContextMode = 'none' | 'inherit' | 'summary' | 'last_n';
|
|
49
|
+
/** Retry саб-агента: максимум попыток LLM-вызова (единая политика — LLM_MAX_ATTEMPTS). */
|
|
50
|
+
export declare const SUBAGENT_MAX_ATTEMPTS = 3;
|
|
51
|
+
/** Backoff между попытками (единая политика — LLM_RETRY_DELAYS_MS). */
|
|
52
|
+
export declare const SUBAGENT_RETRY_DELAYS_MS: number[];
|
|
53
|
+
/** Параметры retry-цикла LLM-вызова саб-агента. */
|
|
54
|
+
export interface SubagentRetryConfig {
|
|
55
|
+
/** Максимум попыток (включая первую). */
|
|
56
|
+
maxRetries: number;
|
|
57
|
+
/** Задержки между попытками, мс (index = попытка - 1). */
|
|
58
|
+
delaysMs: number[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Промпт саб-агента по языку сессии: prompts/subagents/{type}.{lang}.md →
|
|
62
|
+
* {type}.md → agentDef.subagentPrompt (definitions JSON, легаси).
|
|
63
|
+
* Каталог промптов — systemPromptsDir из ContextConfig (резолв prompts/ или dist/prompts).
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveSubagentPrompt(agentDef: {
|
|
66
|
+
subagentPrompt?: string;
|
|
67
|
+
}, subagentType: string, language: string | undefined, systemPromptsDir: string | undefined): string;
|
|
68
|
+
export declare function messageToLLMMessage(msg: Message): LLMMessage;
|
|
69
|
+
export declare function publishMessageAdded(eventBus: EventBus, parentSessionId: string, childSessionId: string, msg: Message, index: number, childSession?: Session): Promise<void>;
|
|
34
70
|
export declare const taskTool: ToolDefinition;
|
|
71
|
+
/**
|
|
72
|
+
* runSubagent — цикл выполнения саб-агента, общий для тула `task` и для
|
|
73
|
+
* возобновления прерванной дочерней сессии (task-resume.ts).
|
|
74
|
+
*
|
|
75
|
+
* Включает: связку cancel-токена с родительским сигналом отмены, permissions
|
|
76
|
+
* дочерней сессии (AD-029), режимную фильтрацию тулов, tool-loop со стримом
|
|
77
|
+
* прогресса родителю, retry-цикл LLM-вызова (recoverable → backoff, аналог
|
|
78
|
+
* QueueProcessor), обработку отмены (finishAborted), quality check/эскалацию
|
|
79
|
+
* (AD-034) и формирование tool_result.
|
|
80
|
+
*/
|
|
81
|
+
export interface SubagentRunConfig {
|
|
82
|
+
/** Тип саб-агента (id в реестре агентов). */
|
|
83
|
+
subagentType: string;
|
|
84
|
+
description: string;
|
|
85
|
+
contextMode: ContextMode;
|
|
86
|
+
/** Лимит шагов агента (0/undefined — без ограничений). */
|
|
87
|
+
maxSteps?: number;
|
|
88
|
+
/** Сырой системный промпт саб-агента (второй аргумент chatAsync). */
|
|
89
|
+
systemPrompt: string;
|
|
90
|
+
/** Расширенный системный промпт (заметки/роутинг) — messages[0]. */
|
|
91
|
+
llmSystemPrompt: string;
|
|
92
|
+
/** Начальные LLM-сообщения БЕЗ system: история дочерней сессии + user-промпт. */
|
|
93
|
+
initialMessages: LLMMessage[];
|
|
94
|
+
/** Провайдер саб-агента (уже резолвнутый роутером/оркестратором). */
|
|
95
|
+
provider: BaseProvider;
|
|
96
|
+
tools?: ToolForLLM[];
|
|
97
|
+
/** Дочерняя сессия (если есть) — в неё пишется история саб-агента. */
|
|
98
|
+
childSessionId?: string;
|
|
99
|
+
/** Сессия для child.*-событий (у task — родитель, у resume — родитель resumed-сессии). */
|
|
100
|
+
parentSessionId: string;
|
|
101
|
+
/** Начальное routing-решение (AD-034) — для QA/эскалации. */
|
|
102
|
+
routingDecisionInfo?: {
|
|
103
|
+
providerName: string;
|
|
104
|
+
modelName: string;
|
|
105
|
+
strategy: string;
|
|
106
|
+
};
|
|
107
|
+
extra: TaskExtra;
|
|
108
|
+
ctx: ToolContext;
|
|
109
|
+
/** Override retry-параметров (иначе extra.retry или дефолт 3 попытки / 5-15-30с). */
|
|
110
|
+
retry?: SubagentRetryConfig;
|
|
111
|
+
}
|
|
112
|
+
export declare function runSubagent(config: SubagentRunConfig): Promise<ToolResult>;
|
|
113
|
+
export {};
|
|
35
114
|
//# sourceMappingURL=task.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/engine/tools/task.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/engine/tools/task.ts"],"names":[],"mappings":"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"}
|