@promptbook/cli 0.114.0-3 → 0.114.0-5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/README.md +4 -12
  2. package/apps/agents-server/{USE_TIMEOUT_CHIP_QA.md → TIMEOUT_CHIP_QA.md} +1 -1
  3. package/apps/agents-server/src/app/agents/[agentName]/api/chat/resolveAgentChatRouteContext.ts +5 -12
  4. package/apps/agents-server/src/app/agents/[agentName]/api/voice/route.ts +4 -9
  5. package/apps/agents-server/src/app/api/scrape/route.ts +1 -1
  6. package/apps/agents-server/src/app/layout.tsx +25 -0
  7. package/apps/agents-server/src/app/system/user-wallet/UserWalletDraft.ts +2 -2
  8. package/apps/agents-server/src/components/AgentProfile/AgentCapabilityChips.tsx +1 -24
  9. package/apps/agents-server/src/components/Header/Header.tsx +8 -0
  10. package/apps/agents-server/src/components/Header/HeaderTypes.ts +5 -0
  11. package/apps/agents-server/src/components/Header/buildHeaderSystemMenuItems.ts +118 -30
  12. package/apps/agents-server/src/components/Header/resolveHeaderSystemActivities.ts +86 -0
  13. package/apps/agents-server/src/components/Homepage/AgentCard.tsx +0 -3
  14. package/apps/agents-server/src/components/LayoutWrapper/LayoutWrapper.tsx +8 -0
  15. package/apps/agents-server/src/components/NewAgentDialog/NewAgentWizardState.ts +0 -12
  16. package/apps/agents-server/src/components/NewAgentDialog/NewAgentWizardUseSetupStep.tsx +0 -58
  17. package/apps/agents-server/src/components/NewAgentDialog/newAgentWizardPresets.ts +0 -56
  18. package/apps/agents-server/src/components/WalletRecordDialog/useWalletRecordDialogState.ts +1 -1
  19. package/apps/agents-server/src/languages/ServerTranslationKeys.ts +0 -10
  20. package/apps/agents-server/src/languages/translations/czech.yaml +0 -10
  21. package/apps/agents-server/src/languages/translations/english.yaml +0 -10
  22. package/apps/agents-server/src/message-providers/email/smtp/SmtpMessageProvider.ts +1 -1
  23. package/apps/agents-server/src/tools/$provideOpenAiAgentKitExecutionToolsForServer.ts +0 -191
  24. package/apps/agents-server/src/tools/$provideOpenAiAssistantExecutionToolsForServer.ts +0 -3
  25. package/apps/agents-server/src/tools/run_browser.ts +1 -1
  26. package/apps/agents-server/src/tools/send_email.ts +3 -3
  27. package/apps/agents-server/src/utils/handleChatCompletion/createHandleChatCompletionPromptContext.ts +0 -1
  28. package/apps/agents-server/src/utils/handleChatCompletion/resolveHandleChatCompletionRuntime.ts +4 -12
  29. package/apps/agents-server/src/utils/manGoOnboarding/manGoOnboardingAgentBooks.ts +0 -1
  30. package/apps/agents-server/src/utils/messages/parseUseEmailSmtpCredential.ts +1 -1
  31. package/apps/agents-server/src/utils/resolveUseEmailSmtpCredential.ts +1 -1
  32. package/apps/agents-server/src/utils/useEmailSmtpWalletConstants.ts +5 -5
  33. package/apps/agents-server/src/utils/userChat/createRunUserChatJobExecutionContext.ts +5 -12
  34. package/apps/agents-server/src/utils/userWallet/UserWalletRecord.ts +1 -1
  35. package/apps/agents-server/src/utils/userWallet/resolveUseEmailSmtpCredentialFromWallet.ts +1 -1
  36. package/apps/agents-server/src/utils/vpsSelfUpdate/deleteVpsSelfUpdateInstalledVersion.ts +2 -1
  37. package/apps/agents-server/src/utils/vpsSelfUpdate/isVpsSelfUpdateJobRunning.ts +16 -0
  38. package/apps/agents-server/src/utils/vpsSelfUpdate/startVpsSelfUpdate.ts +2 -1
  39. package/apps/agents-server/src/utils/vpsSelfUpdate.ts +1 -0
  40. package/esm/index.es.js +2885 -6344
  41. package/esm/index.es.js.map +1 -1
  42. package/esm/scripts/run-codex-prompts/common/createCoderRunStepTracker.d.ts +48 -0
  43. package/esm/scripts/run-codex-prompts/prompts/buildPromptStatusDetails.d.ts +43 -0
  44. package/esm/scripts/run-codex-prompts/prompts/formatCoderRunSteps.d.ts +6 -3
  45. package/esm/scripts/run-codex-prompts/prompts/isPromptSectionUnfinished.d.ts +8 -0
  46. package/esm/scripts/run-codex-prompts/prompts/markPromptDone.d.ts +1 -1
  47. package/esm/scripts/run-codex-prompts/prompts/markPromptInProgress.d.ts +27 -0
  48. package/esm/scripts/run-codex-prompts/prompts/resolvePromptStatusLine.d.ts +19 -0
  49. package/esm/scripts/run-codex-prompts/prompts/writePromptStatusLine.d.ts +9 -0
  50. package/esm/scripts/run-codex-prompts/server/buildCoderServerPromptResponse.d.ts +1 -1
  51. package/esm/scripts/run-codex-prompts/server/coderServerHtml.d.ts +1 -1
  52. package/esm/scripts/run-codex-prompts/server/updatePromptSection.d.ts +1 -1
  53. package/esm/scripts/run-codex-prompts/testing/runPromptWithTestFeedback.d.ts +6 -0
  54. package/esm/scripts/verify-prompts/$orderPromptFiles.d.ts +9 -0
  55. package/esm/scripts/verify-prompts/VerifyPromptsOrder.d.ts +26 -0
  56. package/esm/scripts/verify-prompts/verify-prompts.d.ts +3 -2
  57. package/esm/src/book-2.0/agent-source/AgentBasicInformation.d.ts +3 -3
  58. package/esm/src/cli/cli-commands/coder/boilerplateCount.d.ts +52 -0
  59. package/esm/src/cli/cli-commands/coder/generate-boilerplates.d.ts +3 -2
  60. package/esm/src/cli/cli-commands/coder/verify.d.ts +1 -1
  61. package/esm/src/commitments/{COMPONENT/COMPONENT.d.ts → META_FULLNAME/META_FULLNAME.d.ts} +8 -5
  62. package/esm/src/commitments/META_ID/META_ID.d.ts +32 -0
  63. package/esm/src/commitments/index.d.ts +4 -12
  64. package/esm/src/llm-providers/agent/Agent.d.ts +1 -1
  65. package/esm/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.d.ts +1 -1
  66. package/esm/src/{commitments/USE_BROWSER → scrapers/_common/utils}/fetchUrlContent.d.ts +2 -3
  67. package/esm/src/version.d.ts +1 -1
  68. package/package.json +1 -1
  69. package/src/_packages/components.readme.md +1 -1
  70. package/src/book-2.0/agent-source/AgentBasicInformation.ts +3 -9
  71. package/src/book-2.0/agent-source/createAgentModelRequirementsWithCommitments/filterCommitmentsForAgentModelRequirements.ts +0 -23
  72. package/src/book-2.0/agent-source/createAgentModelRequirementsWithCommitments.ts +0 -2
  73. package/src/book-2.0/agent-source/parseAgentSource/applyMetaCommitment.ts +16 -31
  74. package/src/book-2.0/agent-source/parseAgentSource/createCapabilitiesFromCommitment.ts +0 -35
  75. package/src/book-2.0/book-language-documentation/bookLanguageDocumentationExamples.ts +0 -25
  76. package/src/book-2.0/book-language-documentation/createStandaloneBookLanguageMarkdown.ts +2 -10
  77. package/src/book-2.0/book-language-documentation/czechBookLanguageManualDictionary.ts +7 -32
  78. package/src/book-2.0/book-language-documentation/englishBookLanguageManualDictionary.ts +6 -31
  79. package/src/book-components/BookEditor/useBookEditorMonacoLanguage.ts +1 -1
  80. package/src/cli/cli-commands/coder/boilerplateCount.ts +139 -0
  81. package/src/cli/cli-commands/coder/generate-boilerplates.ts +52 -44
  82. package/src/cli/cli-commands/coder/getDefaultCoderPackageJsonScripts.ts +3 -1
  83. package/src/cli/cli-commands/coder/init.ts +2 -1
  84. package/src/cli/cli-commands/coder/verify.ts +29 -5
  85. package/src/commitments/ACTION/ACTION.ts +3 -3
  86. package/src/commitments/{META → META_DESCRIPTION}/META_DESCRIPTION.ts +1 -1
  87. package/src/commitments/META_FULLNAME/META_FULLNAME.ts +70 -0
  88. package/src/commitments/META_ID/META_ID.ts +78 -0
  89. package/src/commitments/_common/getAllCommitmentsToolFunctionsForNode.ts +1 -49
  90. package/src/commitments/index.ts +6 -24
  91. package/src/llm-providers/agent/Agent.ts +1 -1
  92. package/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.ts +2 -2
  93. package/src/other/templates/getTemplatesPipelineCollection.ts +735 -693
  94. package/src/{commitments/USE_BROWSER → scrapers/_common/utils}/fetchUrlContent.ts +8 -9
  95. package/src/version.ts +2 -2
  96. package/src/versions.txt +2 -0
  97. package/umd/index.umd.js +2888 -6347
  98. package/umd/index.umd.js.map +1 -1
  99. package/umd/scripts/run-codex-prompts/common/createCoderRunStepTracker.d.ts +48 -0
  100. package/umd/scripts/run-codex-prompts/prompts/buildPromptStatusDetails.d.ts +43 -0
  101. package/umd/scripts/run-codex-prompts/prompts/formatCoderRunSteps.d.ts +6 -3
  102. package/umd/scripts/run-codex-prompts/prompts/isPromptSectionUnfinished.d.ts +8 -0
  103. package/umd/scripts/run-codex-prompts/prompts/markPromptDone.d.ts +1 -1
  104. package/umd/scripts/run-codex-prompts/prompts/markPromptInProgress.d.ts +27 -0
  105. package/umd/scripts/run-codex-prompts/prompts/resolvePromptStatusLine.d.ts +19 -0
  106. package/umd/scripts/run-codex-prompts/prompts/writePromptStatusLine.d.ts +9 -0
  107. package/umd/scripts/run-codex-prompts/server/buildCoderServerPromptResponse.d.ts +1 -1
  108. package/umd/scripts/run-codex-prompts/server/coderServerHtml.d.ts +1 -1
  109. package/umd/scripts/run-codex-prompts/server/updatePromptSection.d.ts +1 -1
  110. package/umd/scripts/run-codex-prompts/testing/runPromptWithTestFeedback.d.ts +6 -0
  111. package/umd/scripts/verify-prompts/$orderPromptFiles.d.ts +9 -0
  112. package/umd/scripts/verify-prompts/VerifyPromptsOrder.d.ts +26 -0
  113. package/umd/scripts/verify-prompts/verify-prompts.d.ts +3 -2
  114. package/umd/src/book-2.0/agent-source/AgentBasicInformation.d.ts +3 -3
  115. package/umd/src/cli/cli-commands/coder/boilerplateCount.d.ts +52 -0
  116. package/umd/src/cli/cli-commands/coder/generate-boilerplates.d.ts +3 -2
  117. package/umd/src/cli/cli-commands/coder/verify.d.ts +1 -1
  118. package/umd/src/commitments/{COMPONENT/COMPONENT.d.ts → META_FULLNAME/META_FULLNAME.d.ts} +8 -5
  119. package/umd/src/commitments/META_ID/META_ID.d.ts +32 -0
  120. package/umd/src/commitments/index.d.ts +4 -12
  121. package/umd/src/llm-providers/agent/Agent.d.ts +1 -1
  122. package/umd/src/llm-providers/openai/OpenAiAgentKitExecutionToolsToolBuilder.d.ts +1 -1
  123. package/umd/src/{commitments/USE_BROWSER → scrapers/_common/utils}/fetchUrlContent.d.ts +2 -3
  124. package/umd/src/version.d.ts +1 -1
  125. package/apps/agents-server/src/tools/configureTimeoutToolRuntimeAdapterForServer.ts +0 -381
  126. package/apps/agents-server/src/utils/emails/extractUseEmailConfigurationFromAgentSource.ts +0 -42
  127. package/esm/scripts/run-codex-prompts/prompts/replacePromptTodoStatusLine.d.ts +0 -7
  128. package/esm/src/commitments/MEMORY/MEMORY.d.ts +0 -48
  129. package/esm/src/commitments/MEMORY/MemoryToolNames.d.ts +0 -11
  130. package/esm/src/commitments/MEMORY/MemoryToolRuntimeAdapter.d.ts +0 -149
  131. package/esm/src/commitments/MEMORY/createMemorySystemMessage.d.ts +0 -6
  132. package/esm/src/commitments/MEMORY/createMemoryToolFunctions.d.ts +0 -8
  133. package/esm/src/commitments/MEMORY/createMemoryTools.d.ts +0 -14
  134. package/esm/src/commitments/MEMORY/getMemoryCommitmentDocumentation.d.ts +0 -6
  135. package/esm/src/commitments/MEMORY/getMemoryToolRuntimeAdapterOrDisabledResult.d.ts +0 -17
  136. package/esm/src/commitments/MEMORY/getMemoryToolTitles.d.ts +0 -7
  137. package/esm/src/commitments/MEMORY/parseMemoryToolArgs.d.ts +0 -61
  138. package/esm/src/commitments/MEMORY/resolveMemoryRuntimeContext.d.ts +0 -8
  139. package/esm/src/commitments/MEMORY/setMemoryToolRuntimeAdapter.d.ts +0 -13
  140. package/esm/src/commitments/META/META.d.ts +0 -65
  141. package/esm/src/commitments/USE/aggregateUseCommitmentSystemMessages.d.ts +0 -32
  142. package/esm/src/commitments/USE_BROWSER/USE_BROWSER.d.ts +0 -58
  143. package/esm/src/commitments/USE_BROWSER/fetchUrlContentViaBrowser.d.ts +0 -13
  144. package/esm/src/commitments/USE_BROWSER/resolveRunBrowserToolForNode.d.ts +0 -10
  145. package/esm/src/commitments/USE_DEEPSEARCH/USE_DEEPSEARCH.d.ts +0 -47
  146. package/esm/src/commitments/USE_EMAIL/USE_EMAIL.d.ts +0 -38
  147. package/esm/src/commitments/USE_EMAIL/parseUseEmailCommitmentContent.d.ts +0 -21
  148. package/esm/src/commitments/USE_EMAIL/parseUseEmailCommitmentContent.test.d.ts +0 -1
  149. package/esm/src/commitments/USE_EMAIL/resolveSendEmailToolForNode.d.ts +0 -11
  150. package/esm/src/commitments/USE_EMAIL/sendEmailViaBrowser.d.ts +0 -13
  151. package/esm/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.d.ts +0 -46
  152. package/esm/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.test.d.ts +0 -1
  153. package/esm/src/commitments/USE_SPAWN/USE_SPAWN.d.ts +0 -38
  154. package/esm/src/commitments/USE_SPAWN/USE_SPAWN.test.d.ts +0 -1
  155. package/esm/src/commitments/USE_SPAWN/resolveSpawnAgentToolForNode.d.ts +0 -9
  156. package/esm/src/commitments/USE_SPAWN/spawnAgentViaBrowser.d.ts +0 -12
  157. package/esm/src/commitments/USE_TIME/USE_TIME.d.ts +0 -43
  158. package/esm/src/commitments/USE_TIME/USE_TIME.test.d.ts +0 -1
  159. package/esm/src/commitments/USE_TIMEOUT/TimeoutToolNames.d.ts +0 -11
  160. package/esm/src/commitments/USE_TIMEOUT/TimeoutToolRuntimeAdapter.d.ts +0 -212
  161. package/esm/src/commitments/USE_TIMEOUT/USE_TIMEOUT.d.ts +0 -38
  162. package/esm/src/commitments/USE_TIMEOUT/USE_TIMEOUT.test.d.ts +0 -1
  163. package/esm/src/commitments/USE_TIMEOUT/createTimeoutSystemMessage.d.ts +0 -6
  164. package/esm/src/commitments/USE_TIMEOUT/createTimeoutToolFunctions.d.ts +0 -8
  165. package/esm/src/commitments/USE_TIMEOUT/createTimeoutTools.d.ts +0 -7
  166. package/esm/src/commitments/USE_TIMEOUT/getTimeoutToolRuntimeAdapterOrDisabledResult.d.ts +0 -17
  167. package/esm/src/commitments/USE_TIMEOUT/parseTimeoutToolArgs.d.ts +0 -78
  168. package/esm/src/commitments/USE_TIMEOUT/resolveTimeoutRuntimeContext.d.ts +0 -8
  169. package/esm/src/commitments/USE_TIMEOUT/setTimeoutToolRuntimeAdapter.d.ts +0 -13
  170. package/esm/src/commitments/WALLET/WALLET.d.ts +0 -21
  171. package/esm/src/commitments/WALLET/WALLET.test.d.ts +0 -1
  172. package/esm/src/commitments/WALLET/WalletToolNames.d.ts +0 -12
  173. package/esm/src/commitments/WALLET/WalletToolRuntimeAdapter.d.ts +0 -163
  174. package/esm/src/commitments/WALLET/createWalletSystemMessage.d.ts +0 -6
  175. package/esm/src/commitments/WALLET/createWalletToolFunctions.d.ts +0 -8
  176. package/esm/src/commitments/WALLET/createWalletTools.d.ts +0 -7
  177. package/esm/src/commitments/WALLET/getWalletCommitmentDocumentation.d.ts +0 -6
  178. package/esm/src/commitments/WALLET/getWalletToolRuntimeAdapterOrDisabledResult.d.ts +0 -16
  179. package/esm/src/commitments/WALLET/getWalletToolTitles.d.ts +0 -7
  180. package/esm/src/commitments/WALLET/parseWalletToolArgs.d.ts +0 -51
  181. package/esm/src/commitments/WALLET/resolveWalletRuntimeContext.d.ts +0 -8
  182. package/esm/src/commitments/WALLET/setWalletToolRuntimeAdapter.d.ts +0 -13
  183. package/esm/src/commitments/_common/createSerpSearchToolFunction.d.ts +0 -12
  184. package/src/commitments/COMPONENT/COMPONENT.ts +0 -70
  185. package/src/commitments/MEMORY/MEMORY.ts +0 -94
  186. package/src/commitments/MEMORY/MemoryToolNames.ts +0 -13
  187. package/src/commitments/MEMORY/MemoryToolRuntimeAdapter.ts +0 -180
  188. package/src/commitments/MEMORY/createMemorySystemMessage.ts +0 -27
  189. package/src/commitments/MEMORY/createMemoryToolFunctions.ts +0 -134
  190. package/src/commitments/MEMORY/createMemoryTools.ts +0 -115
  191. package/src/commitments/MEMORY/getMemoryCommitmentDocumentation.ts +0 -47
  192. package/src/commitments/MEMORY/getMemoryToolRuntimeAdapterOrDisabledResult.ts +0 -104
  193. package/src/commitments/MEMORY/getMemoryToolTitles.ts +0 -16
  194. package/src/commitments/MEMORY/parseMemoryToolArgs.ts +0 -126
  195. package/src/commitments/MEMORY/resolveMemoryRuntimeContext.ts +0 -23
  196. package/src/commitments/MEMORY/setMemoryToolRuntimeAdapter.ts +0 -26
  197. package/src/commitments/META/META.ts +0 -168
  198. package/src/commitments/USE/TODO.txt +0 -1
  199. package/src/commitments/USE/aggregateUseCommitmentSystemMessages.ts +0 -219
  200. package/src/commitments/USE_BROWSER/TODO.txt +0 -1
  201. package/src/commitments/USE_BROWSER/USE_BROWSER.ts +0 -257
  202. package/src/commitments/USE_BROWSER/fetchUrlContentViaBrowser.ts +0 -45
  203. package/src/commitments/USE_BROWSER/resolveRunBrowserToolForNode.ts +0 -83
  204. package/src/commitments/USE_DEEPSEARCH/USE_DEEPSEARCH.ts +0 -146
  205. package/src/commitments/USE_EMAIL/USE_EMAIL.ts +0 -201
  206. package/src/commitments/USE_EMAIL/parseUseEmailCommitmentContent.ts +0 -75
  207. package/src/commitments/USE_EMAIL/resolveSendEmailToolForNode.ts +0 -44
  208. package/src/commitments/USE_EMAIL/sendEmailViaBrowser.ts +0 -47
  209. package/src/commitments/USE_SEARCH_ENGINE/TODO.txt +0 -1
  210. package/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.ts +0 -171
  211. package/src/commitments/USE_SPAWN/USE_SPAWN.ts +0 -150
  212. package/src/commitments/USE_SPAWN/resolveSpawnAgentToolForNode.ts +0 -42
  213. package/src/commitments/USE_SPAWN/spawnAgentViaBrowser.ts +0 -50
  214. package/src/commitments/USE_TIME/USE_TIME.ts +0 -177
  215. package/src/commitments/USE_TIMEOUT/TimeoutToolNames.ts +0 -13
  216. package/src/commitments/USE_TIMEOUT/TimeoutToolRuntimeAdapter.ts +0 -255
  217. package/src/commitments/USE_TIMEOUT/USE_TIMEOUT.ts +0 -117
  218. package/src/commitments/USE_TIMEOUT/createTimeoutSystemMessage.ts +0 -22
  219. package/src/commitments/USE_TIMEOUT/createTimeoutToolFunctions.ts +0 -361
  220. package/src/commitments/USE_TIMEOUT/createTimeoutTools.ts +0 -127
  221. package/src/commitments/USE_TIMEOUT/getTimeoutToolRuntimeAdapterOrDisabledResult.ts +0 -67
  222. package/src/commitments/USE_TIMEOUT/parseTimeoutToolArgs.ts +0 -460
  223. package/src/commitments/USE_TIMEOUT/resolveTimeoutRuntimeContext.ts +0 -36
  224. package/src/commitments/USE_TIMEOUT/setTimeoutToolRuntimeAdapter.ts +0 -26
  225. package/src/commitments/WALLET/WALLET.ts +0 -71
  226. package/src/commitments/WALLET/WalletToolNames.ts +0 -14
  227. package/src/commitments/WALLET/WalletToolRuntimeAdapter.ts +0 -180
  228. package/src/commitments/WALLET/createWalletSystemMessage.ts +0 -22
  229. package/src/commitments/WALLET/createWalletToolFunctions.ts +0 -145
  230. package/src/commitments/WALLET/createWalletTools.ts +0 -129
  231. package/src/commitments/WALLET/getWalletCommitmentDocumentation.ts +0 -14
  232. package/src/commitments/WALLET/getWalletToolRuntimeAdapterOrDisabledResult.ts +0 -64
  233. package/src/commitments/WALLET/getWalletToolTitles.ts +0 -17
  234. package/src/commitments/WALLET/parseWalletToolArgs.ts +0 -231
  235. package/src/commitments/WALLET/resolveWalletRuntimeContext.ts +0 -23
  236. package/src/commitments/WALLET/setWalletToolRuntimeAdapter.ts +0 -26
  237. package/src/commitments/_common/createSerpSearchToolFunction.ts +0 -46
  238. package/umd/scripts/run-codex-prompts/prompts/replacePromptTodoStatusLine.d.ts +0 -7
  239. package/umd/src/book-2.0/agent-source/createAgentModelRequirements.useCommitmentAggregation.test.d.ts +0 -1
  240. package/umd/src/commitments/MEMORY/MEMORY.d.ts +0 -48
  241. package/umd/src/commitments/MEMORY/MEMORY.test.d.ts +0 -1
  242. package/umd/src/commitments/MEMORY/MemoryToolNames.d.ts +0 -11
  243. package/umd/src/commitments/MEMORY/MemoryToolRuntimeAdapter.d.ts +0 -149
  244. package/umd/src/commitments/MEMORY/createMemorySystemMessage.d.ts +0 -6
  245. package/umd/src/commitments/MEMORY/createMemoryToolFunctions.d.ts +0 -8
  246. package/umd/src/commitments/MEMORY/createMemoryTools.d.ts +0 -14
  247. package/umd/src/commitments/MEMORY/getMemoryCommitmentDocumentation.d.ts +0 -6
  248. package/umd/src/commitments/MEMORY/getMemoryToolRuntimeAdapterOrDisabledResult.d.ts +0 -17
  249. package/umd/src/commitments/MEMORY/getMemoryToolTitles.d.ts +0 -7
  250. package/umd/src/commitments/MEMORY/parseMemoryToolArgs.d.ts +0 -61
  251. package/umd/src/commitments/MEMORY/resolveMemoryRuntimeContext.d.ts +0 -8
  252. package/umd/src/commitments/MEMORY/setMemoryToolRuntimeAdapter.d.ts +0 -13
  253. package/umd/src/commitments/META/META.d.ts +0 -65
  254. package/umd/src/commitments/USE/aggregateUseCommitmentSystemMessages.d.ts +0 -32
  255. package/umd/src/commitments/USE_BROWSER/USE_BROWSER.d.ts +0 -58
  256. package/umd/src/commitments/USE_BROWSER/USE_BROWSER.test.d.ts +0 -1
  257. package/umd/src/commitments/USE_BROWSER/fetchUrlContentViaBrowser.d.ts +0 -13
  258. package/umd/src/commitments/USE_BROWSER/resolveRunBrowserToolForNode.d.ts +0 -10
  259. package/umd/src/commitments/USE_BROWSER/resolveRunBrowserToolForNode.test.d.ts +0 -1
  260. package/umd/src/commitments/USE_DEEPSEARCH/USE_DEEPSEARCH.d.ts +0 -47
  261. package/umd/src/commitments/USE_DEEPSEARCH/USE_DEEPSEARCH.test.d.ts +0 -1
  262. package/umd/src/commitments/USE_EMAIL/USE_EMAIL.d.ts +0 -38
  263. package/umd/src/commitments/USE_EMAIL/USE_EMAIL.test.d.ts +0 -1
  264. package/umd/src/commitments/USE_EMAIL/parseUseEmailCommitmentContent.d.ts +0 -21
  265. package/umd/src/commitments/USE_EMAIL/parseUseEmailCommitmentContent.test.d.ts +0 -1
  266. package/umd/src/commitments/USE_EMAIL/resolveSendEmailToolForNode.d.ts +0 -11
  267. package/umd/src/commitments/USE_EMAIL/sendEmailViaBrowser.d.ts +0 -13
  268. package/umd/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.d.ts +0 -46
  269. package/umd/src/commitments/USE_SEARCH_ENGINE/USE_SEARCH_ENGINE.test.d.ts +0 -1
  270. package/umd/src/commitments/USE_SPAWN/USE_SPAWN.d.ts +0 -38
  271. package/umd/src/commitments/USE_SPAWN/USE_SPAWN.test.d.ts +0 -1
  272. package/umd/src/commitments/USE_SPAWN/resolveSpawnAgentToolForNode.d.ts +0 -9
  273. package/umd/src/commitments/USE_SPAWN/spawnAgentViaBrowser.d.ts +0 -12
  274. package/umd/src/commitments/USE_TIME/USE_TIME.d.ts +0 -43
  275. package/umd/src/commitments/USE_TIME/USE_TIME.test.d.ts +0 -1
  276. package/umd/src/commitments/USE_TIMEOUT/TimeoutToolNames.d.ts +0 -11
  277. package/umd/src/commitments/USE_TIMEOUT/TimeoutToolRuntimeAdapter.d.ts +0 -212
  278. package/umd/src/commitments/USE_TIMEOUT/USE_TIMEOUT.d.ts +0 -38
  279. package/umd/src/commitments/USE_TIMEOUT/USE_TIMEOUT.test.d.ts +0 -1
  280. package/umd/src/commitments/USE_TIMEOUT/createTimeoutSystemMessage.d.ts +0 -6
  281. package/umd/src/commitments/USE_TIMEOUT/createTimeoutToolFunctions.d.ts +0 -8
  282. package/umd/src/commitments/USE_TIMEOUT/createTimeoutTools.d.ts +0 -7
  283. package/umd/src/commitments/USE_TIMEOUT/getTimeoutToolRuntimeAdapterOrDisabledResult.d.ts +0 -17
  284. package/umd/src/commitments/USE_TIMEOUT/parseTimeoutToolArgs.d.ts +0 -78
  285. package/umd/src/commitments/USE_TIMEOUT/resolveTimeoutRuntimeContext.d.ts +0 -8
  286. package/umd/src/commitments/USE_TIMEOUT/setTimeoutToolRuntimeAdapter.d.ts +0 -13
  287. package/umd/src/commitments/WALLET/WALLET.d.ts +0 -21
  288. package/umd/src/commitments/WALLET/WALLET.test.d.ts +0 -1
  289. package/umd/src/commitments/WALLET/WalletToolNames.d.ts +0 -12
  290. package/umd/src/commitments/WALLET/WalletToolRuntimeAdapter.d.ts +0 -163
  291. package/umd/src/commitments/WALLET/createWalletSystemMessage.d.ts +0 -6
  292. package/umd/src/commitments/WALLET/createWalletToolFunctions.d.ts +0 -8
  293. package/umd/src/commitments/WALLET/createWalletTools.d.ts +0 -7
  294. package/umd/src/commitments/WALLET/getWalletCommitmentDocumentation.d.ts +0 -6
  295. package/umd/src/commitments/WALLET/getWalletToolRuntimeAdapterOrDisabledResult.d.ts +0 -16
  296. package/umd/src/commitments/WALLET/getWalletToolTitles.d.ts +0 -7
  297. package/umd/src/commitments/WALLET/parseWalletToolArgs.d.ts +0 -51
  298. package/umd/src/commitments/WALLET/resolveWalletRuntimeContext.d.ts +0 -8
  299. package/umd/src/commitments/WALLET/setWalletToolRuntimeAdapter.d.ts +0 -13
  300. package/umd/src/commitments/_common/createSerpSearchToolFunction.d.ts +0 -12
  301. /package/esm/src/book-2.0/agent-source/{createAgentModelRequirements.useCommitmentAggregation.test.d.ts → createAgentModelRequirements.commitmentAggregation.test.d.ts} +0 -0
  302. /package/esm/src/{commitments/MEMORY/MEMORY.test.d.ts → cli/cli-commands/coder/boilerplateCount.test.d.ts} +0 -0
  303. /package/esm/src/{commitments/USE_BROWSER/USE_BROWSER.test.d.ts → cli/cli-commands/coder/generate-boilerplates.test.d.ts} +0 -0
  304. /package/esm/src/commitments/{META → META_DESCRIPTION}/META_DESCRIPTION.d.ts +0 -0
  305. /package/{esm/src/commitments/USE_BROWSER/resolveRunBrowserToolForNode.test.d.ts → umd/src/book-2.0/agent-source/createAgentModelRequirements.commitmentAggregation.test.d.ts} +0 -0
  306. /package/{esm/src/commitments/USE_DEEPSEARCH/USE_DEEPSEARCH.test.d.ts → umd/src/cli/cli-commands/coder/boilerplateCount.test.d.ts} +0 -0
  307. /package/{esm/src/commitments/USE_EMAIL/USE_EMAIL.test.d.ts → umd/src/cli/cli-commands/coder/generate-boilerplates.test.d.ts} +0 -0
  308. /package/umd/src/commitments/{META → META_DESCRIPTION}/META_DESCRIPTION.d.ts +0 -0
