kenaz 0.3.3 → 0.3.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 (413) hide show
  1. package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
  2. package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
  3. package/core/.claude/commands/Ansuz.md +14 -2
  4. package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
  5. package/core/.claude/hooks/handoff-staleness.js +2 -2
  6. package/core/.claude/hooks/session-init.ps1 +49 -49
  7. package/core/.claude/hooks/turn-context.js +50 -2
  8. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
  9. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
  10. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
  11. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
  12. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
  13. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  14. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  15. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  16. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  17. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  18. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  19. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  20. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  21. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  22. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  23. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  24. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  25. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  26. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  27. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
  28. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
  29. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  30. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  31. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  32. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
  33. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  34. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
  35. package/core/.collaboration/core/task-api.js +1 -4
  36. package/core/.formation/README.md +21 -146
  37. package/core/.formation/bifrost/codex-doctor.js +37 -2
  38. package/core/.formation/bifrost/codex-doctor.test.js +18 -0
  39. package/core/.formation/bifrost/launch.js +1 -1
  40. package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
  41. package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
  42. package/core/.formation/bifrost/setup-codex.js +3 -0
  43. package/core/.formation/spec/task_operations.parity.test.js +0 -1
  44. package/core/.formation/tests/hello.txt +2 -2
  45. package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
  46. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
  47. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
  48. package/core/.formation/tools/dispatch.js +28 -549
  49. package/core/.formation/tools/mcp-allowlist.test.js +0 -1
  50. package/core/.formation/tools/post-complete/task2345.test.js +0 -5
  51. package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
  52. package/core/.formation/tools/prompt.js +29 -1623
  53. package/core/.formation/tools/prompt.test.js +26 -594
  54. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  55. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  56. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  57. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  58. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  59. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  60. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  61. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  62. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  63. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  64. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  65. package/core/.matrix/index.matrix +5 -5
  66. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
  67. package/core/KENAZ_CORE_VERSION +1 -1
  68. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  69. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  70. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  71. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  72. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  73. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  74. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  75. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  76. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  77. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  78. package/core/dev/jev-eval/README.md +99 -99
  79. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  80. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  81. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  82. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  83. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  84. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  85. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  86. package/core/dev/scripts/init_git.sh +0 -0
  87. package/core/dev/scripts/init_project.sh +0 -0
  88. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  89. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  90. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  91. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  92. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  93. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  94. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  95. package/core/dev/scripts/run_once.sh +0 -0
  96. package/core/dev/scripts/setup_mcp.sh +0 -0
  97. package/core/dev/scripts/setup_rag.sh +0 -0
  98. package/core/dev/scripts/start_dev_agent.sh +0 -0
  99. package/core/dev/scripts/start_multi_agent.sh +0 -0
  100. package/core/dev/scripts/sync_task_queue.sh +0 -0
  101. package/core/plugins/kenaz/commands/Amelia.md +1 -1
  102. package/core/plugins/kenaz/commands/Ansuz.md +15 -3
  103. package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
  104. package/core/plugins/kenaz/scripts/sync.js +6 -2
  105. package/core/plugins/kenaz/scripts/ygg.js +13 -1
  106. package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
  107. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  108. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  109. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  110. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  111. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  112. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  113. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  114. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  115. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  116. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  117. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  118. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  119. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  120. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  121. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  122. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  123. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  124. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  125. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  126. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  127. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  128. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  129. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  130. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  131. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  132. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  133. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  134. package/lib/cli.js +11 -4
  135. package/package.json +11 -7
  136. package/vendor/install-kenaz-cli.js +18 -7
  137. package/core/.formation/tools/broadcast.js +0 -103
  138. package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
  139. package/core/.formation/tools/dispatch-notifier.js +0 -84
  140. package/core/.formation/tools/formations.js +0 -1203
  141. package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
  142. package/core/.formation/tools/headless-dryrun.test.js +0 -79
  143. package/core/.formation/tools/headless-v2.js +0 -659
  144. package/core/.formation/tools/headless.js +0 -1071
  145. package/core/.formation/tools/legacy-scheduler.js +0 -1994
  146. package/core/.formation/tools/logger.js +0 -273
  147. package/core/.formation/tools/memory-loader.js +0 -422
  148. package/core/.formation/tools/process-state.js +0 -33
  149. package/core/.formation/tools/remote-conflict.js +0 -98
  150. package/core/.formation/tools/runner.js +0 -1332
  151. package/core/.formation/tools/task-utils.js +0 -344
  152. package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
  153. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
  154. package/core/.formation/tools/worktree-leak.test.js +0 -162
  155. package/core/k-cli/dist/alaya/run.js +0 -91
  156. package/core/k-cli/dist/core/output.js +0 -24
  157. package/core/k-cli/dist/core/process.js +0 -38
  158. package/core/k-cli/dist/core/project.js +0 -80
  159. package/core/k-cli/dist/core/spawn.js +0 -268
  160. package/core/k-cli/dist/core/types.js +0 -2
  161. package/core/k-cli/dist/dashboard/update.js +0 -53
  162. package/core/k-cli/dist/dashboard/version.js +0 -20
  163. package/core/k-cli/dist/dispatch/run.js +0 -241
  164. package/core/k-cli/dist/dispatch/status.js +0 -103
  165. package/core/k-cli/dist/index.js +0 -283
  166. package/core/k-cli/dist/project/initialize.js +0 -301
  167. package/core/k-cli/dist/project/install.js +0 -89
  168. package/core/k-cli/dist/project/status.js +0 -138
  169. package/core/k-cli/dist/specialist/list.js +0 -100
  170. package/core/k-cli/dist/specialist/run.js +0 -93
  171. package/core/k-cli/dist/task/create.js +0 -194
  172. package/core/k-cli/dist/task/delete.js +0 -98
  173. package/core/k-cli/dist/task/get.js +0 -55
  174. package/core/k-cli/dist/task/list.js +0 -58
  175. package/core/k-cli/dist/task/submit.js +0 -156
  176. package/core/k-cli/dist/ygg/run.js +0 -51
  177. package/core/k-cli/node_modules/.bin/yaml +0 -16
  178. package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
  179. package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
  180. package/core/k-cli/node_modules/.package-lock.json +0 -23
  181. package/core/k-cli/node_modules/yaml/LICENSE +0 -13
  182. package/core/k-cli/node_modules/yaml/README.md +0 -172
  183. package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
  184. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
  185. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
  186. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
  187. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
  188. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
  189. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
  190. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
  191. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
  192. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
  193. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
  194. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
  195. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
  196. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
  197. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
  198. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
  199. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
  200. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
  201. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
  202. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
  203. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
  204. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
  205. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
  206. package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
  207. package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
  208. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
  209. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
  210. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
  211. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
  212. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
  213. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
  214. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
  215. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
  216. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
  217. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
  218. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
  219. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
  220. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
  221. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
  222. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
  223. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
  224. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
  225. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
  226. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
  227. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
  228. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
  229. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
  230. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
  231. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
  232. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
  233. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
  234. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
  235. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
  236. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
  237. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
  238. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
  239. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
  240. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
  241. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
  242. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
  243. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  244. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
  245. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
  246. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  247. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
  248. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
  249. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
  250. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
  251. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
  252. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
  253. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
  254. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
  255. package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
  256. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
  257. package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
  258. package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
  259. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
  260. package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
  261. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
  262. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
  263. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
  264. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
  265. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
  266. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
  267. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
  268. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
  269. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
  270. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
  271. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
  272. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
  273. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
  274. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
  275. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
  276. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
  277. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
  278. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
  279. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
  280. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
  281. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
  282. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
  283. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
  284. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
  285. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
  286. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
  287. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
  288. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
  289. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
  290. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
  291. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
  292. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
  293. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
  294. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
  295. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
  296. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
  297. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
  298. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
  299. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
  300. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
  301. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
  302. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
  303. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
  304. package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
  305. package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
  306. package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
  307. package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
  308. package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
  309. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
  310. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
  311. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
  312. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
  313. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
  314. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
  315. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
  316. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
  317. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
  318. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
  319. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
  320. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
  321. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
  322. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
  323. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
  324. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
  325. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
  326. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
  327. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
  328. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
  329. package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
  330. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
  331. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
  332. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
  333. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
  334. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
  335. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
  336. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
  337. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
  338. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
  339. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
  340. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
  341. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
  342. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
  343. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
  344. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
  345. package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
  346. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
  347. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
  348. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
  349. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
  350. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
  351. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
  352. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
  353. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
  354. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
  355. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
  356. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
  357. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
  358. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
  359. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
  360. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
  361. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
  362. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
  363. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
  364. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
  365. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
  366. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
  367. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
  368. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
  369. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
  370. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
  371. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
  372. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
  373. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
  374. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
  375. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
  376. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
  377. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
  378. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  379. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
  380. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
  381. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
  382. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  383. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
  384. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
  385. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
  386. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
  387. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
  388. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  389. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
  390. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
  391. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
  392. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
  393. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
  394. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
  395. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
  396. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
  397. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
  398. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
  399. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
  400. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
  401. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
  402. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
  403. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
  404. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
  405. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
  406. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
  407. package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
  408. package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
  409. package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
  410. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
  411. package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
  412. package/core/k-cli/node_modules/yaml/package.json +0 -97
  413. package/core/k-cli/node_modules/yaml/util.js +0 -2
