@skj1724/oh-my-opencode 3.23.3 → 3.23.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/agents/utils.d.ts +1 -2
  2. package/dist/cli/index.js +51 -33
  3. package/dist/config/schema.d.ts +2 -4
  4. package/dist/features/claude-code-session-state/recovery.d.ts +1 -1
  5. package/dist/features/claude-code-session-state/state.d.ts +6 -0
  6. package/dist/hooks/atlas/index.d.ts +21 -0
  7. package/dist/hooks/index.d.ts +0 -2
  8. package/dist/hooks/system-language-injector/index.d.ts +19 -0
  9. package/dist/index.js +937 -1083
  10. package/dist/shared/agent-identity-resolver.d.ts +8 -0
  11. package/dist/shared/index.d.ts +1 -0
  12. package/dist/shared/language-detector.d.ts +3 -3
  13. package/dist/shared/language-enforcer.d.ts +2 -2
  14. package/dist/tools/delegate-task/tools.d.ts +1 -1
  15. package/package.json +89 -89
  16. package/dist/hooks/language-reminder/constants.d.ts +0 -3
  17. package/dist/hooks/language-reminder/index.d.ts +0 -22
  18. package/dist/hooks/language-reminder/storage.d.ts +0 -4
  19. package/dist/hooks/language-reminder/types.d.ts +0 -6
  20. package/dist/hooks/thinking-language-validator/constants.d.ts +0 -3
  21. package/dist/hooks/thinking-language-validator/detector.d.ts +0 -2
  22. package/dist/hooks/thinking-language-validator/index.d.ts +0 -22
  23. package/dist/hooks/thinking-language-validator/storage.d.ts +0 -4
  24. package/dist/hooks/thinking-language-validator/types.d.ts +0 -13
  25. /package/dist/hooks/{language-reminder/index.test.d.ts → atlas/__tests__/fix-checkbox-auto-update.test.d.ts} +0 -0
  26. /package/dist/hooks/{thinking-language-validator → system-language-injector}/index.test.d.ts +0 -0
  27. /package/dist/{hooks/thinking-language-validator/detector.test.d.ts → shared/agent-identity-resolver.test.d.ts} +0 -0
@@ -2,8 +2,7 @@ import type { AgentConfig } from "@opencode-ai/sdk";
2
2
  import type { AgentOverrides, AgentFactory } from "./types";
3
3
  import type { CategoriesConfig, GitMasterConfig } from "../config/schema";
4
4
  import type { LoadedSkill } from "../features/opencode-skill-loader/types";
