pybao-cli 1.4.49 → 1.4.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/REPL-6YEOSMEP.js +47 -0
- package/dist/{acp-FGRNDOS5.js → acp-2C774HUW.js} +31 -31
- package/dist/{agentsValidate-7CRDPNQ6.js → agentsValidate-RCXZBOU3.js} +7 -7
- package/dist/{ask-IR5W5M66.js → ask-EIO3Q6ED.js} +30 -30
- package/dist/{autoUpdater-MAEQZPST.js → autoUpdater-IIJMDPJE.js} +3 -3
- package/dist/{chunk-SHIPHOMT.js → chunk-5RX62PWR.js} +1 -1
- package/dist/{chunk-XHGUMYRL.js → chunk-6MFZG46W.js} +1 -1
- package/dist/{chunk-IQ3KORSP.js → chunk-DCSAQNHW.js} +4 -4
- package/dist/{chunk-YFBIVUDT.js → chunk-ESKTQXW6.js} +27 -3
- package/dist/chunk-ESKTQXW6.js.map +7 -0
- package/dist/{chunk-QW4VX3FW.js → chunk-G2FI43IB.js} +2 -2
- package/dist/{chunk-4Z6CCSED.js → chunk-GLS3ZXCS.js} +3 -3
- package/dist/{chunk-DEQQW4H6.js → chunk-GTP62T63.js} +3 -3
- package/dist/{chunk-UUGWQSET.js → chunk-HJDETBB6.js} +1 -1
- package/dist/{chunk-55QJI7OQ.js → chunk-HY24VLOS.js} +1 -1
- package/dist/{chunk-LZT5LZKG.js → chunk-KDKXQODT.js} +2 -2
- package/dist/{chunk-HFL2SOFQ.js → chunk-KNOCJVE6.js} +1 -1
- package/dist/{chunk-MCP52ZSD.js → chunk-L2FQX7IL.js} +419 -244
- package/dist/chunk-L2FQX7IL.js.map +7 -0
- package/dist/{chunk-6Y4OSP3J.js → chunk-LAFEZLTD.js} +307 -218
- package/dist/chunk-LAFEZLTD.js.map +7 -0
- package/dist/{chunk-EXEPX5H2.js → chunk-LAQQRRQR.js} +4 -4
- package/dist/{chunk-2U747SA5.js → chunk-LEQNJ73H.js} +3 -3
- package/dist/{chunk-NZTVG7YS.js → chunk-MZ6UJROW.js} +4 -4
- package/dist/{chunk-MLCISJKM.js → chunk-N6DXTYLR.js} +3 -3
- package/dist/{chunk-JF4AMPKU.js → chunk-OBFMPMGW.js} +2 -2
- package/dist/{chunk-A7VN6YXZ.js → chunk-OYCMMRZV.js} +1 -1
- package/dist/{chunk-XZNXY65J.js → chunk-PKAVBIO7.js} +1 -1
- package/dist/{chunk-S2AJAM6R.js → chunk-SNKLRBWT.js} +2 -2
- package/dist/{chunk-6GOKZQDV.js → chunk-SQJJRPIY.js} +5 -5
- package/dist/{chunk-72SGZIMD.js → chunk-TMFNSMVV.js} +6 -6
- package/dist/{chunk-D3Q32IUW.js → chunk-U7MPXQO4.js} +3 -3
- package/dist/{chunk-3P2EGWMK.js → chunk-VUILI5ED.js} +2 -2
- package/dist/{chunk-7FNDFUQH.js → chunk-WCKPMAYX.js} +1 -1
- package/dist/{chunk-PSI4PJ2H.js → chunk-WSN5UCPE.js} +1 -1
- package/dist/{chunk-AWML3QPK.js → chunk-YNVGW5VZ.js} +7 -7
- package/dist/{chunk-I5H5PGD5.js → chunk-YTUV273Y.js} +50 -122
- package/dist/{chunk-I5H5PGD5.js.map → chunk-YTUV273Y.js.map} +2 -2
- package/dist/{chunk-GFDV6FUG.js → chunk-ZQAKMVXR.js} +3 -3
- package/dist/{cli-PCLH664O.js → cli-JPS6PPHH.js} +91 -89
- package/dist/{cli-PCLH664O.js.map → cli-JPS6PPHH.js.map} +2 -2
- package/dist/commands-3IJYY2KF.js +51 -0
- package/dist/{config-EBW7GI65.js → config-7RFJBYCF.js} +4 -4
- package/dist/{context-4BILE3LL.js → context-L6IDU4ZF.js} +6 -6
- package/dist/{customCommands-GDDHYRJR.js → customCommands-2ZLDKEPS.js} +4 -4
- package/dist/{env-7V57CD26.js → env-KKHHZ47D.js} +2 -2
- package/dist/{file-3W4M7RXM.js → file-QGJRLWJ7.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-PIRKDSMO.js → llm-HHSKS5JE.js} +31 -31
- package/dist/{llmLazy-HWKMKZ5M.js → llmLazy-YV33JO4W.js} +1 -1
- package/dist/{loader-GYFX3MOO.js → loader-YCEP5CYE.js} +4 -4
- package/dist/{lsp-BDQVEVFK.js → lsp-TG3EZZOU.js} +6 -6
- package/dist/{lspAnchor-S45W3FAI.js → lspAnchor-T3544E7J.js} +6 -6
- package/dist/{mcp-ZHLSRCM5.js → mcp-SWYFI5FF.js} +7 -7
- package/dist/{mentionProcessor-GOS6BB64.js → mentionProcessor-IP6FAEXL.js} +7 -6
- package/dist/{mentionProcessor-GOS6BB64.js.map → mentionProcessor-IP6FAEXL.js.map} +1 -1
- package/dist/{messages-AX4MWPK5.js → messages-3B2ZJJKW.js} +1 -1
- package/dist/{model-QDQAUOQ6.js → model-HDJXCBKD.js} +5 -5
- package/dist/{openai-IBJPYBTX.js → openai-DF2BQT7X.js} +5 -5
- package/dist/{outputStyles-UNAE3KVB.js → outputStyles-GWUBSKDY.js} +4 -4
- package/dist/{pluginRuntime-QP6HTJ6Y.js → pluginRuntime-LKAAMJH2.js} +6 -6
- package/dist/{pluginValidation-C66MGV4E.js → pluginValidation-7GJA32YV.js} +6 -6
- package/dist/prompts-DB772NLS.js +53 -0
- package/dist/{pybAgentSessionLoad-GJQQFHVS.js → pybAgentSessionLoad-BGIX7L4O.js} +4 -4
- package/dist/{pybAgentSessionResume-2ZNOOEVX.js → pybAgentSessionResume-VKK6VZSA.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-PE2K75QJ.js → pybAgentStreamJsonSession-HDXJ4F5W.js} +1 -1
- package/dist/{pybHooks-22R4DOTT.js → pybHooks-LEIAZ7D6.js} +5 -5
- package/dist/query-LVPGQYDL.js +55 -0
- package/dist/{registry-ES4KTNF7.js → registry-C4V5AZ6N.js} +5 -5
- package/dist/{ripgrep-7BPG53S4.js → ripgrep-PWIRRS2Q.js} +3 -3
- package/dist/{skillMarketplace-O5TAM4G6.js → skillMarketplace-GZN6RWUY.js} +3 -3
- package/dist/{state-3OM3WWZ2.js → state-T7WQKFBG.js} +2 -2
- package/dist/{theme-7MFSQQ5Z.js → theme-CLYLDSCI.js} +5 -5
- package/dist/{toolPermissionSettings-KKMWAVTJ.js → toolPermissionSettings-UYHSUTC5.js} +6 -6
- package/dist/tools-SEWCFM5P.js +52 -0
- package/dist/{userInput-3BYMTC52.js → userInput-KZXH5O7V.js} +32 -32
- package/package.json +27 -3
- package/dist/REPL-PRQAXE32.js +0 -47
- package/dist/chunk-6Y4OSP3J.js.map +0 -7
- package/dist/chunk-MCP52ZSD.js.map +0 -7
- package/dist/chunk-YFBIVUDT.js.map +0 -7
- package/dist/commands-Y7GVRV66.js +0 -51
- package/dist/prompts-LNJ2SJQ7.js +0 -53
- package/dist/query-2ZFLZTV6.js +0 -55
- package/dist/tools-ME4EX5CM.js +0 -52
- /package/dist/{REPL-PRQAXE32.js.map → REPL-6YEOSMEP.js.map} +0 -0
- /package/dist/{acp-FGRNDOS5.js.map → acp-2C774HUW.js.map} +0 -0
- /package/dist/{agentsValidate-7CRDPNQ6.js.map → agentsValidate-RCXZBOU3.js.map} +0 -0
- /package/dist/{ask-IR5W5M66.js.map → ask-EIO3Q6ED.js.map} +0 -0
- /package/dist/{autoUpdater-MAEQZPST.js.map → autoUpdater-IIJMDPJE.js.map} +0 -0
- /package/dist/{chunk-SHIPHOMT.js.map → chunk-5RX62PWR.js.map} +0 -0
- /package/dist/{chunk-XHGUMYRL.js.map → chunk-6MFZG46W.js.map} +0 -0
- /package/dist/{chunk-IQ3KORSP.js.map → chunk-DCSAQNHW.js.map} +0 -0
- /package/dist/{chunk-QW4VX3FW.js.map → chunk-G2FI43IB.js.map} +0 -0
- /package/dist/{chunk-4Z6CCSED.js.map → chunk-GLS3ZXCS.js.map} +0 -0
- /package/dist/{chunk-DEQQW4H6.js.map → chunk-GTP62T63.js.map} +0 -0
- /package/dist/{chunk-UUGWQSET.js.map → chunk-HJDETBB6.js.map} +0 -0
- /package/dist/{chunk-55QJI7OQ.js.map → chunk-HY24VLOS.js.map} +0 -0
- /package/dist/{chunk-LZT5LZKG.js.map → chunk-KDKXQODT.js.map} +0 -0
- /package/dist/{chunk-HFL2SOFQ.js.map → chunk-KNOCJVE6.js.map} +0 -0
- /package/dist/{chunk-EXEPX5H2.js.map → chunk-LAQQRRQR.js.map} +0 -0
- /package/dist/{chunk-2U747SA5.js.map → chunk-LEQNJ73H.js.map} +0 -0
- /package/dist/{chunk-NZTVG7YS.js.map → chunk-MZ6UJROW.js.map} +0 -0
- /package/dist/{chunk-MLCISJKM.js.map → chunk-N6DXTYLR.js.map} +0 -0
- /package/dist/{chunk-JF4AMPKU.js.map → chunk-OBFMPMGW.js.map} +0 -0
- /package/dist/{chunk-A7VN6YXZ.js.map → chunk-OYCMMRZV.js.map} +0 -0
- /package/dist/{chunk-XZNXY65J.js.map → chunk-PKAVBIO7.js.map} +0 -0
- /package/dist/{chunk-S2AJAM6R.js.map → chunk-SNKLRBWT.js.map} +0 -0
- /package/dist/{chunk-6GOKZQDV.js.map → chunk-SQJJRPIY.js.map} +0 -0
- /package/dist/{chunk-72SGZIMD.js.map → chunk-TMFNSMVV.js.map} +0 -0
- /package/dist/{chunk-D3Q32IUW.js.map → chunk-U7MPXQO4.js.map} +0 -0
- /package/dist/{chunk-3P2EGWMK.js.map → chunk-VUILI5ED.js.map} +0 -0
- /package/dist/{chunk-7FNDFUQH.js.map → chunk-WCKPMAYX.js.map} +0 -0
- /package/dist/{chunk-PSI4PJ2H.js.map → chunk-WSN5UCPE.js.map} +0 -0
- /package/dist/{chunk-AWML3QPK.js.map → chunk-YNVGW5VZ.js.map} +0 -0
- /package/dist/{chunk-GFDV6FUG.js.map → chunk-ZQAKMVXR.js.map} +0 -0
- /package/dist/{commands-Y7GVRV66.js.map → commands-3IJYY2KF.js.map} +0 -0
- /package/dist/{config-EBW7GI65.js.map → config-7RFJBYCF.js.map} +0 -0
- /package/dist/{context-4BILE3LL.js.map → context-L6IDU4ZF.js.map} +0 -0
- /package/dist/{customCommands-GDDHYRJR.js.map → customCommands-2ZLDKEPS.js.map} +0 -0
- /package/dist/{env-7V57CD26.js.map → env-KKHHZ47D.js.map} +0 -0
- /package/dist/{file-3W4M7RXM.js.map → file-QGJRLWJ7.js.map} +0 -0
- /package/dist/{llm-PIRKDSMO.js.map → llm-HHSKS5JE.js.map} +0 -0
- /package/dist/{llmLazy-HWKMKZ5M.js.map → llmLazy-YV33JO4W.js.map} +0 -0
- /package/dist/{loader-GYFX3MOO.js.map → loader-YCEP5CYE.js.map} +0 -0
- /package/dist/{lsp-BDQVEVFK.js.map → lsp-TG3EZZOU.js.map} +0 -0
- /package/dist/{lspAnchor-S45W3FAI.js.map → lspAnchor-T3544E7J.js.map} +0 -0
- /package/dist/{mcp-ZHLSRCM5.js.map → mcp-SWYFI5FF.js.map} +0 -0
- /package/dist/{messages-AX4MWPK5.js.map → messages-3B2ZJJKW.js.map} +0 -0
- /package/dist/{model-QDQAUOQ6.js.map → model-HDJXCBKD.js.map} +0 -0
- /package/dist/{openai-IBJPYBTX.js.map → openai-DF2BQT7X.js.map} +0 -0
- /package/dist/{outputStyles-UNAE3KVB.js.map → outputStyles-GWUBSKDY.js.map} +0 -0
- /package/dist/{pluginRuntime-QP6HTJ6Y.js.map → pluginRuntime-LKAAMJH2.js.map} +0 -0
- /package/dist/{pluginValidation-C66MGV4E.js.map → pluginValidation-7GJA32YV.js.map} +0 -0
- /package/dist/{prompts-LNJ2SJQ7.js.map → prompts-DB772NLS.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-GJQQFHVS.js.map → pybAgentSessionLoad-BGIX7L4O.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-2ZNOOEVX.js.map → pybAgentSessionResume-VKK6VZSA.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-PE2K75QJ.js.map → pybAgentStreamJsonSession-HDXJ4F5W.js.map} +0 -0
- /package/dist/{pybHooks-22R4DOTT.js.map → pybHooks-LEIAZ7D6.js.map} +0 -0
- /package/dist/{query-2ZFLZTV6.js.map → query-LVPGQYDL.js.map} +0 -0
- /package/dist/{registry-ES4KTNF7.js.map → registry-C4V5AZ6N.js.map} +0 -0
- /package/dist/{ripgrep-7BPG53S4.js.map → ripgrep-PWIRRS2Q.js.map} +0 -0
- /package/dist/{skillMarketplace-O5TAM4G6.js.map → skillMarketplace-GZN6RWUY.js.map} +0 -0
- /package/dist/{state-3OM3WWZ2.js.map → state-T7WQKFBG.js.map} +0 -0
- /package/dist/{theme-7MFSQQ5Z.js.map → theme-CLYLDSCI.js.map} +0 -0
- /package/dist/{toolPermissionSettings-KKMWAVTJ.js.map → toolPermissionSettings-UYHSUTC5.js.map} +0 -0
- /package/dist/{tools-ME4EX5CM.js.map → tools-SEWCFM5P.js.map} +0 -0
- /package/dist/{userInput-3BYMTC52.js.map → userInput-KZXH5O7V.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/taskLockNative.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 closeSync,\n mkdirSync,\n openSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { AsyncLocalStorage } from 'async_hooks'\nimport type { GlobalConfig, ProjectConfig } from '@utils/config'\nimport { getCurrentProjectConfig, getGlobalConfig } from '@utils/config'\nimport { resolveXdgDataPath } from '@utils/config/env'\nimport { getCwd } from '@utils/state'\nimport { getPybAgentSessionId } from '@utils/protocol/pybAgentSessionId'\nimport {\n loadNativeTaskLock,\n resolveNativeLockPackage,\n type NativeTaskLock,\n} from './taskLockNative'\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'done' | 'archived'\nexport type TaskStatusInput = TaskStatus | 'open'\nexport type TaskMetadata = Record<string, unknown>\nexport type TaskMetadataUpdate = Record<string, unknown | null>\n\nexport type TaskRecord = {\n id: string\n subject: string\n description?: string\n activeForm?: string\n status: TaskStatus\n tags?: string[]\n assignee?: string\n metadata?: TaskMetadata\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?: TaskStatusInput\n tags?: string[]\n assignee?: string\n metadata?: TaskMetadata\n archived?: boolean\n blocks?: string[]\n blockedBy?: string[]\n parent?: string\n related?: string[]\n legacyTodoId?: string\n}\n\nexport type TaskUpdateInput = Omit<Partial<TaskCreateInput>, 'metadata'> & {\n baseVersion?: number\n updatedAt?: number\n metadata?: TaskMetadataUpdate\n}\n\nexport type TaskUpdateResult = {\n task: TaskRecord\n conflict: boolean\n}\n\nconst taskListIdStorage = new AsyncLocalStorage<string>()\nconst taskListEnvStorage = new AsyncLocalStorage<NodeJS.ProcessEnv>()\nlet nativeLock: NativeTaskLock | null = null\nlet nativeLockResolved = false\n\nfunction getNativeLock(): NativeTaskLock | null {\n const globalLock = (\n globalThis as typeof globalThis & { __PYB_NATIVE_TASK_LOCK__?: NativeTaskLock }\n ).__PYB_NATIVE_TASK_LOCK__\n if (globalLock) {\n nativeLock = globalLock\n nativeLockResolved = true\n return nativeLock\n }\n if (nativeLockResolved) return nativeLock\n nativeLockResolved = true\n nativeLock = loadNativeTaskLock()\n return nativeLock\n}\n\nexport function generateTaskListId(): string {\n return randomUUID()\n}\n\nexport function runWithTaskListId<T>(listId: string, handler: () => T): T {\n return taskListIdStorage.run(listId, () => {\n const result = handler()\n const asyncIterator =\n result && typeof (result as any)[Symbol.asyncIterator] === 'function'\n ? (result as AsyncIterable<unknown>)\n : null\n if (!asyncIterator) return result\n return {\n [Symbol.asyncIterator]() {\n const iterator = asyncIterator[Symbol.asyncIterator]()\n return {\n next: (value?: unknown) =>\n taskListIdStorage.run(listId, () => iterator.next(value)),\n return: iterator.return\n ? (value?: unknown) =>\n taskListIdStorage.run(listId, () => iterator.return!(value))\n : undefined,\n throw: iterator.throw\n ? (err?: unknown) =>\n taskListIdStorage.run(listId, () => iterator.throw!(err))\n : undefined,\n }\n },\n } as T\n })\n}\n\nexport function runWithTaskListEnv<T>(\n env: NodeJS.ProcessEnv,\n handler: () => T,\n): T {\n return taskListEnvStorage.run(env, () => {\n const result = handler()\n const asyncIterator =\n result && typeof (result as any)[Symbol.asyncIterator] === 'function'\n ? (result as AsyncIterable<unknown>)\n : null\n if (!asyncIterator) return result\n return {\n [Symbol.asyncIterator]() {\n const iterator = asyncIterator[Symbol.asyncIterator]()\n return {\n next: (value?: unknown) =>\n taskListEnvStorage.run(env, () => iterator.next(value)),\n return: iterator.return\n ? (value?: unknown) =>\n taskListEnvStorage.run(env, () => iterator.return!(value))\n : undefined,\n throw: iterator.throw\n ? (err?: unknown) =>\n taskListEnvStorage.run(env, () => iterator.throw!(err))\n : undefined,\n }\n },\n } as T\n })\n}\n\nexport function getTaskListEnv(): NodeJS.ProcessEnv | undefined {\n return taskListEnvStorage.getStore()\n}\n\ntype TaskListScope = 'project' | 'global'\n\ntype TaskListContext = {\n listId: string\n scope: TaskListScope\n source: 'env' | 'global' | 'project' | 'default' | 'input' | 'context'\n}\n\ntype TaskListLock = {\n handle: number\n mode: 'fd' | 'nativeHandle'\n}\n\nconst taskListLocks = new Map<string, TaskListLock>()\nconst taskLockWaitBuffer = new Int32Array(new SharedArrayBuffer(4))\n\nconst DEFAULT_LOCK_TIMEOUT_MS = Number(\n process.env.PYB_TASK_LOCK_TIMEOUT_MS ?? 5000,\n)\nconst DEFAULT_LOCK_RETRY_MS = Number(process.env.PYB_TASK_LOCK_RETRY_MS ?? 50)\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 getPybAgentSessionId()\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 ?? taskListEnvStorage.getStore() ?? 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 const contextListId = taskListIdStorage.getStore()?.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 (contextListId) {\n return { listId: contextListId, scope: 'project', source: 'context' }\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\nexport function getTaskNextId(options?: { listId?: string }): number {\n const paths = getTaskListPaths(options?.listId)\n return getNextTaskId(paths)\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\ntype TaskListPaths = {\n listId: string\n baseDir: string\n listDir: string\n tasksDir: string\n lockPath: string\n highwatermarkPath: string\n}\n\ntype TaskListPathsWithSource = TaskListPaths & {\n source: 'pyb' | 'claude' | 'other'\n}\n\nfunction buildTaskListPaths(baseDir: string, listId: string): TaskListPaths {\n const listDir = join(baseDir, listId)\n return {\n listId,\n baseDir,\n listDir,\n tasksDir: listDir,\n lockPath: join(listDir, '.lock'),\n highwatermarkPath: join(listDir, '.highwatermark'),\n }\n}\n\nexport function getTaskListPaths(listId?: string): TaskListPaths {\n const context = getTaskListContext({ listId })\n const cwd = getCwd()\n const baseDir = resolveTaskBaseDir(context, cwd)\n return buildTaskListPaths(baseDir, context.listId)\n}\n\nexport function initTaskListLockFile(options?: { listId?: string }): void {\n const paths = getTaskListPaths(options?.listId)\n ensureTaskListDirs(paths)\n}\n\nfunction sortReadPaths(paths: TaskListPathsWithSource[]): TaskListPathsWithSource[] {\n const priority = { pyb: 0, claude: 1, other: 2 }\n return [...paths].sort((a, b) => priority[a.source] - priority[b.source])\n}\n\nfunction resolveSourceForBaseDir(baseDir: string): 'pyb' | 'claude' | 'other' {\n if (baseDir.includes(`${join('.pyb', 'tasks')}`)) return 'pyb'\n if (baseDir.includes(`${join('.claude', 'tasks')}`)) return 'claude'\n if (baseDir.includes(`${join('.pyb')}`)) return 'pyb'\n if (baseDir.includes(`${join('.claude')}`)) return 'claude'\n return 'other'\n}\n\nfunction getTaskListReadPaths(listId?: string): TaskListPathsWithSource[] {\n const context = getTaskListContext({ listId })\n const cwd = getCwd()\n const projectPyb = join(cwd, '.pyb', 'tasks')\n const projectClaude = join(cwd, '.claude', 'tasks')\n if (context.scope === 'project') {\n const existing: TaskListPathsWithSource[] = []\n if (existsSync(join(projectPyb, context.listId))) {\n existing.push({\n ...buildTaskListPaths(projectPyb, context.listId),\n source: 'pyb',\n })\n }\n if (existsSync(join(projectClaude, context.listId))) {\n existing.push({\n ...buildTaskListPaths(projectClaude, context.listId),\n source: 'claude',\n })\n }\n if (existing.length > 0) return sortReadPaths(existing)\n }\n\n const override = process.env.PYB_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR\n const globalCandidates: Array<{\n baseDir: string\n source: 'pyb' | 'claude' | 'other'\n }> = override\n ? [\n {\n baseDir: join(override, 'tasks'),\n source: resolveSourceForBaseDir(join(override, 'tasks')),\n },\n ]\n : [\n { baseDir: join(homedir(), '.pyb', 'tasks'), source: 'pyb' },\n { baseDir: join(homedir(), '.claude', 'tasks'), source: 'claude' },\n ]\n const candidates: Array<{ baseDir: string; source: 'pyb' | 'claude' | 'other' }> = [\n ...globalCandidates,\n { baseDir: resolveXdgDataPath('tasks'), source: 'other' },\n ]\n const existing = candidates\n .filter(candidate => existsSync(join(candidate.baseDir, context.listId)))\n .map(candidate => ({\n ...buildTaskListPaths(candidate.baseDir, context.listId),\n source: candidate.source,\n }))\n if (existing.length > 0) return sortReadPaths(existing)\n\n const baseDir = resolveTaskBaseDir(context, cwd)\n return [\n {\n ...buildTaskListPaths(baseDir, context.listId),\n source: resolveSourceForBaseDir(baseDir),\n },\n ]\n}\n\nfunction ensureTaskListDirs(paths: ReturnType<typeof getTaskListPaths>): void {\n mkdirSync(paths.listDir, { recursive: true })\n if (!existsSync(paths.lockPath)) {\n writeFileSync(paths.lockPath, '')\n }\n cleanupLegacyFiles(paths)\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\nfunction writeJsonAtomic(path: string, value: unknown): void {\n const tempPath = `${path}.${randomUUID()}.tmp`\n writeFileSync(tempPath, JSON.stringify(value, null, 2), 'utf8')\n renameSync(tempPath, path)\n}\n\nfunction readHighwatermark(paths: ReturnType<typeof getTaskListPaths>): number | null {\n if (!existsSync(paths.highwatermarkPath)) return null\n const raw = readFileSync(paths.highwatermarkPath, 'utf8').trim()\n const value = Number(raw)\n if (!Number.isFinite(value) || value < 0) return null\n return value\n}\n\nfunction writeHighwatermark(\n paths: ReturnType<typeof getTaskListPaths>,\n value: number,\n): void {\n ensureTaskListDirs(paths)\n writeFileSync(paths.highwatermarkPath, String(value), 'utf8')\n}\n\nfunction updateHighwatermark(\n paths: ReturnType<typeof getTaskListPaths>,\n value: number,\n): void {\n if (!Number.isFinite(value) || value < 0) return\n const current = readHighwatermark(paths)\n const next = current !== null ? Math.max(current, value) : value\n writeHighwatermark(paths, next)\n}\n\n\nfunction readTaskFile(path: string): TaskRecord | null {\n const data = readJson<\n Partial<Omit<TaskRecord, 'status'>> & {\n status?: TaskStatusInput | string\n title?: string\n version?: number\n }\n >(path)\n if (!data || !data.id || (!data.subject && !data.title) || !data.status) {\n return null\n }\n const status = data.status === 'open' ? 'pending' : data.status\n if (\n status !== 'pending' &&\n status !== 'in_progress' &&\n status !== 'blocked' &&\n status !== 'done' &&\n status !== 'archived'\n ) {\n return null\n }\n const subject = data.subject ?? data.title\n const activeForm = data.activeForm\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: TaskRecord = {\n id: data.id,\n subject,\n description: data.description,\n activeForm,\n status,\n tags: data.tags,\n assignee: data.assignee,\n metadata: data.metadata,\n archived: data.archived,\n blocks: data.blocks ?? [],\n blockedBy: data.blockedBy ?? [],\n parent: data.parent,\n related: data.related ?? [],\n createdAt,\n updatedAt,\n baseVersion,\n version,\n legacyTodoId: data.legacyTodoId,\n }\n delete (normalized as any).priority\n return normalized\n}\n\nfunction deriveBlocks(tasks: TaskRecord[]): Map<string, string[]> {\n const map = new Map<string, string[]>()\n for (const task of tasks) {\n map.set(task.id, [])\n }\n for (const task of tasks) {\n const blockers = task.blockedBy ?? []\n for (const blockerId of blockers) {\n const list = map.get(blockerId)\n if (list) {\n list.push(task.id)\n } else {\n map.set(blockerId, [task.id])\n }\n }\n }\n for (const [key, list] of map.entries()) {\n map.set(\n key,\n list.sort((a, b) => Number(a) - Number(b)),\n )\n }\n return map\n}\n\nfunction areBlocksEqual(a: string[] | undefined, b: string[] | undefined): boolean {\n const left = a ?? []\n const right = b ?? []\n if (left.length !== right.length) return false\n for (let i = 0; i < left.length; i += 1) {\n if (left[i] !== right[i]) return false\n }\n return true\n}\n\nfunction readTasksFromDisk(paths: ReturnType<typeof getTaskListPaths>): TaskRecord[] {\n if (!existsSync(paths.tasksDir)) return []\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n return files\n .map(file => readTaskFile(join(paths.tasksDir, file)))\n .filter(Boolean) as TaskRecord[]\n}\n\nfunction applyBlocksMap(\n tasks: TaskRecord[],\n map: Map<string, string[]>,\n): TaskRecord[] {\n return tasks.map(task => ({\n ...task,\n blocks: map.get(task.id) ?? [],\n }))\n}\n\nfunction persistBlocksMap(\n paths: ReturnType<typeof getTaskListPaths>,\n map: Map<string, string[]>,\n): number {\n ensureTaskListDirs(paths)\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n let updated = 0\n for (const file of files) {\n const path = join(paths.tasksDir, file)\n const raw = readJson<Partial<TaskRecord>>(path)\n if (!raw || !raw.id) continue\n const nextBlocks = map.get(raw.id) ?? []\n const currentBlocks = Array.isArray(raw.blocks) ? raw.blocks : []\n if (areBlocksEqual(currentBlocks, nextBlocks)) continue\n raw.blocks = nextBlocks\n writeJson(path, raw)\n updated += 1\n }\n return updated\n}\n\nfunction rebuildBlocksForPaths(paths: ReturnType<typeof getTaskListPaths>): {\n tasks: TaskRecord[]\n updated: number\n} {\n const tasks = readTasksFromDisk(paths)\n const map = deriveBlocks(tasks)\n const updated = persistBlocksMap(paths, map)\n return { tasks: applyBlocksMap(tasks, map), updated }\n}\n\nconst legacyFiles = ['index.json', 'meta.json', 'events.jsonl']\n\nfunction cleanupLegacyFiles(paths: ReturnType<typeof getTaskListPaths>): void {\n for (const file of legacyFiles) {\n const path = join(paths.listDir, file)\n if (existsSync(path)) {\n rmSync(path, { force: true })\n }\n }\n}\n\nfunction getMaxIdFromTasksDir(paths: ReturnType<typeof getTaskListPaths>): number {\n if (!existsSync(paths.tasksDir)) return 0\n const files = readdirSync(paths.tasksDir).filter(file => file.endsWith('.json'))\n let maxId = 0\n for (const file of files) {\n const numeric = Number(file.replace(/\\.json$/, ''))\n if (Number.isFinite(numeric)) {\n maxId = Math.max(maxId, numeric)\n }\n }\n return maxId\n}\n\nfunction getNextTaskId(paths: ReturnType<typeof getTaskListPaths>): number {\n const highwatermark = readHighwatermark(paths) ?? 0\n const maxId = getMaxIdFromTasksDir(paths)\n return Math.max(highwatermark, maxId) + 1\n}\n\nfunction acquireLock(paths: ReturnType<typeof getTaskListPaths>): void {\n ensureTaskListDirs(paths)\n const start = Date.now()\n while (taskListLocks.has(paths.lockPath)) {\n const elapsed = Date.now() - start\n if (elapsed >= DEFAULT_LOCK_TIMEOUT_MS) {\n throw new TaskStoreLockError('Task list is locked')\n }\n Atomics.wait(taskLockWaitBuffer, 0, 0, DEFAULT_LOCK_RETRY_MS)\n }\n const native = getNativeLock()\n if (!native) {\n const platformLabel = `${process.platform}-${process.arch}`\n const packageName = resolveNativeLockPackage()\n if (packageName) {\n throw new TaskStoreLockError(\n `Native lock unavailable. Missing package ${packageName} for ${platformLabel}`,\n )\n }\n throw new TaskStoreLockError(\n `Native lock unavailable. Unsupported platform ${platformLabel}`,\n )\n }\n if (native.tryLockExclusivePath && native.unlockHandle) {\n const lockKey = paths.lockPath\n while (true) {\n try {\n const handle = native.tryLockExclusivePath(lockKey)\n if (handle > 0) {\n taskListLocks.set(paths.lockPath, { handle, mode: 'nativeHandle' })\n return\n }\n } catch {}\n const elapsed = Date.now() - start\n if (elapsed >= DEFAULT_LOCK_TIMEOUT_MS) {\n throw new TaskStoreLockError('Task list is locked')\n }\n Atomics.wait(taskLockWaitBuffer, 0, 0, DEFAULT_LOCK_RETRY_MS)\n }\n }\n while (true) {\n const handle = openSync(paths.lockPath, 'r+')\n try {\n const ok = native.tryLockExclusive(handle)\n if (ok) {\n taskListLocks.set(paths.lockPath, { handle, mode: 'fd' })\n return\n }\n try {\n closeSync(handle)\n } catch {}\n const elapsed = Date.now() - start\n if (elapsed >= DEFAULT_LOCK_TIMEOUT_MS) {\n throw new TaskStoreLockError('Task list is locked')\n }\n Atomics.wait(taskLockWaitBuffer, 0, 0, DEFAULT_LOCK_RETRY_MS)\n } catch {\n try {\n closeSync(handle)\n } catch {}\n const elapsed = Date.now() - start\n if (elapsed >= DEFAULT_LOCK_TIMEOUT_MS) {\n throw new TaskStoreLockError('Task list is locked')\n }\n Atomics.wait(taskLockWaitBuffer, 0, 0, DEFAULT_LOCK_RETRY_MS)\n }\n }\n}\n\nfunction releaseLock(paths: ReturnType<typeof getTaskListPaths>): void {\n const lock = taskListLocks.get(paths.lockPath)\n if (lock !== undefined) {\n const native = getNativeLock()\n if (native && lock.mode === 'nativeHandle' && native.unlockHandle) {\n try {\n native.unlockHandle(lock.handle)\n } catch {}\n } else {\n if (native) {\n try {\n native.unlock(lock.handle)\n } catch {}\n }\n closeSync(lock.handle)\n }\n taskListLocks.delete(paths.lockPath)\n }\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\nexport function acquireTaskListLockForTests(\n paths: ReturnType<typeof getTaskListPaths>,\n): void {\n acquireLock(paths)\n}\n\nexport function releaseTaskListLockForTests(\n paths: ReturnType<typeof getTaskListPaths>,\n): void {\n releaseLock(paths)\n}\n\nfunction mergeMetadata(\n existing?: TaskMetadata,\n updates?: TaskMetadataUpdate,\n): TaskMetadata | undefined {\n if (!updates) return existing\n const next: TaskMetadata = { ...(existing ?? {}) }\n for (const [key, value] of Object.entries(updates)) {\n if (value === null) {\n delete next[key]\n } else {\n next[key] = value\n }\n }\n return Object.keys(next).length > 0 ? next : undefined\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 activeForm = updates.activeForm ?? task.activeForm\n const blockedBy = updates.blockedBy ?? task.blockedBy ?? []\n const nextStatus = updates.status ?? task.status\n const status = nextStatus === 'open' ? task.status : nextStatus\n return {\n ...task,\n subject,\n description: updates.description ?? task.description,\n activeForm,\n status,\n tags: updates.tags ?? task.tags,\n assignee: updates.assignee ?? task.assignee,\n metadata: mergeMetadata(task.metadata, updates.metadata),\n archived: updates.archived ?? task.archived,\n blocks: task.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 if (input.status === 'open') {\n throw new Error('Task status open is not supported')\n }\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n ensureTaskListDirs(paths)\n const id = String(getNextTaskId(paths))\n const now = Date.now()\n const subject = input.subject\n if (!subject) {\n throw new Error('Task subject is required')\n }\n const activeForm = input.activeForm\n const status = input.status ?? 'pending'\n if (status === 'open') {\n throw new Error('Task status open is not supported')\n }\n const record: TaskRecord = {\n id,\n subject,\n description: input.description,\n activeForm,\n status,\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n 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 updateHighwatermark(paths, Number(id))\n const { tasks } = rebuildBlocksForPaths(paths)\n const refreshed = tasks.find(task => task.id === record.id)\n return refreshed ?? record\n })\n}\n\nexport function getTask(\n id: string,\n options?: { listId?: string },\n): TaskRecord | null {\n const pathsList = getTaskListReadPaths(options?.listId)\n for (const paths of pathsList) {\n const taskPath = join(paths.tasksDir, `${id}.json`)\n if (!existsSync(taskPath)) continue\n const task = readTaskFile(taskPath)\n if (task) return task\n }\n return null\n}\n\nexport function listTasks(options?: { listId?: string }): TaskRecord[] {\n const pathsList = getTaskListReadPaths(options?.listId)\n const merged = new Map<string, TaskRecord>()\n for (const paths of pathsList) {\n const tasks = readTasksFromDisk(paths)\n const map = deriveBlocks(tasks)\n const derived = applyBlocksMap(tasks, map)\n const needsPersist = tasks.some(task => {\n const nextBlocks = map.get(task.id) ?? []\n return !areBlocksEqual(task.blocks, nextBlocks)\n })\n const ready = needsPersist\n ? withTaskListLock(paths, () => rebuildBlocksForPaths(paths).tasks)\n : derived\n for (const task of ready) {\n if (!merged.has(task.id)) {\n merged.set(task.id, task)\n }\n }\n }\n return Array.from(merged.values()).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 if (updates.status === 'open') {\n throw new Error('Task status open is not supported')\n }\n const pathsList = getTaskListReadPaths(options?.listId)\n const target = pathsList.find(paths =>\n existsSync(join(paths.tasksDir, `${id}.json`)),\n )\n if (!target) {\n throw new Error(`Task ${id} not found`)\n }\n return withTaskListLock(target, () => {\n const existing = readTaskFile(join(target.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 writeJsonAtomic(join(target.tasksDir, `${id}.json`), updated)\n const { tasks } = rebuildBlocksForPaths(target)\n const refreshed = tasks.find(task => task.id === updated.id)\n return { task: refreshed ?? updated, conflict: hasConflict }\n })\n}\n\nexport function rebuildTaskBlocks(options?: { listId?: string }): {\n updated: number\n total: number\n} {\n const paths = getTaskListPaths(options?.listId)\n return withTaskListLock(paths, () => {\n ensureTaskListDirs(paths)\n const { tasks, updated } = rebuildBlocksForPaths(paths)\n return { updated, total: tasks.length }\n })\n}\n", "import { createRequire } from 'module'\n\nconst require = createRequire(import.meta.url)\n\nexport type NativeTaskLock = {\n lockExclusive: (fd: number) => void\n tryLockExclusive: (fd: number) => boolean\n unlock: (fd: number) => void\n tryLockExclusivePath?: (path: string) => number\n unlockHandle?: (handle: number) => void\n}\n\nconst getLinuxVariant = (report?: { getReport?: () => any }): 'gnu' | 'musl' => {\n const glibc = report?.getReport?.()?.header?.glibcVersionRuntime\n return glibc ? 'gnu' : 'musl'\n}\n\nexport const resolveNativeLockPackage = (options?: {\n platform?: NodeJS.Platform\n arch?: string\n report?: { getReport?: () => any }\n}): string | null => {\n const platform = options?.platform ?? process.platform\n const arch = options?.arch ?? process.arch\n const report =\n options?.report ?? (process as typeof process & { report?: any }).report\n if (platform === 'win32' && arch === 'x64') {\n return '@pyb/lock-win32-x64-msvc'\n }\n if (platform === 'win32' && arch === 'arm64') {\n return '@pyb/lock-win32-arm64-msvc'\n }\n if (platform === 'darwin' && arch === 'x64') {\n return '@pyb/lock-darwin-x64'\n }\n if (platform === 'darwin' && arch === 'arm64') {\n return '@pyb/lock-darwin-arm64'\n }\n if (platform === 'linux' && arch === 'x64') {\n const variant = getLinuxVariant(report)\n return variant === 'musl' ? '@pyb/lock-linux-x64-musl' : '@pyb/lock-linux-x64-gnu'\n }\n if (platform === 'linux' && arch === 'arm64') {\n return '@pyb/lock-linux-arm64-gnu'\n }\n if (platform === 'linux' && arch === 'arm') {\n return '@pyb/lock-linux-armv7-gnueabihf'\n }\n return null\n}\n\nlet cachedLock: NativeTaskLock | null | undefined\n\nexport const loadNativeTaskLock = (): NativeTaskLock | null => {\n const globalLock = (\n globalThis as typeof globalThis & { __PYB_NATIVE_TASK_LOCK__?: NativeTaskLock }\n ).__PYB_NATIVE_TASK_LOCK__\n if (globalLock) {\n cachedLock = globalLock\n return cachedLock\n }\n if (cachedLock !== undefined) return cachedLock\n const envPath = process.env.PYB_NATIVE_LOCK_NODE_PATH\n if (envPath) {\n try {\n const mod = require(envPath) as Partial<NativeTaskLock> & {\n default?: Partial<NativeTaskLock>\n }\n const candidate = mod?.default ?? mod\n if (\n candidate &&\n typeof candidate.lockExclusive === 'function' &&\n typeof candidate.tryLockExclusive === 'function' &&\n typeof candidate.unlock === 'function'\n ) {\n cachedLock = candidate as NativeTaskLock\n return cachedLock\n }\n } catch {}\n }\n const packageName = resolveNativeLockPackage()\n if (!packageName) {\n cachedLock = null\n return null\n }\n try {\n const mod = require(packageName) as Partial<NativeTaskLock> & {\n default?: Partial<NativeTaskLock>\n }\n const candidate = mod?.default ?? mod\n if (\n candidate &&\n typeof candidate.lockExclusive === 'function' &&\n typeof candidate.tryLockExclusive === 'function' &&\n typeof candidate.unlock === 'function'\n ) {\n cachedLock = candidate as NativeTaskLock\n return cachedLock\n }\n } catch {}\n cachedLock = null\n return null\n}\n", "import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from '@utils/agent/storage'\nimport { createTask, getTaskListPaths, listTasks, TaskStatus, updateTask } 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'\nconst TODO_MIGRATION_KEY = 'todoMigration'\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 'pending'\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 migrationKey = `${listId}:${options?.agentId ?? 'default'}`\n const sessionState = getSessionState() as any\n const migrationState =\n (sessionState[TODO_MIGRATION_KEY] as Record<string, any> | undefined) ?? {}\n if (migrationState[migrationKey]?.completedAt) {\n return { listId, migrated: false, created: 0 }\n }\n const todos = getTodos(options?.agentId)\n const result = syncTodosToTasks(todos, { listId })\n setSessionState({\n ...sessionState,\n [TODO_MIGRATION_KEY]: {\n ...migrationState,\n [migrationKey]: {\n completedAt: Date.now(),\n sourceCount: todos.length,\n },\n },\n } as any)\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 once to provide a complete task list (no dependencies); the tool will finalize dependencies internally. 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 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.pending}_${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}, Pending: ${summary.pending}, 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?.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?.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", "randomUUID", "require", "randomUUID", "join", "existsSync", "join", "existsSync", "override", "defaultBaseDir", "candidates", "existing", "mkdirSync", "writeFileSync", "readFileSync", "randomUUID", "join", "existsSync", "processedTodos", "updatedTodos"]
|
|
7
|
+
}
|