@@ -0,0 +1,48 @@
1
+ import type { CodexLoginMethod } from '../../../src/book-3.0/codexLoginMethod';
2
+ import type { CoderRunStep, CoderRunStepKind } from './CoderRunStep';
3
+ /**
4
+ * Progress of one prompt round, reported right before a new step starts.
5
+ */
6
+ export type CoderRunStepProgress = {
7
+ /**
8
+ * Kind of the step which is about to start.
9
+ */
10
+ readonly startedStepKind: CoderRunStepKind;
11
+ /**
12
+ * Steps of the same prompt round which have already finished, in the order they ran.
13
+ */
14
+ readonly finishedSteps: ReadonlyArray<CoderRunStep>;
15
+ /**
16
+ * Authentication method the harness reported, as soon as one of the finished steps revealed it.
17
+ */
18
+ readonly loginMethod?: CodexLoginMethod;
19
+ };
20
+ /**
21
+ * Notified right before one coder run step starts.
22
+ */
23
+ export type OnCoderRunStepStarted = (progress: CoderRunStepProgress) => Promise<void>;
24
+ /**
25
+ * Collects the measured steps of one prompt round and announces every step which starts.
26
+ */
27
+ export type CoderRunStepTracker = {
28
+ /**
29
+ * Steps which have finished so far, in the order they ran.
30
+ */
31
+ readonly steps: ReadonlyArray<CoderRunStep>;
32
+ /**
33
+ * Announces that one step is about to start.
34
+ */
35
+ readonly startStep: (kind: CoderRunStepKind) => Promise<void>;
36
+ /**
37
+ * Records one finished step together with the authentication method its runner reported.
38
+ */
39
+ readonly finishStep: (step: CoderRunStep, loginMethod?: CodexLoginMethod) => void;
40
+ };
41
+ /**
42
+ * Creates the step tracker of one prompt round.
43
+ *
44
+ * The tracker is the single place which knows which steps have finished and which one is running,
45
+ * so both the finished `[x]` status line and the intermediate `[^]` in-progress status lines are
46
+ * built from the very same data.
47
+ */
48
+ export declare function createCoderRunStepTracker(onStepStarted?: OnCoderRunStepStarted): CoderRunStepTracker;
@@ -0,0 +1,43 @@
1
+ import { type CodexLoginMethod } from '../../../src/book-3.0/codexLoginMethod';
2
+ import type { ThinkingLevel } from '../../../src/cli/cli-commands/coder/ThinkingLevel';
3
+ import type { CoderRunStep, CoderRunStepKind } from '../common/CoderRunStep';
4
+ /**
5
+ * Everything one prompt status line says after its checklist marker.
6
+ */
7
+ export type BuildPromptStatusDetailsOptions = {
8
+ /**
9
+ * Steps of the prompt round which have already finished, each with its own price and duration.
10
+ */
11
+ readonly steps: ReadonlyArray<CoderRunStep>;
12
+ /**
13
+ * Step which has already started but has not finished yet, reported as `Implementation in progress`.
14
+ */
15
+ readonly inProgressStepKind?: CoderRunStepKind;
16
+ /**
17
+ * Harness which runs the prompt.
18
+ */
19
+ readonly runnerName: string | undefined;
20
+ /**
21
+ * Model the harness runs the prompt with.
22
+ */
23
+ readonly modelName: string | undefined;
24
+ /**
25
+ * How many coding attempts the prompt has taken so far.
26
+ */
27
+ readonly attemptCount: number;
28
+ /**
29
+ * Authentication method the harness reported, when it is already known.
30
+ */
31
+ readonly loginMethod?: CodexLoginMethod;
32
+ /**
33
+ * Reasoning effort the harness runs the prompt with.
34
+ */
35
+ readonly thinkingLevel?: ThinkingLevel;
36
+ };
37
+ /**
38
+ * Builds the shared body of a prompt status line, used by both the in-progress `[^]` and the done `[x]` status.
39
+ *
40
+ * Produces details such as
41
+ * ``by OpenAI Codex `gpt-5.6-luna` thinking `max` (ChatGPT account) - Implementation ~$0.2036 10 minutes``.
42
+ */
43
+ export declare function buildPromptStatusDetails(options: BuildPromptStatusDetailsOptions): string;
@@ -1,9 +1,12 @@
1
- import type { CoderRunStep } from '../common/CoderRunStep';
1
+ import type { CoderRunStep, CoderRunStepKind } from '../common/CoderRunStep';
2
2
  /**
3
- * Formats the per-step usage breakdown recorded for one finished prompt.
3
+ * Formats the per-step usage breakdown recorded for one prompt.
4
4
  *
5
5
  * Produces a `; `-separated summary such as
6
6
  * `Implementation $8.01 6 hours; Testing 1 hour; Fixing $3.14 2 hours` where each coding step carries its
7
7
  * price and duration and each verification step carries only its duration.
8
+ *
9
+ * @param steps - Steps which have already finished
10
+ * @param inProgressStepKind - Step which has started but has not finished yet, appended as `Testing in progress`
8
11
  */
