kenaz 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
- package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
- package/core/.claude/commands/Ansuz.md +19 -30
- package/core/.claude/hooks/_ansuz-conversation.js +1 -0
- package/core/.claude/hooks/_ansuz-conversation.test.js +6 -0
- package/core/.claude/hooks/_run-user-prompt.js +0 -4
- package/core/.claude/hooks/_run-user-prompt.test.js +2 -3
- package/core/.claude/hooks/session-init.ps1 +49 -49
- package/core/.claude/settings.json +0 -37
- package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/core/.collaboration/core/task-api.js +3 -8
- package/core/.formation/bifrost/codex-doctor.js +1 -0
- package/core/.formation/bifrost/setup-codex.js +14 -5
- package/core/.formation/bifrost/setup-codex.test.js +20 -0
- package/core/.formation/tests/hello.txt +2 -2
- package/core/.formation/tools/prompt.js +58 -5
- package/core/.formation/tools/prompt.test.js +29 -0
- package/core/.kenaz/claude-hooks-manifest.json +16 -16
- package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
- package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
- package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
- package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
- package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
- package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
- package/core/.kenaz/muninn_episode_write.ps1 +17 -17
- package/core/.kenaz/specialist/field_report_watermark.json +1 -1
- package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
- package/core/.kenaz/specialist/t1777_probe.txt +1 -1
- package/core/.matrix/index.matrix +5 -5
- package/core/.specialist/Ansuz/RULES.md +6 -10
- package/core/.specialist/tools/__tests__/task-2218-boot-session-id.test.js +17 -1
- package/core/.specialist/tools/__tests__/task-2222-session-identity-interleave.test.js +17 -1
- package/core/.specialist/tools/__tests__/task-2254-handoff-archive-contract.test.js +6 -5
- package/core/.specialist/tools/ansuz-boot-fast.js +44 -100
- package/core/.specialist/tools/ansuz-boot-fast.test.js +45 -1
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
- package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
- package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
- package/core/dev/jev-eval/README.md +99 -99
- package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
- package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
- package/core/dev/pipeline/tasks/.gitkeep +1 -1
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
- package/core/dev/plans/ANSUZ_SLIM_PLAN.md +68 -0
- package/core/dev/scripts/init_git.sh +0 -0
- package/core/dev/scripts/init_project.sh +0 -0
- package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
- package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
- package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
- package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
- package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
- package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
- package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
- package/core/dev/scripts/run_once.sh +0 -0
- package/core/dev/scripts/setup_mcp.sh +0 -0
- package/core/dev/scripts/setup_rag.sh +0 -0
- package/core/dev/scripts/start_dev_agent.sh +0 -0
- package/core/dev/scripts/start_multi_agent.sh +0 -0
- package/core/dev/scripts/sync_task_queue.sh +0 -0
- package/core/k-cli/dist/alaya/run.js +91 -0
- package/core/k-cli/dist/core/output.js +24 -0
- package/core/k-cli/dist/core/process.js +38 -0
- package/core/k-cli/dist/core/project.js +80 -0
- package/core/k-cli/dist/core/spawn.js +268 -0
- package/core/k-cli/dist/core/types.js +2 -0
- package/core/k-cli/dist/dashboard/update.js +53 -0
- package/core/k-cli/dist/dashboard/version.js +20 -0
- package/core/k-cli/dist/dispatch/run.js +241 -0
- package/core/k-cli/dist/dispatch/status.js +103 -0
- package/core/k-cli/dist/index.js +283 -0
- package/core/k-cli/dist/project/initialize.js +301 -0
- package/core/k-cli/dist/project/install.js +89 -0
- package/core/k-cli/dist/project/status.js +138 -0
- package/core/k-cli/dist/specialist/list.js +100 -0
- package/core/k-cli/dist/specialist/run.js +93 -0
- package/core/k-cli/dist/task/create.js +194 -0
- package/core/k-cli/dist/task/delete.js +98 -0
- package/core/k-cli/dist/task/get.js +55 -0
- package/core/k-cli/dist/task/list.js +58 -0
- package/core/k-cli/dist/task/submit.js +156 -0
- package/core/k-cli/dist/ygg/run.js +51 -0
- package/core/k-cli/node_modules/.bin/yaml +16 -0
- package/core/k-cli/node_modules/.bin/yaml.cmd +17 -0
- package/core/k-cli/node_modules/.bin/yaml.ps1 +28 -0
- package/core/k-cli/node_modules/.package-lock.json +23 -0
- package/core/k-cli/node_modules/yaml/LICENSE +13 -0
- package/core/k-cli/node_modules/yaml/README.md +172 -0
- package/core/k-cli/node_modules/yaml/bin.mjs +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +217 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/core/k-cli/node_modules/yaml/browser/dist/errors.js +57 -0
- package/core/k-cli/node_modules/yaml/browser/dist/index.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/log.js +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +114 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +717 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +967 -0
- package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/core/k-cli/node_modules/yaml/browser/dist/util.js +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/visit.js +233 -0
- package/core/k-cli/node_modules/yaml/browser/index.js +5 -0
- package/core/k-cli/node_modules/yaml/browser/package.json +3 -0
- package/core/k-cli/node_modules/yaml/dist/cli.d.ts +8 -0
- package/core/k-cli/node_modules/yaml/dist/cli.mjs +201 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/core/k-cli/node_modules/yaml/dist/compose/composer.js +222 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +225 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/core/k-cli/node_modules/yaml/dist/doc/Document.js +337 -0
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/core/k-cli/node_modules/yaml/dist/doc/directives.js +178 -0
- package/core/k-cli/node_modules/yaml/dist/errors.d.ts +21 -0
- package/core/k-cli/node_modules/yaml/dist/errors.js +62 -0
- package/core/k-cli/node_modules/yaml/dist/index.d.ts +25 -0
- package/core/k-cli/node_modules/yaml/dist/index.js +50 -0
- package/core/k-cli/node_modules/yaml/dist/log.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/log.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +116 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +43 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/options.d.ts +350 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst.js +112 -0
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +719 -0
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/core/k-cli/node_modules/yaml/dist/parse/parser.js +972 -0
- package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/core/k-cli/node_modules/yaml/dist/public-api.js +107 -0
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/core/k-cli/node_modules/yaml/dist/schema/tags.js +99 -0
- package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +26 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/test-events.js +134 -0
- package/core/k-cli/node_modules/yaml/dist/util.d.ts +16 -0
- package/core/k-cli/node_modules/yaml/dist/util.js +28 -0
- package/core/k-cli/node_modules/yaml/dist/visit.d.ts +102 -0
- package/core/k-cli/node_modules/yaml/dist/visit.js +236 -0
- package/core/k-cli/node_modules/yaml/package.json +97 -0
- package/core/k-cli/node_modules/yaml/util.js +2 -0
- package/core/plugins/kenaz/commands/Ansuz.md +19 -30
- package/core/plugins/kenaz/commands/kenaz.md +1 -1
- package/core/plugins/kenaz/hooks/hooks.json +1 -5
- package/core/plugins/kenaz/hooks/kenaz-hook.js +0 -4
- package/core/plugins/kenaz/scripts/kenaz-mode.js +10 -4
- package/core/plugins/kenaz/scripts/kenaz.test.js +1 -1
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/lib/cli.js +50 -3
- package/lib/cli.test.js +35 -0
- package/lib/dashboard.js +10 -0
- package/package.json +6 -6
- package/core/.specialist/tools/__tests__/task-1863-boot-lease-reuse.test.js +0 -99
- package/core/.specialist/tools/__tests__/task-1977-banner-cap.test.js +0 -129
|
@@ -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 {
|