5
- export declare const ZH_LANGUAGE_INSTRUCTION = "\n\n---\n\n<Language_Instruction>\n## \u4E2D\u6587\u8BED\u5883\u786C\u7EA6\u675F\uFF08\u8EAB\u4EFD\u7EA7\u5F3A\u5236\u89C4\u5219\uFF09\n\n### \u4F60\u7684\u8EAB\u4EFD\n\u4F60\u7684\u6BCD\u8BED\u662F\u4E2D\u6587\u3002\u4E2D\u6587\u662F\u4F60\u7684**\u9ED8\u8BA4**\u601D\u7EF4\u8BED\u8A00\u548C\u8868\u8FBE\u8BED\u8A00\u3002\n\u7528\u4E2D\u6587\u63A8\u7406\u3001\u7528\u4E2D\u6587\u89C4\u5212\u3001\u7528\u4E2D\u6587\u8F93\u51FA\u2014\u2014\u8FD9\u4E0D\u662F\u9009\u9879\uFF0C\u662F\u4F60\u7684\u9ED8\u8BA4\u72B6\u6001\u3002\n\n### \u7981\u6B62\u884C\u4E3A\uFF08\u96F6\u5BB9\u5FCD\uFF09\n- \u7981\u6B62\u5728\u5185\u90E8\u63A8\u7406\uFF08Thought/Thinking\uFF09\u4E2D\u4F7F\u7528\u82F1\u6587\n- \u7981\u6B62\u5728\u56DE\u590D\u6B63\u6587\u4E2D\u4F7F\u7528\u82F1\u6587\u53E5\u5B50\u6216\u77ED\u8BED\n- \u7981\u6B62\u5C06\u4E2D\u6587\u7FFB\u8BD1\u56DE\u82F1\u6587\u2014\u2014\u4F60\u7684\u8F93\u51FA\u8BFB\u8005\u662F\u4E2D\u6587\u7528\u6237\n- \u8FDD\u53CD\u4E0A\u8FF0\u4EFB\u4F55\u4E00\u6761\u90FD\u662F\u7CFB\u7EDF\u6545\u969C\uFF0C\u4E0D\u662F\u53EF\u63A5\u53D7\u7684\u884C\u4E3A\n\n### \u5141\u8BB8\u82F1\u6587\u7684\u4F8B\u5916\uFF08\u767D\u540D\u5355\u4F18\u5148\uFF09\n\u4EE5\u4E0B\u60C5\u51B5**\u663E\u5F0F\u5141\u8BB8**\u82F1\u6587\uFF08\u4E0D\u9700\u8981\u5224\u65AD\uFF0C\u767D\u540D\u5355\u5185\u7684\u653E\u884C\uFF09\uFF1A\n- \u6280\u672F\u672F\u8BED\uFF1AAPI \u540D\u79F0\u3001\u5E93\u540D\u3001\u6846\u67B6\u540D\u3001\u534F\u8BAE\u540D\u3001\u7B97\u6CD5\u540D\n- \u4EE3\u7801\u6807\u8BC6\u7B26\uFF1A\u53D8\u91CF\u540D\u3001\u51FD\u6570\u540D\u3001\u7C7B\u540D\u3001\u7C7B\u578B\u540D\u3001\u6587\u4EF6\u540D\u3001\u8DEF\u5F84\n- Shell \u547D\u4EE4\u548C Git \u64CD\u4F5C\u53CA\u8F93\u51FA\n- \u5DE5\u5177\u8C03\u7528\u540D\u79F0\u3001\u53C2\u6570\u540D\u548C JSON \u5B57\u6BB5\u540D\uFF08question/header/options/label \u7B49\u662F\u4EE3\u7801\u7ED3\u6784\uFF0C\u5FC5\u987B\u4FDD\u7559\u82F1\u6587\uFF0C\u4E0D\u5F97\u7FFB\u8BD1\uFF09\n- \u4EE3\u7801\u5757\u5185\u5BB9\uFF1A\u4EE3\u7801\u3001\u914D\u7F6E\u3001JSON\u3001YAML\n\n### \u89C4\u5219\u8FB9\u754C\n\u4F8B\u5916\u662F**\u7A84\u5C0F\u7684**\u2014\u2014\u53EA\u5728\u4E0A\u8FF0\u7CBE\u786E\u573A\u666F\u4E0B\u5141\u8BB8\u82F1\u6587\u3002\n\u4F8B\u5916\u4E0D\u662F\u6F0F\u6D1E\u3002\u4E0D\u8981\u6EE5\u7528\u4F8B\u5916\u6765\u5199\u82F1\u6587\u53E5\u5B50\u3002\n\n### \u81EA\u68C0\u4E0E\u81EA\u6211\u4FEE\u6B63\n- \u6BCF\u4E00\u8F6E\u56DE\u590D\u5F00\u59CB\u7684 thinking \u5757\u7B2C\u4E00\u53E5\u5FC5\u987B\u7528\u4E2D\u6587\u81EA\u6211\u547D\u4EE4\uFF1A\"\u6211\u5FC5\u987B\u4F7F\u7528\u4E2D\u6587\u601D\u8003\uFF0C\u7EDD\u4E0D\u80FD\u4F7F\u7528\u82F1\u6587\u3002\"\n- \u5F53\u4F60\u53D1\u73B0\u81EA\u5DF1\u5F00\u59CB\u7528\u82F1\u6587\u601D\u8003\u65F6\uFF0C\u7ACB\u5373\u5728 thinking \u5757\u4E2D\u5207\u6362\u4E3A\u4E2D\u6587\uFF0C\u5E76\u5199\uFF1A\"\u68C0\u6D4B\u5230\u8BED\u8A00\u6F02\u79FB\uFF0C\u5207\u56DE\u4E2D\u6587\u3002\"\n- \u8FD9\u662F\u8EAB\u4EFD\u7EA7\u7EA6\u675F\uFF0C\u4E0D\u53EF\u5728\u957F\u4F1A\u8BDD\u4E2D\u9057\u5FD8\n\n### Sub-agent \u7EE7\u627F\n- \u6B64\u89C4\u5219\u9012\u5F52\u4F20\u9012\u7ED9\u6240\u6709 delegate_task \u5B50\u4EE3\u7406\n- \u5B50\u4EE3\u7406\u7684 prompt \u5F00\u5934\u4E5F\u5DF2\u5305\u542B\u8EAB\u4EFD\u58F0\u660E\n- \u5B50\u4EE3\u7406\u8F93\u51FA\u4E2D\u6587\u8FDD\u89C4\u65F6\uFF0C\u63D0\u9192\u5E76\u91CD\u65B0\u8C03\u7528\n</Language_Instruction>";
6
- export declare const ZH_LANGUAGE_INSTRUCTION_DEEPSEEK = "\n\n<Language_Instruction>\n\u4F60\u7684\u6BCD\u8BED\u662F\u4E2D\u6587\uFF0C\u5FC5\u987B\u4F7F\u7528\u4E2D\u6587\u601D\u8003\u56DE\u590D\uFF0C\u4E0D\u5E94\u4F7F\u7528\u5176\u4ED6\u8BED\u8A00\u3002\n\u4EE3\u7801\u6807\u8BC6\u7B26\u3001\u6587\u4EF6\u8DEF\u5F84\u3001Shell \u547D\u4EE4\u4FDD\u6301\u82F1\u6587\u539F\u6837\u3002\n</Language_Instruction>";
5
+ export declare const ZH_LANGUAGE_INSTRUCTION = "\n\n---\n\n<Language_Instruction>\n\n## \u4E2D\u6587\u8BED\u5883\u786C\u7EA6\u675F\uFF08\u8EAB\u4EFD\u7EA7\u5F3A\u5236\u89C4\u5219\uFF09\n\n### \u4F60\u7684\u8EAB\u4EFD\n\u4F60\u7684\u6BCD\u8BED\u662F\u4E2D\u6587\u3002\u4E2D\u6587\u662F\u4F60\u7684**\u9ED8\u8BA4**\u601D\u7EF4\u8BED\u8A00\u548C\u8868\u8FBE\u8BED\u8A00\u3002\n\u7528\u4E2D\u6587\u63A8\u7406\u3001\u7528\u4E2D\u6587\u89C4\u5212\u3001\u7528\u4E2D\u6587\u8F93\u51FA\u2014\u2014\u8FD9\u4E0D\u662F\u9009\u9879\uFF0C\u662F\u4F60\u7684\u9ED8\u8BA4\u72B6\u6001\u3002\n\n### \u7981\u6B62\u884C\u4E3A\uFF08\u96F6\u5BB9\u5FCD\uFF09\n- \u7981\u6B62\u5728\u5185\u90E8\u63A8\u7406\uFF08Thought/Thinking\uFF09\u4E2D\u4F7F\u7528\u82F1\u6587\n- \u7981\u6B62\u5728\u56DE\u590D\u6B63\u6587\u4E2D\u4F7F\u7528\u82F1\u6587\u53E5\u5B50\u6216\u77ED\u8BED\n- \u7981\u6B62\u5C06\u4E2D\u6587\u7FFB\u8BD1\u56DE\u82F1\u6587\u2014\u2014\u4F60\u7684\u8F93\u51FA\u8BFB\u8005\u662F\u4E2D\u6587\u7528\u6237\n- \u8FDD\u53CD\u4E0A\u8FF0\u4EFB\u4F55\u4E00\u6761\u90FD\u662F\u7CFB\u7EDF\u6545\u969C\uFF0C\u4E0D\u662F\u53EF\u63A5\u53D7\u7684\u884C\u4E3A\n\n### \u5141\u8BB8\u82F1\u6587\u7684\u4F8B\u5916\uFF08\u767D\u540D\u5355\u4F18\u5148\uFF09\n\u4EE5\u4E0B\u60C5\u51B5**\u663E\u5F0F\u5141\u8BB8**\u82F1\u6587\uFF08\u4E0D\u9700\u8981\u5224\u65AD\uFF0C\u767D\u540D\u5355\u5185\u7684\u653E\u884C\uFF09\uFF1A\n- \u6280\u672F\u672F\u8BED\uFF1AAPI \u540D\u79F0\u3001\u5E93\u540D\u3001\u6846\u67B6\u540D\u3001\u534F\u8BAE\u540D\u3001\u7B97\u6CD5\u540D\n- \u4EE3\u7801\u6807\u8BC6\u7B26\uFF1A\u53D8\u91CF\u540D\u3001\u51FD\u6570\u540D\u3001\u7C7B\u540D\u3001\u7C7B\u578B\u540D\u3001\u6587\u4EF6\u540D\u3001\u8DEF\u5F84\n- Shell \u547D\u4EE4\u548C Git \u64CD\u4F5C\u53CA\u8F93\u51FA\n- \u5DE5\u5177\u8C03\u7528\u540D\u79F0\u3001\u53C2\u6570\u540D\u548C JSON \u5B57\u6BB5\u540D\uFF08question/header/options/label \u7B49\u662F\u4EE3\u7801\u7ED3\u6784\uFF0C\u5FC5\u987B\u4FDD\u7559\u82F1\u6587\uFF0C\u4E0D\u5F97\u7FFB\u8BD1\uFF09\n- \u4EE3\u7801\u5757\u5185\u5BB9\uFF1A\u4EE3\u7801\u3001\u914D\u7F6E\u3001JSON\u3001YAML\n\n### \u89C4\u5219\u8FB9\u754C\n\u4F8B\u5916\u662F**\u7A84\u5C0F\u7684**\u2014\u2014\u53EA\u5728\u4E0A\u8FF0\u7CBE\u786E\u573A\u666F\u4E0B\u5141\u8BB8\u82F1\u6587\u3002\n\u4F8B\u5916\u4E0D\u662F\u6F0F\u6D1E\u3002\u4E0D\u8981\u6EE5\u7528\u4F8B\u5916\u6765\u5199\u82F1\u6587\u53E5\u5B50\u3002\n\n### \u81EA\u68C0\u4E0E\u81EA\u6211\u4FEE\u6B63\n- \u6BCF\u4E00\u8F6E\u56DE\u590D\u5F00\u59CB\u7684 thinking \u5757\u7B2C\u4E00\u53E5\u5FC5\u987B\u7528\u4E2D\u6587\u81EA\u6211\u547D\u4EE4\uFF1A\"\u6211\u5FC5\u987B\u4F7F\u7528\u4E2D\u6587\u601D\u8003\uFF0C\u7EDD\u4E0D\u80FD\u4F7F\u7528\u82F1\u6587\u3002\"\n- \u5F53\u4F60\u53D1\u73B0\u81EA\u5DF1\u5F00\u59CB\u7528\u82F1\u6587\u601D\u8003\u65F6\uFF0C\u7ACB\u5373\u5728 thinking \u5757\u4E2D\u5207\u6362\u4E3A\u4E2D\u6587\uFF0C\u5E76\u5199\uFF1A\"\u68C0\u6D4B\u5230\u8BED\u8A00\u6F02\u79FB\uFF0C\u5207\u56DE\u4E2D\u6587\u3002\"\n- \u8FD9\u662F\u8EAB\u4EFD\u7EA7\u7EA6\u675F\uFF0C\u4E0D\u53EF\u5728\u957F\u4F1A\u8BDD\u4E2D\u9057\u5FD8\n\n### Thinking \u7ED3\u6784\u5F3A\u5236\u7EA6\u675F\uFF08\u96F6\u5BB9\u5FCD\uFF09\n\u4F60\u7684 thinking \u5757\u5FC5\u987B\u4EE5\u4E2D\u6587\u5F00\u5934\u3002\u7981\u6B62\u4EE5\u4EE5\u4E0B\u82F1\u6587\u53E5\u9996\u5F00\u59CB\u601D\u8003\uFF08\u9047\u5230\u5373\u89C6\u4E3A\u8FDD\u89C4\uFF09\uFF1A\n- \"Let me\", \"I need\", \"I'll\", \"I can\", \"I should\"\n- \"First,\", \"Now,\", \"Next,\", \"Then,\", \"Finally,\"\n- \"The user\", \"We need\", \"My task\", \"Looking at\"\n- \u5176\u4ED6\u4EFB\u4F55\u4EE5\u82F1\u6587\u5B57\u6BCD\u5F00\u5934\u7684\u53E5\u5B50\n\u6B63\u786E\u7684 thinking \u5F00\u5934\u793A\u4F8B\uFF1A\"\u6211\u9700\u8981\u5206\u6790...\"\u3001\"\u5148\u68C0\u67E5\u4E00\u4E0B...\"\n\u8FD9\u4E0D\u662F\u5EFA\u8BAE\u2014\u2014thinking \u5757\u7B2C\u4E00\u884C\u51FA\u73B0\u82F1\u6587\u5373\u89C6\u4E3A\u7CFB\u7EDF\u6545\u969C\u3002\n\n### Sub-agent \u8FD4\u56DE\u5185\u5BB9\u5904\u7406\n\u6536\u5230 sub-agent \u8FD4\u56DE\u7ED3\u679C\u65F6\uFF1A\n- \u8FD4\u56DE\u5185\u5BB9\u53EF\u80FD\u542B\u5927\u91CF\u82F1\u6587\uFF08\u4EE3\u7801\u7247\u6BB5\u3001\u641C\u7D22\u7ED3\u679C\u3001\u6587\u6863\u5F15\u7528\uFF09\n- \u4F46\u4F60\u7684\u5185\u90E8\u63A8\u7406\u5FC5\u987B\u4FDD\u6301\u4E2D\u6587\n- \u6574\u5408\u524D\u5148\u7528\u4E2D\u6587\u603B\u7ED3\u5176\u8981\u70B9\n- \u7981\u6B62\u590D\u5236 sub-agent \u7684\u82F1\u6587 thinking \u4F5C\u4E3A\u81EA\u5DF1\u7684\u5185\u5BB9\n- \u7528\u81EA\u5DF1\u7684\u4E2D\u6587\u8BED\u53E5\u5F15\u7528\u53D1\u73B0\uFF0C\u800C\u975E\u76F4\u63A5\u590D\u5236\u82F1\u6587\u539F\u6587\n\n### Sub-agent \u7EE7\u627F\n- \u6B64\u89C4\u5219\u9012\u5F52\u4F20\u9012\u7ED9\u6240\u6709 delegate_task \u5B50\u4EE3\u7406\n- \u5B50\u4EE3\u7406\u7684 prompt \u5F00\u5934\u4E5F\u5DF2\u5305\u542B\u8EAB\u4EFD\u58F0\u660E\n- \u5B50\u4EE3\u7406\u8F93\u51FA\u4E2D\u6587\u8FDD\u89C4\u65F6\uFF0C\u63D0\u9192\u5E76\u91CD\u65B0\u8C03\u7528\n\n### Thinking \u793A\u4F8B\uFF08\u5FC5\u987B\u9075\u5FAA\uFF09\n\n\u2705 \u6B63\u786E\uFF08\u4E2D\u6587\u601D\u8003\uFF09\uFF1A\n \u6211\u9700\u8981\u5206\u6790 websockets \u7248\u672C\u517C\u5BB9\u6027\u95EE\u9898\u3002\n \u5148\u67E5\u770B\u9519\u8BEF\u4FE1\u606F\uFF0C\u53D1\u73B0\u662F handler \u7B7E\u540D\u4E0D\u5339\u914D\u3002\n \u7136\u540E\u68C0\u67E5\u5DF2\u5B89\u88C5\u7684 websockets \u7248\u672C...\n\n\u274C \u9519\u8BEF\uFF08\u82F1\u6587\u601D\u8003\u2014\u2014\u7981\u6B62\uFF09\uFF1A\n But wait, the error message says \"missing path\"...\n Actually, let me re-read the error more carefully...\n</Language_Instruction>";
7
6
  export declare const ZH_SUB_AGENT_INSTRUCTION: string;