@@ -1,163 +1,163 @@
1
- diff --git a/src/include/storage/file_handle.h b/src/include/storage/file_handle.h
2
- index bff124907..ec9cf3e6a 100644
3
- --- a/src/include/storage/file_handle.h
4
- +++ b/src/include/storage/file_handle.h
5
- @@ -104,6 +104,9 @@ class FileHandle {
6
- common::page_idx_t getNumPages() const { return numPages; }
7
- common::FileInfo* getFileInfo() const { return fileInfo.get(); }
8
- void resetFileInfo() { fileInfo.reset(); }
9
- + void setFileInfo(std::unique_ptr<common::FileInfo> fileInfo_) {
10
- + fileInfo = std::move(fileInfo_);
11
- + }
12
-
13
- uint64_t getPageSize() const {
14
- return isLargePaged() ? common::TEMP_PAGE_SIZE : common::LBUG_PAGE_SIZE;
15
- diff --git a/src/storage/file_handle.cpp b/src/storage/file_handle.cpp
16
- index 5f141f805..ae4f4f327 100644
17
- --- a/src/storage/file_handle.cpp
18
- +++ b/src/storage/file_handle.cpp
19
- @@ -72,6 +72,10 @@ page_idx_t FileHandle::addNewPages(page_idx_t numNewPages) {
20
- page_idx_t FileHandle::addNewPageWithoutLock() {
21
- if (numPages == pageCapacity) {
22
- addNewPageGroupWithoutLock();
23
- + } else if (numPages >= static_cast<page_idx_t>(pageStates.size())) {
24
- + // Reusing retained capacity after a truncate: re-expose the already-allocated slots.
25
- + // ConcurrentVector::resize never deallocates, so this is cheap and leak-free.
26
- + pageStates.resize(pageCapacity);
27
- }
28
- pageStates[numPages].resetToEvicted();
29
- const auto pageIdx = numPages++;
30
- @@ -133,14 +137,13 @@ void FileHandle::removePageIdxAndTruncateIfNecessary(page_idx_t pageIdx) {
31
- return;
32
- }
33
- numPages = pageIdx;
34
- - pageStates.resize(numPages);
35
- - const auto numPageGroups = getNumPageGroups();
36
- - if (numPageGroups == frameGroupIdxes.size()) {
37
- - return;
38
- + // Keep frameGroupIdxes and pageCapacity at their high-water mark so truncated page groups
39
- + // reuse their already-allocated VM frame groups when the file grows again. Shrinking them
40
- + // here permanently leaks a VMRegion frame group per truncated page group
41
- + // (VMRegion::addNewFrameGroup only grows up to max_db_size).
42
- + if (pageStates.size() > numPages) {
43
- + pageStates.resize(numPages);
44
- }
45
- - DASSERT(numPageGroups < frameGroupIdxes.size());
46
- - frameGroupIdxes.resize(numPageGroups);
47
- - pageCapacity = numPageGroups * StorageConstants::PAGE_GROUP_SIZE;
48
- }
49
-
50
- void FileHandle::removePageFromFrameIfNecessary(page_idx_t pageIdx) {
51
- diff --git a/src/storage/shadow_file.cpp b/src/storage/shadow_file.cpp
52
- index eaac734ab..9811166c6 100644
53
- --- a/src/storage/shadow_file.cpp
54
- +++ b/src/storage/shadow_file.cpp
55
- @@ -191,31 +191,62 @@ void ShadowFile::flushAll(main::ClientContext& context) const {
56
-
57
- void ShadowFile::clear(BufferManager& bm) {
58
- DASSERT(shadowingFH);
59
- - // TODO(Guodong): We should remove shadow file here. This requires changes:
60
- - // 1. We need to make shadow file not going through BM.
61
- - // 2. We need to remove fileHandles held in BM, so that BM only keeps FH for the data file.
62
- + // Evict pages, truncate to zero pages (which also truncates the on-disk file), then unlink
63
- + // the path and drop the stale fd so no leftover .shadow file exists at rest (a present
64
- + // .shadow is treated as "checkpoint in progress" by recovery/startup probes). The
65
- + // retained FileHandle keeps its VM frame groups (see reset()); the file is re-created
66
- + // lazily by getOrCreateShadowingFH on the next checkpoint, which also re-reserves the
67
- + // header page.
68
- bm.removeFilePagesFromFrames(*shadowingFH);
69
- shadowingFH->resetToZeroPagesAndPageCapacity();
70
- + shadowingFH->resetFileInfo();
71
- + vfs->removeFileIfExists(shadowFilePath);
72
- shadowPagesMap.clear();
73
- shadowPageRecords.clear();
74
- - // Reserve header page.
75
- - shadowingFH->addNewPage();
76
- }
77
-
78
- void ShadowFile::reset() {
79
- - shadowingFH->resetFileInfo();
80
- - shadowingFH = nullptr;
81
- - vfs->removeFileIfExists(shadowFilePath);
82
- + // Keep the shadowing FileHandle (and its VM frame groups) alive across checkpoints:
83
- + // each FileHandle allocates VMRegion frame groups that count against max_db_size and
84
- + // are never reclaimed, so orphaning the handle here exhausted max_db_size after a
85
- + // handful of checkpoints (see #924). Evict pages, truncate to zero pages (which also
86
- + // truncates the on-disk file), drop the stale fd, and unlink the path so
87
- + // recovery/startup probes — which treat a present .shadow file as "checkpoint in
88
- + // progress" — don't trip on it. getOrCreateShadowingFH re-opens the path into the
89
- + // same retained handle on the next checkpoint, so subsequent shadow pages land in a
90
- + // real on-disk file visible to recovery (which replays by path).
91
- + if (shadowingFH == nullptr) {
92
- + return;
93
- + }
94
- + // If clear() already ran (the normal checkpoint flow calls both), the file was truncated,
95
- + // unlinked and the fd dropped; just make sure the in-memory maps are empty.
96
- + if (shadowingFH->getFileInfo() != nullptr) {
97
- + bm.removeFilePagesFromFrames(*shadowingFH);
98
- + shadowingFH->resetToZeroPagesAndPageCapacity();
99
- + shadowingFH->resetFileInfo();
100
- + vfs->removeFileIfExists(shadowFilePath);
101
- + }
102
- + shadowPagesMap.clear();
103
- + shadowPageRecords.clear();
104
- }
105
-
106
- FileHandle* ShadowFile::getOrCreateShadowingFH() {
107
- if (!shadowingFH) {
108
- shadowingFH = bm.getFileHandle(shadowFilePath,
109
- FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs, nullptr);
110
- - if (shadowingFH->getNumPages() == 0) {
111
- - // Reserve the first page for the header.
112
- - shadowingFH->addNewPage();
113
- - }
114
- + } else if (shadowingFH->getFileInfo() == nullptr) {
115
- + // reset() unlinked the on-disk file and dropped the stale fd (which pointed at the
116
- + // unlinked inode): re-open the same retained FileHandle in place so its identity
117
- + // (fileIndex, frame groups) is preserved and no new VM accounting is consumed.
118
- + // Matches constructPersistentFileHandle's flags for O_PERSISTENT_FILE_CREATE_NOT_EXISTS.
119
- + shadowingFH->setFileInfo(vfs->openFile(shadowFilePath,
120
- + FileOpenFlags(
121
- + FileFlags::WRITE | FileFlags::READ_ONLY | FileFlags::CREATE_IF_NOT_EXISTS),
122
- + nullptr));
123
- + }
124
- + if (shadowingFH->getNumPages() == 0) {
125
- + // Reserve the first page for the header.
126
- + shadowingFH->addNewPage();
127
- }
128
- return shadowingFH;
129
- }
130
- diff --git a/test/api/system_config_test.cpp b/test/api/system_config_test.cpp
131
- index 638b0a685..e398ddc4b 100644
132
- --- a/test/api/system_config_test.cpp
133
- +++ b/test/api/system_config_test.cpp
134
- @@ -101,6 +101,29 @@ TEST_F(SystemConfigTest, testMaxDBSize) {
135
- }
136
- }
137
-
138
- +TEST_F(SystemConfigTest, testRepeatedCheckpointsDoNotExhaustMaxDBSize) {
139
- + // Regression test for https://github.com/LadybugDB/ladybug/issues/924: each CHECKPOINT
140
- + // used to permanently consume ~1 VM frame group of max_db_size accounting (the shadowing
141
- + // FileHandle was orphaned on every checkpoint), so ~7 checkpoints exhausted a 64 MiB cap.
142
- + if (databasePath == "" || databasePath == ":memory:") {
143
- + GTEST_SKIP();
144
- + }
145
- + systemConfig->maxDBSize = 64 * 1024 * 1024;
146
- + auto db = std::make_unique<Database>(databasePath, *systemConfig);
147
- + auto con = std::make_unique<Connection>(db.get());
148
- + assertQuery(*con->query("CREATE NODE TABLE Node(id STRING, payload STRING, PRIMARY KEY(id))"));
149
- + for (auto i = 0; i < 50; ++i) {
150
- + auto res = con->query("MERGE (n:Node {id: 'node-" + std::to_string(i % 10) +
151
- + "'}) ON CREATE SET n.payload = 'x' ON MATCH SET n.payload = 'x'");
152
- + ASSERT_TRUE(res->isSuccess()) << res->toString();
153
- + auto checkpoint = con->query("CHECKPOINT");
154
- + ASSERT_TRUE(checkpoint->isSuccess()) << checkpoint->toString();
155
- + }
156
- + auto count = con->query("MATCH (n:Node) RETURN COUNT(*)");
157
- + ASSERT_TRUE(count->isSuccess()) << count->toString();
158
- + ASSERT_EQ(TestHelper::convertResultToString(*count), std::vector<std::string>{"10"});
159
- +}
160
- +
161
- TEST_F(SystemConfigTest, testBufferPoolSize) {
162
- systemConfig->bufferPoolSize = 1024;
163
- try {
1
+ diff --git a/src/include/storage/file_handle.h b/src/include/storage/file_handle.h
2
+ index bff124907..ec9cf3e6a 100644
3
+ --- a/src/include/storage/file_handle.h
4
+ +++ b/src/include/storage/file_handle.h
5
+ @@ -104,6 +104,9 @@ class FileHandle {
6
+ common::page_idx_t getNumPages() const { return numPages; }
7
+ common::FileInfo* getFileInfo() const { return fileInfo.get(); }
8
+ void resetFileInfo() { fileInfo.reset(); }
9
+ + void setFileInfo(std::unique_ptr<common::FileInfo> fileInfo_) {
10
+ + fileInfo = std::move(fileInfo_);
11
+ + }
12
+
13
+ uint64_t getPageSize() const {
14
+ return isLargePaged() ? common::TEMP_PAGE_SIZE : common::LBUG_PAGE_SIZE;
15
+ diff --git a/src/storage/file_handle.cpp b/src/storage/file_handle.cpp
16
+ index 5f141f805..ae4f4f327 100644
17
+ --- a/src/storage/file_handle.cpp
18
+ +++ b/src/storage/file_handle.cpp
19
+ @@ -72,6 +72,10 @@ page_idx_t FileHandle::addNewPages(page_idx_t numNewPages) {
20
+ page_idx_t FileHandle::addNewPageWithoutLock() {
21
+ if (numPages == pageCapacity) {
22
+ addNewPageGroupWithoutLock();
23
+ + } else if (numPages >= static_cast<page_idx_t>(pageStates.size())) {
24
+ + // Reusing retained capacity after a truncate: re-expose the already-allocated slots.
25
+ + // ConcurrentVector::resize never deallocates, so this is cheap and leak-free.
26
+ + pageStates.resize(pageCapacity);
27
+ }
28
+ pageStates[numPages].resetToEvicted();
29
+ const auto pageIdx = numPages++;
30
+ @@ -133,14 +137,13 @@ void FileHandle::removePageIdxAndTruncateIfNecessary(page_idx_t pageIdx) {
31
+ return;
32
+ }
33
+ numPages = pageIdx;
34
+ - pageStates.resize(numPages);
35
+ - const auto numPageGroups = getNumPageGroups();
36
+ - if (numPageGroups == frameGroupIdxes.size()) {
37
+ - return;
38
+ + // Keep frameGroupIdxes and pageCapacity at their high-water mark so truncated page groups
39
+ + // reuse their already-allocated VM frame groups when the file grows again. Shrinking them
40
+ + // here permanently leaks a VMRegion frame group per truncated page group
41
+ + // (VMRegion::addNewFrameGroup only grows up to max_db_size).
42
+ + if (pageStates.size() > numPages) {
43
+ + pageStates.resize(numPages);
44
+ }
45
+ - DASSERT(numPageGroups < frameGroupIdxes.size());
46
+ - frameGroupIdxes.resize(numPageGroups);
47
+ - pageCapacity = numPageGroups * StorageConstants::PAGE_GROUP_SIZE;
48
+ }
49
+
50
+ void FileHandle::removePageFromFrameIfNecessary(page_idx_t pageIdx) {
51
+ diff --git a/src/storage/shadow_file.cpp b/src/storage/shadow_file.cpp
52
+ index eaac734ab..9811166c6 100644
53
+ --- a/src/storage/shadow_file.cpp
54
+ +++ b/src/storage/shadow_file.cpp
55
+ @@ -191,31 +191,62 @@ void ShadowFile::flushAll(main::ClientContext& context) const {
56
+
57
+ void ShadowFile::clear(BufferManager& bm) {
58
+ DASSERT(shadowingFH);
59
+ - // TODO(Guodong): We should remove shadow file here. This requires changes:
60
+ - // 1. We need to make shadow file not going through BM.
61
+ - // 2. We need to remove fileHandles held in BM, so that BM only keeps FH for the data file.
62
+ + // Evict pages, truncate to zero pages (which also truncates the on-disk file), then unlink
63
+ + // the path and drop the stale fd so no leftover .shadow file exists at rest (a present
64
+ + // .shadow is treated as "checkpoint in progress" by recovery/startup probes). The
65
+ + // retained FileHandle keeps its VM frame groups (see reset()); the file is re-created
66
+ + // lazily by getOrCreateShadowingFH on the next checkpoint, which also re-reserves the
67
+ + // header page.
68
+ bm.removeFilePagesFromFrames(*shadowingFH);
69
+ shadowingFH->resetToZeroPagesAndPageCapacity();
70
+ + shadowingFH->resetFileInfo();
71
+ + vfs->removeFileIfExists(shadowFilePath);
72
+ shadowPagesMap.clear();
73
+ shadowPageRecords.clear();
74
+ - // Reserve header page.
75
+ - shadowingFH->addNewPage();
76
+ }
77
+
78
+ void ShadowFile::reset() {
79
+ - shadowingFH->resetFileInfo();
80
+ - shadowingFH = nullptr;
81
+ - vfs->removeFileIfExists(shadowFilePath);
82
+ + // Keep the shadowing FileHandle (and its VM frame groups) alive across checkpoints:
83
+ + // each FileHandle allocates VMRegion frame groups that count against max_db_size and
84
+ + // are never reclaimed, so orphaning the handle here exhausted max_db_size after a
85
+ + // handful of checkpoints (see #924). Evict pages, truncate to zero pages (which also
86
+ + // truncates the on-disk file), drop the stale fd, and unlink the path so
87
+ + // recovery/startup probes — which treat a present .shadow file as "checkpoint in
88
+ + // progress" — don't trip on it. getOrCreateShadowingFH re-opens the path into the
89
+ + // same retained handle on the next checkpoint, so subsequent shadow pages land in a
90
+ + // real on-disk file visible to recovery (which replays by path).
91
+ + if (shadowingFH == nullptr) {
92
+ + return;
93
+ + }
94
+ + // If clear() already ran (the normal checkpoint flow calls both), the file was truncated,
95
+ + // unlinked and the fd dropped; just make sure the in-memory maps are empty.
96
+ + if (shadowingFH->getFileInfo() != nullptr) {
97
+ + bm.removeFilePagesFromFrames(*shadowingFH);
98
+ + shadowingFH->resetToZeroPagesAndPageCapacity();
99
+ + shadowingFH->resetFileInfo();
100
+ + vfs->removeFileIfExists(shadowFilePath);
101
+ + }
102
+ + shadowPagesMap.clear();
103
+ + shadowPageRecords.clear();
104
+ }
105
+
106
+ FileHandle* ShadowFile::getOrCreateShadowingFH() {
107
+ if (!shadowingFH) {
108
+ shadowingFH = bm.getFileHandle(shadowFilePath,
109
+ FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs, nullptr);
110
+ - if (shadowingFH->getNumPages() == 0) {
111
+ - // Reserve the first page for the header.
112
+ - shadowingFH->addNewPage();
113
+ - }
114
+ + } else if (shadowingFH->getFileInfo() == nullptr) {
115
+ + // reset() unlinked the on-disk file and dropped the stale fd (which pointed at the
116
+ + // unlinked inode): re-open the same retained FileHandle in place so its identity
117
+ + // (fileIndex, frame groups) is preserved and no new VM accounting is consumed.
118
+ + // Matches constructPersistentFileHandle's flags for O_PERSISTENT_FILE_CREATE_NOT_EXISTS.
119
+ + shadowingFH->setFileInfo(vfs->openFile(shadowFilePath,
120
+ + FileOpenFlags(
121
+ + FileFlags::WRITE | FileFlags::READ_ONLY | FileFlags::CREATE_IF_NOT_EXISTS),
122
+ + nullptr));
123
+ + }
124
+ + if (shadowingFH->getNumPages() == 0) {
125
+ + // Reserve the first page for the header.
126
+ + shadowingFH->addNewPage();
127
+ }
128
+ return shadowingFH;
129
+ }
130
+ diff --git a/test/api/system_config_test.cpp b/test/api/system_config_test.cpp
131
+ index 638b0a685..e398ddc4b 100644
132
+ --- a/test/api/system_config_test.cpp
133
+ +++ b/test/api/system_config_test.cpp
134
+ @@ -101,6 +101,29 @@ TEST_F(SystemConfigTest, testMaxDBSize) {
135
+ }
136
+ }
137
+
138
+ +TEST_F(SystemConfigTest, testRepeatedCheckpointsDoNotExhaustMaxDBSize) {
139
+ + // Regression test for https://github.com/LadybugDB/ladybug/issues/924: each CHECKPOINT
140
+ + // used to permanently consume ~1 VM frame group of max_db_size accounting (the shadowing
141
+ + // FileHandle was orphaned on every checkpoint), so ~7 checkpoints exhausted a 64 MiB cap.
142
+ + if (databasePath == "" || databasePath == ":memory:") {
143
+ + GTEST_SKIP();
144
+ + }
145
+ + systemConfig->maxDBSize = 64 * 1024 * 1024;
146
+ + auto db = std::make_unique<Database>(databasePath, *systemConfig);
147
+ + auto con = std::make_unique<Connection>(db.get());
148
+ + assertQuery(*con->query("CREATE NODE TABLE Node(id STRING, payload STRING, PRIMARY KEY(id))"));
149
+ + for (auto i = 0; i < 50; ++i) {
150
+ + auto res = con->query("MERGE (n:Node {id: 'node-" + std::to_string(i % 10) +
151
+ + "'}) ON CREATE SET n.payload = 'x' ON MATCH SET n.payload = 'x'");
152
+ + ASSERT_TRUE(res->isSuccess()) << res->toString();
153
+ + auto checkpoint = con->query("CHECKPOINT");
154
+ + ASSERT_TRUE(checkpoint->isSuccess()) << checkpoint->toString();
155
+ + }
156
+ + auto count = con->query("MATCH (n:Node) RETURN COUNT(*)");
157
+ + ASSERT_TRUE(count->isSuccess()) << count->toString();
158
+ + ASSERT_EQ(TestHelper::convertResultToString(*count), std::vector<std::string>{"10"});
159
+ +}
160
+ +
161
+ TEST_F(SystemConfigTest, testBufferPoolSize) {
162
+ systemConfig->bufferPoolSize = 1024;
163
+ try {