9
- export declare function formatCoderRunSteps(steps: ReadonlyArray<CoderRunStep>): string;
12
+ export declare function formatCoderRunSteps(steps: ReadonlyArray<CoderRunStep>, inProgressStepKind?: CoderRunStepKind): string;
@@ -0,0 +1,8 @@
1
+ import type { PromptSection } from './types/PromptSection';
2
+ /**
3
+ * Checks whether one prompt section still has open coding work.
4
+ *
5
+ * A `[ ]` prompt has not been started at all and a `[^]` prompt was left in the middle of its
6
+ * implementation, so a file containing either of them is not finished yet.
7
+ */
8
+ export declare function isPromptSectionUnfinished(section: PromptSection): boolean;
@@ -1,4 +1,4 @@
1
- import { type CodexLoginMethod } from '../../../src/book-3.0/codexLoginMethod';
1
+ import type { CodexLoginMethod } from '../../../src/book-3.0/codexLoginMethod';
2
2
  import type { ThinkingLevel } from '../../../src/cli/cli-commands/coder/ThinkingLevel';
3
3
  import type { CoderRunStep } from '../common/CoderRunStep';
4
4
  import type { PromptFile } from './types/PromptFile';
@@ -0,0 +1,27 @@
1
+ import { type BuildPromptStatusDetailsOptions } from './buildPromptStatusDetails';
2
+ import type { PromptFile } from './types/PromptFile';
3
+ import type { PromptSection } from './types/PromptSection';
4
+ /**
5
+ * Input for marking one prompt section as being implemented right now.
6
+ */
7
+ export type MarkPromptInProgressOptions = BuildPromptStatusDetailsOptions & {
8
+ /**
9
+ * Prompt file the marked section belongs to.
10
+ */
11
+ readonly file: PromptFile;
12
+ /**
13
+ * Section which is being implemented right now.
14
+ */
15
+ readonly section: PromptSection;
16
+ /**
17
+ * Step which has just started, always present because a prompt is only in progress while a step runs.
18
+ */
19
+ readonly inProgressStepKind: NonNullable<BuildPromptStatusDetailsOptions['inProgressStepKind']>;
20
+ };
21
+ /**
22
+ * Marks a prompt section as being implemented right now and records the steps finished so far.
23
+ *
24
+ * The `[^]` status is deliberately never reverted: when the coder is killed or crashes, the status stays
25
+ * in the prompt file as the signal that this task was left in the middle of its implementation.
26
+ */
27
+ export declare function markPromptInProgress(options: MarkPromptInProgressOptions): void;
@@ -0,0 +1,19 @@
1
+ import type { PromptFile } from './types/PromptFile';
2
+ import type { PromptSection } from './types/PromptSection';
3
+ /**
4
+ * Status line of one prompt section together with the index it lives on.
5
+ */
6
+ export type ResolvedPromptStatusLine = {
7
+ /**
8
+ * Index of the status line within `file.lines`.
9
+ */
10
+ readonly statusLineIndex: number;
11
+ /**
12
+ * Current content of the status line, including its indentation and checklist marker.
13
+ */
14
+ readonly line: string;
15
+ };
16
+ /**
17
+ * Resolves the status line of one prompt section so it can be rewritten.
18
+ */
19
+ export declare function resolvePromptStatusLine(file: PromptFile, section: PromptSection): ResolvedPromptStatusLine;
@@ -0,0 +1,9 @@
1
+ import type { PromptFile } from './types/PromptFile';
2
+ import type { PromptSection } from './types/PromptSection';
3
+ /**
4
+ * Rewrites the status line of one prompt section while preserving its indentation.
5
+ *
6
+ * Only a todo `[ ]` or an in-progress `[^]` status line is rewritten, so an already finalized
7
+ * `[x]`, `[!]` or `[-]` status is never overwritten by accident.
8
+ */
9
+ export declare function writePromptStatusLine(file: PromptFile, section: PromptSection, replacementStatusLine: string): void;
@@ -10,7 +10,7 @@ export type CoderServerBoardColumn = 'backlog' | 'low-priority' | 'todo' | 'in-p
10
10
  * UI tag attached to one prompt card.
