pybao-cli 1.4.38 → 1.4.39

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 (147) hide show
  1. package/dist/REPL-N62XVC35.js +47 -0
  2. package/dist/{acp-VM2J53W4.js → acp-6LBQJVMX.js} +29 -29
  3. package/dist/{agentsValidate-GFWWYUUT.js → agentsValidate-SLBW2ESZ.js} +7 -7
  4. package/dist/{ask-PEAASZU5.js → ask-DB4F3WJG.js} +28 -28
  5. package/dist/{autoUpdater-3MO2ERDJ.js → autoUpdater-CYDJVIEC.js} +3 -3
  6. package/dist/{chunk-2PTOXRBC.js → chunk-3LNPU7WH.js} +3 -3
  7. package/dist/{chunk-KJAUAOX4.js → chunk-4LXZDGCO.js} +3 -3
  8. package/dist/{chunk-65QK3573.js → chunk-6KSM5M7T.js} +1 -1
  9. package/dist/{chunk-4HUEIGXE.js → chunk-7TGWBYFN.js} +4 -4
  10. package/dist/{chunk-3BPMIKJM.js → chunk-7WCSSH3C.js} +3 -3
  11. package/dist/{chunk-UAPC4AG3.js → chunk-AI7FJQR4.js} +78 -20
  12. package/dist/chunk-AI7FJQR4.js.map +7 -0
  13. package/dist/{chunk-4YELTGBJ.js → chunk-DEYAAT6H.js} +3 -3
  14. package/dist/{chunk-4VNRS435.js → chunk-DLBWS3IW.js} +1 -1
  15. package/dist/{chunk-IHIHIPNE.js → chunk-E5EB22W4.js} +4 -4
  16. package/dist/{chunk-VFIFN6QL.js → chunk-GD43B2GV.js} +1 -1
  17. package/dist/{chunk-VINZKV6L.js → chunk-GL3ZM7F3.js} +3 -3
  18. package/dist/{chunk-WYUAUOQL.js → chunk-GXHSGPIF.js} +4 -4
  19. package/dist/{chunk-ZTLEOE22.js → chunk-HD4IO3I5.js} +38 -55
  20. package/dist/{chunk-ZTLEOE22.js.map → chunk-HD4IO3I5.js.map} +2 -2
  21. package/dist/{chunk-Q6D4CWM7.js → chunk-KNLFFHBT.js} +2 -2
  22. package/dist/{chunk-DR3UKEHX.js → chunk-KWPH7MSB.js} +1 -1
  23. package/dist/{chunk-NV4KLIR4.js → chunk-N4GXGPVA.js} +1 -1
  24. package/dist/{chunk-2TPHG5NF.js → chunk-NMJYV37P.js} +2 -2
  25. package/dist/{chunk-5F5QQXYO.js → chunk-NNE44UHQ.js} +2 -2
  26. package/dist/{chunk-7D6P6FJI.js → chunk-O5OT26P6.js} +1 -1
  27. package/dist/{chunk-KXOZAPOR.js → chunk-RS2N2KBH.js} +164 -67
  28. package/dist/chunk-RS2N2KBH.js.map +7 -0
  29. package/dist/{chunk-F33UZKH2.js → chunk-SBPVAFBQ.js} +2 -2
  30. package/dist/{chunk-4QZIAEFU.js → chunk-SSKQUKI7.js} +1 -1
  31. package/dist/{chunk-YSGQ33QO.js → chunk-TNAAGT3Q.js} +3 -3
  32. package/dist/{chunk-SV44GQBZ.js → chunk-UK4IHZU3.js} +2 -2
  33. package/dist/{chunk-POFRZWP7.js → chunk-UUWI4VWU.js} +1 -1
  34. package/dist/{chunk-POFRZWP7.js.map → chunk-UUWI4VWU.js.map} +1 -1
  35. package/dist/{chunk-PAZ5OZZ3.js → chunk-VFQU3JSH.js} +4 -4
  36. package/dist/{chunk-NDU2T5RK.js → chunk-VHTIDAOJ.js} +2 -2
  37. package/dist/{chunk-Q5VMFXN3.js → chunk-VXQMCAPS.js} +1 -1
  38. package/dist/{chunk-ZBXRD5R5.js → chunk-YJ2WXW2J.js} +3 -3
  39. package/dist/{chunk-FQBPNSQM.js → chunk-ZGVGFR4C.js} +1 -1
  40. package/dist/{cli-BMCKTX2V.js → cli-FMCSS5QE.js} +87 -87
  41. package/dist/commands-IJTOU4P3.js +51 -0
  42. package/dist/{config-CKEF5MIR.js → config-YRHKZJO6.js} +4 -4
  43. package/dist/{context-CV3LBU7I.js → context-ZZO64MRN.js} +6 -6
  44. package/dist/{customCommands-JK4SVCOD.js → customCommands-2S7LYMG7.js} +4 -4
  45. package/dist/{env-2D5PYXT3.js → env-PQDRZBAW.js} +2 -2
  46. package/dist/{file-DTOJ46HD.js → file-X7BE3MNR.js} +4 -4
  47. package/dist/index.js +3 -3
  48. package/dist/{llm-3C5ICYYM.js → llm-3KCTIVOM.js} +29 -29
  49. package/dist/{llmLazy-7NGDJTCJ.js → llmLazy-HCTXTHRZ.js} +1 -1
  50. package/dist/{loader-K64KKCLP.js → loader-DKMJSH4V.js} +4 -4
  51. package/dist/{lsp-UIWT5EAB.js → lsp-IXEAYT4K.js} +6 -6
  52. package/dist/{lspAnchor-XM5HYD36.js → lspAnchor-FKXOKCQZ.js} +6 -6
  53. package/dist/{mcp-WF3IJF4P.js → mcp-ZUJD3E4V.js} +7 -7
  54. package/dist/{mentionProcessor-FBOG655N.js → mentionProcessor-7GXI47P3.js} +6 -6
  55. package/dist/{messages-S6BQMC7F.js → messages-55HNRTQC.js} +1 -1
  56. package/dist/{model-N6XZCIO2.js → model-R5X6XP7I.js} +5 -5
  57. package/dist/{openai-YJOBEGF4.js → openai-FM7DX3GB.js} +5 -5
  58. package/dist/{outputStyles-UJISJCZB.js → outputStyles-ZLGIDCCJ.js} +4 -4
  59. package/dist/{pluginRuntime-B5FLWZCB.js → pluginRuntime-REF3E5F5.js} +6 -6
  60. package/dist/{pluginValidation-YLGUCTSN.js → pluginValidation-E33USDYW.js} +6 -6
  61. package/dist/prompts-W7TUXY74.js +53 -0
  62. package/dist/{pybAgentSessionLoad-ZIJOJP53.js → pybAgentSessionLoad-PGTH6SZH.js} +4 -4
  63. package/dist/{pybAgentSessionResume-32HYMEZD.js → pybAgentSessionResume-IVBY65PN.js} +4 -4
  64. package/dist/{pybAgentStreamJsonSession-33GITQPO.js → pybAgentStreamJsonSession-N2Q6LQHX.js} +1 -1
  65. package/dist/{pybHooks-XQH57YXB.js → pybHooks-WIA5KKVN.js} +4 -4
  66. package/dist/query-BTG2T7NV.js +55 -0
  67. package/dist/{registry-AWWHDPCP.js → registry-PT3XVAT6.js} +5 -5
  68. package/dist/{ripgrep-HM6FRMPY.js → ripgrep-2VWCSPH4.js} +3 -3
  69. package/dist/{skillMarketplace-RFELE7ZN.js → skillMarketplace-NHPAPZTS.js} +3 -3
  70. package/dist/{state-3MIS3KPI.js → state-4AIVX6VM.js} +2 -2
  71. package/dist/{theme-3W3YPAC4.js → theme-LKZFY5TU.js} +5 -5
  72. package/dist/{toolPermissionSettings-Q7A55J23.js → toolPermissionSettings-OVFT6D3R.js} +6 -6
  73. package/dist/tools-6ONPKOSL.js +52 -0
  74. package/dist/{userInput-Y5GXDITH.js → userInput-RHGZ225B.js} +30 -30
  75. package/package.json +1 -1
  76. package/dist/REPL-7KQEJZQW.js +0 -47
  77. package/dist/chunk-KXOZAPOR.js.map +0 -7
  78. package/dist/chunk-UAPC4AG3.js.map +0 -7
  79. package/dist/commands-MTPBHNKM.js +0 -51
  80. package/dist/prompts-YL2Q36DH.js +0 -53
  81. package/dist/query-UI6I2555.js +0 -55
  82. package/dist/tools-VFHVJUG3.js +0 -52
  83. /package/dist/{REPL-7KQEJZQW.js.map → REPL-N62XVC35.js.map} +0 -0
  84. /package/dist/{acp-VM2J53W4.js.map → acp-6LBQJVMX.js.map} +0 -0
  85. /package/dist/{agentsValidate-GFWWYUUT.js.map → agentsValidate-SLBW2ESZ.js.map} +0 -0
  86. /package/dist/{ask-PEAASZU5.js.map → ask-DB4F3WJG.js.map} +0 -0
  87. /package/dist/{autoUpdater-3MO2ERDJ.js.map → autoUpdater-CYDJVIEC.js.map} +0 -0
  88. /package/dist/{chunk-2PTOXRBC.js.map → chunk-3LNPU7WH.js.map} +0 -0
  89. /package/dist/{chunk-KJAUAOX4.js.map → chunk-4LXZDGCO.js.map} +0 -0
  90. /package/dist/{chunk-65QK3573.js.map → chunk-6KSM5M7T.js.map} +0 -0
  91. /package/dist/{chunk-4HUEIGXE.js.map → chunk-7TGWBYFN.js.map} +0 -0
  92. /package/dist/{chunk-3BPMIKJM.js.map → chunk-7WCSSH3C.js.map} +0 -0
  93. /package/dist/{chunk-4YELTGBJ.js.map → chunk-DEYAAT6H.js.map} +0 -0
  94. /package/dist/{chunk-4VNRS435.js.map → chunk-DLBWS3IW.js.map} +0 -0
  95. /package/dist/{chunk-IHIHIPNE.js.map → chunk-E5EB22W4.js.map} +0 -0
  96. /package/dist/{chunk-VFIFN6QL.js.map → chunk-GD43B2GV.js.map} +0 -0
  97. /package/dist/{chunk-VINZKV6L.js.map → chunk-GL3ZM7F3.js.map} +0 -0
  98. /package/dist/{chunk-WYUAUOQL.js.map → chunk-GXHSGPIF.js.map} +0 -0
  99. /package/dist/{chunk-Q6D4CWM7.js.map → chunk-KNLFFHBT.js.map} +0 -0
  100. /package/dist/{chunk-DR3UKEHX.js.map → chunk-KWPH7MSB.js.map} +0 -0
  101. /package/dist/{chunk-NV4KLIR4.js.map → chunk-N4GXGPVA.js.map} +0 -0
  102. /package/dist/{chunk-2TPHG5NF.js.map → chunk-NMJYV37P.js.map} +0 -0
  103. /package/dist/{chunk-5F5QQXYO.js.map → chunk-NNE44UHQ.js.map} +0 -0
  104. /package/dist/{chunk-7D6P6FJI.js.map → chunk-O5OT26P6.js.map} +0 -0
  105. /package/dist/{chunk-F33UZKH2.js.map → chunk-SBPVAFBQ.js.map} +0 -0
  106. /package/dist/{chunk-4QZIAEFU.js.map → chunk-SSKQUKI7.js.map} +0 -0
  107. /package/dist/{chunk-YSGQ33QO.js.map → chunk-TNAAGT3Q.js.map} +0 -0
  108. /package/dist/{chunk-SV44GQBZ.js.map → chunk-UK4IHZU3.js.map} +0 -0
  109. /package/dist/{chunk-PAZ5OZZ3.js.map → chunk-VFQU3JSH.js.map} +0 -0
  110. /package/dist/{chunk-NDU2T5RK.js.map → chunk-VHTIDAOJ.js.map} +0 -0
  111. /package/dist/{chunk-Q5VMFXN3.js.map → chunk-VXQMCAPS.js.map} +0 -0
  112. /package/dist/{chunk-ZBXRD5R5.js.map → chunk-YJ2WXW2J.js.map} +0 -0
  113. /package/dist/{chunk-FQBPNSQM.js.map → chunk-ZGVGFR4C.js.map} +0 -0
  114. /package/dist/{cli-BMCKTX2V.js.map → cli-FMCSS5QE.js.map} +0 -0
  115. /package/dist/{commands-MTPBHNKM.js.map → commands-IJTOU4P3.js.map} +0 -0
  116. /package/dist/{config-CKEF5MIR.js.map → config-YRHKZJO6.js.map} +0 -0
  117. /package/dist/{context-CV3LBU7I.js.map → context-ZZO64MRN.js.map} +0 -0
  118. /package/dist/{customCommands-JK4SVCOD.js.map → customCommands-2S7LYMG7.js.map} +0 -0
  119. /package/dist/{env-2D5PYXT3.js.map → env-PQDRZBAW.js.map} +0 -0
  120. /package/dist/{file-DTOJ46HD.js.map → file-X7BE3MNR.js.map} +0 -0
  121. /package/dist/{llm-3C5ICYYM.js.map → llm-3KCTIVOM.js.map} +0 -0
  122. /package/dist/{llmLazy-7NGDJTCJ.js.map → llmLazy-HCTXTHRZ.js.map} +0 -0
  123. /package/dist/{loader-K64KKCLP.js.map → loader-DKMJSH4V.js.map} +0 -0
  124. /package/dist/{lsp-UIWT5EAB.js.map → lsp-IXEAYT4K.js.map} +0 -0
  125. /package/dist/{lspAnchor-XM5HYD36.js.map → lspAnchor-FKXOKCQZ.js.map} +0 -0
  126. /package/dist/{mcp-WF3IJF4P.js.map → mcp-ZUJD3E4V.js.map} +0 -0
  127. /package/dist/{mentionProcessor-FBOG655N.js.map → mentionProcessor-7GXI47P3.js.map} +0 -0
  128. /package/dist/{messages-S6BQMC7F.js.map → messages-55HNRTQC.js.map} +0 -0
  129. /package/dist/{model-N6XZCIO2.js.map → model-R5X6XP7I.js.map} +0 -0
  130. /package/dist/{openai-YJOBEGF4.js.map → openai-FM7DX3GB.js.map} +0 -0
  131. /package/dist/{outputStyles-UJISJCZB.js.map → outputStyles-ZLGIDCCJ.js.map} +0 -0
  132. /package/dist/{pluginRuntime-B5FLWZCB.js.map → pluginRuntime-REF3E5F5.js.map} +0 -0
  133. /package/dist/{pluginValidation-YLGUCTSN.js.map → pluginValidation-E33USDYW.js.map} +0 -0
  134. /package/dist/{prompts-YL2Q36DH.js.map → prompts-W7TUXY74.js.map} +0 -0
  135. /package/dist/{pybAgentSessionLoad-ZIJOJP53.js.map → pybAgentSessionLoad-PGTH6SZH.js.map} +0 -0
  136. /package/dist/{pybAgentSessionResume-32HYMEZD.js.map → pybAgentSessionResume-IVBY65PN.js.map} +0 -0
  137. /package/dist/{pybAgentStreamJsonSession-33GITQPO.js.map → pybAgentStreamJsonSession-N2Q6LQHX.js.map} +0 -0
  138. /package/dist/{pybHooks-XQH57YXB.js.map → pybHooks-WIA5KKVN.js.map} +0 -0
  139. /package/dist/{query-UI6I2555.js.map → query-BTG2T7NV.js.map} +0 -0
  140. /package/dist/{registry-AWWHDPCP.js.map → registry-PT3XVAT6.js.map} +0 -0
  141. /package/dist/{ripgrep-HM6FRMPY.js.map → ripgrep-2VWCSPH4.js.map} +0 -0
  142. /package/dist/{skillMarketplace-RFELE7ZN.js.map → skillMarketplace-NHPAPZTS.js.map} +0 -0
  143. /package/dist/{state-3MIS3KPI.js.map → state-4AIVX6VM.js.map} +0 -0
  144. /package/dist/{theme-3W3YPAC4.js.map → theme-LKZFY5TU.js.map} +0 -0
  145. /package/dist/{toolPermissionSettings-Q7A55J23.js.map → toolPermissionSettings-OVFT6D3R.js.map} +0 -0
  146. /package/dist/{tools-VFHVJUG3.js.map → tools-6ONPKOSL.js.map} +0 -0
  147. /package/dist/{userInput-Y5GXDITH.js.map → userInput-RHGZ225B.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/agent/storage.ts", "../src/utils/session/taskStore.ts", "../src/utils/session/todoStorage.ts", "../src/services/system/systemReminder.ts"],
4
+ "sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { resolveXdgDataPath } from '@utils/config/env'\n\n\nfunction getConfigDirectory(): string {\n const override = process.env.ANYKODE_CONFIG_DIR?.trim()\n if (override) return override\n return resolveXdgDataPath('agents')\n}\n\nfunction getSessionId(): string {\n return process.env.ANYKODE_SESSION_ID ?? 'default-session'\n}\n\nexport function getAgentFilePath(agentId: string): string {\n const sessionId = getSessionId()\n const filename = `${sessionId}-agent-${agentId}.json`\n const configDir = getConfigDirectory()\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n\n return join(configDir, filename)\n}\n\nexport function readAgentData<T = any>(agentId: string): T | null {\n const filePath = getAgentFilePath(agentId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_READ_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\nexport function writeAgentData<T = any>(agentId: string, data: T): void {\n const filePath = getAgentFilePath(agentId)\n\n try {\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_WRITE_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport function getDefaultAgentId(): string {\n return 'default'\n}\n\nexport function resolveAgentId(agentId?: string): string {\n return agentId || getDefaultAgentId()\n}\n\nexport function generateAgentId(): string {\n return randomUUID()\n}\n", "import {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { createHash } from 'crypto'\nimport type { GlobalConfig, ProjectConfig } from '@utils/config'\nimport { getCurrentProjectConfig, getGlobalConfig } from '@utils/config'\nimport { resolveXdgDataPath } from '@utils/config/env'\nimport { getCwd } from '@utils/state'\n\nexport type TaskStatus = 'open' | 'in_progress' | 'blocked' | 'done' | 'archived'\n\nexport type TaskRecord = {\n id: string\n subject: string\n title: string\n description?: string\n activeForm?: string\n status: TaskStatus\n tags?: string[]\n assignee?: string\n metadata?: Record<string, string>\n archived?: boolean\n blocks?: string[]\n blockedBy?: string[]\n parent?: string\n related?: string[]\n createdAt: number\n updatedAt: number\n baseVersion: number\n version: number\n legacyTodoId?: string\n}\n\nexport type TaskCreateInput = {\n subject?: string\n description?: string\n activeForm?: string\n status?: TaskStatus\n tags?: string[]\n assignee?: string\n metadata?: Record<string, string>\n archived?: boolean\n blocks?: string[]\n blockedBy?: string[]\n parent?: string\n related?: string[]\n legacyTodoId?: string\n}\n\nexport type TaskUpdateInput = Partial<TaskCreateInput> & {\n baseVersion?: number\n updatedAt?: number\n}\n\nexport type TaskUpdateResult = {\n task: TaskRecord\n conflict: boolean\n}\n\ntype TaskListScope = 'project' | 'global'\n\ntype TaskListContext = {\n listId: string\n scope: TaskListScope\n source: 'env' | 'global' | 'project' | 'default' | 'input'\n}\n\ntype TaskIndex = {\n nextId: number\n total: number\n byStatus: Record<TaskStatus, number>\n lastUpdated: number\n}\n\ntype TaskListMeta = {\n listId: string\n createdAt: number\n updatedAt: number\n todoMigration?: {\n completedAt: number\n sourceCount: number\n }\n}\n\nconst DEFAULT_LOCK_TTL_MS = 60000\n\nfunction buildActiveForm(subject: string): string {\n return `Working on ${subject}`\n}\n\nexport class TaskStoreLockError extends Error {\n code = 'TASK_STORE_LOCKED'\n constructor(message: string) {\n super(message)\n this.name = 'TaskStoreLockError'\n }\n}\n\nexport class TaskStoreConflictError extends Error {\n code = 'TASK_STORE_CONFLICT'\n taskId: string\n expectedBaseVersion: number\n actualBaseVersion: number\n constructor(params: { taskId: string; expected: number; actual: number }) {\n super(\n `Task ${params.taskId} baseVersion ${params.actual} does not match expected ${params.expected}`,\n )\n this.name = 'TaskStoreConflictError'\n this.taskId = params.taskId\n this.expectedBaseVersion = params.expected\n this.actualBaseVersion = params.actual\n }\n}\n\nexport function getDefaultTaskListId(cwd: string): string {\n return createHash('sha256').update(cwd).digest('hex').slice(0, 12)\n}\n\nfunction resolveGlobalTaskRootDir(): string {\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n if (override) return override\n const home = homedir()\n const pybDir = join(home, '.pyb')\n if (existsSync(pybDir)) return pybDir\n const claudeDir = join(home, '.claude')\n if (existsSync(claudeDir)) return claudeDir\n return pybDir\n}\n\nfunction findBaseDirWithList(\n listId: string,\n candidates: string[],\n): string | null {\n for (const candidate of candidates) {\n if (existsSync(join(candidate, listId))) return candidate\n }\n return null\n}\n\nfunction getTaskListContext(options?: {\n listId?: string\n cwd?: string\n env?: NodeJS.ProcessEnv\n projectConfig?: ProjectConfig | null\n globalConfig?: GlobalConfig | null\n}): TaskListContext {\n const env = options?.env ?? process.env\n const globalConfig = options?.globalConfig ?? getGlobalConfig()\n const projectConfig = options?.projectConfig ?? getCurrentProjectConfig()\n const cwd = options?.cwd ?? getCwd()\n const defaultId = getDefaultTaskListId(cwd)\n const inputListId = options?.listId?.trim()\n\n const envId =\n env.PYB_TASK_LIST_ID?.trim() || env.CLAUDE_CODE_TASK_LIST_ID?.trim()\n const globalId = globalConfig?.taskListId?.trim()\n const projectId = projectConfig?.taskListId?.trim()\n\n if (inputListId) {\n if (inputListId === projectId || inputListId === defaultId) {\n return { listId: inputListId, scope: 'project', source: 'input' }\n }\n if (inputListId === globalId || inputListId === envId) {\n return { listId: inputListId, scope: 'global', source: 'input' }\n }\n return { listId: inputListId, scope: 'project', source: 'input' }\n }\n\n if (envId) return { listId: envId, scope: 'global', source: 'env' }\n if (globalId) return { listId: globalId, scope: 'global', source: 'global' }\n if (projectId) return { listId: projectId, scope: 'project', source: 'project' }\n\n return { listId: defaultId, scope: 'project', source: 'default' }\n}\n\nexport function getTaskListId(options?: {\n cwd?: string\n env?: NodeJS.ProcessEnv\n projectConfig?: ProjectConfig | null\n globalConfig?: GlobalConfig | null\n}): string {\n return getTaskListContext(options).listId\n}\n\nfunction resolveTaskBaseDir(context: TaskListContext, cwd: string): string {\n if (context.scope === 'project') {\n const pybDir = join(cwd, '.pyb')\n const claudeDir = join(cwd, '.claude')\n const hasProjectPyb = existsSync(pybDir)\n const hasProjectClaude = existsSync(claudeDir)\n const projectRoot = hasProjectPyb ? pybDir : hasProjectClaude ? claudeDir : pybDir\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n const defaultBaseDir =\n !hasProjectPyb && !hasProjectClaude && override\n ? join(override, 'tasks')\n : join(projectRoot, 'tasks')\n const candidates = [\n join(cwd, '.pyb', 'tasks'),\n join(cwd, '.claude', 'tasks'),\n ...(override ? [join(override, 'tasks')] : []),\n resolveXdgDataPath('tasks'),\n ]\n return findBaseDirWithList(context.listId, candidates) ?? defaultBaseDir\n }\n\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n const globalCandidates = override\n ? [join(override, 'tasks')]\n : [\n join(homedir(), '.pyb', 'tasks'),\n join(homedir(), '.claude', 'tasks'),\n ]\n const defaultBaseDir = join(resolveGlobalTaskRootDir(), 'tasks')\n const candidates = [...globalCandidates, resolveXdgDataPath('tasks')]\n return findBaseDirWithList(context.listId, candidates) ?? defaultBaseDir\n}\n\nexport function getTaskListPaths(listId?: string): {\n listId: string\n baseDir: string\n listDir: string\n tasksDir: string\n indexPath: string\n metaPath: string\n lockPath: string\n eventsPath: string\n} {\n const context = getTaskListContext({ listId })\n const cwd = getCwd()\n const baseDir = resolveTaskBaseDir(context, cwd)\n const listDir = join(baseDir, context.listId)\n return {\n listId: context.listId,\n baseDir,\n listDir,\n tasksDir: listDir,\n indexPath: join(listDir, 'index.json'),\n metaPath: join(listDir, 'meta.json'),\n lockPath: join(listDir, '.lock'),\n eventsPath: join(listDir, 'events.jsonl'),\n }\n}\n\nfunction ensureTaskListDirs(paths: ReturnType<typeof getTaskListPaths>): void {\n mkdirSync(paths.listDir, { recursive: true })\n}\n\nfunction defaultIndex(): TaskIndex {\n return {\n nextId: 1,\n total: 0,\n byStatus: {\n open: 0,\n in_progress: 0,\n blocked: 0,\n done: 0,\n archived: 0,\n },\n lastUpdated: Date.now(),\n }\n}\n\nfunction readJson<T>(path: string): T | null {\n if (!existsSync(path)) return null\n try {\n const raw = readFileSync(path, 'utf8')\n return JSON.parse(raw) as T\n } catch {\n return null\n }\n}\n\nfunction writeJson(path: string, value: unknown): void {\n writeFileSync(path, JSON.stringify(value, null, 2), 'utf8')\n}\n\nexport type TaskEventRecord = {\n listId: string\n taskId: string\n type: 'task.created' | 'task.updated'\n timestamp: number\n}\n\nfunction appendTaskEvent(\n paths: ReturnType<typeof getTaskListPaths>,\n event: TaskEventRecord,\n): void {\n ensureTaskListDirs(paths)\n writeFileSync(paths.eventsPath, `${JSON.stringify(event)}\\n`, {\n encoding: 'utf8',\n flag: 'a',\n })\n}\n\nexport function readTaskEventLog(\n listId?: string,\n offset: number = 0,\n): { events: TaskEventRecord[]; nextOffset: number } {\n const paths = getTaskListPaths(listId)\n if (!existsSync(paths.eventsPath)) {\n return { events: [], nextOffset: 0 }\n }\n const buffer = readFileSync(paths.eventsPath)\n const nextOffset = buffer.length\n if (offset >= nextOffset) {\n return { events: [], nextOffset }\n }\n const chunk = buffer.toString('utf8', offset)\n const events: TaskEventRecord[] = []\n for (const line of chunk.split('\\n')) {\n if (!line.trim()) continue\n try {\n const parsed = JSON.parse(line) as TaskEventRecord\n if (parsed.listId && parsed.taskId && parsed.type && parsed.timestamp) {\n events.push(parsed)\n }\n } catch {\n continue\n }\n }\n return { events, nextOffset }\n}\n\nfunction readIndex(paths: ReturnType<typeof getTaskListPaths>): TaskIndex {\n const index = readJson<TaskIndex>(paths.indexPath)\n if (index && index.nextId >= 1) return index\n return recoverIndex(paths)\n}\n\nfunction writeIndex(paths: ReturnType<typeof getTaskListPaths>, index: TaskIndex) {\n writeJson(paths.indexPath, index)\n}\n\nfunction readMeta(paths: ReturnType<typeof getTaskListPaths>): TaskListMeta {\n ensureTaskListDirs(paths)\n const meta = readJson<TaskListMeta>(paths.metaPath)\n if (meta && meta.listId) return meta\n const now = Date.now()\n const created: TaskListMeta = {\n listId: paths.listId,\n createdAt: now,\n updatedAt: now,\n }\n writeJson(paths.metaPath, created)\n return created\n}\n\nfunction writeMeta(\n paths: ReturnType<typeof getTaskListPaths>,\n meta: TaskListMeta,\n): void {\n ensureTaskListDirs(paths)\n writeJson(paths.metaPath, meta)\n}\n\nfunction readTaskFile(path: string): TaskRecord | null {\n const data = readJson<Partial<TaskRecord> & { title?: string; version?: number }>(\n path,\n )\n if (!data || !data.id || (!data.subject && !data.title) || !data.status) {\n return null\n }\n const subject = data.subject ?? data.title\n const title = subject\n const activeForm = data.activeForm ?? buildActiveForm(subject)\n const baseVersion =\n typeof data.baseVersion === 'number'\n ? data.baseVersion\n : typeof data.version === 'number'\n ? data.version\n : 1\n const version = typeof data.version === 'number' ? data.version : baseVersion\n const createdAt =\n typeof data.createdAt === 'number' ? data.createdAt : Date.now()\n const updatedAt =\n typeof data.updatedAt === 'number' ? data.updatedAt : createdAt\n const normalized = {\n ...data,\n subject,\n title,\n activeForm,\n blocks: data.blocks ?? [],\n blockedBy: data.blockedBy ?? [],\n createdAt,\n updatedAt,\n baseVersion,\n version,\n } as TaskRecord\n delete (normalized as any).priority\n return normalized\n}\n\nfunction recoverIndex(paths: ReturnType<typeof getTaskListPaths>): TaskIndex {\n ensureTaskListDirs(paths)\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n const tasks = files\n .map(file => readTaskFile(join(paths.tasksDir, file)))\n .filter(Boolean) as TaskRecord[]\n const byStatus = {\n open: 0,\n in_progress: 0,\n blocked: 0,\n done: 0,\n archived: 0,\n }\n let maxId = 0\n for (const task of tasks) {\n byStatus[task.status] += 1\n const numericId = Number(task.id)\n if (!Number.isNaN(numericId)) {\n maxId = Math.max(maxId, numericId)\n }\n }\n const index: TaskIndex = {\n nextId: Math.max(1, maxId + 1),\n total: tasks.length,\n byStatus,\n lastUpdated: Date.now(),\n }\n writeIndex(paths, index)\n return index\n}\n\nfunction readLock(\n path: string,\n): { createdAt: number; expiresAt: number } | null {\n const lock = readJson<{ createdAt: number; expiresAt: number }>(path)\n if (!lock || !lock.createdAt || !lock.expiresAt) return null\n return lock\n}\n\nfunction isLockExpired(lock: { expiresAt: number }): boolean {\n return lock.expiresAt <= Date.now()\n}\n\nfunction acquireLock(paths: ReturnType<typeof getTaskListPaths>): void {\n ensureTaskListDirs(paths)\n const lock = readLock(paths.lockPath)\n if (lock && !isLockExpired(lock)) {\n throw new TaskStoreLockError('Task list is locked')\n }\n if (lock && isLockExpired(lock)) {\n rmSync(paths.lockPath, { force: true })\n }\n const now = Date.now()\n try {\n writeFileSync(\n paths.lockPath,\n JSON.stringify(\n {\n createdAt: now,\n expiresAt: now + DEFAULT_LOCK_TTL_MS,\n },\n null,\n 2,\n ),\n { encoding: 'utf8', flag: 'wx' },\n )\n } catch {\n throw new TaskStoreLockError('Task list is locked')\n }\n}\n\nfunction releaseLock(paths: ReturnType<typeof getTaskListPaths>): void {\n rmSync(paths.lockPath, { force: true })\n}\n\nfunction withTaskListLock<T>(\n paths: ReturnType<typeof getTaskListPaths>,\n handler: () => T,\n): T {\n acquireLock(paths)\n try {\n return handler()\n } finally {\n releaseLock(paths)\n }\n}\n\nfunction applyTaskUpdates(\n task: TaskRecord,\n updates: TaskUpdateInput,\n nextBaseVersion: number,\n): TaskRecord {\n const now = updates.updatedAt ?? Date.now()\n const subject = updates.subject ?? task.subject\n const title = subject\n const activeForm =\n updates.activeForm ??\n (updates.subject\n ? buildActiveForm(subject)\n : task.activeForm ?? buildActiveForm(subject))\n const blocks = updates.blocks ?? task.blocks ?? []\n const blockedBy = updates.blockedBy ?? task.blockedBy ?? []\n return {\n ...task,\n subject,\n title,\n description: updates.description ?? task.description,\n activeForm,\n status: updates.status ?? task.status,\n tags: updates.tags ?? task.tags,\n assignee: updates.assignee ?? task.assignee,\n metadata: updates.metadata ?? task.metadata,\n archived: updates.archived ?? task.archived,\n blocks,\n blockedBy,\n parent: updates.parent ?? task.parent,\n related: updates.related ?? task.related,\n updatedAt: now,\n baseVersion: nextBaseVersion,\n version: nextBaseVersion,\n legacyTodoId: updates.legacyTodoId ?? task.legacyTodoId,\n }\n}\n\nexport function createTask(\n input: TaskCreateInput,\n options?: { listId?: string },\n): TaskRecord {\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n ensureTaskListDirs(paths)\n const index = readIndex(paths)\n const id = String(index.nextId)\n const now = Date.now()\n const subject = input.subject\n if (!subject) {\n throw new Error('Task subject is required')\n }\n const title = subject\n const activeForm = input.activeForm ?? buildActiveForm(subject)\n const record: TaskRecord = {\n id,\n subject,\n title,\n description: input.description,\n activeForm,\n status: input.status ?? 'open',\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blocks: input.blocks ?? [],\n blockedBy: input.blockedBy ?? [],\n parent: input.parent,\n related: input.related,\n createdAt: now,\n updatedAt: now,\n baseVersion: 1,\n version: 1,\n legacyTodoId: input.legacyTodoId,\n }\n writeJson(join(paths.tasksDir, `${id}.json`), record)\n index.nextId += 1\n index.total += 1\n index.byStatus[record.status] += 1\n index.lastUpdated = Date.now()\n writeIndex(paths, index)\n const meta = readMeta(paths)\n meta.updatedAt = Date.now()\n writeMeta(paths, meta)\n appendTaskEvent(paths, {\n listId: paths.listId,\n taskId: record.id,\n type: 'task.created',\n timestamp: Date.now(),\n })\n return record\n })\n}\n\nexport function getTask(\n id: string,\n options?: { listId?: string },\n): TaskRecord | null {\n const paths = getTaskListPaths(options?.listId)\n const record = readTaskFile(join(paths.tasksDir, `${id}.json`))\n if (!record) return null\n return record\n}\n\nexport function listTasks(options?: { listId?: string }): TaskRecord[] {\n const paths = getTaskListPaths(options?.listId)\n readIndex(paths)\n ensureTaskListDirs(paths)\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n const tasks = files\n .map(file => readTaskFile(join(paths.tasksDir, file)))\n .filter(Boolean) as TaskRecord[]\n return tasks.sort((a, b) => Number(a.id) - Number(b.id))\n}\n\nexport function updateTask(\n id: string,\n updates: TaskUpdateInput,\n options?: { listId?: string; allowMerge?: boolean },\n): TaskUpdateResult {\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n const existing = readTaskFile(join(paths.tasksDir, `${id}.json`))\n if (!existing) {\n throw new Error(`Task ${id} not found`)\n }\n const requestedBase = updates.baseVersion\n const hasConflict =\n typeof requestedBase === 'number' &&\n requestedBase !== existing.baseVersion\n if (hasConflict && !options?.allowMerge) {\n throw new TaskStoreConflictError({\n taskId: id,\n expected: requestedBase,\n actual: existing.baseVersion,\n })\n }\n if (hasConflict && options?.allowMerge) {\n const updateTimestamp = updates.updatedAt ?? Date.now()\n if (updateTimestamp <= existing.updatedAt) {\n return { task: existing, conflict: true }\n }\n }\n const nextBaseVersion = existing.baseVersion + 1\n const updated = applyTaskUpdates(existing, updates, nextBaseVersion)\n writeJson(join(paths.tasksDir, `${id}.json`), updated)\n const index = readIndex(paths)\n if (updated.status !== existing.status) {\n index.byStatus[existing.status] = Math.max(\n 0,\n index.byStatus[existing.status] - 1,\n )\n index.byStatus[updated.status] += 1\n }\n index.lastUpdated = Date.now()\n writeIndex(paths, index)\n const meta = readMeta(paths)\n meta.updatedAt = Date.now()\n writeMeta(paths, meta)\n appendTaskEvent(paths, {\n listId: paths.listId,\n taskId: updated.id,\n type: 'task.updated',\n timestamp: Date.now(),\n })\n return { task: updated, conflict: hasConflict }\n })\n}\n\nexport function getTaskListMeta(options?: { listId?: string }): TaskListMeta {\n const paths = getTaskListPaths(options?.listId)\n return readMeta(paths)\n}\n\nexport function updateTaskListMeta(\n meta: TaskListMeta,\n options?: { listId?: string },\n): TaskListMeta {\n const paths = getTaskListPaths(options?.listId)\n const updated = { ...meta, updatedAt: Date.now() }\n writeMeta(paths, updated)\n return updated\n}\n", "import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from '@utils/agent/storage'\nimport {\n createTask,\n getTaskListMeta,\n getTaskListPaths,\n listTasks,\n TaskStatus,\n updateTask,\n updateTaskListMeta,\n} from './taskStore'\n\nexport interface TodoItem {\n id: string\n content: string\n status: 'pending' | 'in_progress' | 'completed'\n activeForm: string\n priority: 'high' | 'medium' | 'low'\n createdAt?: number\n updatedAt?: number\n tags?: string[]\n estimatedHours?: number\n previousStatus?: 'pending' | 'in_progress' | 'completed'\n}\n\nexport interface TodoQuery {\n status?: TodoItem['status'][]\n priority?: TodoItem['priority'][]\n contentMatch?: string\n tags?: string[]\n dateRange?: { from?: Date; to?: Date }\n}\n\nexport interface TodoStorageConfig {\n maxTodos: number\n autoArchiveCompleted: boolean\n sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'\n sortOrder: 'asc' | 'desc'\n}\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\nconst TODO_CACHE_KEY = 'todoCache'\n\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status',\n sortOrder: 'desc',\n}\n\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000\n\nexport function isTodoCompatEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n const raw = String(\n env.PYB_TODO_COMPAT ?? env.CLAUDE_CODE_TODO_COMPAT ?? '',\n )\n .trim()\n .toLowerCase()\n if (!raw) return false\n if (['0', 'false', 'no', 'off'].includes(raw)) return false\n if (['1', 'true', 'yes', 'on'].includes(raw)) return true\n return true\n}\n\nfunction toTaskStatus(status: TodoItem['status']): TaskStatus {\n if (status === 'completed') return 'done'\n if (status === 'in_progress') return 'in_progress'\n return 'open'\n}\n\nexport function syncTodosToTasks(\n todos: TodoItem[],\n options?: { listId?: string },\n): { listId: string; created: number; updated: number } {\n const { listId } = getTaskListPaths(options?.listId)\n const tasks = listTasks({ listId })\n const byLegacyId = new Map(\n tasks\n .filter(task => task.legacyTodoId)\n .map(task => [task.legacyTodoId as string, task]),\n )\n let created = 0\n let updated = 0\n for (const todo of todos) {\n const existing = byLegacyId.get(todo.id)\n if (!existing) {\n createTask(\n {\n subject: todo.content,\n description: todo.content,\n activeForm: todo.activeForm,\n status: toTaskStatus(todo.status),\n legacyTodoId: todo.id,\n },\n { listId },\n )\n created += 1\n } else {\n updateTask(\n existing.id,\n {\n subject: todo.content,\n description: todo.content,\n activeForm: todo.activeForm,\n status: toTaskStatus(todo.status),\n legacyTodoId: todo.id,\n },\n { listId, allowMerge: true },\n )\n updated += 1\n }\n }\n return { listId, created, updated }\n}\n\nexport function migrateTodosToTasks(options?: {\n listId?: string\n agentId?: string\n}): { listId: string; migrated: boolean; created: number } {\n const { listId } = getTaskListPaths(options?.listId)\n const meta = getTaskListMeta({ listId })\n if (meta.todoMigration?.completedAt) {\n return { listId, migrated: false, created: 0 }\n }\n const todos = getTodos(options?.agentId)\n const result = syncTodosToTasks(todos, { listId })\n updateTaskListMeta(\n {\n ...meta,\n todoMigration: {\n completedAt: Date.now(),\n sourceCount: todos.length,\n },\n },\n { listId },\n )\n return { listId, migrated: true, created: result.created }\n}\n\nexport function getTodoCompatSnapshot(options?: {\n listId?: string\n agentId?: string\n}): { listId: string; todos: TodoItem[]; tasks: ReturnType<typeof listTasks> } {\n const { listId } = getTaskListPaths(options?.listId)\n return {\n listId,\n todos: getTodos(options?.agentId),\n tasks: listTasks({ listId }),\n }\n}\n\nexport interface TodoMetrics {\n totalOperations: number\n cacheHits: number\n cacheMisses: number\n lastOperation: number\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(operation: string, cacheHit: boolean = false): void {\n const sessionState = getSessionState() as any\n const metrics = sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n\n metrics.totalOperations++\n metrics.lastOperation = Date.now()\n\n if (cacheHit) {\n metrics.cacheHits++\n } else {\n metrics.cacheMisses++\n }\n\n setSessionState({\n ...sessionState,\n todoMetrics: metrics,\n })\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n const sessionState = getSessionState() as any\n return (\n sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n )\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n if (agentId) {\n updateMetrics('getTodos', false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n\n const agentCacheKey = `todoCache_${resolvedAgentId}`\n\n return agentTodos.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics('getTodos', true)\n return todoCache.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n updateMetrics('getTodos', false)\n const sessionState = getSessionState()\n const todos = (sessionState as any)[TODO_STORAGE_KEY] || []\n\n todoCache = [...todos].map((todo: TodoItem) => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n cacheTimestamp = now\n\n return todoCache\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n if (agentId) {\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(\n existing => existing.id === todo.id,\n )\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics('setTodos')\n return\n }\n\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: updatedTodos,\n } as any)\n\n invalidateCache()\n updateMetrics('setTodos')\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const sessionState = getSessionState() as any\n return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState({\n ...getSessionState(),\n [TODO_CONFIG_KEY]: newConfig,\n } as any)\n\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos)\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n updateMetrics('addTodo')\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n updateMetrics('updateTodo')\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n updateMetrics('deleteTodo')\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n updateMetrics('clearTodos')\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n updateMetrics('getTodoById')\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByStatus')\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByPriority')\n return todos.filter(todo => todo.priority === priority)\n}\n\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n updateMetrics('queryTodos')\n\n return todos.filter(todo => {\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\nexport function getTodoStatistics() {\n const todos = getTodos()\n const metrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics,\n cacheEfficiency:\n metrics.totalOperations > 0\n ? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n invalidateCache()\n\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n todo.activeForm &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n\n updateMetrics('optimizeTodoStorage')\n}\n", "import { getTodos, TodoItem } from '@utils/session/todoStorage'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\nexport interface ReminderMessage {\n role: 'system'\n content: string\n isMeta: boolean\n timestamp: number\n type: string\n priority: 'low' | 'medium' | 'high'\n category: 'task' | 'security' | 'performance' | 'general'\n}\n\ninterface ReminderConfig {\n todoEmptyReminder: boolean\n securityReminder: boolean\n performanceReminder: boolean\n maxRemindersPerSession: number\n}\n\ninterface SessionReminderState {\n lastTodoUpdate: number\n lastFileAccess: number\n lastTaskUpdate: number\n sessionStartTime: number\n remindersSent: Set<string>\n contextPresent: boolean\n reminderCount: number\n taskEventTimestamps: Map<string, number>\n config: ReminderConfig\n}\n\nclass SystemReminderService {\n private sessionState: SessionReminderState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n lastTaskUpdate: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n taskEventTimestamps: new Map(),\n config: {\n todoEmptyReminder: true,\n securityReminder: true,\n performanceReminder: true,\n maxRemindersPerSession: 10,\n },\n }\n\n private eventDispatcher = new Map<string, Array<(context: any) => void>>()\n private reminderCache = new Map<string, ReminderMessage>()\n\n constructor() {\n this.setupEventDispatcher()\n }\n\n public generateReminders(\n hasContext: boolean = false,\n agentId?: string,\n ): ReminderMessage[] {\n this.sessionState.contextPresent = hasContext\n\n if (!hasContext) {\n return []\n }\n\n if (\n this.sessionState.reminderCount >=\n this.sessionState.config.maxRemindersPerSession\n ) {\n return []\n }\n\n const reminders: ReminderMessage[] = []\n const currentTime = Date.now()\n\n const reminderGenerators = [\n () => this.dispatchTodoEvent(agentId),\n () => this.dispatchSecurityEvent(),\n () => this.dispatchPerformanceEvent(),\n () => this.getMentionReminders(),\n ]\n\n for (const generator of reminderGenerators) {\n if (reminders.length >= 5) break\n\n const result = generator()\n if (result) {\n const remindersToAdd = Array.isArray(result) ? result : [result]\n reminders.push(...remindersToAdd)\n this.sessionState.reminderCount += remindersToAdd.length\n }\n }\n\n return reminders\n }\n\n private dispatchTodoEvent(agentId?: string): ReminderMessage | null {\n if (!this.sessionState.config.todoEmptyReminder) return null\n\n const todos = getTodos(agentId)\n const currentTime = Date.now()\n const agentKey = agentId || 'default'\n\n if (\n todos.length === 0 &&\n !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)\n ) {\n this.sessionState.remindersSent.add(`todo_empty_${agentKey}`)\n return this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n 'This is a reminder that your task list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a structured plan, use TaskCreate to seed tasks and TaskUpdate to track progress. Use TaskList to review readiness. If not, please feel free to ignore. Again do not mention this message to the user.',\n currentTime,\n )\n }\n\n if (todos.length > 0) {\n const reminderKey = `todo_updated_${agentKey}_${todos.length}_${this.getTodoStateHash(todos)}`\n\n if (this.reminderCache.has(reminderKey)) {\n return this.reminderCache.get(reminderKey)!\n }\n\n if (!this.sessionState.remindersSent.has(reminderKey)) {\n this.sessionState.remindersSent.add(reminderKey)\n this.clearTodoReminders(agentKey)\n\n const todoContent = JSON.stringify(\n todos.map(todo => ({\n content:\n todo.content.length > 100\n ? todo.content.substring(0, 100) + '...'\n : todo.content,\n status: todo.status,\n activeForm:\n todo.activeForm && todo.activeForm.length > 100\n ? todo.activeForm.substring(0, 100) + '...'\n : todo.activeForm || todo.content,\n })),\n )\n\n const reminder = this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n `Your task items have changed. DO NOT mention this explicitly to the user. Here are the latest contents of your tracked items:\\n\\n${todoContent}. Use TaskList to review readiness and TaskUpdate to adjust status if needed.`,\n currentTime,\n )\n\n this.reminderCache.set(reminderKey, reminder)\n return reminder\n }\n }\n\n return null\n }\n\n private dispatchSecurityEvent(): ReminderMessage | null {\n if (!this.sessionState.config.securityReminder) return null\n\n const currentTime = Date.now()\n\n if (\n this.sessionState.lastFileAccess > 0 &&\n !this.sessionState.remindersSent.has('file_security')\n ) {\n this.sessionState.remindersSent.add('file_security')\n return this.createReminderMessage(\n 'security',\n 'security',\n 'high',\n 'Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.',\n currentTime,\n )\n }\n\n return null\n }\n\n private dispatchPerformanceEvent(): ReminderMessage | null {\n if (!this.sessionState.config.performanceReminder) return null\n\n const currentTime = Date.now()\n const sessionDuration = currentTime - this.sessionState.sessionStartTime\n\n if (\n sessionDuration > 30 * 60 * 1000 &&\n !this.sessionState.remindersSent.has('performance_long_session')\n ) {\n this.sessionState.remindersSent.add('performance_long_session')\n return this.createReminderMessage(\n 'performance',\n 'performance',\n 'low',\n 'Long session detected. Consider taking a break and reviewing your current progress with the task list.',\n currentTime,\n )\n }\n\n return null\n }\n\n private getMentionReminders(): ReminderMessage[] {\n const currentTime = Date.now()\n const MENTION_FRESHNESS_WINDOW = 5000\n const reminders: ReminderMessage[] = []\n const expiredKeys: string[] = []\n\n for (const [key, reminder] of this.reminderCache.entries()) {\n if (this.isMentionReminder(reminder)) {\n const age = currentTime - reminder.timestamp\n if (age <= MENTION_FRESHNESS_WINDOW) {\n reminders.push(reminder)\n } else {\n expiredKeys.push(key)\n }\n }\n }\n\n expiredKeys.forEach(key => this.reminderCache.delete(key))\n\n return reminders\n }\n\n private isMentionReminder(reminder: ReminderMessage): boolean {\n const mentionTypes = ['agent_mention', 'file_mention', 'ask_model_mention']\n return mentionTypes.includes(reminder.type)\n }\n\n public generateFileChangeReminder(context: any): ReminderMessage | null {\n const { agentId, filePath, reminder } = context\n\n if (!reminder) {\n return null\n }\n\n const currentTime = Date.now()\n const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`\n\n if (this.sessionState.remindersSent.has(reminderKey)) {\n return null\n }\n\n this.sessionState.remindersSent.add(reminderKey)\n\n return this.createReminderMessage(\n 'file_changed',\n 'general',\n 'medium',\n reminder,\n currentTime,\n )\n }\n\n private createReminderMessage(\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ): ReminderMessage {\n return {\n role: 'system',\n content: `<system-reminder>\\n${content}\\n</system-reminder>`,\n isMeta: true,\n timestamp,\n type,\n priority,\n category,\n }\n }\n\n private getTodoStateHash(todos: TodoItem[]): string {\n return todos\n .map(t => `${t.content}:${t.status}:${t.activeForm || t.content}`)\n .sort()\n .join('|')\n }\n\n private clearTodoReminders(agentId?: string): void {\n const agentKey = agentId || 'default'\n for (const key of this.sessionState.remindersSent) {\n if (key.startsWith(`todo_updated_${agentKey}_`)) {\n this.sessionState.remindersSent.delete(key)\n }\n }\n }\n\n private shouldEmitTaskReminder(key: string, throttleMs: number): boolean {\n const now = Date.now()\n const last = this.sessionState.taskEventTimestamps.get(key) ?? 0\n if (now - last < throttleMs) {\n return false\n }\n this.sessionState.taskEventTimestamps.set(key, now)\n return true\n }\n\n private createTaskListReminder(context: any): ReminderMessage | null {\n const { listId, summary } = context\n if (!summary || !listId) return null\n const reminderKey = `task_list_${listId}_${summary.total}_${summary.ready}_${summary.blocked}_${summary.inProgress}_${summary.open}_${summary.done}_${summary.archived}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_list_changed',\n 'task',\n 'medium',\n `Your task list changed. Ready: ${summary.ready}, Blocked: ${summary.blocked}, In progress: ${summary.inProgress}, Open: ${summary.open}, Done: ${summary.done}, Archived: ${summary.archived}.`,\n Date.now(),\n )\n }\n\n private createTaskReadyReminder(context: any): ReminderMessage | null {\n const { listId, readyIds } = context\n if (!listId || !Array.isArray(readyIds)) return null\n const limited = readyIds.slice(0, 5).join(', ')\n const reminderKey = `task_ready_${listId}_${readyIds.length}_${limited}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_ready_changed',\n 'task',\n 'medium',\n `Task readiness changed. Ready count: ${readyIds.length}. Ready ids: ${limited || 'none'}.`,\n Date.now(),\n )\n }\n\n private createTaskConflictReminder(context: any): ReminderMessage | null {\n const { listId, taskId } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_conflict_${listId}_${taskId}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_conflict',\n 'task',\n 'high',\n `Task update conflict detected for ${taskId}. Refresh task data and retry updates with the latest baseVersion.`,\n Date.now(),\n )\n }\n\n private createTaskCreatedReminder(context: any): ReminderMessage | null {\n const { listId, taskId, task } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_created_${listId}_${taskId}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n const subject = task?.title || task?.subject || taskId\n return this.createReminderMessage(\n 'task_created',\n 'task',\n 'medium',\n `Task created: ${subject} (${taskId}). Review details and adjust status if needed.`,\n Date.now(),\n )\n }\n\n private createTaskUpdatedReminder(context: any): ReminderMessage | null {\n const { listId, taskId, task } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_updated_${listId}_${taskId}_${task?.baseVersion ?? ''}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n const subject = task?.title || task?.subject || taskId\n return this.createReminderMessage(\n 'task_updated',\n 'task',\n 'medium',\n `Task updated: ${subject} (${taskId}). Confirm dependencies and status are correct.`,\n Date.now(),\n )\n }\n\n private createTaskStatusReminder(context: any): ReminderMessage | null {\n const { listId, taskId, previousStatus, status } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_status_${listId}_${taskId}_${previousStatus}_${status}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_status_changed',\n 'task',\n 'medium',\n `Task status changed for ${taskId}: ${previousStatus} \u2192 ${status}. Review dependent tasks if needed.`,\n Date.now(),\n )\n }\n\n private createTaskDepsReminder(context: any): ReminderMessage | null {\n const { listId, taskId, deps } = context\n if (!listId || !taskId) return null\n const reminderKey = `task_deps_${listId}_${taskId}_${JSON.stringify(deps ?? {})}`\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n return this.createReminderMessage(\n 'task_deps_changed',\n 'task',\n 'medium',\n `Task dependencies changed for ${taskId}. Recheck readiness and blockers.`,\n Date.now(),\n )\n }\n\n private setupEventDispatcher(): void {\n this.addEventListener('session:startup', context => {\n this.resetSession()\n\n this.sessionState.sessionStartTime = Date.now()\n this.sessionState.contextPresent =\n Object.keys(context.context || {}).length > 0\n })\n\n this.addEventListener('todo:changed', context => {\n this.sessionState.lastTodoUpdate = Date.now()\n this.clearTodoReminders(context.agentId)\n })\n\n this.addEventListener('todo:file_changed', context => {\n const agentId = context.agentId || 'default'\n this.clearTodoReminders(agentId)\n this.sessionState.lastTodoUpdate = Date.now()\n\n const reminder = this.generateFileChangeReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n agentId,\n type: 'file_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task:list_changed', context => {\n const key = `task_list_${context.listId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n this.sessionState.lastTaskUpdate = Date.now()\n const reminder = this.createTaskListReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: 'task_list_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task:ready_changed', context => {\n const key = `task_ready_${context.listId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskReadyReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: 'task_ready_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task:conflict_detected', context => {\n const key = `task_conflict_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskConflictReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: 'task_conflict',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('task.created', context => {\n const key = `task_created_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskCreatedReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('task.updated', context => {\n const key = `task_updated_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskUpdatedReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('task.status_changed', context => {\n const key = `task_status_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskStatusReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('task.deps_changed', context => {\n const key = `task_deps_${context.listId}_${context.taskId}`\n if (!this.shouldEmitTaskReminder(key, 2000)) return\n const reminder = this.createTaskDepsReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n listId: context.listId,\n type: reminder.type,\n timestamp: reminder.timestamp,\n })\n }\n })\n\n this.addEventListener('file:read', context => {\n this.sessionState.lastFileAccess = Date.now()\n })\n\n this.addEventListener('file:edited', context => {\n })\n\n this.addEventListener('agent:mentioned', context => {\n this.createMentionReminder({\n type: 'agent_mention',\n key: `agent_mention_${context.agentType}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type=\"${context.agentType}\" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('file:mentioned', context => {\n this.createMentionReminder({\n type: 'file_mention',\n key: `file_mention_${context.filePath}_${context.timestamp}`,\n category: 'general',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('ask-model:mentioned', context => {\n this.createMentionReminder({\n type: 'ask_model_mention',\n key: `ask_model_mention_${context.modelName}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,\n timestamp: context.timestamp,\n })\n })\n }\n\n public addEventListener(\n event: string,\n callback: (context: any) => void,\n ): void {\n if (!this.eventDispatcher.has(event)) {\n this.eventDispatcher.set(event, [])\n }\n this.eventDispatcher.get(event)!.push(callback)\n }\n\n public emitEvent(event: string, context: any): void {\n const listeners = this.eventDispatcher.get(event) || []\n listeners.forEach(callback => {\n try {\n callback(context)\n } catch (error) {\n logError(error)\n debugLogger.warn('SYSTEM_REMINDER_LISTENER_ERROR', {\n event,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n })\n }\n\n private createMentionReminder(params: {\n type: string\n key: string\n category: ReminderMessage['category']\n priority: ReminderMessage['priority']\n content: string\n timestamp: number\n }): void {\n if (!this.sessionState.remindersSent.has(params.key)) {\n this.sessionState.remindersSent.add(params.key)\n\n const reminder = this.createReminderMessage(\n params.type,\n params.category,\n params.priority,\n params.content,\n params.timestamp,\n )\n\n this.reminderCache.set(params.key, reminder)\n }\n }\n\n public resetSession(): void {\n this.sessionState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n lastTaskUpdate: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n taskEventTimestamps: new Map(),\n config: { ...this.sessionState.config },\n }\n this.reminderCache.clear()\n }\n\n public updateConfig(config: Partial<ReminderConfig>): void {\n this.sessionState.config = { ...this.sessionState.config, ...config }\n }\n\n public getSessionState(): SessionReminderState {\n return { ...this.sessionState }\n }\n}\n\nexport const systemReminderService = new SystemReminderService()\n\nexport const generateSystemReminders = (\n hasContext: boolean = false,\n agentId?: string,\n) => systemReminderService.generateReminders(hasContext, agentId)\n\nexport const generateFileChangeReminder = (context: any) =>\n systemReminderService.generateFileChangeReminder(context)\n\nexport const emitReminderEvent = (event: string, context: any) =>\n systemReminderService.emitEvent(event, context)\n\nexport const resetReminderSession = () => systemReminderService.resetSession()\nexport const getReminderSessionState = () =>\n systemReminderService.getSessionState()\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "mkdirSync", "readFileSync", "writeFileSync", "join", "join", "existsSync", "join", "existsSync", "override", "defaultBaseDir", "candidates", "mkdirSync", "existsSync", "readFileSync", "writeFileSync", "join", "processedTodos", "updatedTodos"]
7
+ }
@@ -5,14 +5,14 @@ import {
5
5
  } from "./chunk-B6IMQJZM.js";