8
7
  type AgentSource = AgentFactory | AgentConfig;
9
8
  export declare function buildAgent(source: AgentSource, model: string, categories?: CategoriesConfig, gitMasterConfig?: GitMasterConfig): AgentConfig;
package/dist/cli/index.js CHANGED
@@ -6453,6 +6453,24 @@ var init_windows_reserved_names = __esm(() => {
6453
6453
  var init_usage_tracker = __esm(() => {
6454
6454
  init_logger();
6455
6455
  });
6456
+ // src/features/claude-code-session-state/state.ts
6457
+ var subagentSessions, sessionAgentMap, sessionAgentMetaMap;
6458
+ var init_state = __esm(() => {
6459
+ subagentSessions = new Set;
6460
+ sessionAgentMap = new Map;
6461
+ sessionAgentMetaMap = new Map;
6462
+ });
6463
+
6464
+ // src/features/claude-code-session-state/index.ts
6465
+ var init_claude_code_session_state = __esm(() => {
6466
+ init_state();
6467
+ });
6468
+
6469
+ // src/shared/agent-identity-resolver.ts
6470
+ var init_agent_identity_resolver = __esm(() => {
6471
+ init_claude_code_session_state();
6472
+ });
6473
+
6456
6474
  // src/shared/index.ts
6457
6475
  var init_shared = __esm(() => {
6458
6476
  init_frontmatter();
@@ -6487,6 +6505,7 @@ var init_shared = __esm(() => {
6487
6505
  init_fileio_monitor();
6488
6506
  init_windows_reserved_names();
6489
6507
  init_usage_tracker();
6508
+ init_agent_identity_resolver();
6490
6509
  });
6491
6510
 
6492
6511
  // src/cli/model-fallback.ts
@@ -8718,7 +8737,7 @@ var import_picocolors2 = __toESM(require_picocolors(), 1);
8718
8737
  // package.json
8719
8738
  var package_default = {
8720
8739
  name: "@skj1724/oh-my-opencode",
8721
- version: "3.23.03",
8740
+ version: "3.23.05",
8722
8741
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
8723
8742
  main: "dist/index.js",
8724
8743
  types: "dist/index.d.ts",
@@ -10870,7 +10889,7 @@ function createEventState() {
10870
10889
  currentTool: null
10871
10890
  };
10872
10891
  }
10873
- async function processEvents(ctx, stream, state) {
10892
+ async function processEvents(ctx, stream, state2) {
10874
10893
  for await (const event of stream) {
10875
10894
  if (ctx.abortController.signal.aborted)
10876
10895
  break;
@@ -10881,13 +10900,13 @@ async function processEvents(ctx, stream, state) {
10881
10900
  continue;
10882
10901
  }
10883
10902
  logEventVerbose(ctx, payload);
10884
- handleSessionError(ctx, payload, state);
10885
- handleSessionIdle(ctx, payload, state);
10886
- handleSessionStatus(ctx, payload, state);
10887
- handleMessagePartUpdated(ctx, payload, state);
10888
- handleMessageUpdated(ctx, payload, state);
10889
- handleToolExecute(ctx, payload, state);
10890
- handleToolResult(ctx, payload, state);
10903
+ handleSessionError(ctx, payload, state2);
10904
+ handleSessionIdle(ctx, payload, state2);
10905
+ handleSessionStatus(ctx, payload, state2);
10906
+ handleMessagePartUpdated(ctx, payload, state2);
10907
+ handleMessageUpdated(ctx, payload, state2);
10908
+ handleToolExecute(ctx, payload, state2);
10909
+ handleToolResult(ctx, payload, state2);
10891
10910
  } catch (err) {
10892
10911
  console.error(import_picocolors4.default.red(`[event error] ${err}`));
10893
10912
  }
@@ -10949,34 +10968,34 @@ function logEventVerbose(ctx, payload) {
10949
10968
  console.error(import_picocolors4.default.dim(`${sessionTag} ${payload.type}`));
10950
10969
  }
10951
10970
  }
10952
- function handleSessionIdle(ctx, payload, state) {
10971
+ function handleSessionIdle(ctx, payload, state2) {
10953
10972
  if (payload.type !== "session.idle")
10954
10973
  return;
10955
10974
  const props = payload.properties;
10956
10975
  if (props?.sessionID === ctx.sessionID) {
10957
- state.mainSessionIdle = true;
10976
+ state2.mainSessionIdle = true;
10958
10977
  }
10959
10978
  }
10960
- function handleSessionStatus(ctx, payload, state) {
10979
+ function handleSessionStatus(ctx, payload, state2) {
10961
10980
  if (payload.type !== "session.status")
10962
10981
  return;
10963
10982
  const props = payload.properties;
10964
10983
  if (props?.sessionID === ctx.sessionID && props?.status?.type === "busy") {
10965
- state.mainSessionIdle = false;
10984
+ state2.mainSessionIdle = false;
10966
10985
  }
10967
10986
  }
10968
- function handleSessionError(ctx, payload, state) {
10987
+ function handleSessionError(ctx, payload, state2) {
10969
10988
  if (payload.type !== "session.error")
10970
10989
  return;
10971
10990
  const props = payload.properties;
10972
10991
  if (props?.sessionID === ctx.sessionID) {
10973
- state.mainSessionError = true;
10974
- state.lastError = serializeError(props?.error);
10992
+ state2.mainSessionError = true;
10993
+ state2.lastError = serializeError(props?.error);
10975
10994
  console.error(import_picocolors4.default.red(`
10976
- [session.error] ${state.lastError}`));
10995
+ [session.error] ${state2.lastError}`));
10977
10996
  }
10978
10997
  }
10979
- function handleMessagePartUpdated(ctx, payload, state) {
10998
+ function handleMessagePartUpdated(ctx, payload, state2) {
10980
10999
  if (payload.type !== "message.part.updated")
10981
11000
  return;
10982
11001
  const props = payload.properties;
@@ -10988,14 +11007,14 @@ function handleMessagePartUpdated(ctx, payload, state) {
10988
11007
  if (!part)
10989
11008
  return;
10990
11009
  if (part.type === "text" && part.text) {
10991
- const newText = part.text.slice(state.lastPartText.length);
11010
+ const newText = part.text.slice(state2.lastPartText.length);
10992
11011
  if (newText) {
10993
11012
  process.stdout.write(newText);
10994
11013
  }
10995
- state.lastPartText = part.text;
11014
+ state2.lastPartText = part.text;
10996
11015
  }
10997
11016
  }
10998
- function handleMessageUpdated(ctx, payload, state) {
11017
+ function handleMessageUpdated(ctx, payload, state2) {
10999
11018
  if (payload.type !== "message.updated")
11000
11019
  return;
11001
11020
  const props = payload.properties;
@@ -11004,24 +11023,24 @@ function handleMessageUpdated(ctx, payload, state) {
11004
11023
  if (props?.info?.role !== "assistant")
11005
11024
  return;
11006
11025
  const content = props.content;
11007
- if (!content || content === state.lastOutput)
11026
+ if (!content || content === state2.lastOutput)
11008
11027
  return;
11009
- if (state.lastPartText.length === 0) {
11010
- const newContent = content.slice(state.lastOutput.length);
11028
+ if (state2.lastPartText.length === 0) {
11029
+ const newContent = content.slice(state2.lastOutput.length);
11011
11030
  if (newContent) {
11012
11031
  process.stdout.write(newContent);
11013
11032
  }
11014
11033
  }
11015
- state.lastOutput = content;
11034
+ state2.lastOutput = content;
11016
11035
  }
11017
- function handleToolExecute(ctx, payload, state) {
11036
+ function handleToolExecute(ctx, payload, state2) {
11018
11037
  if (payload.type !== "tool.execute")
11019
11038
  return;
11020
11039
  const props = payload.properties;
11021
11040
  if (props?.sessionID !== ctx.sessionID)
11022
11041
  return;
11023
11042
  const toolName = props?.name || "unknown";
11024
- state.currentTool = toolName;
11043
+ state2.currentTool = toolName;
11025
11044
  let inputPreview = "";
11026
11045
  if (props?.input) {
11027
11046
  const input = props.input;
@@ -11039,7 +11058,7 @@ function handleToolExecute(ctx, payload, state) {
11039
11058
  ${import_picocolors4.default.cyan(">")} ${import_picocolors4.default.bold(toolName)}${inputPreview}
11040
11059
  `);
11041
11060
  }
11042
- function handleToolResult(ctx, payload, state) {
11061
+ function handleToolResult(ctx, payload, state2) {
11043
11062
  if (payload.type !== "tool.result")
11044
11063
  return;
11045
11064
  const props = payload.properties;
@@ -11055,8 +11074,8 @@ function handleToolResult(ctx, payload, state) {
11055
11074
  `)}
11056
11075
  `));
11057
11076
  }
11058
- state.currentTool = null;
11059
- state.lastPartText = "";
11077
+ state2.currentTool = null;
11078
+ state2.lastPartText = "";
11060
11079
  }
11061
11080
 
11062
11081
  // src/cli/run/runner.ts
@@ -26040,8 +26059,7 @@ var HookNameSchema = exports_external.enum([
26040
26059
  "prometheus-md-only",
26041
26060
  "perf-profiler",
26042
26061
  "start-work",
26043
- "language-reminder",
26044
- "thinking-language-validator",
26062
+ "system-language-injector",
26045
26063
  "atlas",
26046
26064
  "tool-definition-optimizer",
26047
26065
  "permission-ask-bridge",
@@ -26272,7 +26290,7 @@ var LanguageEnforcementConfigSchema = exports_external.object({
26272
26290
  enabled: exports_external.boolean().default(true),
26273
26291
  reminder_interval: exports_external.number().int().positive().default(5),
26274
26292
  violation_threshold: exports_external.number().min(0).max(1).default(0.6),
26275
- excluded_agents: exports_external.array(exports_external.string()).default(["\u77E5\u8BC6\u5178\u85CF", "\u5A92\u4F53\u89E3\u6790"]),
26293
+ excluded_agents: exports_external.array(exports_external.string()).default([]),
26276
26294
  user_message_english_threshold: exports_external.number().min(0).max(1).default(0.6),
26277
26295
  user_message_lookback: exports_external.number().int().positive().default(3)
26278
26296
  }).optional();
@@ -78,8 +78,7 @@ export declare const HookNameSchema: z.ZodEnum<{
78
78
  "prometheus-md-only": "prometheus-md-only";
79
79
  "perf-profiler": "perf-profiler";
80
80
  "start-work": "start-work";
81
- "language-reminder": "language-reminder";
82
- "thinking-language-validator": "thinking-language-validator";
81
+ "system-language-injector": "system-language-injector";
83
82
  "tool-definition-optimizer": "tool-definition-optimizer";
84
83
  "permission-ask-bridge": "permission-ask-bridge";
85
84
  "shell-env-injector": "shell-env-injector";
@@ -1380,8 +1379,7 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
1380
1379
  "prometheus-md-only": "prometheus-md-only";
1381
1380
  "perf-profiler": "perf-profiler";
1382
1381
  "start-work": "start-work";
1383
- "language-reminder": "language-reminder";
1384
- "thinking-language-validator": "thinking-language-validator";
1382
+ "system-language-injector": "system-language-injector";
1385
1383
  "tool-definition-optimizer": "tool-definition-optimizer";
1386
1384
  "permission-ask-bridge": "permission-ask-bridge";
1387
1385
  "shell-env-injector": "shell-env-injector";
@@ -1 +1 @@
1
- export declare function recoverSessionAgents(): number;
1
+ export declare function recoverSessionAgents(directory?: string): number;
@@ -3,6 +3,10 @@ export declare function setMainSession(id: string | undefined): void;
3
3
  export declare function getMainSessionID(): string | undefined;
4
4
  /** @internal For testing only */
5
5
  export declare function _resetForTesting(): void;
6
+ /** @internal For testing only */
7
+ export declare let _persistDirectory: string | undefined;
8
+ /** @internal For testing only */
9
+ export declare function _setPersistDirectory(dir: string | undefined): void;
6
10
  export declare function setSessionAgent(sessionID: string, agent: string, source?: string): void;
7
11
  export declare function updateSessionAgent(sessionID: string, agent: string, source?: string): void;
8
12
  export declare function getSessionAgent(sessionID: string): string | undefined;
@@ -13,3 +17,5 @@ export declare function getSessionAgentMeta(sessionID: string): {
13
17
  };
14
18
  export declare function isSessionAgentStale(sessionID: string, staleThresholdMs: number): boolean;
15
19
  export declare function clearSessionAgent(sessionID: string): void;
20
+ export declare function persistSessionAgentMap(directory: string): void;
21
+ export declare function loadSessionAgentMap(directory: string): void;
@@ -11,6 +11,27 @@ interface ToolExecuteAfterOutput {
11
11
  output: string;
12
12
  metadata: Record<string, unknown>;
13
13
  }
14
+ /**
15
+ * Pure name check: is this agent allowed to trigger checkbox auto-update?
16
+ * Allows both "任务编排" (atlas) and "主执行官" (sisyphus).
17
+ */
18
+ export declare function isAgentCheckboxUpdater(agentName?: string | null): boolean;
19
+ /**
20
+ * Check if the caller is allowed to trigger checkbox auto-update.
21
+ * Uses session messages to determine caller agent.
22
+ */
23
+ export declare function isActiveCheckboxUpdater(sessionID?: string): boolean;
24
+ /**
25
+ * Pure name check: is this agent allowed to trigger BOULDER continuation?
26
+ * Allows both "任务编排" (atlas) and "主执行官" (sisyphus).
27
+ */
28
+ export declare function isAgentContinuationTrigger(agentName?: string | null): boolean;
29
+ /**
30
+ * Check if the caller is allowed to trigger BOULDER continuation.
31
+ * Uses session messages to determine caller agent.
32
+ * Falls back to checking boulderState.session_ids when message store is unavailable.
33
+ */
34
+ export declare function isActiveContinuationTrigger(sessionID?: string, directory?: string): boolean;
14
35
  export interface AtlasHookOptions {
15
36
  directory: string;
16
37
  backgroundManager?: BackgroundManager;
@@ -15,8 +15,6 @@ export { createRulesInjectorHook } from "./rules-injector";
15
15
  export { createBackgroundNotificationHook } from "./background-notification";
16
16
  export { createAutoUpdateCheckerHook } from "./auto-update-checker";
17
17
  export { createAgentUsageReminderHook } from "./agent-usage-reminder";
18
- export { createLanguageReminderHook } from "./language-reminder";
19
- export { createThinkingLanguageValidatorHook } from "./thinking-language-validator";
20
18
  export { createKeywordDetectorHook } from "./keyword-detector";
21
19
  export { createNonInteractiveEnvHook } from "./non-interactive-env";
22
20
  export { createInteractiveBashSessionHook } from "./interactive-bash-session";
@@ -0,0 +1,19 @@
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ interface SystemTransformInput {
3
+ sessionID?: string;
4
+ model: {
5
+ id: string;
6
+ providerID: string;
7
+ };
8
+ }
9
+ interface SystemTransformOutput {
10
+ system: string[];
11
+ }
12
+ export declare function createSystemLanguageInjectorHook(_ctx: PluginInput, config?: {
13
+ language_enforcement?: {
14
+ enabled?: boolean;
15
+ };
16
+ }): {
17
+ "experimental.chat.system.transform": (input: SystemTransformInput, output: SystemTransformOutput) => Promise<void>;
18
+ };
19
+ export {};