11
11
  */
12
12
  export type CoderServerPromptTag = {
13
- readonly id: 'not-ready' | 'unwritten' | 'implementing' | 'verifying';
13
+ readonly id: 'not-ready' | 'unwritten' | 'left-in-progress' | 'implementing' | 'verifying';
14
14
  readonly label: string;
15
15
  };
16
16
  /**
@@ -6,4 +6,4 @@
6
6
  *
7
7
  * @private internal constant of `ptbk coder server`
8
8
  */
9
- export declare const CODER_SERVER_HTML = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Ptbk Coder Server</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: #f6f7f9;\n color: #1f2933;\n min-height: 100vh;\n }\n\n header {\n background: #22313f;\n color: white;\n padding: 12px 18px;\n display: flex;\n align-items: center;\n gap: 12px;\n position: sticky;\n top: 0;\n z-index: 10;\n box-shadow: 0 2px 10px rgba(15,23,42,0.22);\n }\n header h1 { font-size: 17px; font-weight: 700; flex-shrink: 0; letter-spacing: 0; }\n\n .status-badge {\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n .status-RUNNING { background: #0b875b; color: white; }\n .status-PAUSING { background: #d97904; color: white; }\n .status-PAUSED { background: #b42318; color: white; }\n\n #pause-label {\n font-size: 12px;\n color: rgba(255,255,255,0.75);\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .btn {\n padding: 6px 12px;\n border: 0;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 700;\n transition: background 0.15s, opacity 0.15s;\n flex-shrink: 0;\n }\n .btn:disabled { opacity: 0.55; cursor: default; }\n .btn-pause { background: #ffd166; color: #1f2933; }\n .btn-resume { background: #0b875b; color: white; }\n .btn-save { background: #2563eb; color: white; }\n .btn-cancel { background: #edf0f4; color: #1f2933; }\n\n .run-strip {\n background: white;\n border-bottom: 1px solid #d8dee8;\n padding: 12px 18px;\n display: grid;\n grid-template-columns: minmax(220px, 1.2fr) minmax(240px, 1fr) minmax(260px, 1.4fr);\n gap: 14px;\n align-items: center;\n }\n .run-title {\n font-size: 14px;\n font-weight: 700;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .run-subtitle,\n .run-current,\n .run-output {\n color: #64748b;\n font-size: 12px;\n line-height: 1.45;\n overflow: hidden;\n }\n .run-current,\n .run-output {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .progress-shell {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: center;\n }\n .progress-track {\n height: 10px;\n background: #e4e9f0;\n border-radius: 999px;\n overflow: hidden;\n }\n .progress-fill {\n display: block;\n height: 100%;\n width: 0;\n background: linear-gradient(90deg, #0b875b, #2563eb);\n transition: width 0.2s;\n }\n .progress-label {\n color: #475569;\n font-size: 12px;\n font-weight: 700;\n min-width: 72px;\n text-align: right;\n }\n\n .board {\n display: flex;\n gap: 14px;\n padding: 16px;\n overflow-x: auto;\n min-height: calc(100vh - 119px);\n align-items: flex-start;\n }\n\n .column {\n background: #e9edf3;\n border-top: 4px solid #94a3b8;\n border-radius: 6px;\n padding: 10px;\n min-width: 250px;\n width: 270px;\n flex-shrink: 0;\n }\n .column-backlog { border-top-color: #64748b; }\n .column-low-priority { border-top-color: #d97904; }\n .column-todo { border-top-color: #2563eb; }\n .column-in-progress { border-top-color: #7c3aed; }\n .column-done { border-top-color: #0b875b; }\n .column-errors { border-top-color: #b42318; }\n .column-finished { border-top-color: #0891b2; }\n\n .column-header {\n font-size: 12px;\n font-weight: 800;\n text-transform: uppercase;\n color: #475569;\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n .column-count {\n background: rgba(255,255,255,0.72);\n border-radius: 999px;\n padding: 2px 8px;\n font-size: 11px;\n color: #475569;\n }\n .column-cards { min-height: 40px; }\n\n .card {\n background: white;\n border-radius: 6px;\n padding: 10px 12px;\n margin-bottom: 8px;\n box-shadow: 0 1px 3px rgba(15,23,42,0.12);\n cursor: pointer;\n border-left: 3px solid #94a3b8;\n }\n .card:hover { box-shadow: 0 4px 12px rgba(15,23,42,0.16); }\n .card-backlog { border-left-color: #64748b; }\n .card-low-priority { border-left-color: #d97904; }\n .card-todo { border-left-color: #2563eb; }\n .card-in-progress { border-left-color: #7c3aed; }\n .card-done { border-left-color: #0b875b; }\n .card-errors { border-left-color: #b42318; }\n .card-finished { border-left-color: #0891b2; }\n\n .card-file {\n font-size: 10px;\n color: #7b8794;\n margin-bottom: 6px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .card-summary {\n font-size: 13px;\n line-height: 1.45;\n color: #1f2933;\n word-break: break-word;\n white-space: pre-wrap;\n max-height: 76px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n }\n .card-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n margin-top: 8px;\n }\n .card-tag {\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 10px;\n font-weight: 800;\n line-height: 1.35;\n }\n .tag-not-ready { background: #e2e8f0; color: #475569; }\n .tag-unwritten { background: #fff4cc; color: #8a5a00; }\n .tag-implementing { background: #ede9fe; color: #5b21b6; }\n .tag-verifying { background: #fae8ff; color: #86198f; }\n .tag-priority { background: #ffedd5; color: #9a3412; }\n\n .empty-column {\n color: #94a3b8;\n font-size: 12px;\n padding: 10px 4px;\n text-align: center;\n }\n\n .modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(15,23,42,0.58);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 56px 16px 16px;\n z-index: 100;\n }\n .modal-overlay.hidden { display: none; }\n\n .modal {\n background: white;\n border-radius: 8px;\n width: 100%;\n max-width: 720px;\n padding: 18px;\n box-shadow: 0 14px 40px rgba(15,23,42,0.28);\n }\n .modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 14px;\n gap: 12px;\n }\n .modal-meta { flex: 1; min-width: 0; }\n .modal-file {\n font-size: 11px;\n color: #7b8794;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .modal-section-label { font-size: 14px; font-weight: 700; color: #1f2933; }\n .modal-status {\n font-size: 11px;\n font-weight: 800;\n padding: 3px 8px;\n border-radius: 999px;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n .status-backlog { background: #e2e8f0; color: #475569; }\n .status-low-priority { background: #ffedd5; color: #9a3412; }\n .status-todo { background: #dbeafe; color: #1d4ed8; }\n .status-in-progress { background: #ede9fe; color: #5b21b6; }\n .status-done { background: #dcfce7; color: #166534; }\n .status-errors { background: #fee2e2; color: #991b1b; }\n .status-finished { background: #cffafe; color: #155e75; }\n .modal-close {\n background: transparent;\n border: 0;\n color: #64748b;\n cursor: pointer;\n font-size: 20px;\n padding: 0 4px;\n line-height: 1;\n }\n .modal-close:hover { color: #1f2933; }\n\n textarea {\n width: 100%;\n min-height: 300px;\n font-family: \"SFMono-Regular\", Consolas, \"Courier New\", monospace;\n font-size: 13px;\n border: 2px solid #d8dee8;\n border-radius: 4px;\n padding: 10px 12px;\n resize: vertical;\n line-height: 1.6;\n color: #1f2933;\n }\n textarea:focus {\n outline: none;\n border-color: #2563eb;\n box-shadow: 0 0 0 3px rgba(37,99,235,0.12);\n }\n .modal-actions {\n display: flex;\n gap: 8px;\n margin-top: 14px;\n justify-content: flex-end;\n }\n\n .error-banner {\n background: #fee2e2;\n border-bottom: 2px solid #b42318;\n color: #991b1b;\n padding: 8px 18px;\n font-size: 13px;\n font-weight: 700;\n }\n .error-banner.hidden { display: none; }\n\n @media (max-width: 860px) {\n header { flex-wrap: wrap; }\n #pause-label { order: 4; flex-basis: 100%; }\n .run-strip { grid-template-columns: 1fr; }\n .board { min-height: calc(100vh - 212px); }\n }\n </style>\n</head>\n<body>\n <div id=\"error-banner\" class=\"error-banner hidden\"></div>\n\n <header>\n <h1>Ptbk Coder Server</h1>\n <span id=\"status-badge\" class=\"status-badge status-RUNNING\">RUNNING</span>\n <span id=\"pause-label\"></span>\n <button id=\"toggle-btn\" class=\"btn btn-pause\">Pause</button>\n </header>\n\n <section class=\"run-strip\">\n <div>\n <div class=\"run-title\" id=\"run-title\">Initializing...</div>\n <div class=\"run-subtitle\" id=\"run-subtitle\">Loading runner state</div>\n </div>\n <div class=\"progress-shell\">\n <div class=\"progress-track\"><span class=\"progress-fill\" id=\"progress-fill\"></span></div>\n <div class=\"progress-label\" id=\"progress-label\">0%</div>\n </div>\n <div>\n <div class=\"run-current\" id=\"run-current\">No active prompt</div>\n <div class=\"run-output\" id=\"run-output\"></div>\n </div>\n </section>\n\n <div class=\"board\" id=\"board\"></div>\n\n <div class=\"modal-overlay hidden\" id=\"modal-overlay\">\n <div class=\"modal\">\n <div class=\"modal-header\">\n <div class=\"modal-meta\">\n <div class=\"modal-file\" id=\"modal-file\"></div>\n <div class=\"modal-section-label\" id=\"modal-section-label\"></div>\n </div>\n <span class=\"modal-status\" id=\"modal-status-badge\"></span>\n <button class=\"modal-close\" id=\"modal-close\" title=\"Close\">&times;</button>\n </div>\n\n <textarea id=\"modal-content\" placeholder=\"Prompt content\"></textarea>\n\n <div class=\"modal-actions\">\n <button class=\"btn btn-cancel\" id=\"cancel-button\">Cancel</button>\n <button class=\"btn btn-save\" id=\"save-button\">Save</button>\n </div>\n </div>\n </div>\n\n <script>\n \"use strict\";\n\n const BOARD_COLUMNS = [\n { id: \"backlog\", title: \"Backlog\" },\n { id: \"low-priority\", title: \"Outside priority\" },\n { id: \"todo\", title: \"To do\" },\n { id: \"in-progress\", title: \"In progress\" },\n { id: \"done\", title: \"Done\" },\n { id: \"errors\", title: \"Errors\" },\n { id: \"finished\", title: \"Finished\" },\n ];\n\n let modalState = null;\n let lastPauseState = \"RUNNING\";\n\n function getColumnTitle(columnId) {\n const column = BOARD_COLUMNS.find((columnCandidate) => columnCandidate.id === columnId);\n return column ? column.title : columnId;\n }\n\n function showError(message) {\n const banner = document.getElementById(\"error-banner\");\n banner.textContent = message;\n banner.classList.remove(\"hidden\");\n clearTimeout(banner.timer);\n banner.timer = setTimeout(() => banner.classList.add(\"hidden\"), 6000);\n }\n\n function escapeHtml(value) {\n const element = document.createElement(\"div\");\n element.textContent = String(value);\n return element.innerHTML;\n }\n\n function renderBoardSkeleton() {\n const board = document.getElementById(\"board\");\n board.innerHTML = \"\";\n\n for (const column of BOARD_COLUMNS) {\n const columnElement = document.createElement(\"section\");\n columnElement.className = \"column column-\" + column.id;\n columnElement.innerHTML =\n '<div class=\"column-header\">' +\n '<span>' + escapeHtml(column.title) + '</span>' +\n '<span class=\"column-count\" id=\"count-' + column.id + '\">0</span>' +\n '</div>' +\n '<div class=\"column-cards\" id=\"cards-' + column.id + '\">' +\n '<div class=\"empty-column\">Loading</div>' +\n '</div>';\n board.appendChild(columnElement);\n }\n }\n\n async function fetchStatus() {\n try {\n const response = await fetch(\"/api/status\");\n if (!response.ok) {\n showError(\"Status API error: \" + response.status);\n return;\n }\n\n const status = await response.json();\n renderPauseState(status);\n renderRunState(status.runState);\n } catch (error) {\n showError(\"Could not reach coder server: \" + error.message);\n }\n }\n\n function renderPauseState(status) {\n lastPauseState = status.pauseState;\n\n const badge = document.getElementById(\"status-badge\");\n badge.textContent = status.pauseState;\n badge.className = \"status-badge status-\" + status.pauseState;\n\n const toggleButton = document.getElementById(\"toggle-btn\");\n const pauseLabel = document.getElementById(\"pause-label\");\n\n if (status.pauseState === \"RUNNING\") {\n toggleButton.textContent = \"Pause\";\n toggleButton.className = \"btn btn-pause\";\n pauseLabel.textContent = \"\";\n return;\n }\n\n toggleButton.textContent = \"Resume\";\n toggleButton.className = \"btn btn-resume\";\n pauseLabel.textContent =\n (status.pauseState === \"PAUSING\" ? \"Pausing before: \" : \"Paused before: \") +\n (status.pauseTargetLabel || \"next checkpoint\");\n }\n\n function renderRunState(runState) {\n if (!runState) {\n document.getElementById(\"run-title\").textContent = \"Waiting for runner state\";\n document.getElementById(\"run-subtitle\").textContent = \"\";\n return;\n }\n\n const progress = runState.progress || {};\n const percentage = Number(progress.percentage || 0);\n const runnerParts = [runState.config.agentName, runState.config.modelName, runState.config.thinkingLevel]\n .filter(Boolean);\n\n document.getElementById(\"run-title\").textContent = runState.statusMessage || runState.phase;\n document.getElementById(\"run-subtitle\").textContent = runnerParts.join(\" / \");\n document.getElementById(\"progress-fill\").style.width = Math.max(0, Math.min(100, percentage)) + \"%\";\n document.getElementById(\"progress-label\").textContent =\n percentage + \"% \" + (progress.sessionDone || 0) + \"/\" + (progress.sessionTotal || 0);\n document.getElementById(\"run-current\").textContent = runState.currentPromptLabel\n ? runState.currentPromptLabel + \" - attempt \" + runState.currentAttempt + \"/\" + runState.maxAttempts\n : \"No active prompt\";\n\n renderRunOutput(runState);\n }\n\n function renderRunOutput(runState) {\n const statusLines = (runState.agentStatusTableRows || []).map((row) =>\n row.status + \" - \" + row.agentName + (row.url ? \" - \" + row.url : \"\")\n );\n const outputLines = [\n ...(runState.agentStatusLines || []),\n ...statusLines,\n ...(runState.agentOutputLines || []),\n ...(runState.errors || []).map((errorLine) => \"Error: \" + errorLine),\n ].slice(-3);\n\n document.getElementById(\"run-output\").textContent = outputLines.join(\"\\n\");\n }\n\n async function fetchPrompts() {\n try {\n const response = await fetch(\"/api/prompts\");\n if (!response.ok) {\n showError(\"Prompts API error: \" + response.status);\n return;\n }\n\n renderBoard(await response.json());\n } catch (error) {\n showError(\"Could not load prompts: \" + error.message);\n }\n }\n\n function renderBoard(promptFiles) {\n const columns = Object.fromEntries(BOARD_COLUMNS.map((column) => [column.id, []]));\n\n for (const file of promptFiles) {\n for (const section of file.sections) {\n if (columns[section.column]) {\n columns[section.column].push({ file, section });\n }\n }\n }\n\n for (const column of BOARD_COLUMNS) {\n renderColumn(column.id, columns[column.id]);\n }\n }\n\n function renderColumn(columnId, cards) {\n const container = document.getElementById(\"cards-\" + columnId);\n const countElement = document.getElementById(\"count-\" + columnId);\n\n countElement.textContent = cards.length;\n container.innerHTML = \"\";\n\n if (cards.length === 0) {\n container.innerHTML = '<div class=\"empty-column\">Empty</div>';\n return;\n }\n\n for (const cardData of cards) {\n container.appendChild(createPromptCard(cardData.file, cardData.section));\n }\n }\n\n function createPromptCard(file, section) {\n const card = document.createElement(\"article\");\n card.className = \"card card-\" + section.column;\n card.innerHTML =\n '<div class=\"card-file\">' + escapeHtml(file.relativeFilePath || file.fileName) + \" #\" + (section.index + 1) + '</div>' +\n '<div class=\"card-summary\">' + escapeHtml(section.summary) + '</div>' +\n renderTags(section);\n card.onclick = () => openModal(file, section);\n return card;\n }\n\n function renderTags(section) {\n const tags = [...(section.tags || [])];\n if (section.priority > 0) {\n tags.push({ id: \"priority\", label: \"P\" + section.priority });\n }\n\n if (tags.length === 0) {\n return \"\";\n }\n\n return '<div class=\"card-tags\">' + tags.map((tag) =>\n '<span class=\"card-tag tag-' + escapeHtml(tag.id) + '\">' + escapeHtml(tag.label) + '</span>'\n ).join(\"\") + '</div>';\n }\n\n function openModal(file, section) {\n modalState = { filePath: file.filePath, sectionIndex: section.index };\n\n document.getElementById(\"modal-file\").textContent = file.relativeFilePath || file.fileName;\n document.getElementById(\"modal-section-label\").textContent = \"Section \" + (section.index + 1);\n\n const statusBadge = document.getElementById(\"modal-status-badge\");\n statusBadge.textContent = getColumnTitle(section.column);\n statusBadge.className = \"modal-status status-\" + section.column;\n\n document.getElementById(\"modal-content\").value = section.content;\n document.getElementById(\"modal-overlay\").classList.remove(\"hidden\");\n setTimeout(() => document.getElementById(\"modal-content\").focus(), 50);\n }\n\n function closeModal() {\n document.getElementById(\"modal-overlay\").classList.add(\"hidden\");\n modalState = null;\n }\n\n async function saveModal() {\n if (!modalState) {\n return;\n }\n\n const content = document.getElementById(\"modal-content\").value;\n const saveButton = document.getElementById(\"save-button\");\n saveButton.disabled = true;\n saveButton.textContent = \"Saving...\";\n\n try {\n const response = await fetch(\"/api/prompts/update\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n filePath: modalState.filePath,\n sectionIndex: modalState.sectionIndex,\n content,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"HTTP \" + response.status);\n }\n\n closeModal();\n await fetchPrompts();\n } catch (error) {\n showError(\"Save failed: \" + error.message);\n } finally {\n saveButton.disabled = false;\n saveButton.textContent = \"Save\";\n }\n }\n\n document.getElementById(\"toggle-btn\").onclick = async () => {\n try {\n const endpoint = lastPauseState === \"RUNNING\" ? \"/api/pause\" : \"/api/resume\";\n await fetch(endpoint, { method: \"POST\" });\n await fetchStatus();\n } catch (error) {\n showError(\"Toggle failed: \" + error.message);\n }\n };\n\n document.getElementById(\"modal-close\").onclick = closeModal;\n document.getElementById(\"cancel-button\").onclick = closeModal;\n document.getElementById(\"save-button\").onclick = saveModal;\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n closeModal();\n return;\n }\n if ((event.ctrlKey || event.metaKey) && event.key === \"Enter\") {\n saveModal();\n }\n });\n\n document.getElementById(\"modal-overlay\").addEventListener(\"click\", (event) => {\n if (event.target === document.getElementById(\"modal-overlay\")) {\n closeModal();\n }\n });\n\n renderBoardSkeleton();\n fetchStatus();\n fetchPrompts();\n setInterval(fetchStatus, 2000);\n setInterval(fetchPrompts, 5000);\n </script>\n</body>\n</html>\n";
9
+ export declare const CODER_SERVER_HTML = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Ptbk Coder Server</title>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n background: #f6f7f9;\n color: #1f2933;\n min-height: 100vh;\n }\n\n header {\n background: #22313f;\n color: white;\n padding: 12px 18px;\n display: flex;\n align-items: center;\n gap: 12px;\n position: sticky;\n top: 0;\n z-index: 10;\n box-shadow: 0 2px 10px rgba(15,23,42,0.22);\n }\n header h1 { font-size: 17px; font-weight: 700; flex-shrink: 0; letter-spacing: 0; }\n\n .status-badge {\n padding: 3px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n .status-RUNNING { background: #0b875b; color: white; }\n .status-PAUSING { background: #d97904; color: white; }\n .status-PAUSED { background: #b42318; color: white; }\n\n #pause-label {\n font-size: 12px;\n color: rgba(255,255,255,0.75);\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .btn {\n padding: 6px 12px;\n border: 0;\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 700;\n transition: background 0.15s, opacity 0.15s;\n flex-shrink: 0;\n }\n .btn:disabled { opacity: 0.55; cursor: default; }\n .btn-pause { background: #ffd166; color: #1f2933; }\n .btn-resume { background: #0b875b; color: white; }\n .btn-save { background: #2563eb; color: white; }\n .btn-cancel { background: #edf0f4; color: #1f2933; }\n\n .run-strip {\n background: white;\n border-bottom: 1px solid #d8dee8;\n padding: 12px 18px;\n display: grid;\n grid-template-columns: minmax(220px, 1.2fr) minmax(240px, 1fr) minmax(260px, 1.4fr);\n gap: 14px;\n align-items: center;\n }\n .run-title {\n font-size: 14px;\n font-weight: 700;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .run-subtitle,\n .run-current,\n .run-output {\n color: #64748b;\n font-size: 12px;\n line-height: 1.45;\n overflow: hidden;\n }\n .run-current,\n .run-output {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n }\n .progress-shell {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 8px;\n align-items: center;\n }\n .progress-track {\n height: 10px;\n background: #e4e9f0;\n border-radius: 999px;\n overflow: hidden;\n }\n .progress-fill {\n display: block;\n height: 100%;\n width: 0;\n background: linear-gradient(90deg, #0b875b, #2563eb);\n transition: width 0.2s;\n }\n .progress-label {\n color: #475569;\n font-size: 12px;\n font-weight: 700;\n min-width: 72px;\n text-align: right;\n }\n\n .board {\n display: flex;\n gap: 14px;\n padding: 16px;\n overflow-x: auto;\n min-height: calc(100vh - 119px);\n align-items: flex-start;\n }\n\n .column {\n background: #e9edf3;\n border-top: 4px solid #94a3b8;\n border-radius: 6px;\n padding: 10px;\n min-width: 250px;\n width: 270px;\n flex-shrink: 0;\n }\n .column-backlog { border-top-color: #64748b; }\n .column-low-priority { border-top-color: #d97904; }\n .column-todo { border-top-color: #2563eb; }\n .column-in-progress { border-top-color: #7c3aed; }\n .column-done { border-top-color: #0b875b; }\n .column-errors { border-top-color: #b42318; }\n .column-finished { border-top-color: #0891b2; }\n\n .column-header {\n font-size: 12px;\n font-weight: 800;\n text-transform: uppercase;\n color: #475569;\n margin-bottom: 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n }\n .column-count {\n background: rgba(255,255,255,0.72);\n border-radius: 999px;\n padding: 2px 8px;\n font-size: 11px;\n color: #475569;\n }\n .column-cards { min-height: 40px; }\n\n .card {\n background: white;\n border-radius: 6px;\n padding: 10px 12px;\n margin-bottom: 8px;\n box-shadow: 0 1px 3px rgba(15,23,42,0.12);\n cursor: pointer;\n border-left: 3px solid #94a3b8;\n }\n .card:hover { box-shadow: 0 4px 12px rgba(15,23,42,0.16); }\n .card-backlog { border-left-color: #64748b; }\n .card-low-priority { border-left-color: #d97904; }\n .card-todo { border-left-color: #2563eb; }\n .card-in-progress { border-left-color: #7c3aed; }\n .card-done { border-left-color: #0b875b; }\n .card-errors { border-left-color: #b42318; }\n .card-finished { border-left-color: #0891b2; }\n\n .card-file {\n font-size: 10px;\n color: #7b8794;\n margin-bottom: 6px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .card-summary {\n font-size: 13px;\n line-height: 1.45;\n color: #1f2933;\n word-break: break-word;\n white-space: pre-wrap;\n max-height: 76px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 4;\n -webkit-box-orient: vertical;\n }\n .card-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n margin-top: 8px;\n }\n .card-tag {\n border-radius: 999px;\n padding: 2px 7px;\n font-size: 10px;\n font-weight: 800;\n line-height: 1.35;\n }\n .tag-not-ready { background: #e2e8f0; color: #475569; }\n .tag-left-in-progress { background: #ffe4e6; color: #9f1239; }\n .tag-unwritten { background: #fff4cc; color: #8a5a00; }\n .tag-implementing { background: #ede9fe; color: #5b21b6; }\n .tag-verifying { background: #fae8ff; color: #86198f; }\n .tag-priority { background: #ffedd5; color: #9a3412; }\n\n .empty-column {\n color: #94a3b8;\n font-size: 12px;\n padding: 10px 4px;\n text-align: center;\n }\n\n .modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(15,23,42,0.58);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 56px 16px 16px;\n z-index: 100;\n }\n .modal-overlay.hidden { display: none; }\n\n .modal {\n background: white;\n border-radius: 8px;\n width: 100%;\n max-width: 720px;\n padding: 18px;\n box-shadow: 0 14px 40px rgba(15,23,42,0.28);\n }\n .modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 14px;\n gap: 12px;\n }\n .modal-meta { flex: 1; min-width: 0; }\n .modal-file {\n font-size: 11px;\n color: #7b8794;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .modal-section-label { font-size: 14px; font-weight: 700; color: #1f2933; }\n .modal-status {\n font-size: 11px;\n font-weight: 800;\n padding: 3px 8px;\n border-radius: 999px;\n text-transform: uppercase;\n flex-shrink: 0;\n }\n .status-backlog { background: #e2e8f0; color: #475569; }\n .status-low-priority { background: #ffedd5; color: #9a3412; }\n .status-todo { background: #dbeafe; color: #1d4ed8; }\n .status-in-progress { background: #ede9fe; color: #5b21b6; }\n .status-done { background: #dcfce7; color: #166534; }\n .status-errors { background: #fee2e2; color: #991b1b; }\n .status-finished { background: #cffafe; color: #155e75; }\n .modal-close {\n background: transparent;\n border: 0;\n color: #64748b;\n cursor: pointer;\n font-size: 20px;\n padding: 0 4px;\n line-height: 1;\n }\n .modal-close:hover { color: #1f2933; }\n\n textarea {\n width: 100%;\n min-height: 300px;\n font-family: \"SFMono-Regular\", Consolas, \"Courier New\", monospace;\n font-size: 13px;\n border: 2px solid #d8dee8;\n border-radius: 4px;\n padding: 10px 12px;\n resize: vertical;\n line-height: 1.6;\n color: #1f2933;\n }\n textarea:focus {\n outline: none;\n border-color: #2563eb;\n box-shadow: 0 0 0 3px rgba(37,99,235,0.12);\n }\n .modal-actions {\n display: flex;\n gap: 8px;\n margin-top: 14px;\n justify-content: flex-end;\n }\n\n .error-banner {\n background: #fee2e2;\n border-bottom: 2px solid #b42318;\n color: #991b1b;\n padding: 8px 18px;\n font-size: 13px;\n font-weight: 700;\n }\n .error-banner.hidden { display: none; }\n\n @media (max-width: 860px) {\n header { flex-wrap: wrap; }\n #pause-label { order: 4; flex-basis: 100%; }\n .run-strip { grid-template-columns: 1fr; }\n .board { min-height: calc(100vh - 212px); }\n }\n </style>\n</head>\n<body>\n <div id=\"error-banner\" class=\"error-banner hidden\"></div>\n\n <header>\n <h1>Ptbk Coder Server</h1>\n <span id=\"status-badge\" class=\"status-badge status-RUNNING\">RUNNING</span>\n <span id=\"pause-label\"></span>\n <button id=\"toggle-btn\" class=\"btn btn-pause\">Pause</button>\n </header>\n\n <section class=\"run-strip\">\n <div>\n <div class=\"run-title\" id=\"run-title\">Initializing...</div>\n <div class=\"run-subtitle\" id=\"run-subtitle\">Loading runner state</div>\n </div>\n <div class=\"progress-shell\">\n <div class=\"progress-track\"><span class=\"progress-fill\" id=\"progress-fill\"></span></div>\n <div class=\"progress-label\" id=\"progress-label\">0%</div>\n </div>\n <div>\n <div class=\"run-current\" id=\"run-current\">No active prompt</div>\n <div class=\"run-output\" id=\"run-output\"></div>\n </div>\n </section>\n\n <div class=\"board\" id=\"board\"></div>\n\n <div class=\"modal-overlay hidden\" id=\"modal-overlay\">\n <div class=\"modal\">\n <div class=\"modal-header\">\n <div class=\"modal-meta\">\n <div class=\"modal-file\" id=\"modal-file\"></div>\n <div class=\"modal-section-label\" id=\"modal-section-label\"></div>\n </div>\n <span class=\"modal-status\" id=\"modal-status-badge\"></span>\n <button class=\"modal-close\" id=\"modal-close\" title=\"Close\">&times;</button>\n </div>\n\n <textarea id=\"modal-content\" placeholder=\"Prompt content\"></textarea>\n\n <div class=\"modal-actions\">\n <button class=\"btn btn-cancel\" id=\"cancel-button\">Cancel</button>\n <button class=\"btn btn-save\" id=\"save-button\">Save</button>\n </div>\n </div>\n </div>\n\n <script>\n \"use strict\";\n\n const BOARD_COLUMNS = [\n { id: \"backlog\", title: \"Backlog\" },\n { id: \"low-priority\", title: \"Outside priority\" },\n { id: \"todo\", title: \"To do\" },\n { id: \"in-progress\", title: \"In progress\" },\n { id: \"done\", title: \"Done\" },\n { id: \"errors\", title: \"Errors\" },\n { id: \"finished\", title: \"Finished\" },\n ];\n\n let modalState = null;\n let lastPauseState = \"RUNNING\";\n\n function getColumnTitle(columnId) {\n const column = BOARD_COLUMNS.find((columnCandidate) => columnCandidate.id === columnId);\n return column ? column.title : columnId;\n }\n\n function showError(message) {\n const banner = document.getElementById(\"error-banner\");\n banner.textContent = message;\n banner.classList.remove(\"hidden\");\n clearTimeout(banner.timer);\n banner.timer = setTimeout(() => banner.classList.add(\"hidden\"), 6000);\n }\n\n function escapeHtml(value) {\n const element = document.createElement(\"div\");\n element.textContent = String(value);\n return element.innerHTML;\n }\n\n function renderBoardSkeleton() {\n const board = document.getElementById(\"board\");\n board.innerHTML = \"\";\n\n for (const column of BOARD_COLUMNS) {\n const columnElement = document.createElement(\"section\");\n columnElement.className = \"column column-\" + column.id;\n columnElement.innerHTML =\n '<div class=\"column-header\">' +\n '<span>' + escapeHtml(column.title) + '</span>' +\n '<span class=\"column-count\" id=\"count-' + column.id + '\">0</span>' +\n '</div>' +\n '<div class=\"column-cards\" id=\"cards-' + column.id + '\">' +\n '<div class=\"empty-column\">Loading</div>' +\n '</div>';\n board.appendChild(columnElement);\n }\n }\n\n async function fetchStatus() {\n try {\n const response = await fetch(\"/api/status\");\n if (!response.ok) {\n showError(\"Status API error: \" + response.status);\n return;\n }\n\n const status = await response.json();\n renderPauseState(status);\n renderRunState(status.runState);\n } catch (error) {\n showError(\"Could not reach coder server: \" + error.message);\n }\n }\n\n function renderPauseState(status) {\n lastPauseState = status.pauseState;\n\n const badge = document.getElementById(\"status-badge\");\n badge.textContent = status.pauseState;\n badge.className = \"status-badge status-\" + status.pauseState;\n\n const toggleButton = document.getElementById(\"toggle-btn\");\n const pauseLabel = document.getElementById(\"pause-label\");\n\n if (status.pauseState === \"RUNNING\") {\n toggleButton.textContent = \"Pause\";\n toggleButton.className = \"btn btn-pause\";\n pauseLabel.textContent = \"\";\n return;\n }\n\n toggleButton.textContent = \"Resume\";\n toggleButton.className = \"btn btn-resume\";\n pauseLabel.textContent =\n (status.pauseState === \"PAUSING\" ? \"Pausing before: \" : \"Paused before: \") +\n (status.pauseTargetLabel || \"next checkpoint\");\n }\n\n function renderRunState(runState) {\n if (!runState) {\n document.getElementById(\"run-title\").textContent = \"Waiting for runner state\";\n document.getElementById(\"run-subtitle\").textContent = \"\";\n return;\n }\n\n const progress = runState.progress || {};\n const percentage = Number(progress.percentage || 0);\n const runnerParts = [runState.config.agentName, runState.config.modelName, runState.config.thinkingLevel]\n .filter(Boolean);\n\n document.getElementById(\"run-title\").textContent = runState.statusMessage || runState.phase;\n document.getElementById(\"run-subtitle\").textContent = runnerParts.join(\" / \");\n document.getElementById(\"progress-fill\").style.width = Math.max(0, Math.min(100, percentage)) + \"%\";\n document.getElementById(\"progress-label\").textContent =\n percentage + \"% \" + (progress.sessionDone || 0) + \"/\" + (progress.sessionTotal || 0);\n document.getElementById(\"run-current\").textContent = runState.currentPromptLabel\n ? runState.currentPromptLabel + \" - attempt \" + runState.currentAttempt + \"/\" + runState.maxAttempts\n : \"No active prompt\";\n\n renderRunOutput(runState);\n }\n\n function renderRunOutput(runState) {\n const statusLines = (runState.agentStatusTableRows || []).map((row) =>\n row.status + \" - \" + row.agentName + (row.url ? \" - \" + row.url : \"\")\n );\n const outputLines = [\n ...(runState.agentStatusLines || []),\n ...statusLines,\n ...(runState.agentOutputLines || []),\n ...(runState.errors || []).map((errorLine) => \"Error: \" + errorLine),\n ].slice(-3);\n\n document.getElementById(\"run-output\").textContent = outputLines.join(\"\\n\");\n }\n\n async function fetchPrompts() {\n try {\n const response = await fetch(\"/api/prompts\");\n if (!response.ok) {\n showError(\"Prompts API error: \" + response.status);\n return;\n }\n\n renderBoard(await response.json());\n } catch (error) {\n showError(\"Could not load prompts: \" + error.message);\n }\n }\n\n function renderBoard(promptFiles) {\n const columns = Object.fromEntries(BOARD_COLUMNS.map((column) => [column.id, []]));\n\n for (const file of promptFiles) {\n for (const section of file.sections) {\n if (columns[section.column]) {\n columns[section.column].push({ file, section });\n }\n }\n }\n\n for (const column of BOARD_COLUMNS) {\n renderColumn(column.id, columns[column.id]);\n }\n }\n\n function renderColumn(columnId, cards) {\n const container = document.getElementById(\"cards-\" + columnId);\n const countElement = document.getElementById(\"count-\" + columnId);\n\n countElement.textContent = cards.length;\n container.innerHTML = \"\";\n\n if (cards.length === 0) {\n container.innerHTML = '<div class=\"empty-column\">Empty</div>';\n return;\n }\n\n for (const cardData of cards) {\n container.appendChild(createPromptCard(cardData.file, cardData.section));\n }\n }\n\n function createPromptCard(file, section) {\n const card = document.createElement(\"article\");\n card.className = \"card card-\" + section.column;\n card.innerHTML =\n '<div class=\"card-file\">' + escapeHtml(file.relativeFilePath || file.fileName) + \" #\" + (section.index + 1) + '</div>' +\n '<div class=\"card-summary\">' + escapeHtml(section.summary) + '</div>' +\n renderTags(section);\n card.onclick = () => openModal(file, section);\n return card;\n }\n\n function renderTags(section) {\n const tags = [...(section.tags || [])];\n if (section.priority > 0) {\n tags.push({ id: \"priority\", label: \"P\" + section.priority });\n }\n\n if (tags.length === 0) {\n return \"\";\n }\n\n return '<div class=\"card-tags\">' + tags.map((tag) =>\n '<span class=\"card-tag tag-' + escapeHtml(tag.id) + '\">' + escapeHtml(tag.label) + '</span>'\n ).join(\"\") + '</div>';\n }\n\n function openModal(file, section) {\n modalState = { filePath: file.filePath, sectionIndex: section.index };\n\n document.getElementById(\"modal-file\").textContent = file.relativeFilePath || file.fileName;\n document.getElementById(\"modal-section-label\").textContent = \"Section \" + (section.index + 1);\n\n const statusBadge = document.getElementById(\"modal-status-badge\");\n statusBadge.textContent = getColumnTitle(section.column);\n statusBadge.className = \"modal-status status-\" + section.column;\n\n document.getElementById(\"modal-content\").value = section.content;\n document.getElementById(\"modal-overlay\").classList.remove(\"hidden\");\n setTimeout(() => document.getElementById(\"modal-content\").focus(), 50);\n }\n\n function closeModal() {\n document.getElementById(\"modal-overlay\").classList.add(\"hidden\");\n modalState = null;\n }\n\n async function saveModal() {\n if (!modalState) {\n return;\n }\n\n const content = document.getElementById(\"modal-content\").value;\n const saveButton = document.getElementById(\"save-button\");\n saveButton.disabled = true;\n saveButton.textContent = \"Saving...\";\n\n try {\n const response = await fetch(\"/api/prompts/update\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n filePath: modalState.filePath,\n sectionIndex: modalState.sectionIndex,\n content,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"HTTP \" + response.status);\n }\n\n closeModal();\n await fetchPrompts();\n } catch (error) {\n showError(\"Save failed: \" + error.message);\n } finally {\n saveButton.disabled = false;\n saveButton.textContent = \"Save\";\n }\n }\n\n document.getElementById(\"toggle-btn\").onclick = async () => {\n try {\n const endpoint = lastPauseState === \"RUNNING\" ? \"/api/pause\" : \"/api/resume\";\n await fetch(endpoint, { method: \"POST\" });\n await fetchStatus();\n } catch (error) {\n showError(\"Toggle failed: \" + error.message);\n }\n };\n\n document.getElementById(\"modal-close\").onclick = closeModal;\n document.getElementById(\"cancel-button\").onclick = closeModal;\n document.getElementById(\"save-button\").onclick = saveModal;\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n closeModal();\n return;\n }\n if ((event.ctrlKey || event.metaKey) && event.key === \"Enter\") {\n saveModal();\n }\n });\n\n document.getElementById(\"modal-overlay\").addEventListener(\"click\", (event) => {\n if (event.target === document.getElementById(\"modal-overlay\")) {\n closeModal();\n }\n });\n\n renderBoardSkeleton();\n fetchStatus();\n fetchPrompts();\n setInterval(fetchStatus, 2000);\n setInterval(fetchPrompts, 5000);\n </script>\n</body>\n</html>\n";
@@ -2,7 +2,7 @@
2
2
  * Overwrites the body of one prompt section with new content, preserving the status line.