6
6
  import {
7
7
  loadSettingsWithLegacyFallback
8
- } from "./chunk-NV4KLIR4.js";
8
+ } from "./chunk-N4GXGPVA.js";
9
9
  import {
10
10
  getSessionPlugins
11
11
  } from "./chunk-BJSWTHRM.js";
12
12
  import {
13
13
  getCwd,
14
14
  logError
15
- } from "./chunk-FQBPNSQM.js";
15
+ } from "./chunk-ZGVGFR4C.js";
16
16
 
17
17
  // src/utils/session/pybHooks.ts
18
18
  import { spawn } from "child_process";
@@ -496,7 +496,7 @@ async function runPromptHook(args) {
496
496
  fallbackTimeoutMs: args.fallbackTimeoutMs
497
497
  });
498
498
  try {
499
- const { queryQuick } = await import("./llmLazy-7NGDJTCJ.js");
499
+ const { queryQuick } = await import("./llmLazy-HCTXTHRZ.js");
500
500
  const systemPrompt = [
501
501
  "You are executing a Pyb prompt hook.",
502
502
  "Return a single JSON object only (no markdown, no prose).",
@@ -448,7 +448,7 @@ function getLastAssistantMessageId(messages) {
448
448
 
449
449
  // src/utils/messages/index.ts
450
450
  async function processUserInput(input, mode, setToolJSX, context, pastedImages) {
451
- const impl = await import("./userInput-Y5GXDITH.js");
451
+ const impl = await import("./userInput-RHGZ225B.js");
452
452
  return impl.processUserInput(input, mode, setToolJSX, context, pastedImages);
453
453
  }
454
454
 
@@ -3,7 +3,7 @@ const require = __pybCreateRequire(import.meta.url);
3
3
 
4
4
  // src/services/ai/llmLazy.ts
5
5
  async function queryLLM(messages, systemPrompt, maxThinkingTokens, tools, signal, options) {
6
- const { queryLLM: inner } = await import("./llm-3C5ICYYM.js");
6
+ const { queryLLM: inner } = await import("./llm-3KCTIVOM.js");
7
7
  return inner(
8
8
  messages,
9
9
  systemPrompt,
@@ -14,15 +14,15 @@ async function queryLLM(messages, systemPrompt, maxThinkingTokens, tools, signal
14
14
  );
15
15
  }
16
16
  async function queryQuick(args) {
17
- const { queryQuick: inner } = await import("./llm-3C5ICYYM.js");
17
+ const { queryQuick: inner } = await import("./llm-3KCTIVOM.js");
18
18
  return inner(args);
19
19
  }
20
20
  async function verifyApiKey(apiKey, baseURL, provider) {
21
- const { verifyApiKey: inner } = await import("./llm-3C5ICYYM.js");
21
+ const { verifyApiKey: inner } = await import("./llm-3KCTIVOM.js");
22
22
  return inner(apiKey, baseURL, provider);
23
23
  }
24
24
  async function fetchAnthropicModels(apiKey, baseURL) {
25
- const { fetchAnthropicModels: inner } = await import("./llm-3C5ICYYM.js");
25
+ const { fetchAnthropicModels: inner } = await import("./llm-3KCTIVOM.js");
26
26
  return inner(apiKey, baseURL);
27
27
  }
28
28
 
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getGlobalConfig
5
- } from "./chunk-YSGQ33QO.js";
5
+ } from "./chunk-TNAAGT3Q.js";
6
6
 
7
7
  // src/utils/theme/index.ts
8
8
  var lightTheme = {
@@ -2,15 +2,15 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  loadSettingsWithLegacyFallback
5
- } from "./chunk-NV4KLIR4.js";
5
+ } from "./chunk-N4GXGPVA.js";
6
6
  import {
7
7
  debug
8
- } from "./chunk-7D6P6FJI.js";
8
+ } from "./chunk-O5OT26P6.js";
9
9
  import {
10
10
  env,
11
11
  getSessionRoot,
12
12
  resolveXdgDataPath
13
- } from "./chunk-FQBPNSQM.js";
13
+ } from "./chunk-ZGVGFR4C.js";
14
14
  import {
15
15
  __require
16
16
  } from "./chunk-I3J4JYES.js";
