charness 3.6.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/CHANGELOG.md +274 -0
  2. package/DEVELOPMENT.md +31 -5
  3. package/MIGRATION_RENAME_TO_CHARNESS.md +3 -2
  4. package/README.md +84 -782
  5. package/SETUP.md +37 -10
  6. package/agent-plugin/.claude-plugin/plugin.json +7 -0
  7. package/agent-plugin/README.md +35 -0
  8. package/agent-plugin/skills/charness-delegate-claude/SKILL.md +85 -0
  9. package/agent-plugin/skills/charness-delegate-claude/summarize-events.py +90 -0
  10. package/agent-plugin/skills/charness-delegate-opencode/SKILL.md +68 -0
  11. package/agent-plugin/skills/charness-manager/SKILL.md +152 -0
  12. package/dist/adapters/adapterNames.d.ts +6 -0
  13. package/dist/adapters/adapterNames.d.ts.map +1 -1
  14. package/dist/adapters/adapterNames.js +8 -2
  15. package/dist/adapters/adapterNames.js.map +1 -1
  16. package/dist/adapters/claudeCliAdapter.d.ts +8 -0
  17. package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
  18. package/dist/adapters/claudeCliAdapter.js +42 -5
  19. package/dist/adapters/claudeCliAdapter.js.map +1 -1
  20. package/dist/adapters/claudeJsonStreamAdapter.d.ts +10 -9
  21. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
  22. package/dist/adapters/claudeJsonStreamAdapter.js +53 -55
  23. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
  24. package/dist/adapters/createAdapter.d.ts +8 -0
  25. package/dist/adapters/createAdapter.d.ts.map +1 -1
  26. package/dist/adapters/createAdapter.js +14 -2
  27. package/dist/adapters/createAdapter.js.map +1 -1
  28. package/dist/adapters/openCodeAdapter.d.ts +43 -6
  29. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  30. package/dist/adapters/openCodeAdapter.js +95 -6
  31. package/dist/adapters/openCodeAdapter.js.map +1 -1
  32. package/dist/agentLogin/agentLogin.d.ts +1 -1
  33. package/dist/agentLogin/agentLogin.d.ts.map +1 -1
  34. package/dist/apiRetryKick.d.ts +4 -3
  35. package/dist/apiRetryKick.d.ts.map +1 -1
  36. package/dist/apiRetryKick.js +16 -9
  37. package/dist/apiRetryKick.js.map +1 -1
  38. package/dist/bot.d.ts.map +1 -1
  39. package/dist/bot.js +1313 -381
  40. package/dist/bot.js.map +1 -1
  41. package/dist/cli/claudeProfiles.d.ts +11 -6
  42. package/dist/cli/claudeProfiles.d.ts.map +1 -1
  43. package/dist/cli/claudeProfiles.js +50 -22
  44. package/dist/cli/claudeProfiles.js.map +1 -1
  45. package/dist/cli/hot.d.ts +5 -0
  46. package/dist/cli/hot.d.ts.map +1 -1
  47. package/dist/cli/hot.js +71 -25
  48. package/dist/cli/hot.js.map +1 -1
  49. package/dist/cli/tscWatchGuard.d.ts +95 -0
  50. package/dist/cli/tscWatchGuard.d.ts.map +1 -0
  51. package/dist/cli/tscWatchGuard.js +295 -0
  52. package/dist/cli/tscWatchGuard.js.map +1 -0
  53. package/dist/cli.js +12 -1
  54. package/dist/cli.js.map +1 -1
  55. package/dist/connectors/jira/answerSink.d.ts +10 -0
  56. package/dist/connectors/jira/answerSink.d.ts.map +1 -1
  57. package/dist/connectors/jira/answerSink.js +13 -0
  58. package/dist/connectors/jira/answerSink.js.map +1 -1
  59. package/dist/connectors/jira/config.d.ts +2 -0
  60. package/dist/connectors/jira/config.d.ts.map +1 -1
  61. package/dist/connectors/jira/config.js +9 -1
  62. package/dist/connectors/jira/config.js.map +1 -1
  63. package/dist/connectors/jira/connector.d.ts +11 -1
  64. package/dist/connectors/jira/connector.d.ts.map +1 -1
  65. package/dist/connectors/jira/connector.js +13 -1
  66. package/dist/connectors/jira/connector.js.map +1 -1
  67. package/dist/connectors/jira/inbound.d.ts +29 -4
  68. package/dist/connectors/jira/inbound.d.ts.map +1 -1
  69. package/dist/connectors/jira/inbound.js +71 -8
  70. package/dist/connectors/jira/inbound.js.map +1 -1
  71. package/dist/connectors/jira/issueBlocks.d.ts +5 -0
  72. package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
  73. package/dist/connectors/jira/issueBlocks.js +11 -0
  74. package/dist/connectors/jira/issueBlocks.js.map +1 -1
  75. package/dist/connectors/jira/prompt.d.ts +4 -0
  76. package/dist/connectors/jira/prompt.d.ts.map +1 -1
  77. package/dist/connectors/jira/prompt.js +11 -2
  78. package/dist/connectors/jira/prompt.js.map +1 -1
  79. package/dist/connectors/telegram/bindPicker.d.ts +5 -0
  80. package/dist/connectors/telegram/bindPicker.d.ts.map +1 -1
  81. package/dist/connectors/telegram/bindPicker.js +18 -1
  82. package/dist/connectors/telegram/bindPicker.js.map +1 -1
  83. package/dist/connectors/telegram/bindPickerClaims.d.ts +46 -0
  84. package/dist/connectors/telegram/bindPickerClaims.d.ts.map +1 -0
  85. package/dist/connectors/telegram/bindPickerClaims.js +83 -0
  86. package/dist/connectors/telegram/bindPickerClaims.js.map +1 -0
  87. package/dist/connectors/telegram/bindSweep.d.ts +32 -0
  88. package/dist/connectors/telegram/bindSweep.d.ts.map +1 -0
  89. package/dist/connectors/telegram/bindSweep.js +47 -0
  90. package/dist/connectors/telegram/bindSweep.js.map +1 -0
  91. package/dist/connectors/telegram/bindingWelcome.d.ts +23 -0
  92. package/dist/connectors/telegram/bindingWelcome.d.ts.map +1 -0
  93. package/dist/connectors/telegram/bindingWelcome.js +26 -0
  94. package/dist/connectors/telegram/bindingWelcome.js.map +1 -0
  95. package/dist/connectors/telegram/botApiConnection.d.ts +74 -0
  96. package/dist/connectors/telegram/botApiConnection.d.ts.map +1 -0
  97. package/dist/connectors/telegram/botApiConnection.js +201 -0
  98. package/dist/connectors/telegram/botApiConnection.js.map +1 -0
  99. package/dist/connectors/telegram/commands/botCore.d.ts +8 -2
  100. package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
  101. package/dist/connectors/telegram/commands/botSkills.d.ts +21 -0
  102. package/dist/connectors/telegram/commands/botSkills.d.ts.map +1 -0
  103. package/dist/connectors/telegram/commands/botSkills.js +133 -0
  104. package/dist/connectors/telegram/commands/botSkills.js.map +1 -0
  105. package/dist/connectors/telegram/commands/callbackMessage.d.ts +5 -0
  106. package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -1
  107. package/dist/connectors/telegram/commands/callbackMessage.js +9 -0
  108. package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -1
  109. package/dist/connectors/telegram/commands/compaction.d.ts +65 -3
  110. package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -1
  111. package/dist/connectors/telegram/commands/compaction.js +512 -94
  112. package/dist/connectors/telegram/commands/compaction.js.map +1 -1
  113. package/dist/connectors/telegram/commands/displayModes.d.ts +1 -1
  114. package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -1
  115. package/dist/connectors/telegram/commands/displayModes.js +6 -18
  116. package/dist/connectors/telegram/commands/displayModes.js.map +1 -1
  117. package/dist/connectors/telegram/commands/fallbackChain.js +5 -5
  118. package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
  119. package/dist/connectors/telegram/commands/reminders.d.ts +1 -1
  120. package/dist/connectors/telegram/commands/reminders.d.ts.map +1 -1
  121. package/dist/connectors/telegram/commands/reminders.js +4 -15
  122. package/dist/connectors/telegram/commands/reminders.js.map +1 -1
  123. package/dist/connectors/telegram/commands/selfUpdate.d.ts.map +1 -1
  124. package/dist/connectors/telegram/commands/selfUpdate.js +1 -11
  125. package/dist/connectors/telegram/commands/selfUpdate.js.map +1 -1
  126. package/dist/connectors/telegram/commands/taskAgents.d.ts +22 -0
  127. package/dist/connectors/telegram/commands/taskAgents.d.ts.map +1 -0
  128. package/dist/connectors/telegram/commands/taskAgents.js +104 -0
  129. package/dist/connectors/telegram/commands/taskAgents.js.map +1 -0
  130. package/dist/connectors/telegram/commands/todo.d.ts +82 -0
  131. package/dist/connectors/telegram/commands/todo.d.ts.map +1 -0
  132. package/dist/connectors/telegram/commands/todo.js +384 -0
  133. package/dist/connectors/telegram/commands/todo.js.map +1 -0
  134. package/dist/connectors/telegram/commands/topicCommand.d.ts +6 -2
  135. package/dist/connectors/telegram/commands/topicCommand.d.ts.map +1 -1
  136. package/dist/connectors/telegram/commands/topicCommand.js +6 -9
  137. package/dist/connectors/telegram/commands/topicCommand.js.map +1 -1
  138. package/dist/connectors/telegram/openBindMessages.d.ts +45 -0
  139. package/dist/connectors/telegram/openBindMessages.d.ts.map +1 -0
  140. package/dist/connectors/telegram/openBindMessages.js +67 -0
  141. package/dist/connectors/telegram/openBindMessages.js.map +1 -0
  142. package/dist/connectors/telegram/outputFlushPlan.d.ts +49 -0
  143. package/dist/connectors/telegram/outputFlushPlan.d.ts.map +1 -1
  144. package/dist/connectors/telegram/outputFlushPlan.js +46 -0
  145. package/dist/connectors/telegram/outputFlushPlan.js.map +1 -1
  146. package/dist/connectors/telegram/pendingTopicName.d.ts +26 -0
  147. package/dist/connectors/telegram/pendingTopicName.d.ts.map +1 -0
  148. package/dist/connectors/telegram/pendingTopicName.js +27 -0
  149. package/dist/connectors/telegram/pendingTopicName.js.map +1 -0
  150. package/dist/connectors/test/connector.d.ts.map +1 -1
  151. package/dist/connectors/test/connector.js +6 -1
  152. package/dist/connectors/test/connector.js.map +1 -1
  153. package/dist/i18n/de.d.ts.map +1 -1
  154. package/dist/i18n/de.js +90 -7
  155. package/dist/i18n/de.js.map +1 -1
  156. package/dist/i18n/en.d.ts.map +1 -1
  157. package/dist/i18n/en.js +90 -7
  158. package/dist/i18n/en.js.map +1 -1
  159. package/dist/i18n/es.d.ts.map +1 -1
  160. package/dist/i18n/es.js +90 -7
  161. package/dist/i18n/es.js.map +1 -1
  162. package/dist/i18n/fr.d.ts.map +1 -1
  163. package/dist/i18n/fr.js +90 -7
  164. package/dist/i18n/fr.js.map +1 -1
  165. package/dist/i18n/hi.d.ts.map +1 -1
  166. package/dist/i18n/hi.js +90 -7
  167. package/dist/i18n/hi.js.map +1 -1
  168. package/dist/i18n/ja.d.ts.map +1 -1
  169. package/dist/i18n/ja.js +90 -7
  170. package/dist/i18n/ja.js.map +1 -1
  171. package/dist/i18n/ka.d.ts.map +1 -1
  172. package/dist/i18n/ka.js +90 -7
  173. package/dist/i18n/ka.js.map +1 -1
  174. package/dist/i18n/pt.d.ts.map +1 -1
  175. package/dist/i18n/pt.js +90 -7
  176. package/dist/i18n/pt.js.map +1 -1
  177. package/dist/i18n/ru.d.ts.map +1 -1
  178. package/dist/i18n/ru.js +90 -7
  179. package/dist/i18n/ru.js.map +1 -1
  180. package/dist/i18n/uk.d.ts.map +1 -1
  181. package/dist/i18n/uk.js +90 -7
  182. package/dist/i18n/uk.js.map +1 -1
  183. package/dist/i18n/uz.d.ts.map +1 -1
  184. package/dist/i18n/uz.js +90 -7
  185. package/dist/i18n/uz.js.map +1 -1
  186. package/dist/i18n/zh.d.ts.map +1 -1
  187. package/dist/i18n/zh.js +90 -7
  188. package/dist/i18n/zh.js.map +1 -1
  189. package/dist/i18n.d.ts +1 -1
  190. package/dist/i18n.js +1 -1
  191. package/dist/installManager.d.ts +13 -0
  192. package/dist/installManager.d.ts.map +1 -1
  193. package/dist/installManager.js +38 -4
  194. package/dist/installManager.js.map +1 -1
  195. package/dist/instanceSettings.d.ts +40 -1
  196. package/dist/instanceSettings.d.ts.map +1 -1
  197. package/dist/instanceSettings.js +105 -26
  198. package/dist/instanceSettings.js.map +1 -1
  199. package/dist/openCodeQuestionFlow.d.ts +30 -0
  200. package/dist/openCodeQuestionFlow.d.ts.map +1 -1
  201. package/dist/openCodeQuestionFlow.js +43 -0
  202. package/dist/openCodeQuestionFlow.js.map +1 -1
  203. package/dist/postToSession.d.ts +20 -5
  204. package/dist/postToSession.d.ts.map +1 -1
  205. package/dist/postToSession.js +38 -7
  206. package/dist/postToSession.js.map +1 -1
  207. package/dist/remoteRun/cliArgs.d.ts +73 -0
  208. package/dist/remoteRun/cliArgs.d.ts.map +1 -0
  209. package/dist/remoteRun/cliArgs.js +197 -0
  210. package/dist/remoteRun/cliArgs.js.map +1 -0
  211. package/dist/remoteRun/commands.d.ts +56 -0
  212. package/dist/remoteRun/commands.d.ts.map +1 -0
  213. package/dist/remoteRun/commands.js +306 -0
  214. package/dist/remoteRun/commands.js.map +1 -0
  215. package/dist/remoteRun/depsPlan.d.ts +16 -0
  216. package/dist/remoteRun/depsPlan.d.ts.map +1 -0
  217. package/dist/remoteRun/depsPlan.js +82 -0
  218. package/dist/remoteRun/depsPlan.js.map +1 -0
  219. package/dist/remoteRun/exitCodes.d.ts +34 -0
  220. package/dist/remoteRun/exitCodes.d.ts.map +1 -0
  221. package/dist/remoteRun/exitCodes.js +38 -0
  222. package/dist/remoteRun/exitCodes.js.map +1 -0
  223. package/dist/remoteRun/foreground.d.ts +29 -0
  224. package/dist/remoteRun/foreground.d.ts.map +1 -0
  225. package/dist/remoteRun/foreground.js +159 -0
  226. package/dist/remoteRun/foreground.js.map +1 -0
  227. package/dist/remoteRun/interrupts.d.ts +17 -0
  228. package/dist/remoteRun/interrupts.d.ts.map +1 -0
  229. package/dist/remoteRun/interrupts.js +41 -0
  230. package/dist/remoteRun/interrupts.js.map +1 -0
  231. package/dist/remoteRun/jobFiles.d.ts +31 -0
  232. package/dist/remoteRun/jobFiles.d.ts.map +1 -0
  233. package/dist/remoteRun/jobFiles.js +84 -0
  234. package/dist/remoteRun/jobFiles.js.map +1 -0
  235. package/dist/remoteRun/jobFormat.d.ts +16 -0
  236. package/dist/remoteRun/jobFormat.d.ts.map +1 -0
  237. package/dist/remoteRun/jobFormat.js +130 -0
  238. package/dist/remoteRun/jobFormat.js.map +1 -0
  239. package/dist/remoteRun/jobId.d.ts +15 -0
  240. package/dist/remoteRun/jobId.d.ts.map +1 -0
  241. package/dist/remoteRun/jobId.js +85 -0
  242. package/dist/remoteRun/jobId.js.map +1 -0
  243. package/dist/remoteRun/jobMeta.d.ts +18 -0
  244. package/dist/remoteRun/jobMeta.d.ts.map +1 -0
  245. package/dist/remoteRun/jobMeta.js +33 -0
  246. package/dist/remoteRun/jobMeta.js.map +1 -0
  247. package/dist/remoteRun/jobQuery.d.ts +12 -0
  248. package/dist/remoteRun/jobQuery.d.ts.map +1 -0
  249. package/dist/remoteRun/jobQuery.js +22 -0
  250. package/dist/remoteRun/jobQuery.js.map +1 -0
  251. package/dist/remoteRun/jobRecords.d.ts +22 -0
  252. package/dist/remoteRun/jobRecords.d.ts.map +1 -0
  253. package/dist/remoteRun/jobRecords.js +145 -0
  254. package/dist/remoteRun/jobRecords.js.map +1 -0
  255. package/dist/remoteRun/jobState.d.ts +62 -0
  256. package/dist/remoteRun/jobState.d.ts.map +1 -0
  257. package/dist/remoteRun/jobState.js +132 -0
  258. package/dist/remoteRun/jobState.js.map +1 -0
  259. package/dist/remoteRun/leaseTiming.d.ts +18 -0
  260. package/dist/remoteRun/leaseTiming.d.ts.map +1 -0
  261. package/dist/remoteRun/leaseTiming.js +43 -0
  262. package/dist/remoteRun/leaseTiming.js.map +1 -0
  263. package/dist/remoteRun/output.d.ts +35 -0
  264. package/dist/remoteRun/output.d.ts.map +1 -0
  265. package/dist/remoteRun/output.js +82 -0
  266. package/dist/remoteRun/output.js.map +1 -0
  267. package/dist/remoteRun/pathPatterns.d.ts +33 -0
  268. package/dist/remoteRun/pathPatterns.d.ts.map +1 -0
  269. package/dist/remoteRun/pathPatterns.js +115 -0
  270. package/dist/remoteRun/pathPatterns.js.map +1 -0
  271. package/dist/remoteRun/probe.d.ts +56 -0
  272. package/dist/remoteRun/probe.d.ts.map +1 -0
  273. package/dist/remoteRun/probe.js +123 -0
  274. package/dist/remoteRun/probe.js.map +1 -0
  275. package/dist/remoteRun/project.d.ts +26 -0
  276. package/dist/remoteRun/project.d.ts.map +1 -0
  277. package/dist/remoteRun/project.js +159 -0
  278. package/dist/remoteRun/project.js.map +1 -0
  279. package/dist/remoteRun/projectConfig.d.ts +38 -0
  280. package/dist/remoteRun/projectConfig.d.ts.map +1 -0
  281. package/dist/remoteRun/projectConfig.js +87 -0
  282. package/dist/remoteRun/projectConfig.js.map +1 -0
  283. package/dist/remoteRun/remoteRunCli.d.ts +15 -0
  284. package/dist/remoteRun/remoteRunCli.d.ts.map +1 -0
  285. package/dist/remoteRun/remoteRunCli.js +144 -0
  286. package/dist/remoteRun/remoteRunCli.js.map +1 -0
  287. package/dist/remoteRun/remoteRunError.d.ts +14 -0
  288. package/dist/remoteRun/remoteRunError.d.ts.map +1 -0
  289. package/dist/remoteRun/remoteRunError.js +28 -0
  290. package/dist/remoteRun/remoteRunError.js.map +1 -0
  291. package/dist/remoteRun/rsync.d.ts +17 -0
  292. package/dist/remoteRun/rsync.d.ts.map +1 -0
  293. package/dist/remoteRun/rsync.js +39 -0
  294. package/dist/remoteRun/rsync.js.map +1 -0
  295. package/dist/remoteRun/runnerClient.d.ts +50 -0
  296. package/dist/remoteRun/runnerClient.d.ts.map +1 -0
  297. package/dist/remoteRun/runnerClient.js +139 -0
  298. package/dist/remoteRun/runnerClient.js.map +1 -0
  299. package/dist/remoteRun/runners.d.ts +57 -0
  300. package/dist/remoteRun/runners.d.ts.map +1 -0
  301. package/dist/remoteRun/runners.js +181 -0
  302. package/dist/remoteRun/runners.js.map +1 -0
  303. package/dist/remoteRun/runnersConfig.d.ts +44 -0
  304. package/dist/remoteRun/runnersConfig.d.ts.map +1 -0
  305. package/dist/remoteRun/runnersConfig.js +107 -0
  306. package/dist/remoteRun/runnersConfig.js.map +1 -0
  307. package/dist/remoteRun/safeCopy.d.ts +31 -0
  308. package/dist/remoteRun/safeCopy.d.ts.map +1 -0
  309. package/dist/remoteRun/safeCopy.js +137 -0
  310. package/dist/remoteRun/safeCopy.js.map +1 -0
  311. package/dist/remoteRun/sendPlan.d.ts +67 -0
  312. package/dist/remoteRun/sendPlan.d.ts.map +1 -0
  313. package/dist/remoteRun/sendPlan.js +139 -0
  314. package/dist/remoteRun/sendPlan.js.map +1 -0
  315. package/dist/remoteRun/ssh.d.ts +62 -0
  316. package/dist/remoteRun/ssh.d.ts.map +1 -0
  317. package/dist/remoteRun/ssh.js +202 -0
  318. package/dist/remoteRun/ssh.js.map +1 -0
  319. package/dist/remoteRun/submit.d.ts +29 -0
  320. package/dist/remoteRun/submit.d.ts.map +1 -0
  321. package/dist/remoteRun/submit.js +142 -0
  322. package/dist/remoteRun/submit.js.map +1 -0
  323. package/dist/requests/answerRequest.d.ts +5 -0
  324. package/dist/requests/answerRequest.d.ts.map +1 -1
  325. package/dist/requests/answerRequest.js +16 -1
  326. package/dist/requests/answerRequest.js.map +1 -1
  327. package/dist/requests/requestLedger.d.ts +13 -0
  328. package/dist/requests/requestLedger.d.ts.map +1 -1
  329. package/dist/requests/requestLedger.js +9 -0
  330. package/dist/requests/requestLedger.js.map +1 -1
  331. package/dist/requests/topicRequestSettle.d.ts +30 -0
  332. package/dist/requests/topicRequestSettle.d.ts.map +1 -0
  333. package/dist/requests/topicRequestSettle.js +23 -0
  334. package/dist/requests/topicRequestSettle.js.map +1 -0
  335. package/dist/requests/wakeUpEngine.d.ts +4 -0
  336. package/dist/requests/wakeUpEngine.d.ts.map +1 -1
  337. package/dist/requests/wakeUpEngine.js +5 -1
  338. package/dist/requests/wakeUpEngine.js.map +1 -1
  339. package/dist/scheduler/delivery.d.ts +2 -0
  340. package/dist/scheduler/delivery.d.ts.map +1 -1
  341. package/dist/scheduler/delivery.js +8 -4
  342. package/dist/scheduler/delivery.js.map +1 -1
  343. package/dist/scheduler/mcpSurface.d.ts +59 -10
  344. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  345. package/dist/scheduler/mcpSurface.js +276 -79
  346. package/dist/scheduler/mcpSurface.js.map +1 -1
  347. package/dist/scheduler/recurrence.d.ts +5 -0
  348. package/dist/scheduler/recurrence.d.ts.map +1 -1
  349. package/dist/scheduler/recurrence.js +12 -2
  350. package/dist/scheduler/recurrence.js.map +1 -1
  351. package/dist/scheduler/strictToolInput.d.ts +45 -0
  352. package/dist/scheduler/strictToolInput.d.ts.map +1 -0
  353. package/dist/scheduler/strictToolInput.js +155 -0
  354. package/dist/scheduler/strictToolInput.js.map +1 -0
  355. package/dist/scheduler/types.d.ts +5 -0
  356. package/dist/scheduler/types.d.ts.map +1 -1
  357. package/dist/scheduler/workerWatch.d.ts +23 -0
  358. package/dist/scheduler/workerWatch.d.ts.map +1 -0
  359. package/dist/scheduler/workerWatch.js +26 -0
  360. package/dist/scheduler/workerWatch.js.map +1 -0
  361. package/dist/selfUpdate/emittedSource.d.ts +11 -0
  362. package/dist/selfUpdate/emittedSource.d.ts.map +1 -0
  363. package/dist/selfUpdate/emittedSource.js +24 -0
  364. package/dist/selfUpdate/emittedSource.js.map +1 -0
  365. package/dist/selfUpdate/gitSource.d.ts +0 -6
  366. package/dist/selfUpdate/gitSource.d.ts.map +1 -1
  367. package/dist/selfUpdate/gitSource.js +2 -18
  368. package/dist/selfUpdate/gitSource.js.map +1 -1
  369. package/dist/selfUpdate/updatePending.d.ts +1 -1
  370. package/dist/sendErrorClassifier.d.ts +10 -0
  371. package/dist/sendErrorClassifier.d.ts.map +1 -1
  372. package/dist/sendErrorClassifier.js +22 -0
  373. package/dist/sendErrorClassifier.js.map +1 -1
  374. package/dist/state.d.ts +78 -7
  375. package/dist/state.d.ts.map +1 -1
  376. package/dist/state.js +125 -8
  377. package/dist/state.js.map +1 -1
  378. package/dist/stateFile.d.ts +9 -0
  379. package/dist/stateFile.d.ts.map +1 -0
  380. package/dist/stateFile.js +57 -0
  381. package/dist/stateFile.js.map +1 -0
  382. package/dist/stt/sttInstall.d.ts +7 -3
  383. package/dist/stt/sttInstall.d.ts.map +1 -1
  384. package/dist/stt/sttInstall.js +8 -4
  385. package/dist/stt/sttInstall.js.map +1 -1
  386. package/dist/stt/sttSettings.d.ts +2 -1
  387. package/dist/stt/sttSettings.d.ts.map +1 -1
  388. package/dist/stt/sttSettings.js +3 -2
  389. package/dist/stt/sttSettings.js.map +1 -1
  390. package/dist/stt/transcribeChain.js +2 -0
  391. package/dist/stt/transcribeChain.js.map +1 -1
  392. package/dist/testTimings.d.ts +13 -3
  393. package/dist/testTimings.d.ts.map +1 -1
  394. package/dist/testTimings.js +26 -2
  395. package/dist/testTimings.js.map +1 -1
  396. package/dist/todos/board.d.ts +83 -0
  397. package/dist/todos/board.d.ts.map +1 -0
  398. package/dist/todos/board.js +227 -0
  399. package/dist/todos/board.js.map +1 -0
  400. package/dist/todos/format.d.ts +33 -0
  401. package/dist/todos/format.d.ts.map +1 -0
  402. package/dist/todos/format.js +90 -0
  403. package/dist/todos/format.js.map +1 -0
  404. package/dist/todos/merge.d.ts +46 -0
  405. package/dist/todos/merge.d.ts.map +1 -0
  406. package/dist/todos/merge.js +137 -0
  407. package/dist/todos/merge.js.map +1 -0
  408. package/dist/todos/midTurn.d.ts +75 -0
  409. package/dist/todos/midTurn.d.ts.map +1 -0
  410. package/dist/todos/midTurn.js +214 -0
  411. package/dist/todos/midTurn.js.map +1 -0
  412. package/dist/todos/nag.d.ts +85 -0
  413. package/dist/todos/nag.d.ts.map +1 -0
  414. package/dist/todos/nag.js +103 -0
  415. package/dist/todos/nag.js.map +1 -0
  416. package/dist/todos/order.d.ts +25 -0
  417. package/dist/todos/order.d.ts.map +1 -0
  418. package/dist/todos/order.js +61 -0
  419. package/dist/todos/order.js.map +1 -0
  420. package/dist/todos/projects.d.ts +102 -0
  421. package/dist/todos/projects.d.ts.map +1 -0
  422. package/dist/todos/projects.js +342 -0
  423. package/dist/todos/projects.js.map +1 -0
  424. package/dist/todos/registry.d.ts +64 -0
  425. package/dist/todos/registry.d.ts.map +1 -0
  426. package/dist/todos/registry.js +116 -0
  427. package/dist/todos/registry.js.map +1 -0
  428. package/dist/todos/reminderEngine.d.ts +78 -0
  429. package/dist/todos/reminderEngine.d.ts.map +1 -0
  430. package/dist/todos/reminderEngine.js +162 -0
  431. package/dist/todos/reminderEngine.js.map +1 -0
  432. package/dist/todos/store.d.ts +34 -0
  433. package/dist/todos/store.d.ts.map +1 -0
  434. package/dist/todos/store.js +208 -0
  435. package/dist/todos/store.js.map +1 -0
  436. package/dist/todos/tools.d.ts +26 -0
  437. package/dist/todos/tools.d.ts.map +1 -0
  438. package/dist/todos/tools.js +25 -0
  439. package/dist/todos/tools.js.map +1 -0
  440. package/dist/todos/types.d.ts +85 -0
  441. package/dist/todos/types.d.ts.map +1 -0
  442. package/dist/todos/types.js +30 -0
  443. package/dist/todos/types.js.map +1 -0
  444. package/dist/trackers/taskAgentLimit.d.ts +58 -0
  445. package/dist/trackers/taskAgentLimit.d.ts.map +1 -0
  446. package/dist/trackers/taskAgentLimit.js +62 -0
  447. package/dist/trackers/taskAgentLimit.js.map +1 -0
  448. package/dist/trackers/taskAgentSlots.d.ts +109 -0
  449. package/dist/trackers/taskAgentSlots.d.ts.map +1 -0
  450. package/dist/trackers/taskAgentSlots.js +227 -0
  451. package/dist/trackers/taskAgentSlots.js.map +1 -0
  452. package/dist/trackers/types.d.ts +14 -0
  453. package/dist/trackers/types.d.ts.map +1 -0
  454. package/dist/trackers/types.js +3 -0
  455. package/dist/trackers/types.js.map +1 -0
  456. package/dist/types.d.ts +80 -4
  457. package/dist/types.d.ts.map +1 -1
  458. package/dist/utils/adoptReplayGate.d.ts +16 -0
  459. package/dist/utils/adoptReplayGate.d.ts.map +1 -0
  460. package/dist/utils/adoptReplayGate.js +35 -0
  461. package/dist/utils/adoptReplayGate.js.map +1 -0
  462. package/dist/utils/agentPlugin.d.ts +113 -0
  463. package/dist/utils/agentPlugin.d.ts.map +1 -0
  464. package/dist/utils/agentPlugin.js +192 -0
  465. package/dist/utils/agentPlugin.js.map +1 -0
  466. package/dist/utils/autoContinueOnLimit.d.ts +7 -4
  467. package/dist/utils/autoContinueOnLimit.d.ts.map +1 -1
  468. package/dist/utils/autoContinueOnLimit.js +8 -5
  469. package/dist/utils/autoContinueOnLimit.js.map +1 -1
  470. package/dist/utils/botSkills.d.ts +62 -0
  471. package/dist/utils/botSkills.d.ts.map +1 -0
  472. package/dist/utils/botSkills.js +53 -0
  473. package/dist/utils/botSkills.js.map +1 -0
  474. package/dist/utils/botSkillsSetting.d.ts +7 -0
  475. package/dist/utils/botSkillsSetting.d.ts.map +1 -0
  476. package/dist/utils/botSkillsSetting.js +9 -0
  477. package/dist/utils/botSkillsSetting.js.map +1 -0
  478. package/dist/utils/claudeCodeVersion.d.ts +7 -0
  479. package/dist/utils/claudeCodeVersion.d.ts.map +1 -1
  480. package/dist/utils/claudeCodeVersion.js +14 -1
  481. package/dist/utils/claudeCodeVersion.js.map +1 -1
  482. package/dist/utils/claudeCompactHook.d.ts +33 -15
  483. package/dist/utils/claudeCompactHook.d.ts.map +1 -1
  484. package/dist/utils/claudeCompactHook.js +36 -17
  485. package/dist/utils/claudeCompactHook.js.map +1 -1
  486. package/dist/utils/claudeCompactSummary.d.ts +15 -0
  487. package/dist/utils/claudeCompactSummary.d.ts.map +1 -0
  488. package/dist/utils/claudeCompactSummary.js +96 -0
  489. package/dist/utils/claudeCompactSummary.js.map +1 -0
  490. package/dist/utils/claudeLimitSwitch.d.ts +11 -9
  491. package/dist/utils/claudeLimitSwitch.d.ts.map +1 -1
  492. package/dist/utils/claudeLimitSwitch.js +18 -16
  493. package/dist/utils/claudeLimitSwitch.js.map +1 -1
  494. package/dist/utils/claudeProfiles.d.ts +5 -0
  495. package/dist/utils/claudeProfiles.d.ts.map +1 -1
  496. package/dist/utils/claudeProfiles.js +14 -0
  497. package/dist/utils/claudeProfiles.js.map +1 -1
  498. package/dist/utils/claudeSessionTitle.d.ts +2 -1
  499. package/dist/utils/claudeSessionTitle.d.ts.map +1 -1
  500. package/dist/utils/claudeSessionTitle.js +14 -14
  501. package/dist/utils/claudeSessionTitle.js.map +1 -1
  502. package/dist/utils/claudeUsage.d.ts +95 -15
  503. package/dist/utils/claudeUsage.d.ts.map +1 -1
  504. package/dist/utils/claudeUsage.js +241 -41
  505. package/dist/utils/claudeUsage.js.map +1 -1
  506. package/dist/utils/claudeUsageRefresher.d.ts +10 -0
  507. package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
  508. package/dist/utils/claudeUsageRefresher.js +11 -0
  509. package/dist/utils/claudeUsageRefresher.js.map +1 -1
  510. package/dist/utils/claudeUserEntry.d.ts +50 -0
  511. package/dist/utils/claudeUserEntry.d.ts.map +1 -0
  512. package/dist/utils/claudeUserEntry.js +120 -0
  513. package/dist/utils/claudeUserEntry.js.map +1 -0
  514. package/dist/utils/clearThreadOutputQueues.d.ts +4 -3
  515. package/dist/utils/clearThreadOutputQueues.d.ts.map +1 -1
  516. package/dist/utils/clearThreadOutputQueues.js +1 -1
  517. package/dist/utils/clearThreadOutputQueues.js.map +1 -1
  518. package/dist/utils/compactOnIdle.d.ts +33 -13
  519. package/dist/utils/compactOnIdle.d.ts.map +1 -1
  520. package/dist/utils/compactOnIdle.js +35 -15
  521. package/dist/utils/compactOnIdle.js.map +1 -1
  522. package/dist/utils/fallbackBridge.d.ts +5 -0
  523. package/dist/utils/fallbackBridge.d.ts.map +1 -1
  524. package/dist/utils/fallbackBridge.js +19 -3
  525. package/dist/utils/fallbackBridge.js.map +1 -1
  526. package/dist/utils/fallbackChain.d.ts +9 -3
  527. package/dist/utils/fallbackChain.d.ts.map +1 -1
  528. package/dist/utils/fallbackChain.js +21 -3
  529. package/dist/utils/fallbackChain.js.map +1 -1
  530. package/dist/utils/fileSendPlan.d.ts +6 -0
  531. package/dist/utils/fileSendPlan.d.ts.map +1 -1
  532. package/dist/utils/fileSendPlan.js +11 -0
  533. package/dist/utils/fileSendPlan.js.map +1 -1
  534. package/dist/utils/fileSendService.d.ts +7 -1
  535. package/dist/utils/fileSendService.d.ts.map +1 -1
  536. package/dist/utils/fileSendService.js +6 -2
  537. package/dist/utils/fileSendService.js.map +1 -1
  538. package/dist/utils/groupFinalizePlan.d.ts +8 -10
  539. package/dist/utils/groupFinalizePlan.d.ts.map +1 -1
  540. package/dist/utils/groupFinalizePlan.js +8 -12
  541. package/dist/utils/groupFinalizePlan.js.map +1 -1
  542. package/dist/utils/jsonStreamHost.d.ts +13 -0
  543. package/dist/utils/jsonStreamHost.d.ts.map +1 -1
  544. package/dist/utils/jsonStreamHost.js +13 -0
  545. package/dist/utils/jsonStreamHost.js.map +1 -1
  546. package/dist/utils/messageSendService.d.ts +5 -3
  547. package/dist/utils/messageSendService.d.ts.map +1 -1
  548. package/dist/utils/messageSendService.js +12 -5
  549. package/dist/utils/messageSendService.js.map +1 -1
  550. package/dist/utils/openCodeCompactPlugin.d.ts +39 -14
  551. package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
  552. package/dist/utils/openCodeCompactPlugin.js +106 -38
  553. package/dist/utils/openCodeCompactPlugin.js.map +1 -1
  554. package/dist/utils/promptDelivery.d.ts +29 -12
  555. package/dist/utils/promptDelivery.d.ts.map +1 -1
  556. package/dist/utils/promptDelivery.js +13 -5
  557. package/dist/utils/promptDelivery.js.map +1 -1
  558. package/dist/utils/sentKindsSummary.d.ts +10 -0
  559. package/dist/utils/sentKindsSummary.d.ts.map +1 -0
  560. package/dist/utils/sentKindsSummary.js +18 -0
  561. package/dist/utils/sentKindsSummary.js.map +1 -0
  562. package/dist/utils/telegramError.d.ts +6 -0
  563. package/dist/utils/telegramError.d.ts.map +1 -1
  564. package/dist/utils/telegramError.js +12 -0
  565. package/dist/utils/telegramError.js.map +1 -1
  566. package/dist/utils/topicView.d.ts +1 -1
  567. package/dist/utils/topicView.js +1 -1
  568. package/dist/utils/transcribeAudio.d.ts +10 -0
  569. package/dist/utils/transcribeAudio.d.ts.map +1 -1
  570. package/dist/utils/transcribeAudio.js +22 -3
  571. package/dist/utils/transcribeAudio.js.map +1 -1
  572. package/dist/utils/transcriptErrorTime.d.ts +8 -0
  573. package/dist/utils/transcriptErrorTime.d.ts.map +1 -0
  574. package/dist/utils/transcriptErrorTime.js +56 -0
  575. package/dist/utils/transcriptErrorTime.js.map +1 -0
  576. package/dist/utils/wedgeRecovery.d.ts +2 -0
  577. package/dist/utils/wedgeRecovery.d.ts.map +1 -1
  578. package/dist/utils/wedgeRecovery.js +1 -1
  579. package/dist/utils/wedgeRecovery.js.map +1 -1
  580. package/package.json +11 -3
  581. package/remoteRun/runner.sh +1242 -0
  582. package/stt/gigaam_sidecar.py +555 -50
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.boardReadMaxChars = exports.boardMaxChars = exports.boardTitleMaxLength = exports.boardMaxDonePerPeer = exports.boardMaxQueuedPerPeer = exports.boardMaxInWorkPerPeer = void 0;
4
+ exports.formatTodoAge = formatTodoAge;
5
+ exports.formatTodoBoardPeerBlock = formatTodoBoardPeerBlock;
6
+ exports.formatTodoBoardBlocks = formatTodoBoardBlocks;
7
+ exports.createTodoBoard = createTodoBoard;
8
+ const sessionKey_1 = require("../sessionKey");
9
+ const localClock_1 = require("../utils/localClock");
10
+ const format_1 = require("./format");
11
+ /**
12
+ * @description The project board (D17–D21): what the agents of one project see of each other's lists. Every turn
13
+ * start the bot makes carries the WHOLE board (and the agent's own list) on a fresh context, else only the peers whose
14
+ * list changed since this agent last saw them — and nothing when none did; every `todo_*` result carries the same
15
+ * delta. What each agent has seen is stored with ITS list (`boardSeen`), so sleep, restarts and hot reloads keep it;
16
+ * a fresh context forgets it. A peer's change never starts a turn by itself (D21).
17
+ */
18
+ /** D18 trimming: per peer at most this many in-work items, queued items and done items; titles cut; the block capped. */
19
+ exports.boardMaxInWorkPerPeer = 5;
20
+ exports.boardMaxQueuedPerPeer = 5;
21
+ exports.boardMaxDonePerPeer = 5;
22
+ exports.boardTitleMaxLength = 120;
23
+ exports.boardMaxChars = 3000;
24
+ /** `todo_read` with the project scope asks for the board on purpose: it may be longer. */
25
+ exports.boardReadMaxChars = 10_000;
26
+ /** A peer's list older than this says how old it is. */
27
+ const listAgeShownAfterMs = 60 * 60 * 1000;
28
+ const msPerMinute = 60 * 1000;
29
+ const minutesPerHour = 60;
30
+ const hoursPerDay = 24;
31
+ /** @description `3 min ago`, `2 h ago`, `4 d ago`; under a minute: `just now`. */
32
+ function formatTodoAge(ageMs) {
33
+ const minutes = Math.floor(ageMs / msPerMinute);
34
+ if (minutes < 1)
35
+ return 'just now';
36
+ if (minutes < minutesPerHour)
37
+ return `${minutes} min ago`;
38
+ const hours = Math.floor(minutes / minutesPerHour);
39
+ return hours < hoursPerDay ? `${hours} h ago` : `${Math.floor(hours / hoursPerDay)} d ago`;
40
+ }
41
+ /** @description What a peer's line says about its session and how old its list is. */
42
+ function formatPeerActivity(file, activity, nowMs) {
43
+ const lastTurnEndAt = file.lastTurnEndAt;
44
+ const sessionText = activity === 'working'
45
+ ? 'working now'
46
+ : activity === 'idle'
47
+ ? `active ${lastTurnEndAt === undefined ? 'recently' : formatTodoAge(nowMs - lastTurnEndAt)}`
48
+ : `asleep${lastTurnEndAt === undefined ? '' : ` since ${(0, localClock_1.formatLocalClock)(lastTurnEndAt)}`}`;
49
+ const isListOld = file.lastUpdateAt !== undefined && nowMs - file.lastUpdateAt > listAgeShownAfterMs;
50
+ return isListOld ? `${sessionText}, list ${formatTodoAge(nowMs - (file.lastUpdateAt ?? nowMs)).replace(' ago', '')} old` : sessionText;
51
+ }
52
+ /** @description One peer's block (D17, D18 per-peer caps). */
53
+ function formatTodoBoardPeerBlock(label, file, activity, nowMs) {
54
+ const view = (0, format_1.getTodoListView)(file.items, nowMs);
55
+ const title = (text) => (0, format_1.getTrimmedTodoTitle)(text, exports.boardTitleMaxLength);
56
+ const lines = [`${label} — ${formatPeerActivity(file, activity, nowMs)}`];
57
+ for (const item of view.inWork.slice(0, exports.boardMaxInWorkPerPeer)) {
58
+ lines.push(` ▶ ${title(item.title)}${item.startedAt === undefined ? '' : ` — since ${(0, localClock_1.formatLocalClock)(item.startedAt)}`}`);
59
+ }
60
+ if (view.inWork.length > exports.boardMaxInWorkPerPeer)
61
+ lines.push(` ▶ (+${view.inWork.length - exports.boardMaxInWorkPerPeer} more in work)`);
62
+ if (view.queue.length > 0) {
63
+ const shown = view.queue.slice(0, exports.boardMaxQueuedPerPeer).map((item, index) => `${index + 1}. ${title(item.title)}`).join(' · ');
64
+ const more = view.queue.length > exports.boardMaxQueuedPerPeer ? ` (+${view.queue.length - exports.boardMaxQueuedPerPeer} more)` : '';
65
+ lines.push(` ▷ queue: ${shown}${more}`);
66
+ }
67
+ let doneLeft = exports.boardMaxDonePerPeer;
68
+ for (const day of view.doneDays) {
69
+ if (doneLeft === 0)
70
+ break;
71
+ const shown = day.items.slice(0, doneLeft);
72
+ doneLeft -= shown.length;
73
+ lines.push(` ✓ ${day.date}: ${shown.map((item) => `${title(item.title)} (${(0, localClock_1.formatLocalClock)(item.closedAt ?? item.updatedAt)})`).join(' · ')}`);
74
+ }
75
+ if ((0, format_1.checkIsTodoListViewEmpty)(view))
76
+ lines.push(' nothing in work, nothing queued');
77
+ return lines.join('\n');
78
+ }
79
+ /** @description Peer blocks under `header`, the most recently active first, within `maxChars` (D18). */
80
+ function formatTodoBoardBlocks(header, blocks, maxChars) {
81
+ const ordered = [...blocks].sort((left, right) => right.lastActivityAt - left.lastActivityAt);
82
+ const shown = [];
83
+ let length = header.length;
84
+ for (const [index, block] of ordered.entries()) {
85
+ const leftAfter = ordered.length - index - 1;
86
+ const overflowLine = `… ${leftAfter} more topics: todo_read`;
87
+ // Room for this block, and for the overflow line if more come after it.
88
+ if (length + block.text.length + 1 + (leftAfter > 0 ? overflowLine.length + 1 : 0) > maxChars) {
89
+ shown.push(`… ${ordered.length - index} more topics: todo_read`);
90
+ break;
91
+ }
92
+ shown.push(block.text);
93
+ length += block.text.length + 1;
94
+ }
95
+ return [header, ...shown].join('\n');
96
+ }
97
+ function createTodoBoard(deps) {
98
+ const { store, getProjectOf, peekProjectOf, getPeerLabel, getSessionActivity, getNowMs } = deps;
99
+ /** What `project` shows `key`: its peers with a list to show (a peer that never published is left out, not listed empty), and their revisions now. */
100
+ function locatePeers(key, project) {
101
+ const ownKey = (0, sessionKey_1.keyToString)(key);
102
+ const peers = project.memberKeys.flatMap((conversationKey) => {
103
+ if (conversationKey === ownKey)
104
+ return [];
105
+ const peerKey = (0, sessionKey_1.tryKeyFromString)(conversationKey);
106
+ if (!peerKey)
107
+ return [];
108
+ const file = store.getTopic(peerKey);
109
+ return file.lastUpdateAt === undefined ? [] : [{ conversationKey, file }];
110
+ });
111
+ return { projectName: project.name, peers };
112
+ }
113
+ /** The peers of `key`'s project, waiting for git where a read is due; `null` = no project. */
114
+ async function getPeers(key) {
115
+ const project = await getProjectOf(key);
116
+ return project === null ? null : locatePeers(key, project);
117
+ }
118
+ /** The peers as known now, never waiting; `null` = no project, `undefined` = not known yet. */
119
+ function peekPeers(key) {
120
+ const project = peekProjectOf(key);
121
+ return project === null || project === undefined ? project : locatePeers(key, project);
122
+ }
123
+ function renderBlocks(peers, nowMs) {
124
+ return peers.map(({ conversationKey, file }) => ({
125
+ text: formatTodoBoardPeerBlock(getPeerLabel(conversationKey), file, getSessionActivity(conversationKey), nowMs),
126
+ lastActivityAt: Math.max(file.lastTurnEndAt ?? 0, file.changedAt ?? 0),
127
+ }));
128
+ }
129
+ function formatFullBoard(projectName, peers, nowMs, maxChars) {
130
+ const header = `[Project board · ${projectName} · ${peers.length} other ${peers.length === 1 ? 'topic' : 'topics'}]`;
131
+ return peers.length === 0 ? `${header}\nNo other topic of the project has published a list yet.` : formatTodoBoardBlocks(header, renderBlocks(peers, nowMs), maxChars);
132
+ }
133
+ /** Remember what `key`'s agent was just shown. */
134
+ function markSeen(key, peers, nowMs) {
135
+ const revisions = Object.fromEntries(peers.map(({ conversationKey, file }) => [conversationKey, file.revision]));
136
+ store.saveTopic(key, { ...store.getTopic(key), boardSeen: { revisions, at: nowMs } });
137
+ }
138
+ /** The peers whose list changed since `key`'s agent last saw them. */
139
+ function getChangedPeers(key, peers) {
140
+ const seen = store.getTopic(key).boardSeen?.revisions ?? {};
141
+ return peers.filter(({ conversationKey, file }) => file.revision > (seen[conversationKey] ?? 0));
142
+ }
143
+ return {
144
+ takePromptBoard(key) {
145
+ // A prompt never waits for git: while the grouping is unknown it carries no board, and nothing counts as seen.
146
+ const located = peekPeers(key);
147
+ if (located === null)
148
+ return null;
149
+ const nowMs = getNowMs();
150
+ const own = store.getTopic(key);
151
+ const ownList = own.boardSeen === undefined && !(0, format_1.checkIsTodoListViewEmpty)((0, format_1.getTodoListView)(own.items, nowMs)) ? (0, format_1.formatOwnTodoList)(own.items, nowMs) : null;
152
+ // A fresh context still gets its own list: that needs no grouping.
153
+ if (located === undefined)
154
+ return ownList;
155
+ if (own.boardSeen === undefined) {
156
+ const board = located.peers.length === 0 ? null : formatFullBoard(located.projectName, located.peers, nowMs, exports.boardMaxChars);
157
+ markSeen(key, located.peers, nowMs);
158
+ const parts = [board, ownList].filter((part) => part !== null);
159
+ return parts.length === 0 ? null : parts.join('\n\n');
160
+ }
161
+ const changed = getChangedPeers(key, located.peers);
162
+ if (changed.length === 0)
163
+ return null;
164
+ const header = `[Project board — changes since ${(0, localClock_1.formatLocalClock)(own.boardSeen.at)}]`;
165
+ const text = formatTodoBoardBlocks(header, renderBlocks(changed, nowMs), exports.boardMaxChars);
166
+ markSeen(key, located.peers, nowMs);
167
+ return text;
168
+ },
169
+ async takeToolBoard(key) {
170
+ const located = await getPeers(key);
171
+ if (!located)
172
+ return 'This topic is in no project (no folder bound).';
173
+ const nowMs = getNowMs();
174
+ const seen = store.getTopic(key).boardSeen;
175
+ if (seen === undefined) {
176
+ const text = formatFullBoard(located.projectName, located.peers, nowMs, exports.boardMaxChars);
177
+ markSeen(key, located.peers, nowMs);
178
+ return text;
179
+ }
180
+ const changed = getChangedPeers(key, located.peers);
181
+ const text = changed.length === 0
182
+ ? `No changes in the project's other topics since ${(0, localClock_1.formatLocalClock)(seen.at)}.`
183
+ : formatTodoBoardBlocks(`[Project board — changes since ${(0, localClock_1.formatLocalClock)(seen.at)}]`, renderBlocks(changed, nowMs), exports.boardMaxChars);
184
+ markSeen(key, located.peers, nowMs);
185
+ return text;
186
+ },
187
+ async takeProjectBoard(key) {
188
+ const located = await getPeers(key);
189
+ if (!located)
190
+ return 'This topic is in no project (no folder bound).';
191
+ const nowMs = getNowMs();
192
+ const text = formatFullBoard(located.projectName, located.peers, nowMs, exports.boardReadMaxChars);
193
+ markSeen(key, located.peers, nowMs);
194
+ return text;
195
+ },
196
+ peekChanges(key) {
197
+ const seen = store.getTopic(key).boardSeen;
198
+ if (seen === undefined)
199
+ return null;
200
+ const located = peekPeers(key);
201
+ if (!located)
202
+ return null;
203
+ const changed = getChangedPeers(key, located.peers);
204
+ if (changed.length === 0)
205
+ return null;
206
+ return {
207
+ text: formatTodoBoardBlocks(`[Project board — changes since ${(0, localClock_1.formatLocalClock)(seen.at)}]`, renderBlocks(changed, getNowMs()), exports.boardMaxChars),
208
+ revisions: Object.fromEntries(changed.map(({ conversationKey, file }) => [conversationKey, file.revision])),
209
+ };
210
+ },
211
+ markSeenRevisions(key, revisions) {
212
+ const file = store.getTopic(key);
213
+ if (file.boardSeen === undefined)
214
+ return;
215
+ store.saveTopic(key, { ...file, boardSeen: { revisions: { ...file.boardSeen.revisions, ...revisions }, at: getNowMs() } });
216
+ },
217
+ noteFreshContext(key) {
218
+ const file = store.getTopic(key);
219
+ if (file.boardSeen === undefined)
220
+ return;
221
+ const withoutSeen = { ...file };
222
+ delete withoutSeen.boardSeen;
223
+ store.saveTopic(key, withoutSeen);
224
+ },
225
+ };
226
+ }
227
+ //# sourceMappingURL=board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/todos/board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { TodoItem } from './types';
2
+ /**
3
+ * @description What a list shows and how the agent reads it. The view model ({@link getTodoListView}) is the one
4
+ * place that decides which items a list shows; the agent's text here and the Telegram `/todo` view render it.
5
+ * Agent-facing text is English on every surface.
6
+ */
7
+ /** How many local days of done items a list shows: today and yesterday (D4). */
8
+ export declare const todoRecentDoneDays = 2;
9
+ /** @name TodoDoneDay @description The done items of one local day, the most recently closed first. */
10
+ export interface TodoDoneDay {
11
+ /** `YYYY-MM-DD`, local. */
12
+ date: string;
13
+ items: TodoItem[];
14
+ }
15
+ /** @name TodoListView @description What a list shows: in work, the queue in order, the recent done by day. */
16
+ export interface TodoListView {
17
+ inWork: TodoItem[];
18
+ queue: TodoItem[];
19
+ doneDays: TodoDoneDay[];
20
+ }
21
+ /** @description The local calendar date (`YYYY-MM-DD`) of an instant. */
22
+ export declare function getLocalDateOf(epochMs: number): string;
23
+ /** @description The view of `items` at `nowMs`, with the done items of the last `doneDayCount` local days. */
24
+ export declare function getTodoListView(items: readonly TodoItem[], nowMs: number, doneDayCount?: number): TodoListView;
25
+ /** @description Whether the view shows nothing at all. */
26
+ export declare function checkIsTodoListViewEmpty(view: TodoListView): boolean;
27
+ /** @description `title`, cut to `maxLength` characters with an ellipsis. */
28
+ export declare function getTrimmedTodoTitle(title: string, maxLength: number): string;
29
+ /** @description The agent's own list as the `todo_*` results show it — with the ids it patches by. */
30
+ export declare function formatOwnTodoList(items: readonly TodoItem[], nowMs: number): string;
31
+ /** @description Older closed items (done and dropped) for `todo_read`'s history, most recent first. */
32
+ export declare function formatTodoHistory(items: readonly TodoItem[]): string;
33
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/todos/format.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;GAIG;AAEH,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,sGAAsG;AACtG,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,8GAA8G;AAC9G,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,8GAA8G;AAC9G,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,MAA2B,GAAG,YAAY,CAYlI;AAED,0DAA0D;AAC1D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG5E;AAOD,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBnF;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAQpE"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.todoRecentDoneDays = void 0;
4
+ exports.getLocalDateOf = getLocalDateOf;
5
+ exports.getTodoListView = getTodoListView;
6
+ exports.checkIsTodoListViewEmpty = checkIsTodoListViewEmpty;
7
+ exports.getTrimmedTodoTitle = getTrimmedTodoTitle;
8
+ exports.formatOwnTodoList = formatOwnTodoList;
9
+ exports.formatTodoHistory = formatTodoHistory;
10
+ const localClock_1 = require("../utils/localClock");
11
+ const reminderWizard_1 = require("../utils/reminderWizard");
12
+ const order_1 = require("./order");
13
+ /**
14
+ * @description What a list shows and how the agent reads it. The view model ({@link getTodoListView}) is the one
15
+ * place that decides which items a list shows; the agent's text here and the Telegram `/todo` view render it.
16
+ * Agent-facing text is English on every surface.
17
+ */
18
+ /** How many local days of done items a list shows: today and yesterday (D4). */
19
+ exports.todoRecentDoneDays = 2;
20
+ /** @description The local calendar date (`YYYY-MM-DD`) of an instant. */
21
+ function getLocalDateOf(epochMs) {
22
+ return (0, reminderWizard_1.formatReminderDateIso)(new Date(epochMs));
23
+ }
24
+ /** @description The view of `items` at `nowMs`, with the done items of the last `doneDayCount` local days. */
25
+ function getTodoListView(items, nowMs, doneDayCount = exports.todoRecentDoneDays) {
26
+ const firstShownDate = (0, reminderWizard_1.formatReminderDateIso)((0, reminderWizard_1.getLocalDateAtDayOffset)(nowMs, 1 - doneDayCount));
27
+ const doneDays = [];
28
+ for (const item of (0, order_1.getClosedTodoItems)(items)) {
29
+ if (item.status !== 'done' || item.closedAt === undefined)
30
+ continue;
31
+ const date = getLocalDateOf(item.closedAt);
32
+ if (date < firstShownDate)
33
+ continue;
34
+ const day = doneDays.find((candidate) => candidate.date === date);
35
+ if (day)
36
+ day.items.push(item);
37
+ else
38
+ doneDays.push({ date, items: [item] });
39
+ }
40
+ return { inWork: (0, order_1.getInWorkTodoItems)(items), queue: (0, order_1.getQueuedTodoItems)(items), doneDays };
41
+ }
42
+ /** @description Whether the view shows nothing at all. */
43
+ function checkIsTodoListViewEmpty(view) {
44
+ return view.inWork.length === 0 && view.queue.length === 0 && view.doneDays.length === 0;
45
+ }
46
+ /** @description `title`, cut to `maxLength` characters with an ellipsis. */
47
+ function getTrimmedTodoTitle(title, maxLength) {
48
+ const characters = [...title];
49
+ return characters.length <= maxLength ? title : `${characters.slice(0, maxLength - 1).join('')}…`;
50
+ }
51
+ /** @description The details after an item's title in the agent's own list: its ref and note. */
52
+ function formatOwnItemDetails(item) {
53
+ return `${item.ref === undefined ? '' : ` [${item.ref}]`}${item.note === undefined ? '' : ` · note: ${item.note}`}`;
54
+ }
55
+ /** @description The agent's own list as the `todo_*` results show it — with the ids it patches by. */
56
+ function formatOwnTodoList(items, nowMs) {
57
+ const view = getTodoListView(items, nowMs);
58
+ if (checkIsTodoListViewEmpty(view))
59
+ return 'Your published todo list is empty.';
60
+ const lines = ['Your published todo list:'];
61
+ if (view.inWork.length > 0) {
62
+ lines.push('▶ in work:');
63
+ for (const item of view.inWork) {
64
+ const since = item.startedAt === undefined ? '' : ` — since ${(0, localClock_1.formatLocalClock)(item.startedAt)}`;
65
+ lines.push(` ${item.id} ${item.title}${formatOwnItemDetails(item)}${since}`);
66
+ }
67
+ }
68
+ if (view.queue.length > 0) {
69
+ lines.push('▷ queue (take it top-down):');
70
+ view.queue.forEach((item, index) => lines.push(` ${index + 1}. ${item.id} ${item.title}${formatOwnItemDetails(item)}`));
71
+ }
72
+ for (const day of view.doneDays) {
73
+ lines.push(`✓ done ${day.date}:`);
74
+ for (const item of day.items)
75
+ lines.push(` ${item.id} ${item.title}${formatOwnItemDetails(item)} (${(0, localClock_1.formatLocalClock)(item.closedAt ?? item.updatedAt)})`);
76
+ }
77
+ return lines.join('\n');
78
+ }
79
+ /** @description Older closed items (done and dropped) for `todo_read`'s history, most recent first. */
80
+ function formatTodoHistory(items) {
81
+ if (items.length === 0)
82
+ return 'History: nothing closed yet.';
83
+ const lines = ['History (closed items, most recent first):'];
84
+ for (const item of items) {
85
+ const closedAt = item.closedAt ?? item.updatedAt;
86
+ lines.push(` ${getLocalDateOf(closedAt)} ${(0, localClock_1.formatLocalClock)(closedAt)} ${item.status === 'done' ? '✓' : '✗ dropped'} ${item.id} ${item.title}${formatOwnItemDetails(item)}`);
87
+ }
88
+ return lines.join('\n');
89
+ }
90
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/todos/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { TodoPosition, TodoStatus, TodoTopicFile } from './types';
2
+ /**
3
+ * @description `todo_update` as an UPSERT (D3): an item without an id is new (queued, at the bottom, unless it says
4
+ * otherwise); an item with an id patches only the fields it names; removal is the status `dropped`; `order` lists
5
+ * open items in the wanted queue order. Nothing disappears by omission, and a call with neither part only says the
6
+ * list is still accurate. All or nothing: a call with any error changes nothing.
7
+ */
8
+ /** @name TodoItemPatch @description One entry of `todo_update`'s `items`. */
9
+ export interface TodoItemPatch {
10
+ id?: string;
11
+ title?: string;
12
+ status?: TodoStatus;
13
+ /** An empty note removes it. */
14
+ note?: string;
15
+ /** An empty ref removes it. */
16
+ ref?: string;
17
+ position?: TodoPosition;
18
+ }
19
+ /** @name TodoUpdateArgs @description A whole `todo_update` call. */
20
+ export interface TodoUpdateArgs {
21
+ items?: readonly TodoItemPatch[];
22
+ order?: readonly string[];
23
+ }
24
+ /**
25
+ * @name TodoUpdateResult
26
+ * @description The updated file, or the reasons nothing was applied. `isChanged` = the content moved (a new
27
+ * revision); `createdIds` are the ids given to the new items, in call order.
28
+ */
29
+ export type TodoUpdateResult = {
30
+ ok: true;
31
+ file: TodoTopicFile;
32
+ isChanged: boolean;
33
+ createdIds: string[];
34
+ } | {
35
+ ok: false;
36
+ errors: string[];
37
+ };
38
+ /**
39
+ * @description An agent's text as ONE line: every run of whitespace and control characters becomes one space. A
40
+ * title, note or ref is pasted into other agents' prompts as a line of the board; a line break in it would break that
41
+ * layout and let one agent's text pass for a bot-made block (`[Request …]`, `[Project board …]`) in another's prompt.
42
+ */
43
+ export declare function getSingleLineTodoText(text: string): string;
44
+ /** @description Apply one `todo_update` call to `file` at `nowMs`. */
45
+ export declare function applyTodoUpdate(file: TodoTopicFile, args: TodoUpdateArgs, nowMs: number): TodoUpdateResult;
46
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/todos/merge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEjF;;;;;GAKG;AAEH,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC3E;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAKpC;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAkCD,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAyF1G"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSingleLineTodoText = getSingleLineTodoText;
4
+ exports.applyTodoUpdate = applyTodoUpdate;
5
+ const order_1 = require("./order");
6
+ /** Line breaks, tabs and the other control characters, in runs, with the spaces around them. */
7
+ const lineBreakingRunRe = /[\s\u0000-\u001f\u007f-\u009f\u2028\u2029]+/g;
8
+ /**
9
+ * @description An agent's text as ONE line: every run of whitespace and control characters becomes one space. A
10
+ * title, note or ref is pasted into other agents' prompts as a line of the board; a line break in it would break that
11
+ * layout and let one agent's text pass for a bot-made block (`[Request …]`, `[Project board …]`) in another's prompt.
12
+ */
13
+ function getSingleLineTodoText(text) {
14
+ return text.replace(lineBreakingRunRe, ' ').trim();
15
+ }
16
+ /** The prefix of every item id; the number after it counts per conversation. */
17
+ const todoItemIdPrefix = 't';
18
+ function buildTodoItemId(itemNumber) {
19
+ return `${todoItemIdPrefix}${itemNumber}`;
20
+ }
21
+ /** @description The item fields a status change sets: when it went in work, when it closed. */
22
+ function getStatusTimes(item, status, nowMs) {
23
+ if (status === item.status)
24
+ return { startedAt: item.startedAt, closedAt: item.closedAt };
25
+ const isClosing = status === 'done' || status === 'dropped';
26
+ return {
27
+ startedAt: status === 'inWork' ? nowMs : item.startedAt,
28
+ closedAt: isClosing ? nowMs : undefined,
29
+ };
30
+ }
31
+ /** @description `item` with the optional text field `name` set, or removed for an empty value. */
32
+ function getItemWithTextField(item, name, value) {
33
+ if (value === undefined)
34
+ return item;
35
+ const trimmed = getSingleLineTodoText(value);
36
+ if (trimmed.length > 0)
37
+ return { ...item, [name]: trimmed };
38
+ const withoutField = { ...item };
39
+ delete withoutField[name];
40
+ return withoutField;
41
+ }
42
+ /** @description Whether two items carry the same content (what a peer would see change). */
43
+ function checkIsSameTodoContent(left, right) {
44
+ return left.title === right.title && left.status === right.status && left.note === right.note && left.ref === right.ref;
45
+ }
46
+ /** @description Apply one `todo_update` call to `file` at `nowMs`. */
47
+ function applyTodoUpdate(file, args, nowMs) {
48
+ const errors = [];
49
+ let items = [...file.items];
50
+ let nextItemNumber = file.nextItemNumber;
51
+ const createdIds = [];
52
+ let isOrderChanged = false;
53
+ let isContentChanged = false;
54
+ (args.items ?? []).forEach((patch, index) => {
55
+ const label = `items[${index}]`;
56
+ if (patch.id === undefined) {
57
+ const title = getSingleLineTodoText(patch.title ?? '');
58
+ if (title.length === 0) {
59
+ errors.push(`${label}: a new item needs a title (an item without an id is a new one).`);
60
+ return;
61
+ }
62
+ const id = buildTodoItemId(nextItemNumber);
63
+ nextItemNumber += 1;
64
+ const status = patch.status ?? 'queued';
65
+ const created = {
66
+ id,
67
+ title,
68
+ status,
69
+ source: 'agent',
70
+ createdAt: nowMs,
71
+ updatedAt: nowMs,
72
+ ...(status === 'inWork' ? { startedAt: nowMs } : {}),
73
+ ...(status === 'done' || status === 'dropped' ? { closedAt: nowMs } : {}),
74
+ };
75
+ items.push(getItemWithTextField(getItemWithTextField(created, 'note', patch.note), 'ref', patch.ref));
76
+ if (patch.position === 'top')
77
+ items = (0, order_1.getTodoItemsWithMovedItem)(items, id, 'top');
78
+ createdIds.push(id);
79
+ return;
80
+ }
81
+ const current = items.find((item) => item.id === patch.id);
82
+ if (!current) {
83
+ errors.push(`${label}: there is no item "${patch.id}" in your list.`);
84
+ return;
85
+ }
86
+ if (patch.title !== undefined && getSingleLineTodoText(patch.title).length === 0) {
87
+ errors.push(`${label}: the title of "${patch.id}" cannot be empty.`);
88
+ return;
89
+ }
90
+ const status = patch.status ?? current.status;
91
+ const patched = getItemWithTextField(getItemWithTextField({
92
+ ...current,
93
+ ...(patch.title === undefined ? {} : { title: getSingleLineTodoText(patch.title) }),
94
+ status,
95
+ ...getStatusTimes(current, status, nowMs),
96
+ }, 'note', patch.note), 'ref', patch.ref);
97
+ const isItemChanged = !checkIsSameTodoContent(current, patched);
98
+ isContentChanged ||= isItemChanged;
99
+ const updated = isItemChanged ? { ...patched, updatedAt: nowMs } : patched;
100
+ items = items.map((item) => (item.id === current.id ? updated : item));
101
+ if (patch.position !== undefined && (0, order_1.checkIsOpenTodoItem)(updated)) {
102
+ const before = items.map((item) => item.id).join();
103
+ items = (0, order_1.getTodoItemsWithMovedItem)(items, current.id, patch.position);
104
+ isOrderChanged ||= before !== items.map((item) => item.id).join();
105
+ }
106
+ });
107
+ if (args.order !== undefined) {
108
+ const openIds = new Set(items.filter(order_1.checkIsOpenTodoItem).map((item) => item.id));
109
+ const foreignIds = args.order.filter((id) => !openIds.has(id));
110
+ const repeatedIds = args.order.filter((id, index) => args.order?.indexOf(id) !== index);
111
+ if (foreignIds.length > 0)
112
+ errors.push(`order: ${foreignIds.join(', ')} ${foreignIds.length === 1 ? 'is' : 'are'} not an open item of your list.`);
113
+ if (repeatedIds.length > 0)
114
+ errors.push(`order: ${[...new Set(repeatedIds)].join(', ')} listed more than once.`);
115
+ if (foreignIds.length === 0 && repeatedIds.length === 0) {
116
+ const before = items.map((item) => item.id).join();
117
+ items = (0, order_1.getTodoItemsInRequestedOrder)(items, args.order);
118
+ isOrderChanged ||= before !== items.map((item) => item.id).join();
119
+ }
120
+ }
121
+ if (errors.length > 0)
122
+ return { ok: false, errors };
123
+ const isChanged = createdIds.length > 0 || isOrderChanged || isContentChanged;
124
+ return {
125
+ ok: true,
126
+ isChanged,
127
+ createdIds,
128
+ file: {
129
+ ...file,
130
+ items,
131
+ nextItemNumber,
132
+ lastUpdateAt: nowMs,
133
+ ...(isChanged ? { revision: file.revision + 1, changedAt: nowMs } : {}),
134
+ },
135
+ };
136
+ }
137
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/todos/merge.ts"],"names":[],"mappings":"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"}