3
3
  *
4
4
  * The `newContent` string is the prompt text without the status marker.
5
- * The status line (`[ ]`, `[x]`, `[!]`, `[-]`) is kept intact.
5
+ * The status line (`[ ]`, `[^]`, `[x]`, `[!]`, `[-]`) is kept intact.
6
6
  *
7
7
  * @private internal utility of `ptbk coder server`
8
8
  */
@@ -1,4 +1,5 @@
1
1
  import type { CoderRunStep } from '../common/CoderRunStep';
2
+ import { type OnCoderRunStepStarted } from '../common/createCoderRunStepTracker';
2
3
  import type { PromptRunOptions } from '../runners/types/PromptRunOptions';
3
4
  import type { PromptRunResult } from '../runners/types/PromptRunResult';
4
5
  import type { PromptRunner } from '../runners/types/PromptRunner';
@@ -11,6 +12,11 @@ type RunPromptWithTestFeedbackOptions = PromptRunOptions & {
11
12
  promptLabel: string;
12
13
  testCommand?: string;
13
14
  onAttemptStarted?: (attemptCount: number) => void;
15
+ /**
16
+ * Notified right before each implementation, testing and fixing step starts, so the caller can
17
+ * record the in-progress state of the prompt.
18
+ */
19
+ onStepStarted?: OnCoderRunStepStarted;
14
20
  runPromptTestCommandExecutor?: typeof runPromptTestCommand;
15
21
  };