@@ -2,13 +2,13 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  ripGrepWithStatus
5
- } from "./chunk-65QK3573.js";
5
+ } from "./chunk-6KSM5M7T.js";
6
6
  import {
7
7
  getCurrentProjectConfig,
8
8
  getGlobalConfig,
9
9
  getOrCreateUserID,
10
10
  saveCurrentProjectConfig
11
- } from "./chunk-YSGQ33QO.js";
11
+ } from "./chunk-TNAAGT3Q.js";
12
12
  import {
13
13
  SESSION_ID,
14
14
  env,
@@ -16,10 +16,10 @@ import {
16
16
  getCwd,
17
17
  isContextScanDisabled,
18
18
  logError
19
- } from "./chunk-FQBPNSQM.js";
19
+ } from "./chunk-ZGVGFR4C.js";
20
20
  import {
21
21
  MACRO
22
- } from "./chunk-POFRZWP7.js";
22
+ } from "./chunk-UUWI4VWU.js";
23
23
  import {
24
24
  __require
25
25
  } from "./chunk-I3J4JYES.js";
@@ -28,16 +28,16 @@ import {
28
28
  hasReadPermission,
29
29
  hasWritePermission,
30
30
  query
31
- } from "./chunk-KXOZAPOR.js";
31
+ } from "./chunk-RS2N2KBH.js";
32
32
  import {
33
33
  queryLLM
34
- } from "./chunk-IHIHIPNE.js";
34
+ } from "./chunk-E5EB22W4.js";
35
35
  import {
36
36
  FallbackToolUseRejectedMessage,
37
37
  MCPTool,
38
38
  getClients,
39
39
  getMCPTools
40
- } from "./chunk-PAZ5OZZ3.js";
40
+ } from "./chunk-VFQU3JSH.js";
41
41
  import {
42
42
  TaskStoreConflictError,
43
43
  createTask,
@@ -47,45 +47,45 @@ import {
47
47
  getTaskListPaths,
48
48
  listTasks,
49
49
  updateTask
50
- } from "./chunk-UAPC4AG3.js";
50
+ } from "./chunk-AI7FJQR4.js";
51
51
  import {
52
52
  getActiveAgents,
53
53
  getAgentByType,
54
54
  getAvailableAgentTypes
55
- } from "./chunk-Q6D4CWM7.js";
55
+ } from "./chunk-KNLFFHBT.js";
56
56
  import {
57
57
  INTERRUPT_MESSAGE,
58
58
  createAssistantMessage,
59
59
  createUserMessage,
60
60
  getLastAssistantMessageId
61
- } from "./chunk-4VNRS435.js";
61
+ } from "./chunk-DLBWS3IW.js";
62
62
  import {
63
63
  formatDuration,
64
64
  formatNumber
65
65
  } from "./chunk-OUXHGDLH.js";