16
22
  /**
@@ -0,0 +1,9 @@
1
+ import type { PromptFile } from '../run-codex-prompts/prompts/types/PromptFile';
2
+ import type { VerifyPromptsOrder } from './VerifyPromptsOrder';
3
+ /**
4
+ * Orders the loaded prompt files for one verification pass.
5
+ *
6
+ * Note: `$` is used to indicate that this function is not a pure function - the `random` order is not deterministic
7
+ * Note: This function does NOT mutate the given array
8
+ */
9
+ export declare function $orderPromptFiles(promptFiles: ReadonlyArray<PromptFile>, order: VerifyPromptsOrder): PromptFile[];
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Orders supported by `ptbk coder verify --order`.
3
+ */
4
+ export declare const VERIFY_PROMPTS_ORDER_VALUES: readonly ["from-earliest", "from-latest", "random"];
5
+ /**
6
+ * Order in which the prompt files are processed during one verification run.
7
+ */
8
+ export type VerifyPromptsOrder = (typeof VERIFY_PROMPTS_ORDER_VALUES)[number];
9
+ /**
10
+ * Order used when `--order` is not provided.
11
+ */
12
+ export declare const DEFAULT_VERIFY_PROMPTS_ORDER: VerifyPromptsOrder;
13
+ /**
14
+ * Human-readable description of each supported order, shared by the CLI help and the verification output.
15
+ */
16
+ export declare const VERIFY_PROMPTS_ORDER_DESCRIPTIONS: {
17
+ readonly 'from-earliest': "from the earliest prompt file";
18
+ readonly 'from-latest': "from the latest prompt file";
19
+ readonly random: "in random order";
20
+ };
21
+ /**
22
+ * Parses and validates one raw `--order` value.
23
+ *
24
+ * Note: `ptbk coder verify` lets Commander validate the value, this is used by the standalone script which parses the raw arguments itself
25
+ */
26
+ export declare function parseVerifyPromptsOrder(orderValue: string | undefined): VerifyPromptsOrder;
@@ -1,13 +1,14 @@
1
1
  import type { CoderGitSyncOptions } from '../run-codex-prompts/git/coderGitSync';
2
2
  import type { PromptFile } from '../run-codex-prompts/prompts/types/PromptFile';
3
+ import type { VerifyPromptsOrder } from './VerifyPromptsOrder';
3
4
  /**
4
5
  * Options supported by the prompt verification helper.
5
6
  */
6
7
  export type VerifyPromptsOptions = {
7
8
  /**
8
- * Process prompt files in reverse order.
9
+ * Order in which the prompt files are processed.
9
10
  */
10
- readonly reverse?: boolean;
11
+ readonly order?: VerifyPromptsOrder;
11
12
  /**
12
13
  * Ignore prompt files whose filename or first prompt line contains one of the provided values.
13
14
  */
@@ -31,13 +31,13 @@ export type BookParameter = {
31
31
  };
32
32
  /**
33
33
  * Capability of the agent
34
- * This is parsed from commitments like USE BROWSER, USE SEARCH ENGINE, KNOWLEDGE, etc.
34
+ * This is parsed from commitments like USE CALENDAR, USE PROJECT, KNOWLEDGE, etc.
35
35
  */
36
36
  export type AgentCapability = {
37
37
  /**
38
38
  * The type of the capability
39
39
  */
40
- type: 'browser' | 'search-engine' | 'knowledge' | 'timeout' | 'time' | 'user-location' | 'inheritance' | 'import' | 'image-generator' | 'team' | 'email' | 'popup' | 'privacy' | 'project' | 'calendar' | 'wallet';
40
+ type: 'knowledge' | 'user-location' | 'inheritance' | 'import' | 'image-generator' | 'team' | 'popup' | 'privacy' | 'project' | 'calendar';
41
41
  /**
42
42
  * The label to display for this capability
43
43
  */
@@ -122,7 +122,7 @@ export type AgentBasicInformation = {
122
122
  parameters: Array<BookParameter>;
123
123
  /**
124
124
  * Capabilities of the agent
125
- * This is parsed from commitments like USE BROWSER, USE SEARCH ENGINE, KNOWLEDGE, etc.
125
+ * This is parsed from commitments like USE CALENDAR, USE PROJECT, KNOWLEDGE, etc.
126
126
  */
127
127
  capabilities: Array<AgentCapability>;
128
128
  /**
@@ -0,0 +1,52 @@
1
+ /**
2
+ * How many prompt boilerplate files are generated and how many prompts each of them contains.
3
+ *
4
+ * @private internal utility of `ptbk coder`
5
+ */
6
+ export type BoilerplateCount = {
7
+ /**
8
+ * Number of generated prompt boilerplate files.
9
+ */
10
+ readonly filesCount: number;
11
+ /**
12
+ * Number of prompts written into each generated file.
13
+ *
14
+ * Note: More than one prompt per file is an advanced option - each prompt is one separate
15
+ * coding task separated by `---` and tagged with its own fresh emoji tag.
16
+ */
17
+ readonly promptsPerFileCount: number;
18
+ };
19
+ /**
20
+ * Number of prompt boilerplate files and prompts per file used when `--count` is not provided.
21
+ *
22
+ * @private internal utility of `ptbk coder`
23
+ */
24
+ export declare const DEFAULT_BOILERPLATE_COUNT: BoilerplateCount;
25
+ /**
26
+ * Formats one boilerplate count back into the `N*M` notation of the `--count` option.
27
+ *
28
+ * @private internal utility of `ptbk coder`
29
+ */
30
+ export declare function formatBoilerplateCount({ filesCount, promptsPerFileCount }: BoilerplateCount): string;
31
+ /**
32
+ * Default value of the `--count` option rendered in the `N*M` notation, for example `5*1`.
33
+ *
34
+ * @private internal utility of `ptbk coder`
35
+ */
36
+ export declare const DEFAULT_BOILERPLATE_COUNT_OPTION_VALUE: string;
37
+ /**
38
+ * Description of the `--count` option shared by all commands which generate prompt boilerplates.
39
+ *
40
+ * @private internal utility of `ptbk coder`
41
+ */
42
+ export declare const BOILERPLATE_COUNT_OPTION_DESCRIPTION: string;
43
+ /**
44
+ * Parses the `--count` option value into the number of files and the number of prompts in each of them.
45
+ *
46
+ * Both notations are supported:
47
+ * - `N` and `N*1` => N files with one prompt each
48
+ * - `N*M` => N files with M prompts each
49
+ *
50
+ * @private internal utility of `ptbk coder`
51
+ */
52
+ export declare function parseBoilerplateCount(countOption: string): BoilerplateCount;
@@ -1,5 +1,6 @@
1
1
  import type { Command as Program } from 'commander';
2
2
  import type { $side_effect } from '../../../utils/organization/$side_effect';
3
+ import type { BoilerplateCount } from './boilerplateCount';
3
4
  /**
4
5
  * Initializes `coder generate-boilerplates` command for Promptbook CLI utilities
5
6
  *
@@ -13,8 +14,8 @@ export declare function $initializeCoderGenerateBoilerplatesCommand(program: Pro
13
14
  *
14
15
  * @private internal function of `generatePromptBoilerplate` command
15
16
  */
16
- export declare function generatePromptBoilerplate({ projectPath, filesCount, templateOption, }: {
17
+ export declare function generatePromptBoilerplate({ projectPath, boilerplateCount, templateOption, }: {
17
18
  readonly projectPath: string;
18
- readonly filesCount: number;
19
+ readonly boilerplateCount: BoilerplateCount;
19
20
  readonly templateOption?: string;
20
21
  }): Promise<void>;
@@ -1,4 +1,4 @@
1
- import type { Command as Program } from 'commander';
1
+ import { Command as Program } from 'commander';
2
2
  import type { $side_effect } from '../../../utils/organization/$side_effect';
3
3
  /**
4
4
  * Initializes `coder verify` command for Promptbook CLI utilities
@@ -1,16 +1,19 @@
1
1
  import type { AgentModelRequirements } from '../../book-2.0/agent-source/AgentModelRequirements';
2
2
  import { BaseCommitmentDefinition } from '../_base/BaseCommitmentDefinition';
3
3
  /**
4
- * COMPONENT commitment definition
4
+ * META FULLNAME commitment definition
5
5
  *
6
- * The COMPONENT commitment defines a UI component that the agent can render in the chat.
6
+ * The `META FULLNAME` commitment sets the full display name of the agent, which can differ
7
+ * from the agent name on the first line of the agent source, for example when the agent
8
+ * should be presented with academic titles.
9
+ * This commitment is metadata-only and does not modify model requirements.
7
10
  *
8
11
  * @private [🪔] Maybe export the commitments through some package
9
12
  */
10
- export declare class ComponentCommitmentDefinition extends BaseCommitmentDefinition<'COMPONENT'> {
13
+ export declare class MetaFullnameCommitmentDefinition extends BaseCommitmentDefinition<'META FULLNAME'> {
11
14
  constructor();
12
15
  /**
13
- * Short one-line description of COMPONENT.
16
+ * Short one-line description of META FULLNAME.
14
17
  */
15
18
  get description(): string;
16
19
  /**
@@ -18,7 +21,7 @@ export declare class ComponentCommitmentDefinition extends BaseCommitmentDefinit
18
21
  */
19
22
  get icon(): string;
20
23
  /**
21
- * Markdown documentation for COMPONENT commitment.
24
+ * Markdown documentation for META FULLNAME commitment.
22
25
  */
23
26
  get documentation(): string;
24
27
  applyToAgentModelRequirements(requirements: AgentModelRequirements, content: string): AgentModelRequirements;
@@ -0,0 +1,32 @@
1
+ import type { AgentModelRequirements } from '../../book-2.0/agent-source/AgentModelRequirements';
2
+ import { BaseCommitmentDefinition } from '../_base/BaseCommitmentDefinition';
3
+ /**
4
+ * META ID commitment definition
5
+ *
6
+ * The `META ID` commitment carries the permanent id of the agent when an agent source is moved
7
+ * between systems. It is a low-level commitment which is normally written and stripped by the
8
+ * persistence layer instead of being written by hand.
9
+ * This commitment is metadata-only and does not modify model requirements.
10
+ *
11
+ * @private [🪔] Maybe export the commitments through some package
12
+ */
13
+ export declare class MetaIdCommitmentDefinition extends BaseCommitmentDefinition<'META ID'> {
14
+ constructor();
15
+ /**
16
+ * Short one-line description of META ID.
17
+ */
18
+ get description(): string;
19
+ /**
20
+ * Icon for this commitment.
21
+ */
22
+ get icon(): string;
23
+ /**
24
+ * `META ID` is written by the persistence layer, not by agent authors.
25
+ */
26
+ get isLowLevel(): boolean;
27
+ /**
28
+ * Markdown documentation for META ID commitment.
29
+ */
30
+ get documentation(): string;
31
+ applyToAgentModelRequirements(requirements: AgentModelRequirements, content: string): AgentModelRequirements;
32
+ }