66
66
  import {
67
67
  getAbsolutePath
68
- } from "./chunk-2TPHG5NF.js";
68
+ } from "./chunk-NMJYV37P.js";
69
69
  import {
70
70
  LspFacade,
71
71
  formatDiagnosticsPretty
72
- } from "./chunk-4HUEIGXE.js";
72
+ } from "./chunk-7TGWBYFN.js";
73
73
  import {
74
74
  getModelManager
75
- } from "./chunk-KJAUAOX4.js";
75
+ } from "./chunk-4LXZDGCO.js";
76
76
  import {
77
77
  getContext
78
- } from "./chunk-WYUAUOQL.js";
78
+ } from "./chunk-GXHSGPIF.js";
79
79
  import {
80
80
  filesToTree,
81
81
  ripGrepWithStatus
82
- } from "./chunk-65QK3573.js";
82
+ } from "./chunk-6KSM5M7T.js";
83
83
  import {
84
84
  getTheme
85
- } from "./chunk-VFIFN6QL.js";
85
+ } from "./chunk-GD43B2GV.js";
86
86
  import {
87
87
  debug
88
- } from "./chunk-7D6P6FJI.js";
88
+ } from "./chunk-O5OT26P6.js";
89
89
  import {
90
90
  BunShell,
91
91
  getCwd,
@@ -96,7 +96,7 @@ import {
96
96
  overwriteLog,
97
97
  readTaskOutput,
98
98
  resolveXdgDataPath
99
- } from "./chunk-FQBPNSQM.js";
99
+ } from "./chunk-ZGVGFR4C.js";
100
100
 
101
101
  // src/tools/index.ts
102
102
  import { memoize as memoize2 } from "lodash-es";
@@ -775,7 +775,7 @@ async function analyzeOutputWithLsp(output, exitCode) {
775
775
  if (exitCode !== 0 || errorCount > 0 || warningCount > 0) {
776
776
  try {
777
777
  const { isAbsolute: isAbsolute3, resolve: resolve4 } = await import("path");
778
- const { getSessionRoot: getSessionRoot2 } = await import("./state-3MIS3KPI.js");
778
+ const { getSessionRoot: getSessionRoot2 } = await import("./state-4AIVX6VM.js");
779
779
  const lines = output.split("\n");
780
780
  const uniqueFiles = /* @__PURE__ */ new Set();
781
781
  const lspSuggestions = [];
@@ -1148,7 +1148,7 @@ var DeleteTool = {
1148
1148
  }
1149
1149
  if (!force) {
1150
1150
  try {
1151
- const { LspFacade: LspFacade2 } = await import("./lsp-UIWT5EAB.js");
1151
+ const { LspFacade: LspFacade2 } = await import("./lsp-IXEAYT4K.js");
1152
1152
  const referenceDetail = await LspFacade2.checkFileReferences(fullPath);
1153
1153
  if (referenceDetail) {
1154
1154
  failedItems.push(
@@ -3027,37 +3027,37 @@ function createTaskToolError(params) {
3027
3027
  }
3028
3028
 
3029
3029
  // src/tools/interaction/TaskCreateTool/prompt.ts
3030
- var DESCRIPTION6 = "Create a new task in the task list with optional status, priority, and dependencies.";
3030
+ var DESCRIPTION6 = "Create a new task in the task list with optional status and dependencies.";
3031
3031
  var PROMPT6 = `Use this tool to create a new task in the current task list. It is the entry point for planning multi-step work.
3032
3032
 
3033
3033
  ## When to Use This Tool
3034
3034
  Use this tool proactively in these scenarios:
3035
- - You need to add a task with structured fields (subject/title, status, priority, tags).
3036
- 1. You need to add a task with structured fields (subject/title, status, priority, tags).
3035
+ 1. You need to add a task with structured fields (subject, status, tags).
3037
3036
  2. You want to seed a plan for multi-step work before implementation starts.
3038
3037
  3. You need to define dependencies (blocks, blockedBy, parent, related) at creation time.
3039
3038
  4. You need to align with a user request to create a task list or plan.
3040
- When not to use:
3039
+
3041
3040
  ## When NOT to Use This Tool
3042
3041
  - You need to modify an existing task (use TaskUpdate).
3043
3042
  Skip using this tool when:
3044
3043
  1. You only need to read task data (use TaskGet or TaskList).
3045
3044
  2. You need to modify an existing task (use TaskUpdate).
3046
3045
  3. You are only reporting progress without changing any task fields.
3047
- - Either subject or title is required.
3046
+ - subject is required.
3048
3047
  NOTE that you should not use this tool if you are only updating status or details of an existing task.
3049
3048
 
3050
3049
  ## Input Notes
3051
- - Either subject or title is required.
3050
+ - subject is required.
3052
3051
  - listId is optional; omit to use the default list.
3053
3052
  - Dependencies are validated for cycles; invalid cycles will be rejected.
3054
3053
  - baseVersion is set automatically for new tasks.
3055
3054
  - status can be open, in_progress, blocked, done, or archived.
3055
+ - activeForm will be generated from subject if omitted.
3056
+ - blocks and blockedBy are always stored as arrays (empty when not used).
3057
+ - description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.
3058
+ - Task ordering relies on task id; do not use priority fields.
3056
3059
 
3057
- ## Priority and Status
3058
- - Use high for critical blockers or the next critical step.
3059
- - Use medium for standard implementation steps.
3060
- - Use low for nice-to-have improvements or cleanup.
3060
+ ## Status Notes
3061
3061
  - Use blocked when dependencies prevent work and fill blockedBy.
3062
3062
 
3063
3063
  ## Examples of When to Use TaskCreate
@@ -3092,12 +3092,10 @@ Assistant: I'll create tasks with dependencies.
3092
3092
  // src/tools/interaction/TaskCreateTool/TaskCreateTool.tsx
3093
3093
  var inputSchema9 = z9.strictObject({
3094
3094
  listId: z9.string().optional(),
3095
- subject: z9.string().min(1).optional(),
3096
- title: z9.string().min(1).optional(),
3095
+ subject: z9.string().min(1),
3097
3096
  description: z9.string().optional(),
3098
3097
  activeForm: z9.string().optional(),
3099
3098
  status: z9.enum(["open", "in_progress", "blocked", "done", "archived"]).optional(),
3100
- priority: z9.enum(["high", "medium", "low"]).optional(),
3101
3099
  tags: z9.array(z9.string()).optional(),
3102
3100
  assignee: z9.string().optional(),
3103
3101
  metadata: z9.record(z9.string()).optional(),
@@ -3107,7 +3105,7 @@ var inputSchema9 = z9.strictObject({
3107
3105
  parent: z9.string().optional(),
3108
3106
  related: z9.array(z9.string()).optional(),
3109
3107
  legacyTodoId: z9.string().optional()
3110
- }).refine((data) => data.subject || data.title);
3108
+ });
3111
3109
  var TaskCreateTool = {
3112
3110
  name: "TaskCreate",
3113
3111
  cachedDescription: DESCRIPTION6,
@@ -3141,19 +3139,8 @@ var TaskCreateTool = {
3141
3139
  },
3142
3140
  async *call(input) {
3143
3141
  try {
3144
- const subject = input.subject ?? input.title;
3145
- if (!subject) {
3146
- yield {
3147
- type: "result",
3148
- data: createTaskToolError({
3149
- type: "validation",
3150
- code: "TASK_SUBJECT_REQUIRED",
3151
- message: "Task subject is required"
3152
- })
3153
- };
3154
- return;
3155
- }
3156
- const title = input.title ?? subject;
3142
+ const subject = input.subject;
3143
+ const title = subject;
3157
3144
  const tasks = listTasks({ listId: input.listId });
3158
3145
  const nextId = Math.max(
3159
3146
  0,
@@ -3167,7 +3154,6 @@ var TaskCreateTool = {
3167
3154
  description: input.description,
3168
3155
  activeForm: input.activeForm,
3169
3156
  status: input.status ?? "open",
3170
- priority: input.priority,
3171
3157
  tags: input.tags,
3172
3158
  assignee: input.assignee,
3173
3159
  metadata: input.metadata,
@@ -3199,11 +3185,9 @@ var TaskCreateTool = {
3199
3185
  const task = createTask(
3200
3186
  {
3201
3187
  subject,
3202
- title,
3203
3188
  description: input.description,
3204
3189
  activeForm: input.activeForm,
3205
3190
  status: input.status,
3206
- priority: input.priority,
3207
3191
  tags: input.tags,
3208
3192
  assignee: input.assignee,
3209
3193
  metadata: input.metadata,
@@ -3472,7 +3456,7 @@ var PROMPT9 = `Use this tool to update an existing task. It is the primary way t
3472
3456
  ## When to Use This Tool
3473
3457
  Use this tool proactively in these scenarios:
3474
3458
 
3475
- 1. You need to change task fields (subject/title/description/status/priority/tags).
3459
+ 1. You need to change task fields (subject/description/status/tags).
3476
3460
  2. You need to adjust dependencies (blocks, blockedBy, parent, related).
3477
3461
  3. You need optimistic concurrency control with baseVersion/version.
3478
3462
  4. You are moving a task across states (open \u2192 in_progress \u2192 done).
@@ -3491,8 +3475,12 @@ NOTE that TaskUpdate requires the correct baseVersion or version when concurrenc
3491
3475
  - If you provide status=done/archived and a parent exists, parent must already be completed.
3492
3476
  - Dependencies are validated for cycles; invalid cycles will be rejected.
3493
3477
  - Use baseVersion or version for concurrency checks; allowMerge can relax conflicts.
3478
+ - activeForm will be generated from subject if omitted.
3479
+ - blocks and blockedBy are always stored as arrays (empty when not used).
3480
+ - description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.
3481
+ - Task ordering relies on task id; do not use priority fields.
3494
3482
 
3495
- ## Priority and Status
3483
+ ## Status Notes
3496
3484
  - Use in_progress for the task you are actively working on.
3497
3485
  - Use blocked when dependencies prevent progress and set blockedBy.
3498
3486
  - Use done or archived only when all child/parent constraints are satisfied.
@@ -3553,11 +3541,9 @@ var inputSchema12 = z12.strictObject({
3553
3541
  listId: z12.string().optional(),
3554
3542
  taskId: z12.string().min(1),
3555
3543
  subject: z12.string().optional(),
3556
- title: z12.string().optional(),
3557
3544
  description: z12.string().optional(),
3558
3545
  activeForm: z12.string().optional(),
3559
3546
  status: z12.enum(["open", "in_progress", "blocked", "done", "archived"]).optional(),
3560
- priority: z12.enum(["high", "medium", "low"]).optional(),
3561
3547
  tags: z12.array(z12.string()).optional(),
3562
3548
  assignee: z12.string().optional(),
3563
3549
  metadata: z12.record(z12.string()).optional(),
@@ -3618,8 +3604,8 @@ var TaskUpdateTool = {
3618
3604
  return;
3619
3605
  }
3620
3606
  const tasks = listTasks({ listId: input.listId });
3621
- const subject = input.subject ?? input.title ?? existing.subject;
3622
- const title = input.title ?? input.subject ?? existing.title ?? existing.subject;
3607
+ const subject = input.subject ?? existing.subject;
3608
+ const title = subject;
3623
3609
  const updatedTask = {
3624
3610
  ...existing,
3625
3611
  subject,
@@ -3627,7 +3613,6 @@ var TaskUpdateTool = {
3627
3613
  description: input.description ?? existing.description,
3628
3614
  activeForm: input.activeForm ?? existing.activeForm,
3629
3615
  status: input.status ?? existing.status,
3630
- priority: input.priority ?? existing.priority,
3631
3616
  tags: input.tags ?? existing.tags,
3632
3617
  assignee: input.assignee ?? existing.assignee,
3633
3618
  metadata: input.metadata ?? existing.metadata,
@@ -3681,11 +3666,9 @@ var TaskUpdateTool = {
3681
3666
  input.taskId,
3682
3667
  {
3683
3668
  subject: input.subject,
3684
- title: input.title,
3685
3669
  description: input.description,
3686
3670
  activeForm: input.activeForm,
3687
3671
  status: input.status,
3688
- priority: input.priority,
3689
3672
  tags: input.tags,
3690
3673
  assignee: input.assignee,
3691
3674
  metadata: input.metadata,