@getollie/cli 0.0.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2515 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.js +944 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -13
- package/library/data_science-data_visualization_dashboards/air-quality-realtime-monitoring-system.json +0 -68
- package/library/data_science-data_visualization_dashboards/analyze-file-data-dashboard-html.json +0 -68
- package/library/data_science-data_visualization_dashboards/annual-air-quality-analysis-page.json +0 -68
- package/library/data_science-data_visualization_dashboards/aquaculture-dashboard-html-chartjs.json +0 -68
- package/library/data_science-data_visualization_dashboards/armored-transport-industry-data-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/bar-chart-consumption-savings-comparison.json +0 -68
- package/library/data_science-data_visualization_dashboards/candlestick-charts-patterns-buy-sell-resistance.json +0 -68
- package/library/data_science-data_visualization_dashboards/cdn-monitoring-tool-global-speed-availability.json +0 -68
- package/library/data_science-data_visualization_dashboards/china-3d-map-new-energy-vehicle-sales.json +0 -68
- package/library/data_science-data_visualization_dashboards/china-real-estate-prices-rose-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/china-unicom-data-transformation-stages.json +0 -68
- package/library/data_science-data_visualization_dashboards/code-expert-html-visualizations-data-presentations.json +0 -68
- package/library/data_science-data_visualization_dashboards/comprehensive-analysis-report-table-data-visualization-design.json +0 -68
- package/library/data_science-data_visualization_dashboards/construction-task-gantt-chart-generator.json +0 -68
- package/library/data_science-data_visualization_dashboards/consumption-willingness-by-city-type-bar-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/create-pie-chart-from-table-data-html.json +0 -68
- package/library/data_science-data_visualization_dashboards/create-visualizations-from-code-expert.json +0 -68
- package/library/data_science-data_visualization_dashboards/d3js-heatmap-from-scatter-data.json +0 -68
- package/library/data_science-data_visualization_dashboards/dash-plotly-temperature-pressure-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/data-analysis-dashboard-html-output.json +0 -68
- package/library/data_science-data_visualization_dashboards/data-analysis-visual-presentation-html-output.json +0 -68
- package/library/data_science-data_visualization_dashboards/desktop-bi-analysis-software.json +0 -68
- package/library/data_science-data_visualization_dashboards/drowning-victim-behavior-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/dual-curve-backtest-stock-returns-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/dupont-analysis-chart-html.json +0 -68
- package/library/data_science-data_visualization_dashboards/dynamic-data-dashboard-charts-visualizations.json +0 -68
- package/library/data_science-data_visualization_dashboards/echarts-bubble-chart-engine-displacement-price-market-share.json +0 -68
- package/library/data_science-data_visualization_dashboards/echarts-uniapp-vue3-example.json +0 -68
- package/library/data_science-data_visualization_dashboards/embroidery-products-economic-environmental-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/family-tree-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/four-quadrant-news-material-screening-method.json +0 -68
- package/library/data_science-data_visualization_dashboards/full-visualization-process-number-screening.json +0 -68
- package/library/data_science-data_visualization_dashboards/g2-well-logging-curves-frontend-page.json +0 -68
- package/library/data_science-data_visualization_dashboards/generate-bar-charts-age-education-from-spreadsheet.json +0 -68
- package/library/data_science-data_visualization_dashboards/goldencutchart-drilling-speed-footage-trendline.json +0 -68
- package/library/data_science-data_visualization_dashboards/grade-distribution-and-change-charts.json +0 -68
- package/library/data_science-data_visualization_dashboards/healthcare-big-data-dashboard-vue-echarts.json +0 -68
- package/library/data_science-data_visualization_dashboards/hebei-digital-economy-residential-consumption-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/html-chartjs-cylindrical-fairing-display.json +0 -68
- package/library/data_science-data_visualization_dashboards/html-daily-attendance-timeline-with-color-blocks.json +0 -68
- package/library/data_science-data_visualization_dashboards/html-quadratic-function-graph-plotter.json +0 -68
- package/library/data_science-data_visualization_dashboards/html-rose-chart-housing-prices-chinese-cities.json +0 -68
- package/library/data_science-data_visualization_dashboards/html-tool-generate-trend-chart-from-table-data.json +0 -68
- package/library/data_science-data_visualization_dashboards/html-word-cloud-generator.json +0 -68
- package/library/data_science-data_visualization_dashboards/implement-3d-charts-maps-vue2-echarts.json +0 -68
- package/library/data_science-data_visualization_dashboards/inverse-proportion-graphs-for-elementary-math.json +0 -68
- package/library/data_science-data_visualization_dashboards/javascript-module-dlis-imaging-log-curves-web-page.json +0 -68
- package/library/data_science-data_visualization_dashboards/javaweb-echarts-data-visualization-miniprogram.json +0 -68
- package/library/data_science-data_visualization_dashboards/job-displacement-risk-public-administration-digital-transformation-line-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/logistics-flow-map-top-20-countries.json +0 -68
- package/library/data_science-data_visualization_dashboards/medical-visualization-dashboard-html.json +0 -68
- package/library/data_science-data_visualization_dashboards/mobile-executive-data-platform-product.json +0 -68
- package/library/data_science-data_visualization_dashboards/monthly-electricity-sales-and-prices-trend-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/nightingale-docker-monitoring-dashboard-metrics.json +0 -68
- package/library/data_science-data_visualization_dashboards/personnel-data-dashboard-visualization-html.json +0 -68
- package/library/data_science-data_visualization_dashboards/production-scheduling-visualization-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/provinces-job-levels-column-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/python-amazon-sock-product-dashboard-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/python-financial-data-reports-frontend-display.json +0 -68
- package/library/data_science-data_visualization_dashboards/react-echarts-china-map-geojson-api.json +0 -68
- package/library/data_science-data_visualization_dashboards/realtime-stock-pattern-alert-monitor.json +0 -68
- package/library/data_science-data_visualization_dashboards/retail-consumer-credit-data-dashboard-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/selinux-policy-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/sentence-structure-complexity-visualization-experts-ai.json +0 -68
- package/library/data_science-data_visualization_dashboards/shaanxi-elderly-care-data-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/shanxi-gdp-growth-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/smart-restaurant-data-dashboard-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/stock-limit-up-monitoring-display.json +0 -68
- package/library/data_science-data_visualization_dashboards/stock-price-k-line-charts-app.json +0 -68
- package/library/data_science-data_visualization_dashboards/stock-trading-volume-bar-charts.json +0 -68
- package/library/data_science-data_visualization_dashboards/team-capability-matrix-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/team-training-duration-win-rate-line-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/tech-changes-talent-demand-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/three-3d-pie-charts-distributions.json +0 -68
- package/library/data_science-data_visualization_dashboards/tonghuashun-k-line-chart-rising-limit.json +0 -68
- package/library/data_science-data_visualization_dashboards/training-industry-data-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/uniapp-ecg-drawing-fixed-data.json +0 -68
- package/library/data_science-data_visualization_dashboards/uniapp-editable-knowledge-graph.json +0 -68
- package/library/data_science-data_visualization_dashboards/uniapp-vue3-ts-h5-line-bar-charts-page.json +0 -68
- package/library/data_science-data_visualization_dashboards/us-population-changes-dashboard-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/visitor-flow-analysis-xinzhou-vue-implementation.json +0 -68
- package/library/data_science-data_visualization_dashboards/visualization-dashboard-word-cloud-code-with-npm.json +0 -68
- package/library/data_science-data_visualization_dashboards/visualize-excel-pois-clustering-on-map-html.json +0 -68
- package/library/data_science-data_visualization_dashboards/visualize-temperature-data-from-serial-monitor-web-interface.json +0 -68
- package/library/data_science-data_visualization_dashboards/visualize-trajectories-code-segment.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue-3-interface-data-list-line-charts.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue-antv-china-national-map.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue-d3-github-calendar-heatmap.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue-realtime-3d-warehouse-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue2-d3-pure-tone-audiometry-chart.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue2-echarts-wenzhou-map-district-data-bar-charts.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue2-element-ui-fastapi-tortoise-echarts-dashboard.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue3-echarts-line-chart-with-search.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue3-leaflet-temperature-data-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/vue3-threejs-dynamic-map-dashboard-visualization.json +0 -68
- package/library/data_science-data_visualization_dashboards/water-margin-character-relationship-diagram.json +0 -68
- package/library/data_science-data_visualization_dashboards/web-data-monitoring-excel-import.json +0 -68
- package/library/data_science-data_visualization_dashboards/web-page-excel-upload-charts-display.json +0 -68
- package/library/data_science-data_visualization_dashboards/wechat-mini-program-data-analysis-page.json +0 -68
- package/library/data_science-data_visualization_dashboards/world-empires-gantt-chart.json +0 -68
- package/library/data_science-machine_learning/ai-quant-trading-digital-currency-product.json +0 -68
- package/library/data_science-machine_learning/eyebrow-controlled-phone-app-with-ui.json +0 -68
- package/library/data_science-machine_learning/facial-expression-recognition-webcam-project.json +0 -68
- package/library/data_science-machine_learning/model-training-page.json +0 -68
- package/library/data_science-machine_learning/opencvjs-image-polygon-text-extraction.json +0 -68
- package/library/data_science-machine_learning/pyqt-interface-brain-tumor-yolov8-detection.json +0 -68
- package/library/data_science-machine_learning/text-to-image-generation-tool-development.json +0 -68
- package/library/data_science-machine_learning/web-program-import-tables-convert-to-ai-language.json +0 -68
- package/library/data_science-predictive_modeling/grain-oil-futures-analysis-software.json +0 -68
- package/library/data_science-predictive_modeling/power-station-trend-prediction-optimization-scheduling.json +0 -68
- package/library/data_science-predictive_modeling/program-for-market-software-buy-sell-signals.json +0 -68
- package/library/data_science-predictive_modeling/real-time-trading-signals-high-accuracy.json +0 -68
- package/library/data_science-predictive_modeling/sales-forecasts-in-tabular-format.json +0 -68
- package/library/data_science-predictive_modeling/stock-k-line-wave-analysis-buy-sell-points.json +0 -68
- package/library/data_science-statistical_analysis/ahp-decision-making-program.json +0 -68
- package/library/data_science-statistical_analysis/browser-data-post-processing-software.json +0 -68
- package/library/data_science-statistical_analysis/data-analysis-tool-with-excel-support.json +0 -68
- package/library/data_science-statistical_analysis/demonstrate-process-deriving-pi-html.json +0 -68
- package/library/data_science-statistical_analysis/design-complete-quantitative-factor-research-platform.json +0 -68
- package/library/data_science-statistical_analysis/energy-water-consumption-heat-stations-chart-analysis.json +0 -68
- package/library/data_science-statistical_analysis/stock-selection-yearly-moving-average-breakthrough.json +0 -68
- package/library/data_science-statistical_analysis/web-page-compare-number-frequency-shuffle-reorder.json +0 -68
- package/library/game_development-action_rhythm/browser-dinosaur-game-theme.json +0 -68
- package/library/game_development-action_rhythm/catch-fruit-game-html-javascript.json +0 -68
- package/library/game_development-action_rhythm/character-animation-state-switching.json +0 -68
- package/library/game_development-action_rhythm/classic-brick-breaking-game-code.json +0 -68
- package/library/game_development-action_rhythm/create-dancing-pixel-ponies.json +0 -68
- package/library/game_development-action_rhythm/crossy-road-game-threejs-implementation.json +0 -68
- package/library/game_development-action_rhythm/css-html-platform-game.json +0 -68
- package/library/game_development-action_rhythm/dinosaur-hunter-game-html-javascript.json +0 -68
- package/library/game_development-action_rhythm/fish-at-work-smash-wechat-game.json +0 -68
- package/library/game_development-action_rhythm/generate-combat-attack-game-code.json +0 -68
- package/library/game_development-action_rhythm/giant-squid-parkour-airplanes-turtle-shells-mini-game.json +0 -68
- package/library/game_development-action_rhythm/godzilla-vs-kong-click-speed-game.json +0 -68
- package/library/game_development-action_rhythm/google-chrome-dinosaur-game-html-javascript.json +0 -68
- package/library/game_development-action_rhythm/google-chrome-dinosaur-game.json +0 -68
- package/library/game_development-action_rhythm/gorilla-chase-parkour-running-game.json +0 -68
- package/library/game_development-action_rhythm/html-game-character-sprints-forward.json +0 -68
- package/library/game_development-action_rhythm/html-javascript-drift-mechanism-implementation.json +0 -68
- package/library/game_development-action_rhythm/html-javascript-platform-jumping-game.json +0 -68
- package/library/game_development-action_rhythm/html-javascript-rhythm-game-custom-music-levels.json +0 -68
- package/library/game_development-action_rhythm/html-javascript-sliding-challenge-game.json +0 -68
- package/library/game_development-action_rhythm/html-javascript-sound-reaction-game.json +0 -68
- package/library/game_development-action_rhythm/html-kpop-music-game-hit-keys-card-upgrade.json +0 -68
- package/library/game_development-action_rhythm/html5-game-virtual-joystick-npc-combat-vehicles-missions-map.json +0 -68
- package/library/game_development-action_rhythm/mario-style-game-html.json +0 -68
- package/library/game_development-action_rhythm/monkey-king-havoc-in-heaven-game.json +0 -68
- package/library/game_development-action_rhythm/music-rhythm-training-application.json +0 -68
- package/library/game_development-action_rhythm/musical-rhythm-key-response-action-game.json +0 -68
- package/library/game_development-action_rhythm/pacman-web-game-html-css-javascript.json +0 -68
- package/library/game_development-action_rhythm/pixel-dance-rhythm-music-game.json +0 -68
- package/library/game_development-action_rhythm/pixel-racing-game.json +0 -68
- package/library/game_development-action_rhythm/real-time-battle-game-html-javascript.json +0 -68
- package/library/game_development-action_rhythm/rhythm-game-difficulty-curve-changes.json +0 -68
- package/library/game_development-action_rhythm/sekiro-sword-clash-combat-deflection-core-code.json +0 -68
- package/library/game_development-action_rhythm/ski-adventure-game-html-javascript.json +0 -68
- package/library/game_development-action_rhythm/snake-game-program-creation.json +0 -68
- package/library/game_development-action_rhythm/super-mario-complex-game.json +0 -68
- package/library/game_development-action_rhythm/super-mario-game-html-code.json +0 -68
- package/library/game_development-action_rhythm/super-mario-game-html-single-file.json +0 -68
- package/library/game_development-action_rhythm/super-mario-game-javascript.json +0 -68
- package/library/game_development-action_rhythm/super-mario-like-game-javascript.json +0 -68
- package/library/game_development-action_rhythm/super-mario-like-mobile-game.json +0 -68
- package/library/game_development-action_rhythm/super-mario-mini-game-web-browser.json +0 -68
- package/library/game_development-action_rhythm/super-mario-style-game-introduction.json +0 -68
- package/library/game_development-action_rhythm/super-mario-web-game.json +0 -68
- package/library/game_development-action_rhythm/tank-battle-game-code.json +0 -68
- package/library/game_development-action_rhythm/temple-run-style-girl-protagonist-game.json +0 -68
- package/library/game_development-action_rhythm/tiktok-douyin-agar-io-mini-game.json +0 -68
- package/library/game_development-action_rhythm/two-figures-fighting-animation-mobile.json +0 -68
- package/library/game_development-action_rhythm/two-player-fighting-web-game.json +0 -68
- package/library/game_development-action_rhythm/web-animation-stick-figures-fighting.json +0 -68
- package/library/game_development-action_rhythm/wong-ka-kui-parkour-game-html.json +0 -68
- package/library/game_development-adventure/ancient-ruins-adventure-game-html-js.json +0 -68
- package/library/game_development-adventure/character-disappears-scene-appears-mouse-click.json +0 -68
- package/library/game_development-adventure/complete-text-adventure-game-code.json +0 -68
- package/library/game_development-adventure/harry-potter-chamber-of-secrets-game.json +0 -68
- package/library/game_development-adventure/html-javascript-level-switching-game.json +0 -68
- package/library/game_development-adventure/html-javascript-webvr-game-implementation.json +0 -68
- package/library/game_development-adventure/knight-77-rescues-prince-cloud-game.json +0 -68
- package/library/game_development-adventure/narrative-game-song-dynasty-time-travel-cat.json +0 -68
- package/library/game_development-casual/10-years-from-now-randomizer-webpage.json +0 -68
- package/library/game_development-casual/2d-mobile-racing-game-with-clear-graphics.json +0 -68
- package/library/game_development-casual/browser-snake-game-creation.json +0 -68
- package/library/game_development-casual/capital-letters-typing-practice-game.json +0 -68
- package/library/game_development-casual/cat-character-collects-bamboo-every-15-min.json +0 -68
- package/library/game_development-casual/chinese-character-pinyin-matching-game.json +0 -68
- package/library/game_development-casual/chinese-character-pronunciation-game.json +0 -68
- package/library/game_development-casual/claw-machine-game-with-cute-characters.json +0 -68
- package/library/game_development-casual/cocos-creator-vertical-scrollview-customers-projects.json +0 -68
- package/library/game_development-casual/cocos-java-3d-pinball-game.json +0 -68
- package/library/game_development-casual/company-annual-meeting-lucky-draw.json +0 -68
- package/library/game_development-casual/dinosaur-themed-match-3-game.json +0 -68
- package/library/game_development-casual/elementary-ket-vocabulary-game.json +0 -68
- package/library/game_development-casual/english-vocabulary-memorization-game-web-page.json +0 -68
- package/library/game_development-casual/geographical-riddle-guessing-game.json +0 -68
- package/library/game_development-casual/ghibli-red-panda-doodle-jump-game-website.json +0 -68
- package/library/game_development-casual/html-dice-rolling-program.json +0 -68
- package/library/game_development-casual/html-javascript-catch-collect-game.json +0 -68
- package/library/game_development-casual/html-javascript-friend-system-game.json +0 -68
- package/library/game_development-casual/html-javascript-sound-effects-background-music-system.json +0 -68
- package/library/game_development-casual/html-js-character-animation-game.json +0 -68
- package/library/game_development-casual/html-luck-based-dice-game.json +0 -68
- package/library/game_development-casual/html-scrollbar-idle-game.json +0 -68
- package/library/game_development-casual/html-small-lucky-draw-program.json +0 -68
- package/library/game_development-casual/html-snake-game.json +0 -68
- package/library/game_development-casual/html5-sailing-mini-game-character-symbols.json +0 -68
- package/library/game_development-casual/jump-jump-game-assistant-jumping-distance.json +0 -68
- package/library/game_development-casual/keyboard-practice-master.json +0 -68
- package/library/game_development-casual/livestream-score-tracker.json +0 -68
- package/library/game_development-casual/marble-elimination-game.json +0 -68
- package/library/game_development-casual/nezha-whack-a-marmot-game.json +0 -68
- package/library/game_development-casual/one-piece-semiconductor-game.json +0 -68
- package/library/game_development-casual/princess-makeup-game.json +0 -68
- package/library/game_development-casual/prize-wheel-game-with-editable-content.json +0 -68
- package/library/game_development-casual/pubg-mobile-vocabulary-lottery-system.json +0 -68
- package/library/game_development-casual/random-number-selector-two-color-ball-lottery.json +0 -68
- package/library/game_development-casual/random-prize-draw-program.json +0 -68
- package/library/game_development-casual/simple-jump-game-design.json +0 -68
- package/library/game_development-casual/single-page-fishing-game-html-css-js.json +0 -68
- package/library/game_development-casual/ski-free-html-javascript-game.json +0 -68
- package/library/game_development-casual/small-decompression-game.json +0 -68
- package/library/game_development-casual/stickman-mini-game-html-web-format.json +0 -68
- package/library/game_development-casual/two-player-hand-hitting-game.json +0 -68
- package/library/game_development-casual/typing-game-implementation.json +0 -68
- package/library/game_development-casual/uniapp-blind-box-lottery-system.json +0 -68
- package/library/game_development-casual/uniapp-lucky-draw-lottery-marquee-animation.json +0 -68
- package/library/game_development-casual/viral-cat-confession-code.json +0 -68
- package/library/game_development-casual/web-chinese-english-matching-game.json +0 -68
- package/library/game_development-casual/web-english-vocabulary-matching-game.json +0 -68
- package/library/game_development-casual/web-fast-paced-ball-dot-eater-game.json +0 -68
- package/library/game_development-casual/web-mini-game-trending-hit-songs.json +0 -68
- package/library/game_development-casual/web-vocabulary-memorization-game.json +0 -68
- package/library/game_development-casual/wechat-mini-program-family-social-game.json +0 -68
- package/library/game_development-casual/wechat-mini-program-snake-game.json +0 -68
- package/library/game_development-casual/wechat-mini-program-swipe-data-navigation.json +0 -68
- package/library/game_development-casual/wechat-mini-program-t-rex-running-game.json +0 -68
- package/library/game_development-casual/whack-a-mole-mini-game-html-frontend.json +0 -68
- package/library/game_development-casual/whack-a-mole-mini-game.json +0 -68
- package/library/game_development-casual/world-of-warcraft-manual-counting-script.json +0 -68
- package/library/game_development-puzzle/2048-game-implementation-html5.json +0 -68
- package/library/game_development-puzzle/2048-game-implementation.json +0 -68
- package/library/game_development-puzzle/2048-mini-game-browser-implementation.json +0 -68
- package/library/game_development-puzzle/5th-grade-science-heart-brain-quiz-game.json +0 -68
- package/library/game_development-puzzle/angry-birds-game-implementation.json +0 -68
- package/library/game_development-puzzle/asia-climate-puzzle-game-for-students.json +0 -68
- package/library/game_development-puzzle/candy-crush-wechat-mini-game.json +0 -68
- package/library/game_development-puzzle/chinese-english-word-matching-game-html.json +0 -68
- package/library/game_development-puzzle/chinese-idiom-guessing-game-mobile.json +0 -68
- package/library/game_development-puzzle/collaborative-puzzle-solving-game.json +0 -68
- package/library/game_development-puzzle/color-elimination-game-8x8-grid.json +0 -68
- package/library/game_development-puzzle/cub-n-pup-drag-rotate-puzzle-game.json +0 -68
- package/library/game_development-puzzle/english-card-flipping-memory-game.json +0 -68
- package/library/game_development-puzzle/english-word-elimination-game-for-children.json +0 -68
- package/library/game_development-puzzle/fifth-grade-science-textbook-outline-game.json +0 -68
- package/library/game_development-puzzle/front-end-program-tetris-mini-game.json +0 -68
- package/library/game_development-puzzle/fruit-matching-game.json +0 -68
- package/library/game_development-puzzle/gravity-control-html-javascript-game.json +0 -68
- package/library/game_development-puzzle/how-to-design-implement-tetris-game.json +0 -68
- package/library/game_development-puzzle/html-6x6-klotski-sliding-block-puzzle.json +0 -68
- package/library/game_development-puzzle/html-javascript-environmental-interaction-game.json +0 -68
- package/library/game_development-puzzle/html-javascript-rubiks-cube-game.json +0 -68
- package/library/game_development-puzzle/html-javascript-sudoku-solver.json +0 -68
- package/library/game_development-puzzle/html-math-game-quadratic-equations-radicals.json +0 -68
- package/library/game_development-puzzle/html-math-game-triangles-line-segment.json +0 -68
- package/library/game_development-puzzle/html-mini-game-city-landmark-memory-challenge.json +0 -68
- package/library/game_development-puzzle/html-party-member-quiz-competition-game.json +0 -68
- package/library/game_development-puzzle/html-tetris-game.json +0 -68
- package/library/game_development-puzzle/html-tetris-mini-game-creation.json +0 -68
- package/library/game_development-puzzle/html-vocabulary-game.json +0 -68
- package/library/game_development-puzzle/html-word-matching-game-with-upload.json +0 -68
- package/library/game_development-puzzle/html5-merge-big-watermelon-game.json +0 -68
- package/library/game_development-puzzle/html5-sudoku-game-development.json +0 -68
- package/library/game_development-puzzle/icon-matching-game-implementation.json +0 -68
- package/library/game_development-puzzle/javascript-canvas-match-3-puzzle-game.json +0 -68
- package/library/game_development-puzzle/lianliankan-puzzle-game-with-optimal-path.json +0 -68
- package/library/game_development-puzzle/magic-forest-game-with-puzzles.json +0 -68
- package/library/game_development-puzzle/match-3-game-implementation.json +0 -68
- package/library/game_development-puzzle/match-3-game-with-grid-and-score.json +0 -68
- package/library/game_development-puzzle/match-three-game-with-names.json +0 -68
- package/library/game_development-puzzle/match-three-puzzle-game.json +0 -68
- package/library/game_development-puzzle/matching-game-lianliankan-html-small-animals.json +0 -68
- package/library/game_development-puzzle/minesweeper-game-html.json +0 -68
- package/library/game_development-puzzle/minesweeper-game-implementation.json +0 -68
- package/library/game_development-puzzle/minesweeper-game-with-home-demo-tabs.json +0 -68
- package/library/game_development-puzzle/minesweeper-mini-game.json +0 -68
- package/library/game_development-puzzle/mobile-tetris-game-development.json +0 -68
- package/library/game_development-puzzle/mobile-tetris-game-with-instructions.json +0 -68
- package/library/game_development-puzzle/mobile-tetris-game.json +0 -68
- package/library/game_development-puzzle/multi-player-pixel-block-elimination-game-analysis.json +0 -68
- package/library/game_development-puzzle/nine-grid-klotski-puzzle-game.json +0 -68
- package/library/game_development-puzzle/number-connection-animal-game-1-to-1000.json +0 -68
- package/library/game_development-puzzle/offline-vocabulary-english-tetris-game.json +0 -68
- package/library/game_development-puzzle/reflection-maze-game.json +0 -68
- package/library/game_development-puzzle/rewrite-simple-match-3-game.json +0 -68
- package/library/game_development-puzzle/rubiks-cube-solver-visualization.json +0 -68
- package/library/game_development-puzzle/russian-tetris-game-four-direction-html.json +0 -68
- package/library/game_development-puzzle/sheep-a-sheep-like-game-code.json +0 -68
- package/library/game_development-puzzle/sheep-a-sheep-mini-game.json +0 -68
- package/library/game_development-puzzle/shooting-puzzle-game-with-target-interaction.json +0 -68
- package/library/game_development-puzzle/simple-tetris-game-in-html.json +0 -68
- package/library/game_development-puzzle/sokoban-box-pushing-game.json +0 -68
- package/library/game_development-puzzle/sokoban-game-implementation.json +0 -68
- package/library/game_development-puzzle/sokoban-nezha-puzzle-game-10-levels.json +0 -68
- package/library/game_development-puzzle/spider-solitaire-game-implementation.json +0 -68
- package/library/game_development-puzzle/sudoku-game-implementation.json +0 -68
- package/library/game_development-puzzle/tangram-puzzle-game.json +0 -68
- package/library/game_development-puzzle/tetris-game-html-display.json +0 -68
- package/library/game_development-puzzle/tetris-game-implementation.json +0 -68
- package/library/game_development-puzzle/tetris-game-javascript-implementation.json +0 -68
- package/library/game_development-puzzle/tetris-game-mobile-playable.json +0 -68
- package/library/game_development-puzzle/tetris-game-program-code.json +0 -68
- package/library/game_development-puzzle/tetris-mini-game-text-document.json +0 -68
- package/library/game_development-puzzle/tetris-mini-program-design.json +0 -68
- package/library/game_development-puzzle/tetris-mobile-game-program.json +0 -68
- package/library/game_development-puzzle/tetris-program-implementation.json +0 -68
- package/library/game_development-puzzle/tetris-program-web-browser.json +0 -68
- package/library/game_development-puzzle/tetris-web-game-creation.json +0 -68
- package/library/game_development-puzzle/tetris-web-mini-game.json +0 -68
- package/library/game_development-puzzle/tetris-web-version-mini-game.json +0 -68
- package/library/game_development-puzzle/tile-matching-game-eliminate-blocks.json +0 -68
- package/library/game_development-puzzle/time-reversal-space-time-puzzles.json +0 -68
- package/library/game_development-puzzle/waste-sorting-game-webpage.json +0 -68
- package/library/game_development-puzzle/web-based-candy-crush-game.json +0 -68
- package/library/game_development-puzzle/web-based-candy-crush-match-3-puzzle-game.json +0 -68
- package/library/game_development-puzzle/web-based-fruit-tetris-game.json +0 -68
- package/library/game_development-puzzle/web-based-match-three-puzzle-game.json +0 -68
- package/library/game_development-puzzle/web-based-single-player-tetris-game.json +0 -68
- package/library/game_development-puzzle/web-based-sokoban-box-pushing-mini-game.json +0 -68
- package/library/game_development-puzzle/web-based-tetris-game-with-preview-panel.json +0 -68
- package/library/game_development-puzzle/web-based-tetris-game.json +0 -68
- package/library/game_development-puzzle/web-based-tetris-mini-game.json +0 -68
- package/library/game_development-puzzle/web-based-windows-minesweeper-game.json +0 -68
- package/library/game_development-puzzle/web-browser-tetris-game.json +0 -68
- package/library/game_development-puzzle/web-chinese-idiom-solitaire-game.json +0 -68
- package/library/game_development-puzzle/web-match-3-game-with-translations.json +0 -68
- package/library/game_development-puzzle/wechat-mini-game-mahjong-tile-match.json +0 -68
- package/library/game_development-puzzle/wechat-mini-program-match-3-game.json +0 -68
- package/library/game_development-puzzle/wechat-mini-program-tetris-game.json +0 -68
- package/library/game_development-puzzle/wechat-mini-program-unique-elimination-game.json +0 -68
- package/library/game_development-puzzle/wechat-sokoban-game-development.json +0 -68
- package/library/game_development-puzzle/wechat-tetris-game-code.json +0 -68
- package/library/game_development-puzzle/wechat-tetris-game-implementation.json +0 -68
- package/library/game_development-puzzle/wechat-tetris-mini-game.json +0 -68
- package/library/game_development-puzzle/windows-spider-solitaire-game-html.json +0 -68
- package/library/game_development-puzzle/word-connection-game-upload-play.json +0 -68
- package/library/game_development-puzzle/word-guessing-game.json +0 -68
- package/library/game_development-puzzle/word-matching-game-shanghai-oxford-textbook.json +0 -68
- package/library/game_development-puzzle/word-matching-game-with-custom-upload.json +0 -68
- package/library/game_development-role-playing/character-customization-game-html-javascript.json +0 -68
- package/library/game_development-role-playing/character-dialogue-system-game.json +0 -68
- package/library/game_development-role-playing/character-leveling-skill-tree-system.json +0 -68
- package/library/game_development-role-playing/character-skill-upgrade-system-with-experience-points.json +0 -68
- package/library/game_development-role-playing/cultivation-immortal-progression-game-mobile.json +0 -68
- package/library/game_development-role-playing/cultivation-immortality-seeking-game.json +0 -68
- package/library/game_development-role-playing/custom-character-creation-system.json +0 -68
- package/library/game_development-role-playing/dungeon-roguelike-game-generation.json +0 -68
- package/library/game_development-role-playing/dynamic-npc-companion-system.json +0 -68
- package/library/game_development-role-playing/family-generational-marriage-drama-game.json +0 -68
- package/library/game_development-role-playing/game-backpack-item-management-system.json +0 -68
- package/library/game_development-role-playing/game-stat-allocation-simulator-web-wordpress.json +0 -68
- package/library/game_development-role-playing/honkai-star-rail-critical-damage-attribute-multipliers.json +0 -68
- package/library/game_development-role-playing/html-three-kingdoms-role-playing-game.json +0 -68
- package/library/game_development-role-playing/interactive-npc-system-html-javascript.json +0 -68
- package/library/game_development-role-playing/javascript-weekly-quest-system.json +0 -68
- package/library/game_development-role-playing/legends-condor-heroes-game.json +0 -68
- package/library/game_development-role-playing/magic-academy-game-with-skills-and-exams.json +0 -68
- package/library/game_development-role-playing/magic-learning-game-with-spells-and-effects.json +0 -68
- package/library/game_development-role-playing/monster-slaying-leveling-game-web-browser.json +0 -68
- package/library/game_development-role-playing/multiple-choice-character-life-simulation-game.json +0 -68
- package/library/game_development-role-playing/post-apocalyptic-game-vue3-typescript.json +0 -68
- package/library/game_development-role-playing/rpg-equipment-attribute-system.json +0 -68
- package/library/game_development-role-playing/rpg-leveling-monster-fighting-text-game.json +0 -68
- package/library/game_development-role-playing/sect-building-character-recruitment-game.json +0 -68
- package/library/game_development-role-playing/spirit-summoning-game.json +0 -68
- package/library/game_development-role-playing/stress-relief-mini-game-equipment-level-progression.json +0 -68
- package/library/game_development-role-playing/text-based-character-homepage-attribute-panel-xiao-ke.json +0 -68
- package/library/game_development-role-playing/text-based-immortality-pill-game.json +0 -68
- package/library/game_development-role-playing/web-rpg-post-apocalyptic-combat-game.json +0 -68
- package/library/game_development-role-playing/ywt-adventure-pokemon-style-game.json +0 -68
- package/library/game_development-shooting/3d-shooting-game-html.json +0 -68
- package/library/game_development-shooting/3d-shooting-game-threejs.json +0 -68
- package/library/game_development-shooting/aerial-attack-game.json +0 -68
- package/library/game_development-shooting/browser-first-person-shooter-game.json +0 -68
- package/library/game_development-shooting/bubble-shooter-game-implementation.json +0 -68
- package/library/game_development-shooting/contra-style-game-development.json +0 -68
- package/library/game_development-shooting/first-person-shooter-game-with-obstacles-and-enemies.json +0 -68
- package/library/game_development-shooting/html-airplane-battle-game.json +0 -68
- package/library/game_development-shooting/html-airplane-shooting-game-with-images.json +0 -68
- package/library/game_development-shooting/html-contra-style-game.json +0 -68
- package/library/game_development-shooting/html-cs-game-minecraft-style.json +0 -68
- package/library/game_development-shooting/html-space-shooter-game.json +0 -68
- package/library/game_development-shooting/html-tank-battle-game.json +0 -68
- package/library/game_development-shooting/mech-shooting-game-with-flight-mode-terrain.json +0 -68
- package/library/game_development-shooting/mobile-shooting-game-source-code.json +0 -68
- package/library/game_development-shooting/multiplayer-online-shooting-game-frontend.json +0 -68
- package/library/game_development-shooting/multiplayer-online-shooting-game.json +0 -68
- package/library/game_development-shooting/pirate-shooting-game-island-scene.json +0 -68
- package/library/game_development-shooting/roguelike-shooting-game-with-upgrades.json +0 -68
- package/library/game_development-shooting/sandbox-shooting-game-editor-with-level-design.json +0 -68
- package/library/game_development-shooting/shooting-game-teams-ranking-system.json +0 -68
- package/library/game_development-shooting/simple-fps-game-ak-hk416-dust2-multiplayer.json +0 -68
- package/library/game_development-shooting/simple-web-shooting-game.json +0 -68
- package/library/game_development-shooting/terrain-destruction-shooting-game-with-fluid-simulation.json +0 -68
- package/library/game_development-shooting/web-based-airplane-battle-game.json +0 -68
- package/library/game_development-shooting/web-based-tank-battle-game.json +0 -68
- package/library/game_development-shooting/web-version-contra-game.json +0 -68
- package/library/game_development-shooting/webpage-2d-shooting-mini-game.json +0 -68
- package/library/game_development-shooting/wechat-aircraft-battle-mini-game.json +0 -68
- package/library/game_development-shooting/zombie-mayhem-shooting-game.json +0 -68
- package/library/game_development-simulation_management/3d-space-universe-spacecraft-physics-game.json +0 -68
- package/library/game_development-simulation_management/capture-and-collection-game.json +0 -68
- package/library/game_development-simulation_management/class-teacher-simulator.json +0 -68
- package/library/game_development-simulation_management/dynamic-weather-environmental-impact-game.json +0 -68
- package/library/game_development-simulation_management/dynastic-family-simulation-game.json +0 -68
- package/library/game_development-simulation_management/family-dynasty-simulation-game.json +0 -68
- package/library/game_development-simulation_management/homemade-3d-minecraft-like-game.json +0 -68
- package/library/game_development-simulation_management/html-qq-farm-simulation-game.json +0 -68
- package/library/game_development-simulation_management/ice-snow-world-survival-game.json +0 -68
- package/library/game_development-simulation_management/in-game-economic-system-trading.json +0 -68
- package/library/game_development-simulation_management/space-colony-game-with-resource-management.json +0 -68
- package/library/game_development-simulation_management/star-maker-entertainment-agency-simulation.json +0 -68
- package/library/game_development-simulation_management/traffic-light-game.json +0 -68
- package/library/game_development-simulation_management/weather-effects-dynamic-environment-system.json +0 -68
- package/library/game_development-simulation_management/web-based-3d-minecraft-like-game.json +0 -68
- package/library/game_development-simulation_management/web-based-farm-game-html-js-css.json +0 -68
- package/library/game_development-simulation_management/web-based-single-player-cooking-game.json +0 -68
- package/library/game_development-simulation_management/web-electronic-pet-raising-game.json +0 -68
- package/library/game_development-sports/3d-first-person-racing-game.json +0 -68
- package/library/game_development-sports/animation-physical-collision-sports-game.json +0 -68
- package/library/game_development-sports/archery-scoring-system-gyroscope-physics-simulation.json +0 -68
- package/library/game_development-sports/billiards-aiming-line-tool.json +0 -68
- package/library/game_development-sports/equestrian-show-jumping-game.json +0 -68
- package/library/game_development-sports/html-javascript-racing-game-design.json +0 -68
- package/library/game_development-sports/html-racing-game.json +0 -68
- package/library/game_development-sports/player-control-sports-game.json +0 -68
- package/library/game_development-sports/soccer-team-formation-program.json +0 -68
- package/library/game_development-sports/sports-game-spectator-atmosphere.json +0 -68
- package/library/game_development-sports/sports-team-management-season-game.json +0 -68
- package/library/game_development-strategy/3d-checkers-game-multiplayer.json +0 -68
- package/library/game_development-strategy/agar-io-web-game-html-javascript.json +0 -68
- package/library/game_development-strategy/ai-chess-game.json +0 -68
- package/library/game_development-strategy/ancient-civilization-city-building-game.json +0 -68
- package/library/game_development-strategy/aura-rune-build-calculator-aoki-legend.json +0 -68
- package/library/game_development-strategy/beautiful-interactive-web-page-garbage-sorting-mini-game.json +0 -68
- package/library/game_development-strategy/browser-pixel-art-survival-game-html.json +0 -68
- package/library/game_development-strategy/bull-king-card-game-rules.json +0 -68
- package/library/game_development-strategy/card-battle-game-hearthstone-like.json +0 -68
- package/library/game_development-strategy/cartoon-web-chinese-chess-mini-game.json +0 -68
- package/library/game_development-strategy/cheap-ai-chess-game.json +0 -68
- package/library/game_development-strategy/chessboard-wood-texture.json +0 -68
- package/library/game_development-strategy/chinese-chess-game-html.json +0 -68
- package/library/game_development-strategy/chinese-chess-mini-game.json +0 -68
- package/library/game_development-strategy/chinese-networked-card-board-game.json +0 -68
- package/library/game_development-strategy/chinese-poker-game-dou-dizhu.json +0 -68
- package/library/game_development-strategy/custom-rules-game-board-generation.json +0 -68
- package/library/game_development-strategy/deepseek-chinese-sentence-game-creation.json +0 -68
- package/library/game_development-strategy/dou-dizhu-card-game-html.json +0 -68
- package/library/game_development-strategy/economic-dev-tech-tree-game.json +0 -68
- package/library/game_development-strategy/enemy-ai-track-attack-pathfinding.json +0 -68
- package/library/game_development-strategy/fight-the-landlord-card-game.json +0 -68
- package/library/game_development-strategy/fight-the-landlord-chinese-poker-game.json +0 -68
- package/library/game_development-strategy/fighting-landlord-guandan-shengji-game.json +0 -68
- package/library/game_development-strategy/gomoku-five-in-a-row-mini-game.json +0 -68
- package/library/game_development-strategy/gomoku-five-in-a-row-mobile-game.json +0 -68
- package/library/game_development-strategy/hearts-card-game-notepad-implementation.json +0 -68
- package/library/game_development-strategy/hex-game-11x11-pie-rule.json +0 -68
- package/library/game_development-strategy/horror-game-monster-ai-escape-routes.json +0 -68
- package/library/game_development-strategy/html-canvas-faction-war-game.json +0 -68
- package/library/game_development-strategy/html-classical-chess-board.json +0 -68
- package/library/game_development-strategy/html-earth-gomoku-game.json +0 -68
- package/library/game_development-strategy/html-gomoku-go-board-game.json +0 -68
- package/library/game_development-strategy/html-javascript-castle-defense-game.json +0 -68
- package/library/game_development-strategy/html-javascript-treasure-hunt-game.json +0 -68
- package/library/game_development-strategy/html-mobile-tower-defense-game.json +0 -68
- package/library/game_development-strategy/html-offline-dou-dizhu-card-game.json +0 -68
- package/library/game_development-strategy/html-tower-defense-mini-game.json +0 -68
- package/library/game_development-strategy/interactive-chess-board-game-svg.json +0 -68
- package/library/game_development-strategy/interactive-chess-game-svg-javascript.json +0 -68
- package/library/game_development-strategy/javascript-planet-defense-game-introduction.json +0 -68
- package/library/game_development-strategy/javascript-tank-battle-game.json +0 -68
- package/library/game_development-strategy/magic-trials-game-with-skill-tree.json +0 -68
- package/library/game_development-strategy/mahjong-tile-layout-game.json +0 -68
- package/library/game_development-strategy/ming-dynasty-palace-intrigue-mini-game.json +0 -68
- package/library/game_development-strategy/mini-tank-battle-game.json +0 -68
- package/library/game_development-strategy/mobile-chinese-chess-human-vs-computer.json +0 -68
- package/library/game_development-strategy/monopoly-game-web-browser.json +0 -68
- package/library/game_development-strategy/multi-faction-diplomacy-strategy-game.json +0 -68
- package/library/game_development-strategy/multiplayer-battles-network-synchronization.json +0 -68
- package/library/game_development-strategy/multiplayer-cooperative-mode-implementation.json +0 -68
- package/library/game_development-strategy/northern-expedition-monopoly-game-html.json +0 -68
- package/library/game_development-strategy/plants-vs-zombies-browser-game.json +0 -68
- package/library/game_development-strategy/plants-vs-zombies-game-html.json +0 -68
- package/library/game_development-strategy/plants-vs-zombies-unlimited-sunshine.json +0 -68
- package/library/game_development-strategy/points-system-with-rewards.json +0 -68
- package/library/game_development-strategy/pokemon-type-matchup-query-mini-program.json +0 -68
- package/library/game_development-strategy/programming-for-a-game-of-fight-the-landlord.json +0 -68
- package/library/game_development-strategy/python-chinese-chess-xiangqi-visualization.json +0 -68
- package/library/game_development-strategy/random-level-generation-html-javascript.json +0 -68
- package/library/game_development-strategy/recurrent-neural-network-rock-paper-scissors-game.json +0 -68
- package/library/game_development-strategy/resource-management-game-with-building-upgrades.json +0 -68
- package/library/game_development-strategy/robot-war-game-with-ai-battle.json +0 -68
- package/library/game_development-strategy/sanguosha-like-card-game-implementation.json +0 -68
- package/library/game_development-strategy/sichuan-mahjong-mini-game-rules.json +0 -68
- package/library/game_development-strategy/single-player-texas-holdem-poker-game.json +0 -68
- package/library/game_development-strategy/solitaire-card-game.json +0 -68
- package/library/game_development-strategy/space-exploration-team-game.json +0 -68
- package/library/game_development-strategy/spider-solitaire-game-implementation.json +0 -68
- package/library/game_development-strategy/teamfight-tactics-html-implementation.json +0 -68
- package/library/game_development-strategy/texas-holdem-poker-game-code.json +0 -68
- package/library/game_development-strategy/ugui-2d-grid-map-system.json +0 -68
- package/library/game_development-strategy/virtual-currency-game-system.json +0 -68
- package/library/game_development-strategy/web-based-racing-game.json +0 -68
- package/library/game_development-strategy/web-based-tank-battle-game.json +0 -68
- package/library/game_development-strategy/web-plants-vs-zombies-game.json +0 -68
- package/library/game_development-strategy/web-plants-vs-zombies-naruto-edition.json +0 -68
- package/library/game_development-strategy/zombie-survival-game.json +0 -68
- package/library/management_systems-file_management/building-blueprint-management-system-cad-viewer.json +0 -68
- package/library/management_systems-file_management/csharp-sql-server-image-management-system.json +0 -68
- package/library/management_systems-file_management/draggable-directory-upload-page.json +0 -68
- package/library/management_systems-file_management/electron-vue-file-management-sidebar.json +0 -68
- package/library/management_systems-file_management/file-tag-management-platform.json +0 -68
- package/library/management_systems-file_management/file-upload-question-organizer-download.json +0 -68
- package/library/management_systems-file_management/file-upload-to-cloud-server.json +0 -68
- package/library/management_systems-file_management/frontend-worker-threads-stream-processing-file-uploads.json +0 -68
- package/library/management_systems-file_management/html-file-excel-word-viewer-converter.json +0 -68
- package/library/management_systems-file_management/html-file-list-download.json +0 -68
- package/library/management_systems-file_management/html-user-center-mp3-upload-submissions.json +0 -68
- package/library/management_systems-file_management/implement-drag-and-drop-file-upload-vue-3.json +0 -68
- package/library/management_systems-file_management/market-research-report-management-system.json +0 -68
- package/library/management_systems-file_management/mini-program-photo-upload-cloud.json +0 -68
- package/library/management_systems-file_management/mobile-photo-cloud-upload-download.json +0 -68
- package/library/management_systems-file_management/online-file-preview-system.json +0 -68
- package/library/management_systems-file_management/online-file-storage-sharing-system.json +0 -68
- package/library/management_systems-file_management/pdf-literature-management-system.json +0 -68
- package/library/management_systems-file_management/prescription-details-reference-table.json +0 -68
- package/library/management_systems-file_management/simple-webpage-download-synology-nas-files.json +0 -68
- package/library/management_systems-file_management/timeline-based-file-management-system.json +0 -68
- package/library/management_systems-file_management/user-group-file-management-system.json +0 -68
- package/library/management_systems-file_management/vue-pdf-signature-approval-system.json +0 -68
- package/library/management_systems-file_management/vue-word-document-editor-import-export.json +0 -68
- package/library/management_systems-file_management/vue3-large-file-upload-breakpoint-continuation.json +0 -68
- package/library/management_systems-file_management/web-search-word-pdf-files.json +0 -68
- package/library/management_systems-file_management/webpage-software-categorization-image-display.json +0 -68
- package/library/management_systems-file_management/wechat-mini-program-pdf-download-forward.json +0 -68
- package/library/management_systems-frontend_backend_platforms/academic-conference-submission-system-with-review.json +0 -68
- package/library/management_systems-frontend_backend_platforms/account-management-interface-design.json +0 -68
- package/library/management_systems-frontend_backend_platforms/admin-page-data-view-edit-api-monitoring.json +0 -68
- package/library/management_systems-frontend_backend_platforms/admin-profile-and-password-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/age-friendly-renovation-consulting-app.json +0 -68
- package/library/management_systems-frontend_backend_platforms/ai-software-engineering-portal-app-store-style.json +0 -68
- package/library/management_systems-frontend_backend_platforms/ancient-chinese-natural-science-platform.json +0 -68
- package/library/management_systems-frontend_backend_platforms/android-car-ivi-launcher.json +0 -68
- package/library/management_systems-frontend_backend_platforms/angular-security-management-decision-support.json +0 -68
- package/library/management_systems-frontend_backend_platforms/animal-information-management-app.json +0 -68
- package/library/management_systems-frontend_backend_platforms/api-rate-limiting-strategy-config.json +0 -68
- package/library/management_systems-frontend_backend_platforms/asset-management-system-vue-bootstrap.json +0 -68
- package/library/management_systems-frontend_backend_platforms/atm-user-interface-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/automatic-course-scheduling-and-statistics.json +0 -68
- package/library/management_systems-frontend_backend_platforms/backend-interface-tea-culture.json +0 -68
- package/library/management_systems-frontend_backend_platforms/backend-transfer-record-processing-page.json +0 -68
- package/library/management_systems-frontend_backend_platforms/base-station-maintenance-system-ui-with-navbar.json +0 -68
- package/library/management_systems-frontend_backend_platforms/basic-settings-page-shadcn-ui-nextjs.json +0 -68
- package/library/management_systems-frontend_backend_platforms/bim-management-system-with-3d-preview.json +0 -68
- package/library/management_systems-frontend_backend_platforms/blazor-ruoyi-admin-page.json +0 -68
- package/library/management_systems-frontend_backend_platforms/building-drawing-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/canteen-inventory-management-system-pyqt.json +0 -68
- package/library/management_systems-frontend_backend_platforms/chinese-financial-system-python-react-mysql.json +0 -68
- package/library/management_systems-frontend_backend_platforms/chronic-disease-management-platform.json +0 -68
- package/library/management_systems-frontend_backend_platforms/class-exam-scores-average-display.json +0 -68
- package/library/management_systems-frontend_backend_platforms/classroom-assignment-tracker-groups-students.json +0 -68
- package/library/management_systems-frontend_backend_platforms/cloud-hospital-system-design.json +0 -68
- package/library/management_systems-frontend_backend_platforms/coal-company-erp-system-html.json +0 -68
- package/library/management_systems-frontend_backend_platforms/commercial-property-rental-management-system-contract.json +0 -68
- package/library/management_systems-frontend_backend_platforms/company-announcement-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/computer-application-lottery-draw-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/conference-room-equipment-reservation-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/conference-room-usage-registration-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/contract-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/coupon-management-and-usage.json +0 -68
- package/library/management_systems-frontend_backend_platforms/course-manager-system-for-students.json +0 -68
- package/library/management_systems-frontend_backend_platforms/create-shift-schedule-calendar-format.json +0 -68
- package/library/management_systems-frontend_backend_platforms/create-student-info-website-xampp-vscode.json +0 -68
- package/library/management_systems-frontend_backend_platforms/create-web-based-information-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/customer-salesperson-login-welcome-page.json +0 -68
- package/library/management_systems-frontend_backend_platforms/data-center-server-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/data-source-list-page-improved-design.json +0 -68
- package/library/management_systems-frontend_backend_platforms/database-management-system-multi-db-support.json +0 -68
- package/library/management_systems-frontend_backend_platforms/deepseek-generate-react-project-from-design.json +0 -68
- package/library/management_systems-frontend_backend_platforms/design-draft-review-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/device-maintenance-reminder-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/device-repair-platform-with-qr-and-realtime-tracking.json +0 -68
- package/library/management_systems-frontend_backend_platforms/drone-management-system-with-admin-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/drone-specifications-database-design.json +0 -68
- package/library/management_systems-frontend_backend_platforms/e-commerce-product-collection-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/educational-management-system-teaching-lab-experiments.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electricity-consumption-data-management-vue-upgrade.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electricity-consumption-vue3-upgrade.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electricity-price-model-configuration.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electron-apple-books-like-bookshelf-app.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electron-vue-typescript-epub-reader-desktop-app.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electron-vue2-network-requests.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electronic-fence-management-vue3-autonavi.json +0 -68
- package/library/management_systems-frontend_backend_platforms/electronic-medical-record-editor-web.json +0 -68
- package/library/management_systems-frontend_backend_platforms/employee-daily-work-plan-calendar.json +0 -68
- package/library/management_systems-frontend_backend_platforms/energy-consumption-monitoring-and-warning-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/energy-system-monitoring-frontend-interface.json +0 -68
- package/library/management_systems-frontend_backend_platforms/engineering-management-system-permission-dotnet-mysql-vue3.json +0 -68
- package/library/management_systems-frontend_backend_platforms/enterprise-career-platform-with-two-way-matching.json +0 -68
- package/library/management_systems-frontend_backend_platforms/enterprise-recruitment-website-vue3-js-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/enterprise-wireless-network-device-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/equipment-inventory-ledger-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/equipment-owner-pocket-station-with-blueprints-sockets.json +0 -68
- package/library/management_systems-frontend_backend_platforms/feedback-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/file-database-system-shell-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/file-upload-download-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/film-crew-management-weather-scenes-gantt.json +0 -68
- package/library/management_systems-frontend_backend_platforms/financial-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/fitness-club-membership-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/fixed-deposit-system-react-spring-boot.json +0 -68
- package/library/management_systems-frontend_backend_platforms/flight-operation-guide-with-backup-and-search.json +0 -68
- package/library/management_systems-frontend_backend_platforms/food-delivery-robot-car-joystick-control.json +0 -68
- package/library/management_systems-frontend_backend_platforms/food-flavoring-formulation-generator.json +0 -68
- package/library/management_systems-frontend_backend_platforms/food-ordering-restaurant-program.json +0 -68
- package/library/management_systems-frontend_backend_platforms/form-management-system-low-code-platform.json +0 -68
- package/library/management_systems-frontend_backend_platforms/fresh-food-supermarket-checkout-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/frontend-backend-hospital-dip-software.json +0 -68
- package/library/management_systems-frontend_backend_platforms/frontend-deployment-dashboard-with-monitoring.json +0 -68
- package/library/management_systems-frontend_backend_platforms/frontend-gas-management-system-solution.json +0 -68
- package/library/management_systems-frontend_backend_platforms/frontend-login-system-with-registration-and-admin.json +0 -68
- package/library/management_systems-frontend_backend_platforms/functional-prototype-from-interface-config.json +0 -68
- package/library/management_systems-frontend_backend_platforms/fyne-yuan-bao-desktop-application-interface.json +0 -68
- package/library/management_systems-frontend_backend_platforms/general-manager-management-system-overview.json +0 -68
- package/library/management_systems-frontend_backend_platforms/gym-membership-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/hair-salon-membership-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/hardware-electrical-retail-inventory-management-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/harmonyos-login-page-ui-with-logo.json +0 -68
- package/library/management_systems-frontend_backend_platforms/hbuilder-html-ward-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/higher-math-grade-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/historical-business-interface-vue-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/housekeeping-recruitment-backend-dashboard-vue3-elementplus.json +0 -68
- package/library/management_systems-frontend_backend_platforms/housing-construction-pre-sales-demo-addresses.json +0 -68
- package/library/management_systems-frontend_backend_platforms/how-to-achieve-excellence-daily-habits.json +0 -68
- package/library/management_systems-frontend_backend_platforms/html-attendance-system-with-table-import.json +0 -68
- package/library/management_systems-frontend_backend_platforms/html-navicat-operation-interface.json +0 -68
- package/library/management_systems-frontend_backend_platforms/html-patrol-plan-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/html-patrol-record-table-device-testing.json +0 -68
- package/library/management_systems-frontend_backend_platforms/implement-frontend-backend-app-tsx.json +0 -68
- package/library/management_systems-frontend_backend_platforms/industrial-component-defect-detection-system-vue3.json +0 -68
- package/library/management_systems-frontend_backend_platforms/insurance-customer-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/insurance-customer-service-system-design.json +0 -68
- package/library/management_systems-frontend_backend_platforms/intelligent-manufacturing-command-center.json +0 -68
- package/library/management_systems-frontend_backend_platforms/intelligent-meeting-room-booking-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/intelligent-turtle-tank-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/inventory-management-app-with-pricing-and-time.json +0 -68
- package/library/management_systems-frontend_backend_platforms/inventory-management-system-with-alerts.json +0 -68
- package/library/management_systems-frontend_backend_platforms/inventory-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/investment-project-economic-evaluation-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/investment-system-with-realtime-market-data.json +0 -68
- package/library/management_systems-frontend_backend_platforms/iot-platform-web-frontend-vue3-backend-microservice.json +0 -68
- package/library/management_systems-frontend_backend_platforms/java-picture-book-library-borrowing-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/javafx-real-time-table-update-voice-announcements.json +0 -68
- package/library/management_systems-frontend_backend_platforms/knowledge-base-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/laboratory-instrument-calibration-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/laboratory-instrument-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/large-file-uploads-react-nodejs-mongodb.json +0 -68
- package/library/management_systems-frontend_backend_platforms/leankit-core-functions-pyside6-software-development.json +0 -68
- package/library/management_systems-frontend_backend_platforms/legal-document-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/liangchibao-mini-program-with-photo-upload-and-backend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/line-inspection-app-uniapp-javascript.json +0 -68
- package/library/management_systems-frontend_backend_platforms/login-registration-list-view-interfaces.json +0 -68
- package/library/management_systems-frontend_backend_platforms/login-registration-page-with-overlay-switch.json +0 -68
- package/library/management_systems-frontend_backend_platforms/logistics-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/low-voltage-equipment-inventory-management-qr-excel.json +0 -68
- package/library/management_systems-frontend_backend_platforms/manage-member-list-webpage-fix.json +0 -68
- package/library/management_systems-frontend_backend_platforms/medical-equipment-maintenance-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/meeting-feedback-tracker-with-attendance.json +0 -68
- package/library/management_systems-frontend_backend_platforms/meeting-room-reservation-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/mini-program-video-monitoring-playback.json +0 -68
- package/library/management_systems-frontend_backend_platforms/mobile-app-online-food-ordering.json +0 -68
- package/library/management_systems-frontend_backend_platforms/monthly-assessment-score-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/multi-system-demo-overview.json +0 -68
- package/library/management_systems-frontend_backend_platforms/murder-mystery-game-material-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/music-material-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/nba-fan-community-web-application-architecture.json +0 -68
- package/library/management_systems-frontend_backend_platforms/nextjs-vite-ssr-typescript-micro-frontend-project.json +0 -68
- package/library/management_systems-frontend_backend_platforms/novel-character-details-panel.json +0 -68
- package/library/management_systems-frontend_backend_platforms/office-document-annotation-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/online-approval-workflow-management-system-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/online-examination-system-with-auto-grading.json +0 -68
- package/library/management_systems-frontend_backend_platforms/online-folder-file-management-tool-tree-view.json +0 -68
- package/library/management_systems-frontend_backend_platforms/online-image-tagging-classification-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/online-personnel-excel-form-collection.json +0 -68
- package/library/management_systems-frontend_backend_platforms/open-webui-visual-interface-knowledge-base.json +0 -68
- package/library/management_systems-frontend_backend_platforms/package-management-parcel-collection-point.json +0 -68
- package/library/management_systems-frontend_backend_platforms/parcel-collection-point-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/performance-evaluation-system-with-quarterly-bonuses.json +0 -68
- package/library/management_systems-frontend_backend_platforms/performance-management-system-vue-java-mysql.json +0 -68
- package/library/management_systems-frontend_backend_platforms/personal-finance-management-tool-with-budgeting-and-import.json +0 -68
- package/library/management_systems-frontend_backend_platforms/personal-knowledge-base-management-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/personal-novel-website-with-mysql.json +0 -68
- package/library/management_systems-frontend_backend_platforms/pharmacy-mini-program-user-order-page.json +0 -68
- package/library/management_systems-frontend_backend_platforms/phone-program-sort-names-statistics.json +0 -68
- package/library/management_systems-frontend_backend_platforms/planet-cloud-jump-system-development.json +0 -68
- package/library/management_systems-frontend_backend_platforms/plant-protection-software-frontend-pages.json +0 -68
- package/library/management_systems-frontend_backend_platforms/post-accident-summary-management-website.json +0 -68
- package/library/management_systems-frontend_backend_platforms/product-order-contract-generation-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/product-sketch-to-prototype-vue-springboot.json +0 -68
- package/library/management_systems-frontend_backend_platforms/project-financing-promotion.json +0 -68
- package/library/management_systems-frontend_backend_platforms/project-financing-service-classification.json +0 -68
- package/library/management_systems-frontend_backend_platforms/project-management-system-for-teams.json +0 -68
- package/library/management_systems-frontend_backend_platforms/project-management-system-with-team-collaboration.json +0 -68
- package/library/management_systems-frontend_backend_platforms/prototype-interface-asset-overview-cloud-security.json +0 -68
- package/library/management_systems-frontend_backend_platforms/python-flet-floating-window-application.json +0 -68
- package/library/management_systems-frontend_backend_platforms/python-pyside6-stock-trading-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/qiankun-react-micro-app-manual-load.json +0 -68
- package/library/management_systems-frontend_backend_platforms/qt-interface-for-solidworks-ansys-data.json +0 -68
- package/library/management_systems-frontend_backend_platforms/qt-palantir-style-web-ui-project.json +0 -68
- package/library/management_systems-frontend_backend_platforms/react-antd-admin-template.json +0 -68
- package/library/management_systems-frontend_backend_platforms/react-company-portal-website.json +0 -68
- package/library/management_systems-frontend_backend_platforms/react-material-design-marketing-automation-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/real-time-interface-monitor-agent-status-planning-learning.json +0 -68
- package/library/management_systems-frontend_backend_platforms/real-time-job-recruitment-software.json +0 -68
- package/library/management_systems-frontend_backend_platforms/replicate-element-plus-vue3-typescript-no-dependencies.json +0 -68
- package/library/management_systems-frontend_backend_platforms/report-chart-configuration-page-with-custom-metrics.json +0 -68
- package/library/management_systems-frontend_backend_platforms/report-overview-page-prototype.json +0 -68
- package/library/management_systems-frontend_backend_platforms/residential-community-file-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/scheduling-application-mini-program-multi-people-multi-shifts.json +0 -68
- package/library/management_systems-frontend_backend_platforms/school-academic-administration-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/security-center-federated-learning-audit-tracker.json +0 -68
- package/library/management_systems-frontend_backend_platforms/sensor-calibration-multi-page-gui.json +0 -68
- package/library/management_systems-frontend_backend_platforms/shadcn-frontend-architecture.json +0 -68
- package/library/management_systems-frontend_backend_platforms/shared-bicycle-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/shared-space-reservation-and-usage-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/simple-accounting-program-qt.json +0 -68
- package/library/management_systems-frontend_backend_platforms/simple-warehouse-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/smart-expense-report-recognition-system-with-api-integration.json +0 -68
- package/library/management_systems-frontend_backend_platforms/smart-locker-system-javascript.json +0 -68
- package/library/management_systems-frontend_backend_platforms/smart-project-management-table-with-gantt-chart.json +0 -68
- package/library/management_systems-frontend_backend_platforms/software-development-documentation-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/sports-venue-management-platform.json +0 -68
- package/library/management_systems-frontend_backend_platforms/srm-supplier-admission-kanban-stage-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/student-classroom-completion-status-record-webpage.json +0 -68
- package/library/management_systems-frontend_backend_platforms/student-grade-recording-analysis-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/student-info-query-frontend-website.json +0 -68
- package/library/management_systems-frontend_backend_platforms/student-information-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/student-roll-call-software.json +0 -68
- package/library/management_systems-frontend_backend_platforms/student-scoring-math-groups.json +0 -68
- package/library/management_systems-frontend_backend_platforms/subway-arrival-time-display-board.json +0 -68
- package/library/management_systems-frontend_backend_platforms/supermarket-smart-locker-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/survey-analysis-tool-with-advanced-features.json +0 -68
- package/library/management_systems-frontend_backend_platforms/survey-generator-with-qr-codes.json +0 -68
- package/library/management_systems-frontend_backend_platforms/task-allocation-tracking-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/tauri-svelte-crud-frontend-rust-backend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/team-scheduling-project-management-mini-program.json +0 -68
- package/library/management_systems-frontend_backend_platforms/tencent-cloud-operations-management-mini-program.json +0 -68
- package/library/management_systems-frontend_backend_platforms/test-case-management-platform.json +0 -68
- package/library/management_systems-frontend_backend_platforms/test-execution-dynamic-forms-homepage-module-ttf-icons.json +0 -68
- package/library/management_systems-frontend_backend_platforms/ticket-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/trading-system-component-framework.json +0 -68
- package/library/management_systems-frontend_backend_platforms/tutoring-center-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/ui-interface-design-code-generation.json +0 -68
- package/library/management_systems-frontend_backend_platforms/urban-homestay-brand-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/user-access-restriction-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/user-login-window-program.json +0 -68
- package/library/management_systems-frontend_backend_platforms/user-login-window-transition.json +0 -68
- package/library/management_systems-frontend_backend_platforms/user-registration-login-profile-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/user-registration-login-system-html-css-nodejs-mariadb.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vc-mfc-ceramic-tile-defect-detection-software.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vehicle-management-system-vue-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vehicle-personnel-management-with-reminders.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vehicle-travel-recording-app-development.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue-b-s-architecture-project-setup.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue-book-management-system-frontend-page.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue-elementui-express-survey-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue-hbuilder-admin-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue-spring-boot-parking-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue-tailwind-vite-admin-template.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue2-h5-mobile-project-setup.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue2-mobile-desktop-system-page.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue3-dynamic-menu-vuex-state-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue3-electron-sqlite-knex-pinia-project.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue3-element-plus-project-generation.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue3-ts-pinia-nested-routing-backend-menu.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue3-typescript-bpmn-implementation.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vue3-vite-data-display-video-stats-backend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/vuetify-windows-diary-software-mood-thoughts.json +0 -68
- package/library/management_systems-frontend_backend_platforms/warehouse-management-page-with-navigation.json +0 -68
- package/library/management_systems-frontend_backend_platforms/warehouse-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wastewater-lab-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/web-app-article-list-crud-functionality.json +0 -68
- package/library/management_systems-frontend_backend_platforms/web-based-inventory-management-system-small-online-shop-local-database.json +0 -68
- package/library/management_systems-frontend_backend_platforms/web-based-mysql-data-reporting-tool.json +0 -68
- package/library/management_systems-frontend_backend_platforms/web-based-roll-call-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/web-module-for-security-expense-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/webpage-queue-number-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/webpage-video-image-text-content-sharing.json +0 -68
- package/library/management_systems-frontend_backend_platforms/website-login-approval-data-query-pages.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wechat-alipay-developer-platform.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wechat-expense-tracking-mini-program.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wechat-mini-program-furniture-configurator.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wechat-mini-program-library-management-system.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wechat-mini-program-property-management-frontend.json +0 -68
- package/library/management_systems-frontend_backend_platforms/wechat-mini-program-warehouse-inventory-financial-management.json +0 -68
- package/library/management_systems-frontend_backend_platforms/winform-treeview-department-structure.json +0 -68
- package/library/management_systems-frontend_backend_platforms/yinmeng-self-service-printing-system.json +0 -68
- package/library/management_systems-hardware_management/backup-strategy-management-system.json +0 -68
- package/library/management_systems-hardware_management/device-lifecycle-management-system-fine-chemical.json +0 -68
- package/library/management_systems-hardware_management/equipment-borrowing-management-system.json +0 -68
- package/library/management_systems-hardware_management/esp32-car-control-webpage-ultrasonic-line-tracking.json +0 -68
- package/library/management_systems-hardware_management/hardware-inventory-warning-system.json +0 -68
- package/library/management_systems-hardware_management/hardware-repair-management-system.json +0 -68
- package/library/management_systems-hardware_management/hmi-hydraulic-baler-7inch-800x480.json +0 -68
- package/library/management_systems-hardware_management/html-server-monitoring-dashboard.json +0 -68
- package/library/management_systems-hardware_management/kubernetes-monitoring-dashboard-features.json +0 -68
- package/library/management_systems-hardware_management/lcd-display-temperature-light-curves.json +0 -68
- package/library/management_systems-hardware_management/network-device-monitoring-system.json +0 -68
- package/library/management_systems-hardware_management/perlant-1510a-robotic-arm-visualization-software.json +0 -68
- package/library/management_systems-hardware_management/printer-management-interface-with-admin-features.json +0 -68
- package/library/management_systems-hardware_management/system-server-monitoring-web-interface.json +0 -68
- package/library/management_systems-hardware_management/vacuum-oven-interface-kunlun-tongtai-tpc1031k.json +0 -68
- package/library/management_systems-hardware_management/virtual-smart-home-control-system.json +0 -68
- package/library/management_systems-hardware_management/vue2-dji-drone-rtmp-streaming-windows-solution.json +0 -68
- package/library/management_systems-hardware_management/web-driven-mouse-config-hid-protocol.json +0 -68
- package/library/management_systems-hardware_management/web-joystick-esp32-car-control.json +0 -68
- package/library/management_systems-hardware_management/wifi-sharing-mini-program-advertisement-integration.json +0 -68
- package/library/management_systems-hardware_management/windows-remote-desktop-multi-ip-management.json +0 -68
- package/library/mermaid_flowcharts-logic_flowcharts/digital-twin-long-boom-assembly-bs-architecture.json +0 -68
- package/library/mermaid_flowcharts-logic_flowcharts/sample-code-retejs-vue-3-setup-script-syntax.json +0 -68
- package/library/mermaid_flowcharts-logic_flowcharts/vue-flow-architectural-contract-approval-diagram.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/mind-map-similar-to-xmind.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/mind-mapping-mini-program.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/online-editable-mind-map.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/present-research-findings-mind-map-markmap.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/study-guide-mind-map-generator.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/vue-parse-json-xmind-display-mind-map.json +0 -68
- package/library/mermaid_flowcharts-mind_maps/vue2-g6-mind-map-implementation.json +0 -68
- package/library/multimedia_editing-audio_editing/ai-audio-restoration-tool-with-waveform-comparison.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-clip-management-tagging-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-echo-effect-processor.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-echo-effect-tool-frontend.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-format-conversion-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-mixing-effect-tool-frontend.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-pitch-shifter-with-preview-export.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-recording-basic-editing.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-segmentation-labeling-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-trimming-labeling-frontend-program.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-trimming-tagging-frontend.json +0 -68
- package/library/multimedia_editing-audio_editing/audio-watermark-creator.json +0 -68
- package/library/multimedia_editing-audio_editing/flutter-android-call-recording-feature.json +0 -68
- package/library/multimedia_editing-audio_editing/frontend-audio-denoising-application.json +0 -68
- package/library/multimedia_editing-audio_editing/html-cake-player-happy-birthday-song-waveform-visualization.json +0 -68
- package/library/multimedia_editing-audio_editing/in-browser-multi-track-recording-studio.json +0 -68
- package/library/multimedia_editing-audio_editing/karaoke-lyrics-synchronization-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/music-generation-tool-with-free-ai-inference.json +0 -68
- package/library/multimedia_editing-audio_editing/network-audio-sampler-drum-kit.json +0 -68
- package/library/multimedia_editing-audio_editing/online-audio-concatenation-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/online-audio-loop-editing-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/python-kivy-streaming-media-player.json +0 -68
- package/library/multimedia_editing-audio_editing/qianqian-jingting-ttplayer-music-player-qml-pyside6.json +0 -68
- package/library/multimedia_editing-audio_editing/real-time-multi-user-audio-editing-platform.json +0 -68
- package/library/multimedia_editing-audio_editing/timeline-based-audio-annotation-tool.json +0 -68
- package/library/multimedia_editing-audio_editing/timeline-based-audio-editor.json +0 -68
- package/library/multimedia_editing-audio_editing/vocal-removal-from-audio-frontend-application.json +0 -68
- package/library/multimedia_editing-audio_editing/vocal-remover-frontend-audio-processing.json +0 -68
- package/library/multimedia_editing-audio_editing/vue2-music-player-playlist-loop.json +0 -68
- package/library/multimedia_editing-audio_editing/web-based-audio-sampler-sequencer.json +0 -68
- package/library/multimedia_editing-audio_editing/web-based-sound-effects-library-with-preview-and-download.json +0 -68
- package/library/multimedia_editing-audio_editing/web-microphone-audio-recorder-tool.json +0 -68
- package/library/multimedia_editing-image_editing/2d-product-drawings-sky-blue-background.json +0 -68
- package/library/multimedia_editing-image_editing/360-degree-panoramic-stitching-system.json +0 -68
- package/library/multimedia_editing-image_editing/batch-image-compression-tool.json +0 -68
- package/library/multimedia_editing-image_editing/canvas-javascript-image-editor-with-zoom.json +0 -68
- package/library/multimedia_editing-image_editing/drawing-board-ios-notes-paperjs-vue3.json +0 -68
- package/library/multimedia_editing-image_editing/frontend-batch-image-annotation-tool.json +0 -68
- package/library/multimedia_editing-image_editing/frontend-image-editing-with-history-revert.json +0 -68
- package/library/multimedia_editing-image_editing/gif-player-with-scroll-and-multiple-gifs.json +0 -68
- package/library/multimedia_editing-image_editing/hbuilder-simple-drawing-app.json +0 -68
- package/library/multimedia_editing-image_editing/html-double-layer-rubiks-cube-photo-effect.json +0 -68
- package/library/multimedia_editing-image_editing/html-image-upload-clarity-enhancement-save.json +0 -68
- package/library/multimedia_editing-image_editing/image-annotation-tool-drag-draw-text-save.json +0 -68
- package/library/multimedia_editing-image_editing/image-comparison-tool-multiple-modes.json +0 -68
- package/library/multimedia_editing-image_editing/image-comparison-tool-slider-save.json +0 -68
- package/library/multimedia_editing-image_editing/image-contour-depth-refractive-texture.json +0 -68
- package/library/multimedia_editing-image_editing/image-format-conversion-tool.json +0 -68
- package/library/multimedia_editing-image_editing/image-matting-tool-with-brush-selection.json +0 -68
- package/library/multimedia_editing-image_editing/image-shadow-editor-tool.json +0 -68
- package/library/multimedia_editing-image_editing/image-text-annotation-tool-with-save.json +0 -68
- package/library/multimedia_editing-image_editing/image-text-watermark-frontend-project.json +0 -68
- package/library/multimedia_editing-image_editing/image-watermark-remover-responsive-design.json +0 -68
- package/library/multimedia_editing-image_editing/javascript-drawing-board-with-magnified-pixel-grid.json +0 -68
- package/library/multimedia_editing-image_editing/merge-upload-images-uniapp-canvas.json +0 -68
- package/library/multimedia_editing-image_editing/multi-functional-image-creation-tool-webpage.json +0 -68
- package/library/multimedia_editing-image_editing/online-dynamic-image-sticker-tool.json +0 -68
- package/library/multimedia_editing-image_editing/online-image-annotation-tool.json +0 -68
- package/library/multimedia_editing-image_editing/online-image-clipboard-tool.json +0 -68
- package/library/multimedia_editing-image_editing/online-image-compression-tool-with-preview-and-options.json +0 -68
- package/library/multimedia_editing-image_editing/optimize-image-and-generate-html-file.json +0 -68
- package/library/multimedia_editing-image_editing/video-screenshot-tool-with-editing-and-export.json +0 -68
- package/library/multimedia_editing-image_editing/wechat-mini-program-import-images-generate-pixel-art.json +0 -68
- package/library/multimedia_editing-image_editing/wechat-mini-program-remove-watermarks-photo-video.json +0 -68
- package/library/multimedia_editing-video_production/3d-video-effect-editor-with-animation-curves.json +0 -68
- package/library/multimedia_editing-video_production/ai-dream-xu-zhisheng-standup-comedy-animation.json +0 -68
- package/library/multimedia_editing-video_production/android-soccer-video-top-down-view.json +0 -68
- package/library/multimedia_editing-video_production/animation-video-production-tool.json +0 -68
- package/library/multimedia_editing-video_production/arsenal-players-promo-animation.json +0 -68
- package/library/multimedia_editing-video_production/audio-video-synchronization-tool.json +0 -68
- package/library/multimedia_editing-video_production/browser-video-recorder-editor-tool.json +0 -68
- package/library/multimedia_editing-video_production/face-api-video-enhancement-webpage.json +0 -68
- package/library/multimedia_editing-video_production/flutter-media-player-frontend.json +0 -68
- package/library/multimedia_editing-video_production/frontend-tool-animated-video-elements.json +0 -68
- package/library/multimedia_editing-video_production/frontend-video-animated-stickers-editor.json +0 -68
- package/library/multimedia_editing-video_production/frontend-video-color-adjustment-tool.json +0 -68
- package/library/multimedia_editing-video_production/html-fifteen-second-short-video.json +0 -68
- package/library/multimedia_editing-video_production/multi-track-video-editor.json +0 -68
- package/library/multimedia_editing-video_production/online-dynamic-background-video-generator.json +0 -68
- package/library/multimedia_editing-video_production/online-video-background-removal-tool.json +0 -68
- package/library/multimedia_editing-video_production/online-video-format-conversion-tool.json +0 -68
- package/library/multimedia_editing-video_production/online-video-frame-extractor.json +0 -68
- package/library/multimedia_editing-video_production/online-video-puzzle-generator.json +0 -68
- package/library/multimedia_editing-video_production/online-video-resolution-adjuster.json +0 -68
- package/library/multimedia_editing-video_production/photo-background-text-subtitle-video-synthesis.json +0 -68
- package/library/multimedia_editing-video_production/picture-in-picture-video-editor.json +0 -68
- package/library/multimedia_editing-video_production/simple-love-confession-code-video.json +0 -68
- package/library/multimedia_editing-video_production/social-media-short-video-generator.json +0 -68
- package/library/multimedia_editing-video_production/software-video-player-all-formats.json +0 -68
- package/library/multimedia_editing-video_production/tiktok-watermark-removal-mini-program.json +0 -68
- package/library/multimedia_editing-video_production/video-auto-editing-tool-with-scene-detection.json +0 -68
- package/library/multimedia_editing-video_production/video-background-replacement-chroma-key-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-dubbing-tool-with-audio-waveform-sync.json +0 -68
- package/library/multimedia_editing-video_production/video-editing-timeline-manager.json +0 -68
- package/library/multimedia_editing-video_production/video-editing-tool-with-transitions-and-text.json +0 -68
- package/library/multimedia_editing-video_production/video-filter-app-upload-effects-preview.json +0 -68
- package/library/multimedia_editing-video_production/video-format-conversion-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-picture-in-picture-creation-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-resolution-conversion-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-speed-adjustment-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-speed-curve-editor-with-audio-pitch.json +0 -68
- package/library/multimedia_editing-video_production/video-subtitle-editor-with-timeline-export.json +0 -68
- package/library/multimedia_editing-video_production/video-subtitle-generation-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-timeline-bookmark-marking-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-timeline-chapter-editor.json +0 -68
- package/library/multimedia_editing-video_production/video-to-gif-converter-platform.json +0 -68
- package/library/multimedia_editing-video_production/video-transition-effect-editor.json +0 -68
- package/library/multimedia_editing-video_production/video-transition-effects-editor.json +0 -68
- package/library/multimedia_editing-video_production/video-trimming-splicing-tool.json +0 -68
- package/library/multimedia_editing-video_production/video-watermark-tool-design.json +0 -68
- package/library/multimedia_editing-video_production/web-based-video-editing-tool.json +0 -68
- package/library/multimedia_editing-video_production/web-dynamic-graphic-video-tool.json +0 -68
- package/library/multimedia_editing-video_production/webgl-short-video-effects-editor.json +0 -68
- package/library/multimedia_editing-video_production/webpage-upload-add-watermark-to-videos.json +0 -68
- package/library/multimedia_editing-video_production/xiaohongshu-text-image-to-video-html.json +0 -68
- package/library/other-astrology_divination_software/bazi-charting-software-four-pillars.json +0 -68
- package/library/other-astrology_divination_software/bazi-fortune-telling-software-uni-app.json +0 -68
- package/library/other-audio_player/html-music-player-with-interference-and-pause.json +0 -68
- package/library/other-code_generation/html5-javascript-code-generation-expert-responses.json +0 -68
- package/library/other-code_generation/static-code-generation-no-environment.json +0 -68
- package/library/other-development_configuration/tailwind-css-4-electron-vite-no-react.json +0 -68
- package/library/other-development_framework_setup/spfx-vue-project-generation.json +0 -68
- package/library/other-divination/generate-detailed-hexagram-interpretations.json +0 -68
- package/library/other-divination/heavenly-stems-earthly-branches-i-ching-auspicious-times.json +0 -68
- package/library/other-divination/html-64-hexagrams-divination-app.json +0 -68
- package/library/other-divination_system/javascript-qi-men-dun-jia-divination-chart.json +0 -68
- package/library/other-document_editor/vue-microsoft-word-like-editor.json +0 -68
- package/library/other-educational/five-elements-generation-destruction-e-language.json +0 -68
- package/library/other-financial_platform/mobile-h5-digital-currency-llm-data.json +0 -68
- package/library/other-frontend_development_tools/ai-frontend-development-scaffolding-tools.json +0 -68
- package/library/other-graphics_programming/desktop-heart-code-creation.json +0 -68
- package/library/other-legal_analysis/user-agreement-terms-of-service.json +0 -68
- package/library/other-mini-program_development/card-style-left-right-waterfall-flow-mini-program.json +0 -68
- package/library/other-mobile_app_development/develop-react-app-android-ios.json +0 -68
- package/library/other-mobile_app_development/harmonyos-button-navigation-view.json +0 -68
- package/library/other-mobile_app_development/react-native-tableview-like-with-cell-selection.json +0 -68
- package/library/other-mobile_app_development/taro-wechat-code-128-barcode-recognition.json +0 -68
- package/library/other-mobile_app_development/uniapp-vue3-editor-example.json +0 -68
- package/library/other-mobile_application_development/android-wechat-multi-instance-app-uniapp.json +0 -68
- package/library/other-mobile_development/android-webview-vue2-scanning-functionality.json +0 -68
- package/library/other-mobile_development/xbuild-h5-vue-floating-window-mobile-app.json +0 -68
- package/library/other-mobile_measurement_app/flutter-app-measure-distance-image-photo.json +0 -68
- package/library/other-music_player/online-music-player-with-search-and-controls.json +0 -68
- package/library/other-productivity_scheduling/online-scheduling-tool-with-calendar-and-sync.json +0 -68
- package/library/other-programming_consultation/python-backend-frontend-code-expert-responses.json +0 -68
- package/library/other-security_tools/network-security-scanner-vulnerability-detection.json +0 -68
- package/library/other-software_development/eclipse-plugin-xml-to-awt-swing-shapes.json +0 -68
- package/library/other-software_development/generate-executable-ai-code-workflow.json +0 -68
- package/library/other-tool_recommendations/ai-tool-mini-program-ui-code-generation.json +0 -68
- package/library/other-transit_system/public-transit-system-frontend.json +0 -68
- package/library/other-travel_management/vue3-personalized-travel-system.json +0 -68
- package/library/other-ui_ux_design_standards/ten-lines-at-a-glance-display-standard.json +0 -68
- package/library/other-video_streaming_application/winui3-ffmpeg-rtsp-video-stream-display.json +0 -68
- package/library/other-web_component_development/vue-virtual-table-component-development.json +0 -68
- package/library/other-web_development/create-dynamic-website-from-existing-one.json +0 -68
- package/library/simulation___modeling-3d_simulation/3d-earth-view-tianditu-supermap.json +0 -68
- package/library/simulation___modeling-3d_simulation/3d-li6ps5cl-crystal-lattice.json +0 -68
- package/library/simulation___modeling-3d_simulation/display-unstructured-vtk-models-threejs.json +0 -68
- package/library/simulation___modeling-3d_simulation/fire-evacuation-simulation-cesium-animation.json +0 -68
- package/library/simulation___modeling-3d_simulation/frontend-solar-system-simulation.json +0 -68
- package/library/simulation___modeling-3d_simulation/indoor-3d-pathfinding-uniapp-mini-program.json +0 -68
- package/library/simulation___modeling-3d_simulation/nurbs-curve-3d-graph-control-points.json +0 -68
- package/library/simulation___modeling-3d_simulation/python-3d-robotic-arm-visualization-network-data.json +0 -68
- package/library/simulation___modeling-3d_simulation/python-3d-visualization-tool-saas-composer.json +0 -68
- package/library/simulation___modeling-3d_simulation/radar-point-cloud-to-3d-scene.json +0 -68
- package/library/simulation___modeling-3d_simulation/shanghai-bund-light-show-html-simulation.json +0 -68
- package/library/simulation___modeling-3d_simulation/solar-system-motion-simulation-html.json +0 -68
- package/library/simulation___modeling-3d_simulation/solar-system-simulation-frontend-program.json +0 -68
- package/library/simulation___modeling-3d_simulation/threejs-antd-upload-model-texture.json +0 -68
- package/library/simulation___modeling-3d_simulation/threejs-mouse-drag-object-movement.json +0 -68
- package/library/simulation___modeling-3d_simulation/virtual-photography-studio-lighting-scenario.json +0 -68
- package/library/simulation___modeling-3d_simulation/vr-panoramic-tour-script-framework.json +0 -68
- package/library/simulation___modeling-3d_simulation/vue-3-cesium-wms-terrain-excavation-effects.json +0 -68
- package/library/simulation___modeling-3d_simulation/vue-vtk-animate-nodal-displacement.json +0 -68
- package/library/simulation___modeling-mathematical_abstraction/graphic-intersection-blending-square-circle.json +0 -68
- package/library/simulation___modeling-mathematical_abstraction/interactive-rectangle-cylinder-manipulation.json +0 -68
- package/library/simulation___modeling-mathematical_abstraction/js-sphere-conways-game-life-multicolor-simulation.json +0 -68
- package/library/simulation___modeling-mathematical_abstraction/uniapp-vue3-graphology-path-planning-example-code.json +0 -68
- package/library/simulation___modeling-mathematical_abstraction/web-program-simulate-mqtt-iot-data-transmission.json +0 -68
- package/library/simulation___modeling-physics_simulation/brownian-motion-web-page.json +0 -68
- package/library/simulation___modeling-physics_simulation/bs-ns3-simulation-frontend-display.json +0 -68
- package/library/simulation___modeling-physics_simulation/celestial-body-motion-simulation-frontend-program.json +0 -68
- package/library/simulation___modeling-physics_simulation/celestial-body-motion-simulation-frontend.json +0 -68
- package/library/simulation___modeling-physics_simulation/circuit-experimental-simulator-with-drag-and-drop.json +0 -68
- package/library/simulation___modeling-physics_simulation/conservation-of-momentum-animations.json +0 -68
- package/library/simulation___modeling-physics_simulation/draw-lichtenberg-figures-javascript-html5-canvas.json +0 -68
- package/library/simulation___modeling-physics_simulation/earth-moon-orbital-simulation-frontend.json +0 -68
- package/library/simulation___modeling-physics_simulation/earth-moon-orbital-system-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/earth-rotation-revolution-demonstration.json +0 -68
- package/library/simulation___modeling-physics_simulation/flower-petals-falling-computer-desktop.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-celestial-movement-sun-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-code-to-simulate-solar-system.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-engine-piston-movement-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-program-simulates-celestial-body-movements.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-program-simulates-operation-of-space-elevator.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-solar-system-motion-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-solar-system-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-sun-movement-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/frontend-walking-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/galton-board-program-html.json +0 -68
- package/library/simulation___modeling-physics_simulation/html-celestial-motion-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/html-motion-planets-solar-system.json +0 -68
- package/library/simulation___modeling-physics_simulation/millikan-oil-drop-experiment-simulation-webpage.json +0 -68
- package/library/simulation___modeling-physics_simulation/moon-rotation-simulation-frontend-program.json +0 -68
- package/library/simulation___modeling-physics_simulation/simulate-passenger-station-boarding-time.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-celestial-movement-frontend-code.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-animation-html.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-celestial-body-movement-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-celestial-body-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-celestial-movement-frontend-program.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-celestial-movement-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-motion-frontend-model.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-motion-simulation-frontend.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-orbital-mechanics-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-orbital-simulation-frontend.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-orbital-trajectories-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/solar-system-simulation-frontend-program.json +0 -68
- package/library/simulation___modeling-physics_simulation/three-body-orbital-trajectory-visualization.json +0 -68
- package/library/simulation___modeling-physics_simulation/three-body-problem-motion-simulation.json +0 -68
- package/library/simulation___modeling-physics_simulation/webpage-orbital-patterns-celestial-bodies-solar-system.json +0 -68
- package/library/svg_generation-svg_icons_logos/electrical-plug-phone-charger-portable-speaker-icon.json +0 -68
- package/library/svg_generation-svg_icons_logos/implement-svg-amazon-logo.json +0 -68
- package/library/svg_generation-svg_icons_logos/implement-svg-black-and-white-snapple-logo-with-hat.json +0 -3
- package/library/svg_generation-svg_icons_logos/implement-svg-map-pin-nepal-flag.json +0 -68
- package/library/svg_generation-svg_icons_logos/implement-svg-microsoft-edge-logo.json +0 -68
- package/library/svg_generation-svg_icons_logos/implement-svg-wheelchair-accessible-icon.json +0 -68
- package/library/svg_generation-svg_icons_logos/svg-binoculars-browsing-searching-magnifying.json +0 -68
- package/library/svg_generation-svg_icons_logos/svg-download-files-folder-computer-arrow-circle.json +0 -4
- package/library/svg_generation-svg_icons_logos/svg-nintendo-controller-video-game-icons.json +0 -68
- package/library/svg_generation-svg_icons_logos/svg-red-white-bmc-logo.json +0 -68
- package/library/svg_generation-svg_icons_logos/woman-business-suit-speech-bubble-icon.json +0 -4
- package/library/svg_generation-svg_images/3d-cube-dynamic-shadow-effects-svg-rect-animatetransform.json +0 -68
- package/library/svg_generation-svg_images/angry-bulldog-face-black-white-illustration.json +0 -68
- package/library/svg_generation-svg_images/animated-raindrop-effect-on-glass.json +0 -68
- package/library/svg_generation-svg_images/barley-and-wheat-crop-plants.json +0 -68
- package/library/svg_generation-svg_images/bell-ringing-alerting-sound.json +0 -68
- package/library/svg_generation-svg_images/black-and-white-close-up-letter-e-image.json +0 -68
- package/library/svg_generation-svg_images/black-and-white-person-profile-square-photo.json +0 -68
- package/library/svg_generation-svg_images/black-and-white-picture-of-a-sliding-door.json +0 -68
- package/library/svg_generation-svg_images/black-white-outline-map-new-zealand.json +0 -68
- package/library/svg_generation-svg_images/black-white-vector-microscope.json +0 -68
- package/library/svg_generation-svg_images/building-monument-statue.json +0 -68
- package/library/svg_generation-svg_images/burkina-faso-flag-with-star.json +0 -68
- package/library/svg_generation-svg_images/camera-photo-shutter-svg-code.json +0 -68
- package/library/svg_generation-svg_images/carboy-airlock-carbonation-homebrewing.json +0 -68
- package/library/svg_generation-svg_images/cartoon-hedge-with-face.json +0 -68
- package/library/svg_generation-svg_images/chinese-character-long-tail-svg-image.json +0 -68
- package/library/svg_generation-svg_images/cleaning-mess-wet-mop-wiping-liquid.json +0 -68
- package/library/svg_generation-svg_images/close-up-basketball-new-york-knicks-logo.json +0 -68
- package/library/svg_generation-svg_images/cloud-with-rain-coming-out.json +0 -68
- package/library/svg_generation-svg_images/coffee-maker-espresso-machine-caffeinated-drinks.json +0 -68
- package/library/svg_generation-svg_images/computer-monitor-with-colored-buttons.json +0 -68
- package/library/svg_generation-svg_images/computer-system-diagram-info-types.json +0 -68
- package/library/svg_generation-svg_images/concave-octagon-division-into-quadrilaterals.json +0 -68
- package/library/svg_generation-svg_images/create-bicycle-smallest-transportation-tool.json +0 -68
- package/library/svg_generation-svg_images/cubic-box-packaging-svg-code.json +0 -68
- package/library/svg_generation-svg_images/domino-game-tiles-fun.json +0 -68
- package/library/svg_generation-svg_images/draw-a-heart-program.json +0 -68
- package/library/svg_generation-svg_images/drinking-with-cup-at-bar-svg.json +0 -68
- package/library/svg_generation-svg_images/dynamic-svg-realtime-stock-chart-animate.json +0 -68
- package/library/svg_generation-svg_images/dynamic-svg-traffic-map.json +0 -68
- package/library/svg_generation-svg_images/earphones-with-cord-svg-image.json +0 -68
- package/library/svg_generation-svg_images/earth-seven-continents-south-america.json +0 -68
- package/library/svg_generation-svg_images/green-clover-heart-shaped-plant-svg.json +0 -68
- package/library/svg_generation-svg_images/groom-wearing-tailcoat-svg-code.json +0 -68
- package/library/svg_generation-svg_images/half-track-vehicle-svg-image.json +0 -68
- package/library/svg_generation-svg_images/hand-thumbs-up-down-icon.json +0 -68
- package/library/svg_generation-svg_images/human-ear-hearing-organ-svg-image.json +0 -68
- package/library/svg_generation-svg_images/implement-spray-paint-effect-mouse-svg.json +0 -68
- package/library/svg_generation-svg_images/implement-svg-quill-feather-pen.json +0 -68
- package/library/svg_generation-svg_images/infinity-symbol-black-and-white-photo.json +0 -68
- package/library/svg_generation-svg_images/japanese-kimono-traditional-garment.json +0 -68
- package/library/svg_generation-svg_images/keyboard-with-mouse-on-top.json +0 -68
- package/library/svg_generation-svg_images/leaves-falling-from-plant-autumn.json +0 -68
- package/library/svg_generation-svg_images/listen-to-music-headphones-sound-quality.json +0 -68
- package/library/svg_generation-svg_images/magnet-attraction-metal-magnetic-science.json +0 -68
- package/library/svg_generation-svg_images/man-serving-tennis-silhouette-racquet.json +0 -68
- package/library/svg_generation-svg_images/metal-oil-barrel-petroleum.json +0 -68
- package/library/svg_generation-svg_images/minecraft-end-city-drawing-code.json +0 -68
- package/library/svg_generation-svg_images/music-cassette-tape-player-svg.json +0 -68
- package/library/svg_generation-svg_images/musician-playing-hexagonal-accordion-polka-sounds.json +0 -68
- package/library/svg_generation-svg_images/newly-married-couple-heart-symbol.json +0 -68
- package/library/svg_generation-svg_images/olympic-rings-drawing-program.json +0 -68
- package/library/svg_generation-svg_images/person-falling-cliff-parachute-svg.json +0 -68
- package/library/svg_generation-svg_images/person-holding-box-close-up-portrait.json +0 -68
- package/library/svg_generation-svg_images/person-holding-cell-phone-close-up.json +0 -68
- package/library/svg_generation-svg_images/person-laptop-gears-close-up.json +0 -68
- package/library/svg_generation-svg_images/person-walking-crosswalk.json +0 -68
- package/library/svg_generation-svg_images/pie-chart-with-large-amount-of-data.json +0 -68
- package/library/svg_generation-svg_images/pie-chart-with-middle-circle.json +0 -68
- package/library/svg_generation-svg_images/play-with-tiles-play-domino-game-visualization.json +0 -68
- package/library/svg_generation-svg_images/pour-from-container-svg-image.json +0 -68
- package/library/svg_generation-svg_images/raincoat-water-resistant-clothing-for-weather.json +0 -68
- package/library/svg_generation-svg_images/responsive-org-chart-foreignobject-html-embed.json +0 -68
- package/library/svg_generation-svg_images/rocket-ship-launched-into-space.json +0 -68
- package/library/svg_generation-svg_images/rocket-ship.json +0 -68
- package/library/svg_generation-svg_images/school-bell-ringing-svg-code.json +0 -68
- package/library/svg_generation-svg_images/shower-sink-bathtub-drainage-system-svg.json +0 -68
- package/library/svg_generation-svg_images/smartphone-speech-bubbles-svg-illustration.json +0 -68
- package/library/svg_generation-svg_images/snowing-christmas-holiday-scene.json +0 -68
- package/library/svg_generation-svg_images/svg-animated-astronaut-floating-in-space.json +0 -68
- package/library/svg_generation-svg_images/svg-bar-chart-analytics-trends.json +0 -68
- package/library/svg_generation-svg_images/svg-binoculars-browsing-searching-magnifying.json +0 -68
- package/library/svg_generation-svg_images/svg-black-white-fish-long-tail.json +0 -68
- package/library/svg_generation-svg_images/svg-bow-hunting-weapon.json +0 -68
- package/library/svg_generation-svg_images/svg-boxer-fighting-stance.json +0 -68
- package/library/svg_generation-svg_images/svg-butterflyfish-with-swimming-animation.json +0 -68
- package/library/svg_generation-svg_images/svg-chart-audio-supplier-device-count.json +0 -68
- package/library/svg_generation-svg_images/svg-compass-wayfinding-directions.json +0 -68
- package/library/svg_generation-svg_images/svg-crossroads-intersection.json +0 -68
- package/library/svg_generation-svg_images/svg-cube-shaped-box-design.json +0 -68
- package/library/svg_generation-svg_images/svg-digital-camera-for-photography.json +0 -68
- package/library/svg_generation-svg_images/svg-dollar-bills-cash-currency.json +0 -68
- package/library/svg_generation-svg_images/svg-dynamically-rotating-gears-animation.json +0 -68
- package/library/svg_generation-svg_images/svg-eye-with-medicine-drops.json +0 -68
- package/library/svg_generation-svg_images/svg-fast-stopwatch-image.json +0 -68
- package/library/svg_generation-svg_images/svg-gray-game-controller-purple-buttons.json +0 -68
- package/library/svg_generation-svg_images/svg-information-card-generator.json +0 -68
- package/library/svg_generation-svg_images/svg-kyle-broflovski-winter-hat.json +0 -68
- package/library/svg_generation-svg_images/svg-leaning-tower-of-pisa-italy.json +0 -68
- package/library/svg_generation-svg_images/svg-line-trending-upward-trend-data.json +0 -68
- package/library/svg_generation-svg_images/svg-network-graph-information-connections.json +0 -68
- package/library/svg_generation-svg_images/svg-octopus-underwater-marine-creature.json +0 -68
- package/library/svg_generation-svg_images/svg-pie-chart-with-cpus.json +0 -68
- package/library/svg_generation-svg_images/svg-pizza-delivery-visualization.json +0 -68
- package/library/svg_generation-svg_images/svg-rickshaw-tuktuk-vehicle.json +0 -68
- package/library/svg_generation-svg_images/svg-signpost-three-arrows.json +0 -68
- package/library/svg_generation-svg_images/svg-sim-card-yellow-black-design.json +0 -68
- package/library/svg_generation-svg_images/svg-software-interface-screenshot-symbols-buttons.json +0 -68
- package/library/svg_generation-svg_images/svg-toilet-with-flusher.json +0 -68
- package/library/svg_generation-svg_images/svg-white-sign-youtube-logo.json +0 -68
- package/library/svg_generation-svg_images/svg-wristwatch-yellow-face-blue-band.json +0 -68
- package/library/svg_generation-svg_images/toy-car-with-ramp-close-up.json +0 -68
- package/library/svg_generation-svg_images/trifold-brochure-map-svg-code.json +0 -68
- package/library/svg_generation-svg_images/using-a-kitchen-grater-to-shred-cheese.json +0 -68
- package/library/svg_generation-svg_images/wheat-food-vs-wheat-free-grains-visualization.json +0 -68
- package/library/svg_generation-svg_images/woman-profile-long-hair-feminine-hairstyle.json +0 -68
- package/library/svg_generation-svg_images/women-red-lipstick-beauty-accessory.json +0 -68
- package/library/svg_generation-svg_posters/customizable-recruitment-poster-vue-svg.json +0 -68
- package/library/utility_tools-automation/ai-automatic-webpage-creation.json +0 -68
- package/library/utility_tools-automation/ai-automatically-write-website-code.json +0 -68
- package/library/utility_tools-automation/ai-code-generation-management-system.json +0 -68
- package/library/utility_tools-automation/allocate-nameplate-positions-personnel-list.json +0 -68
- package/library/utility_tools-automation/analyze-c-program-time-complexity-big-o.json +0 -68
- package/library/utility_tools-automation/automated-css-formatter-with-comments.json +0 -68
- package/library/utility_tools-automation/automated-unmanned-printing-system.json +0 -68
- package/library/utility_tools-automation/avalonia-dynamic-viewmodel-reflection-code-generation.json +0 -68
- package/library/utility_tools-automation/bi-weekly-plan-random-selector-tool.json +0 -68
- package/library/utility_tools-automation/build-project-react-vite-typescript.json +0 -68
- package/library/utility_tools-automation/chrome-extension-webpage-control.json +0 -68
- package/library/utility_tools-automation/chrome-plugin-spotlight-search-vue3-naive-ui.json +0 -68
- package/library/utility_tools-automation/clock-in-out-overtime-reminder-app.json +0 -68
- package/library/utility_tools-automation/cloud-based-clipboard-sync-tool-with-real-time-features.json +0 -68
- package/library/utility_tools-automation/cs-grad-project-generator.json +0 -68
- package/library/utility_tools-automation/design-double-pinyin-input-method.json +0 -68
- package/library/utility_tools-automation/distributed-computing-client-with-browser-execution.json +0 -68
- package/library/utility_tools-automation/electron-realtime-speech-to-text-translation.json +0 -68
- package/library/utility_tools-automation/ethernet-packet-capture-vue2-electron-app.json +0 -68
- package/library/utility_tools-automation/excel-group-assignment-tool.json +0 -68
- package/library/utility_tools-automation/export-multiple-html-to-pdf-with-jspdf-react-tss.json +0 -68
- package/library/utility_tools-automation/food-delivery-robot-mini-program-joystick-controls.json +0 -68
- package/library/utility_tools-automation/google-extension-vue-devtools-vue2-vue3.json +0 -68
- package/library/utility_tools-automation/image-based-search-program.json +0 -68
- package/library/utility_tools-automation/implement-automatic-backup-tool.json +0 -68
- package/library/utility_tools-automation/implement-fabricjs-mobile-h5-application.json +0 -68
- package/library/utility_tools-automation/implement-ssh-terminal-tauri-vue3-xterm.json +0 -68
- package/library/utility_tools-automation/javascript-search-autocomplete-chinese-pinyin-english.json +0 -68
- package/library/utility_tools-automation/mini-program-auto-extract-geo-coordinates-from-screenshots.json +0 -68
- package/library/utility_tools-automation/monitor-chext-transactions-mobile.json +0 -68
- package/library/utility_tools-automation/monorepo-vue3-vite-tailwind-v4-setup.json +0 -68
- package/library/utility_tools-automation/multi-window-typescript-framework-no-vue.json +0 -68
- package/library/utility_tools-automation/network-packet-capture-analysis-tool.json +0 -68
- package/library/utility_tools-automation/photoshop-2025-one-click-photo-cutout-jsx-script.json +0 -68
- package/library/utility_tools-automation/python-pinduoduo-automation-gui.json +0 -68
- package/library/utility_tools-automation/react-custom-templates-json-output.json +0 -68
- package/library/utility_tools-automation/ruoyi-framework-code-generator.json +0 -68
- package/library/utility_tools-automation/task-scheduler-with-notifications-and-javascript-execution.json +0 -68
- package/library/utility_tools-automation/tauri-react-shadcn-tailwind-auto-update-project.json +0 -68
- package/library/utility_tools-automation/user-agent-switcher-with-presets-and-detection.json +0 -68
- package/library/utility_tools-automation/video-camera-detection-line-crossing-counting.json +0 -68
- package/library/utility_tools-automation/video-download-tool-with-batch-and-quality-options.json +0 -68
- package/library/utility_tools-automation/vs2019-code-generation-tools-requirements.json +0 -68
- package/library/utility_tools-automation/vue-desktop-app-browser-plugin-settings.json +0 -68
- package/library/utility_tools-automation/vue-packet-capture-electron-app.json +0 -68
- package/library/utility_tools-automation/vue3-webpack-complete-process.json +0 -68
- package/library/utility_tools-automation/web-mouse-auto-clicker-with-left-right-buttons.json +0 -68
- package/library/utility_tools-automation/webpage-screenshot-tool.json +0 -68
- package/library/utility_tools-batch_processing/batch-image-retouching-with-parameters.json +0 -68
- package/library/utility_tools-batch_processing/code-expert-drag-drop-table-display.json +0 -68
- package/library/utility_tools-batch_processing/eml-to-pdf-converter-webpage-girlish-design.json +0 -68
- package/library/utility_tools-batch_processing/excel-to-html-converter-ui.json +0 -68
- package/library/utility_tools-batch_processing/file-format-conversion-tool.json +0 -68
- package/library/utility_tools-batch_processing/file-watermarking-system-with-customizable-options.json +0 -68
- package/library/utility_tools-batch_processing/html-convert-png-to-pdf.json +0 -68
- package/library/utility_tools-batch_processing/javascript-convert-msg-to-html-browser.json +0 -68
- package/library/utility_tools-batch_processing/product-group-segmentation-copy-button.json +0 -68
- package/library/utility_tools-batch_processing/react-streamsaver-download-videos.json +0 -68
- package/library/utility_tools-batch_processing/speech-to-text-tool-with-features.json +0 -68
- package/library/utility_tools-calculation_tools/bazi-marriage-compatibility-calculator-mini-program.json +0 -68
- package/library/utility_tools-calculation_tools/bmi-body-fat-calculator.json +0 -68
- package/library/utility_tools-calculation_tools/create-a-timer-no-programming-experience.json +0 -68
- package/library/utility_tools-calculation_tools/create-calculator-vs-form.json +0 -68
- package/library/utility_tools-calculation_tools/currency-exchange-rate-calculator-with-history.json +0 -68
- package/library/utility_tools-calculation_tools/e-commerce-profit-calculation-tool.json +0 -68
- package/library/utility_tools-calculation_tools/frame-beam-rebar-length-calculator-webpage.json +0 -68
- package/library/utility_tools-calculation_tools/geometric-calculation-tool-with-visual-preview.json +0 -68
- package/library/utility_tools-calculation_tools/html-css-js-simulated-clock.json +0 -68
- package/library/utility_tools-calculation_tools/html-geometric-drawing-board-with-measurements.json +0 -68
- package/library/utility_tools-calculation_tools/indented-tree-layout-algorithm-javascript-canvas.json +0 -68
- package/library/utility_tools-calculation_tools/interactive-calculator.json +0 -68
- package/library/utility_tools-calculation_tools/javascript-timer-function-setup.json +0 -68
- package/library/utility_tools-calculation_tools/large-language-model-simple-calculator.json +0 -68
- package/library/utility_tools-calculation_tools/lottery-number-filter-welfare-lottery-3d.json +0 -68
- package/library/utility_tools-calculation_tools/maui-calculator-implementation.json +0 -68
- package/library/utility_tools-calculation_tools/mini-program-tensile-resistance-anchor-bolts.json +0 -68
- package/library/utility_tools-calculation_tools/mitigate-harm-unhealthy-foods.json +0 -68
- package/library/utility_tools-calculation_tools/natural-frequency-calculator-gui.json +0 -68
- package/library/utility_tools-calculation_tools/network-diagnostic-tool-visual-ping-bandwidth.json +0 -68
- package/library/utility_tools-calculation_tools/pension-calculator-social-security-personal-contribution.json +0 -68
- package/library/utility_tools-calculation_tools/production-calculation-calculator-software.json +0 -68
- package/library/utility_tools-calculation_tools/programmer-calculator.json +0 -68
- package/library/utility_tools-calculation_tools/random-number-wheel-1-to-200.json +0 -68
- package/library/utility_tools-calculation_tools/retirement-calculator-html.json +0 -68
- package/library/utility_tools-calculation_tools/uniapp-android-camera-tree-dbh-measurement.json +0 -68
- package/library/utility_tools-calculation_tools/uniapp-mortgage-calculator-app-code.json +0 -68
- package/library/utility_tools-calculation_tools/used-car-value-assessment-template-uniapp-frontend.json +0 -68
- package/library/utility_tools-calculation_tools/vite-vue-bazi-calculator-gregorian-lunar.json +0 -68
- package/library/utility_tools-calculation_tools/webpage-geographic-to-gauss-coordinates-cgcs2000.json +0 -68
- package/library/utility_tools-calculation_tools/wechat-mini-program-calculator-code.json +0 -68
- package/library/utility_tools-daily_office_tasks/add-lunar-holidays-perpetual-calendar.json +0 -68
- package/library/utility_tools-daily_office_tasks/ant-design-vue-excel-import-export-table.json +0 -68
- package/library/utility_tools-daily_office_tasks/app-with-work-items-tasks-pomodoro-timer.json +0 -68
- package/library/utility_tools-daily_office_tasks/baby-event-event-recorder.json +0 -68
- package/library/utility_tools-daily_office_tasks/browser-screenshot-tool-with-editing.json +0 -68
- package/library/utility_tools-daily_office_tasks/chrome-browser-sidebar-extension.json +0 -68
- package/library/utility_tools-daily_office_tasks/classroom-student-selector-html-webpage.json +0 -68
- package/library/utility_tools-daily_office_tasks/code-editing-demo-arco-design-codemirror.json +0 -68
- package/library/utility_tools-daily_office_tasks/countdown-mini-program-html-output.json +0 -68
- package/library/utility_tools-daily_office_tasks/create-selector-for-discipline-json-data.json +0 -68
- package/library/utility_tools-daily_office_tasks/create-tool-collect-consolidate-weekly-reports.json +0 -68
- package/library/utility_tools-daily_office_tasks/create-webpage-hyperlinks-to-run-programs.json +0 -68
- package/library/utility_tools-daily_office_tasks/date-range-selection-processing.json +0 -68
- package/library/utility_tools-daily_office_tasks/deepseek-write-daily-sunlight-record.json +0 -68
- package/library/utility_tools-daily_office_tasks/detailed-daily-schedule-planner.json +0 -68
- package/library/utility_tools-daily_office_tasks/deveco-studio-jd-login-navigation-interface.json +0 -68
- package/library/utility_tools-daily_office_tasks/develop-computer-keyboard-uni-app.json +0 -68
- package/library/utility_tools-daily_office_tasks/electron-json-tool-macos-desktop-app.json +0 -68
- package/library/utility_tools-daily_office_tasks/electron-vue-secure-dual-window-communication.json +0 -68
- package/library/utility_tools-daily_office_tasks/electronic-signature-plugin-canvas.json +0 -68
- package/library/utility_tools-daily_office_tasks/email-template-generator-with-drag-and-drop.json +0 -68
- package/library/utility_tools-daily_office_tasks/excel-data-import-tool-html.json +0 -68
- package/library/utility_tools-daily_office_tasks/excel-file-upload-split-download.json +0 -68
- package/library/utility_tools-daily_office_tasks/generate-calendar-with-specific-work-pattern.json +0 -68
- package/library/utility_tools-daily_office_tasks/generate-family-annual-budget-table.json +0 -68
- package/library/utility_tools-daily_office_tasks/generate-roll-call-program-html-format.json +0 -68
- package/library/utility_tools-daily_office_tasks/gui-framework-function-switching.json +0 -68
- package/library/utility_tools-daily_office_tasks/hbuilder-apk-document-reader-text-to-speech.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-ansi-decoder-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-browser-python-compiler.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-css-convert-word-document-to-webpage.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-random-name-selector-with-excel-import.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-speech-synthesis-multi-voice-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-webpage-comparison-analysis-html-documents.json +0 -68
- package/library/utility_tools-daily_office_tasks/html-xiaohongshu-image-text-overlay-generator.json +0 -68
- package/library/utility_tools-daily_office_tasks/implement-simple-mind-map-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/intelligent-screenshot-annotation-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/medication-reminders-mini-program-elderly.json +0 -68
- package/library/utility_tools-daily_office_tasks/meeting-schedule-qq-music-reminder-system.json +0 -68
- package/library/utility_tools-daily_office_tasks/memo-application-with-audio-playback.json +0 -68
- package/library/utility_tools-daily_office_tasks/merge-multiple-excel-workbooks.json +0 -68
- package/library/utility_tools-daily_office_tasks/mini-program-survey-generator.json +0 -68
- package/library/utility_tools-daily_office_tasks/mobile-qr-code-scanner-webpage.json +0 -68
- package/library/utility_tools-daily_office_tasks/online-text-to-speech-tts-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/password-generation-management-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/pdf-text-extraction-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/ping-pong-score-counter-html-mobile-devices.json +0 -68
- package/library/utility_tools-daily_office_tasks/read-excel-display-data-html.json +0 -68
- package/library/utility_tools-daily_office_tasks/real-time-baseball-score-display-for-streaming.json +0 -68
- package/library/utility_tools-daily_office_tasks/rich-text-editor-spelling-idiom-word-count.json +0 -68
- package/library/utility_tools-daily_office_tasks/shopping-price-comparison-program.json +0 -68
- package/library/utility_tools-daily_office_tasks/small-japanese-translation-program.json +0 -68
- package/library/utility_tools-daily_office_tasks/smart-spreadsheet-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/tauri-clock-application-development.json +0 -68
- package/library/utility_tools-daily_office_tasks/to-do-item-recorder-with-categories-dates-reminders.json +0 -68
- package/library/utility_tools-daily_office_tasks/to-do-list-mini-program-for-boyfriend.json +0 -68
- package/library/utility_tools-daily_office_tasks/to-do-list-mini-program-in-english.json +0 -68
- package/library/utility_tools-daily_office_tasks/to-do-reminder-interface-with-time-limits.json +0 -68
- package/library/utility_tools-daily_office_tasks/typescript-canvas-rich-text-editor.json +0 -68
- package/library/utility_tools-daily_office_tasks/uni-app-vue2-clock-in-page.json +0 -68
- package/library/utility_tools-daily_office_tasks/uniapp-alibaba-cloud-one-click-login.json +0 -68
- package/library/utility_tools-daily_office_tasks/vision-test-program-random-e-directions.json +0 -68
- package/library/utility_tools-daily_office_tasks/vs-code-excel-import-print-no-office.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue-2-frontend-pdf-fill-in-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue-uni-app-writing-pad-finger-trajectories.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue2-data-dictionary-component.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue2-download-component-with-a-tag.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue2-download-pdf-open-canvas.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue3-ts-save-page-as-pdf.json +0 -68
- package/library/utility_tools-daily_office_tasks/vue3-typescript-pdf-signature.json +0 -68
- package/library/utility_tools-daily_office_tasks/weather-forecast-mini-program-html-preview.json +0 -68
- package/library/utility_tools-daily_office_tasks/weather-forecast-query-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/weather-forecast-software-design.json +0 -68
- package/library/utility_tools-daily_office_tasks/web-audio-visualizer-with-labeling.json +0 -68
- package/library/utility_tools-daily_office_tasks/webpage-screenshot-annotation-tool.json +0 -68
- package/library/utility_tools-daily_office_tasks/wechat-mini-program-restrooms-tencent-maps.json +0 -68
- package/library/utility_tools-daily_office_tasks/wechat-mini-program-virtual-list-miniprogram-recycle-view.json +0 -68
- package/library/utility_tools-hardware_management/java-swing-hikvision-sdk-video-stream-display-linux.json +0 -68
- package/library/utility_tools-web_scraping/automated-web-content-extraction-tool.json +0 -68
- package/library/utility_tools-web_scraping/chrome-extension-extract-iframe-table-data.json +0 -68
- package/library/utility_tools-web_scraping/e-commerce-product-filter-affordable-prices.json +0 -68
- package/library/utility_tools-web_scraping/online-webpage-screenshot-tool-with-download-and-save.json +0 -68
- package/library/utility_tools-web_scraping/seo-analysis-tool.json +0 -68
- package/library/utility_tools-web_scraping/super-lotto-scraper-and-number-generator.json +0 -68
- package/library/web_applications-blogs_forums/alibaba-cloud-club-website-html-css-js.json +0 -68
- package/library/web_applications-blogs_forums/blog-community-topic-circles-articles.json +0 -68
- package/library/web_applications-blogs_forums/blog-recommendation-system.json +0 -68
- package/library/web_applications-blogs_forums/blog-subscription-new-article-notification.json +0 -68
- package/library/web_applications-blogs_forums/blog-system-vue3-koa-mongodb.json +0 -68
- package/library/web_applications-blogs_forums/community-blog-platform-with-social-features.json +0 -68
- package/library/web_applications-blogs_forums/grateful-to-mothers-webpage-the-only.json +0 -68
- package/library/web_applications-blogs_forums/html-blog-with-social-features.json +0 -68
- package/library/web_applications-blogs_forums/linux-forum-registration-posting.json +0 -68
- package/library/web_applications-blogs_forums/nuxt-article-editor-with-element-plus.json +0 -68
- package/library/web_applications-blogs_forums/personal-space-with-custom-profile-and-content.json +0 -68
- package/library/web_applications-blogs_forums/simple-forum-html.json +0 -68
- package/library/web_applications-blogs_forums/three-column-web-content-layout.json +0 -68
- package/library/web_applications-blogs_forums/vue-news-briefings-search-and-display.json +0 -68
- package/library/web_applications-business_website/automotive-lean-production-website.json +0 -68
- package/library/web_applications-business_website/electronic-product-homepage-intro-drivers-support.json +0 -68
- package/library/web_applications-communication/aesthetically-pleasing-login-page.json +0 -68
- package/library/web_applications-communication/agreement-image-upload-component.json +0 -68
- package/library/web_applications-communication/ai-chat-conversation-page-react-tdesign.json +0 -68
- package/library/web_applications-communication/android-chat-interface-json-data.json +0 -68
- package/library/web_applications-communication/animal-translator-html-software.json +0 -68
- package/library/web_applications-communication/anonymous-online-voting-system.json +0 -68
- package/library/web_applications-communication/blazor-server-auth-microservice-timestamp.json +0 -68
- package/library/web_applications-communication/campus-lost-found-wechat-mini-program.json +0 -68
- package/library/web_applications-communication/chaoshan-culture-calendar-forum-app.json +0 -68
- package/library/web_applications-communication/collaborative-whiteboard-tool.json +0 -68
- package/library/web_applications-communication/collapsible-sidebar-streaming-content-input-bar.json +0 -68
- package/library/web_applications-communication/customer-service-chat-button-with-backend.json +0 -68
- package/library/web_applications-communication/customer-service-chat-springboot-websocket-offline.json +0 -68
- package/library/web_applications-communication/dormitory-room-414-official-website.json +0 -68
- package/library/web_applications-communication/draggable-menu-buttons.json +0 -68
- package/library/web_applications-communication/dynamic-login-form-validation-captcha.json +0 -68
- package/library/web_applications-communication/gradio-dynamic-dark-mode-themes.json +0 -68
- package/library/web_applications-communication/h5-java-user-login-interface.json +0 -68
- package/library/web_applications-communication/h5-qr-code-chat-room.json +0 -68
- package/library/web_applications-communication/hikvision-vue-realtime-monitoring-video-page.json +0 -68
- package/library/web_applications-communication/homepage-appointment-booking-store-management.json +0 -68
- package/library/web_applications-communication/html-javascript-real-time-chat-system.json +0 -68
- package/library/web_applications-communication/html-simple-login-page.json +0 -68
- package/library/web_applications-communication/html-springboot-login-registration-button.json +0 -68
- package/library/web_applications-communication/html-text-to-speech-with-rich-voice-features.json +0 -68
- package/library/web_applications-communication/implement-sso-page-auth-automatic-login-vue-router-vuex.json +0 -68
- package/library/web_applications-communication/intelligent-email-template-generator-with-ab-testing.json +0 -68
- package/library/web_applications-communication/java-wechat-chat-window-ui.json +0 -68
- package/library/web_applications-communication/livekit-vue3-audio-video-conferencing.json +0 -68
- package/library/web_applications-communication/login-page-image-left-responsive-layout.json +0 -68
- package/library/web_applications-communication/login-registration-component-with-styling.json +0 -68
- package/library/web_applications-communication/media-sharing-annotation-system.json +0 -68
- package/library/web_applications-communication/mini-program-online-customer-service.json +0 -68
- package/library/web_applications-communication/multi-user-online-whiteboard-tool.json +0 -68
- package/library/web_applications-communication/music-listening-webpage-jay-chou-bigbang-tara-exo.json +0 -68
- package/library/web_applications-communication/nodejs-chunk-file-upload-interface.json +0 -68
- package/library/web_applications-communication/online-meeting-room-video-audio-chat-app.json +0 -68
- package/library/web_applications-communication/online-voting-and-surveys.json +0 -68
- package/library/web_applications-communication/online-whiteboard-with-realtime-sync.json +0 -68
- package/library/web_applications-communication/personal-website-sharing-family-friends.json +0 -68
- package/library/web_applications-communication/private-messaging-feature-forum.json +0 -68
- package/library/web_applications-communication/prize-drawing-web-page.json +0 -68
- package/library/web_applications-communication/product-login-page-with-multiple-options.json +0 -68
- package/library/web_applications-communication/qml-wechat-work-interface.json +0 -68
- package/library/web_applications-communication/react-autocomplete-text-box-implementation.json +0 -68
- package/library/web_applications-communication/react-native-flashlist-chat-application.json +0 -68
- package/library/web_applications-communication/react-tailwind-homepage-development.json +0 -68
- package/library/web_applications-communication/real-time-captioning-mobile-app-ui-design.json +0 -68
- package/library/web_applications-communication/responsive-html-webpage-with-tree-navigation.json +0 -68
- package/library/web_applications-communication/robot-dialogue-stream-printing-uniapp-mini-program.json +0 -68
- package/library/web_applications-communication/ros-image-display-vue-flask.json +0 -68
- package/library/web_applications-communication/rust-nuxt-windows-im-client.json +0 -68
- package/library/web_applications-communication/sdu-compuex-network-repair-activity-record.json +0 -68
- package/library/web_applications-communication/secret-mailbox-webpage.json +0 -68
- package/library/web_applications-communication/send-well-wishes-child-birth.json +0 -68
- package/library/web_applications-communication/simple-forum-website-no-database.json +0 -68
- package/library/web_applications-communication/social-media-feed-with-posts-likes-comments.json +0 -68
- package/library/web_applications-communication/song-request-app-with-social-features.json +0 -68
- package/library/web_applications-communication/tencent-yuanbao-ai-response-interface-bootstrap-v5.json +0 -68
- package/library/web_applications-communication/tencent-yuanbao-ant-design-pro-chat-window.json +0 -68
- package/library/web_applications-communication/uni-app-simple-browser-web-view.json +0 -68
- package/library/web_applications-communication/uni-app-tencent-chat-integration.json +0 -68
- package/library/web_applications-communication/uniapp-mobile-im-app-serverless.json +0 -68
- package/library/web_applications-communication/uniapp-socket-io-client-webrtc-video-chat.json +0 -68
- package/library/web_applications-communication/uniapp-vue3-q-a-system-architecture.json +0 -68
- package/library/web_applications-communication/uniapp-wallpaper-homepage-password-logs.json +0 -68
- package/library/web_applications-communication/user-live-streaming-viewing-page.json +0 -68
- package/library/web_applications-communication/user-my-page-with-login-profile.json +0 -68
- package/library/web_applications-communication/user-registration-chat-dynamic-modules.json +0 -68
- package/library/web_applications-communication/vue-3-facial-registration-mobile-camera-background.json +0 -68
- package/library/web_applications-communication/vue-3-tiktok-like-video-app.json +0 -68
- package/library/web_applications-communication/vue-ai-conversation-wechat-work-login-spring-boot.json +0 -68
- package/library/web_applications-communication/vue-chat-conversation-list.json +0 -68
- package/library/web_applications-communication/vue-continuous-log-query-sse-output.json +0 -68
- package/library/web_applications-communication/vue-deepseek-api-streaming-text-display.json +0 -68
- package/library/web_applications-communication/vue-login-homepage-with-users-table.json +0 -68
- package/library/web_applications-communication/vue-login-navigation-system.json +0 -68
- package/library/web_applications-communication/vue-nodejs-express-mysql-xiaohongshu-webpage.json +0 -68
- package/library/web_applications-communication/vue-three-section-social-website.json +0 -68
- package/library/web_applications-communication/vue-wechat-chat-effect-implementation.json +0 -68
- package/library/web_applications-communication/vue2-elementui-flask-file-download-interface.json +0 -68
- package/library/web_applications-communication/vue2-uniapp-membership-card.json +0 -68
- package/library/web_applications-communication/vue3-announcement-viewer-count-real-time-updates.json +0 -68
- package/library/web_applications-communication/vue3-element-plus-wechat-chat-interface.json +0 -68
- package/library/web_applications-communication/vue3-pinia-token-auth-login-module.json +0 -68
- package/library/web_applications-communication/vue3-tiptap-yjs-shared-editor.json +0 -68
- package/library/web_applications-communication/vue3-uni-app-chat-conversation-text-display.json +0 -68
- package/library/web_applications-communication/vue3-uniapp-socketio-chat-dialogue-box.json +0 -68
- package/library/web_applications-communication/web-app-login-profile-chat-pages.json +0 -68
- package/library/web_applications-communication/web-chat-tool-create-join-room.json +0 -68
- package/library/web_applications-communication/web-document-collaboration-editor-frontend.json +0 -68
- package/library/web_applications-communication/web-message-board-code.json +0 -68
- package/library/web_applications-communication/webpage-auto-assign-tasks.json +0 -68
- package/library/web_applications-communication/webpage-deepseek-model-interaction.json +0 -68
- package/library/web_applications-communication/webrtc-frontend-backend-springboot.json +0 -68
- package/library/web_applications-communication/webrtc-frontend-player-index.json +0 -68
- package/library/web_applications-communication/webrtc-sdp-exchange-example.json +0 -68
- package/library/web_applications-communication/website-design-login-registration-carousel.json +0 -68
- package/library/web_applications-communication/website-registration-login-music-black-green.json +0 -68
- package/library/web_applications-communication/wechat-chat-window-vue3-ant-design.json +0 -68
- package/library/web_applications-communication/wechat-cloud-printing-mini-program.json +0 -68
- package/library/web_applications-communication/wechat-like-chat-tool-with-admin-backend.json +0 -68
- package/library/web_applications-communication/wechat-mini-program-framework-profile-orders-settings.json +0 -68
- package/library/web_applications-communication/wechat-mini-program-my-page-login.json +0 -68
- package/library/web_applications-communication/wechat-mini-program-photo-video-management.json +0 -68
- package/library/web_applications-communication/wechat-mini-program-psychological-counseling.json +0 -68
- package/library/web_applications-communication/wechat-mini-program-registration-login-identity-verification.json +0 -68
- package/library/web_applications-communication/wechat-mini-program-voice-form-component.json +0 -68
- package/library/web_applications-communication/wechat-multi-platform-personal-center.json +0 -68
- package/library/web_applications-communication/wechat-official-account-graphic-message-draft.json +0 -68
- package/library/web_applications-communication/wechat-user-login-authorization-data-management.json +0 -68
- package/library/web_applications-education_learning/8th-grade-english-sentence-completion-interactive-html.json +0 -68
- package/library/web_applications-education_learning/academic-research-platform-frontend.json +0 -68
- package/library/web_applications-education_learning/ai-teaching-assistant-educational-platform.json +0 -68
- package/library/web_applications-education_learning/andrej-karpathy-minimalist-note-taking-method.json +0 -68
- package/library/web_applications-education_learning/android-novel-reader-app-json-url.json +0 -68
- package/library/web_applications-education_learning/anesthesia-record-form-web-code.json +0 -68
- package/library/web_applications-education_learning/apple-iphone-generations-intro.json +0 -68
- package/library/web_applications-education_learning/automotive-chip-industry-subdivisions-html-code.json +0 -68
- package/library/web_applications-education_learning/blazor-binary-dat-file-parsing.json +0 -68
- package/library/web_applications-education_learning/bootstrap-4-dynamic-table-ajax-backend.json +0 -68
- package/library/web_applications-education_learning/botanical-garden-interface.json +0 -68
- package/library/web_applications-education_learning/brachistochrone-curve-frontend-demonstration.json +0 -68
- package/library/web_applications-education_learning/calligraphy-stroke-practice-page.json +0 -68
- package/library/web_applications-education_learning/campus-technology-festival-robot-showcase-website.json +0 -68
- package/library/web_applications-education_learning/chinese-chess-commentary-journey-west-style.json +0 -68
- package/library/web_applications-education_learning/class-schedule-draggable-courses.json +0 -68
- package/library/web_applications-education_learning/classroom-info-maintenance-interface.json +0 -68
- package/library/web_applications-education_learning/classroom-random-name-calling-website.json +0 -68
- package/library/web_applications-education_learning/classroom-roll-call-program-html.json +0 -68
- package/library/web_applications-education_learning/classroom-seating-chart-performance-groups.json +0 -68
- package/library/web_applications-education_learning/code-editor-with-live-preview.json +0 -68
- package/library/web_applications-education_learning/code-preview-split-screen.json +0 -68
- package/library/web_applications-education_learning/code-time-complexity-calculator.json +0 -68
- package/library/web_applications-education_learning/college-entrance-examination-application-software.json +0 -68
- package/library/web_applications-education_learning/conversational-vocabulary-learning-app.json +0 -68
- package/library/web_applications-education_learning/creative-writing-assistance-platform.json +0 -68
- package/library/web_applications-education_learning/daily-wellness-app-with-card-unlocking-interface.json +0 -68
- package/library/web_applications-education_learning/dynamic-weather-forecast-website.json +0 -68
- package/library/web_applications-education_learning/dynamic-web-page-oxidation-reduction-reactions.json +0 -68
- package/library/web_applications-education_learning/elementary-chinese-recitation-program.json +0 -68
- package/library/web_applications-education_learning/elementary-english-text-learning-coze-tool.json +0 -68
- package/library/web_applications-education_learning/energy-storage-hr-information-webpage.json +0 -68
- package/library/web_applications-education_learning/english-dictation-system.json +0 -68
- package/library/web_applications-education_learning/english-teacher-word-wheel-web-code.json +0 -68
- package/library/web_applications-education_learning/english-vocabulary-flashcards-for-memorization.json +0 -68
- package/library/web_applications-education_learning/english-word-quiz-program-elementary-grades.json +0 -68
- package/library/web_applications-education_learning/enterprise-digital-transformation-maturity-assessment.json +0 -68
- package/library/web_applications-education_learning/exam-paper-grading-interface-auto-manual.json +0 -68
- package/library/web_applications-education_learning/exam-room-arrangement-student-label-generator.json +0 -68
- package/library/web_applications-education_learning/experiment-report-generator.json +0 -68
- package/library/web_applications-education_learning/fifth-grade-english-vocabulary-game.json +0 -68
- package/library/web_applications-education_learning/flask-vue-project-login-page-redirection-main-page.json +0 -68
- package/library/web_applications-education_learning/frontend-yang-huis-triangle-binary-tree.json +0 -68
- package/library/web_applications-education_learning/full-screen-calendar-webpage-date-import.json +0 -68
- package/library/web_applications-education_learning/fun-english-learning-preschool-elementary-transition.json +0 -68
- package/library/web_applications-education_learning/fuzhou-themed-tourism-website.json +0 -68
- package/library/web_applications-education_learning/gamified-web-design-8th-grade-modern-chinese-history-knowledge.json +0 -68
- package/library/web_applications-education_learning/genshin-impact-html-webpage.json +0 -68
- package/library/web_applications-education_learning/high-school-english-word-memorization-system.json +0 -68
- package/library/web_applications-education_learning/high-school-physics-knowledge-summary.json +0 -68
- package/library/web_applications-education_learning/historical-random-roll-call-system-web.json +0 -68
- package/library/web_applications-education_learning/html-chip-performance-comparison-webpage.json +0 -68
- package/library/web_applications-education_learning/html-cooking-class-attendance-function.json +0 -68
- package/library/web_applications-education_learning/html-css-javascript-learning-tool-live-editor.json +0 -68
- package/library/web_applications-education_learning/html-demo-visualize-automotive-knowledge.json +0 -68
- package/library/web_applications-education_learning/html-math-quiz-generator.json +0 -68
- package/library/web_applications-education_learning/html-mbti-webpage-with-images.json +0 -68
- package/library/web_applications-education_learning/html-mid-term-review-questions-industrial-revolutions-scores-rankings.json +0 -68
- package/library/web_applications-education_learning/html-parse-math-formulas-marked-library.json +0 -68
- package/library/web_applications-education_learning/html-webpage-gravity-falls.json +0 -68
- package/library/web_applications-education_learning/html-website-configure-delta-game-weapons.json +0 -68
- package/library/web_applications-education_learning/hunan-sichuan-attractions-cuisine.json +0 -68
- package/library/web_applications-education_learning/interactive-audio-visual-learning-tool-sound-clips-images.json +0 -68
- package/library/web_applications-education_learning/interactive-geometric-proof-system.json +0 -68
- package/library/web_applications-education_learning/interactive-html-page-classroom-group-scoring.json +0 -68
- package/library/web_applications-education_learning/interactive-instrument-learning-platform.json +0 -68
- package/library/web_applications-education_learning/interactive-periodic-table-with-details-filtering.json +0 -68
- package/library/web_applications-education_learning/interactive-prefix-sum-animation-cpp-code.json +0 -68
- package/library/web_applications-education_learning/java-miniprogram-html-framework-smart-campus-social-creative-tools.json +0 -68
- package/library/web_applications-education_learning/javascript-dynamic-three-level-train-menu.json +0 -68
- package/library/web_applications-education_learning/javascript-tourism-app-backend-code-explanation.json +0 -68
- package/library/web_applications-education_learning/javascript-website-grade-geography-questions.json +0 -68
- package/library/web_applications-education_learning/learning-partner-matching-system.json +0 -68
- package/library/web_applications-education_learning/lisao-webpage-dynamic-video-audio-narration.json +0 -68
- package/library/web_applications-education_learning/literature-retrieval-frontend-design.json +0 -68
- package/library/web_applications-education_learning/lunar-calendar-moon-phase-webpage.json +0 -68
- package/library/web_applications-education_learning/major-historical-disasters-on-this-day.json +0 -68
- package/library/web_applications-education_learning/material-testing-specifications-data.json +0 -68
- package/library/web_applications-education_learning/math-prize-wheel-for-students.json +0 -68
- package/library/web_applications-education_learning/merge-sort-visualization.json +0 -68
- package/library/web_applications-education_learning/mobile-fish-recognition-webpage-tabs.json +0 -68
- package/library/web_applications-education_learning/movie-information-page-with-dynamic-effects.json +0 -68
- package/library/web_applications-education_learning/multilayer-perceptron-animation-explanation.json +0 -68
- package/library/web_applications-education_learning/music-player-with-vuejs-and-ssm.json +0 -68
- package/library/web_applications-education_learning/nodejs-webpage-amap-weather-aqi-data.json +0 -68
- package/library/web_applications-education_learning/online-english-listening-practice-website.json +0 -68
- package/library/web_applications-education_learning/online-handicraft-teaching-platform-frontend.json +0 -68
- package/library/web_applications-education_learning/online-learning-progress-reminder-application.json +0 -68
- package/library/web_applications-education_learning/online-literature-reading-annotation-platform.json +0 -68
- package/library/web_applications-education_learning/online-music-theory-learning-website.json +0 -68
- package/library/web_applications-education_learning/online-quiz-platform-discipline-inspection.json +0 -68
- package/library/web_applications-education_learning/online-text-editor-with-code-highlighting.json +0 -68
- package/library/web_applications-education_learning/party-history-quiz-module.json +0 -68
- package/library/web_applications-education_learning/peer-competition-statistics-table-webpage.json +0 -68
- package/library/web_applications-education_learning/periodic-table-for-middle-school-chemistry.json +0 -68
- package/library/web_applications-education_learning/personalized-learning-recommendation-website-vue-django-mysql.json +0 -68
- package/library/web_applications-education_learning/pomodoro-diary-system-vue-springboot-mysql.json +0 -68
- package/library/web_applications-education_learning/programming-teaching-website-with-editor.json +0 -68
- package/library/web_applications-education_learning/pyside6-flashcards-random-sequential-reverse-order.json +0 -68
- package/library/web_applications-education_learning/qingdao-subway-map-vue2-canvas.json +0 -68
- package/library/web_applications-education_learning/random-name-caller-html-webpage-apple-style.json +0 -68
- package/library/web_applications-education_learning/react-jupyter-notebook-renderer.json +0 -68
- package/library/web_applications-education_learning/real-time-convertible-bond-market-info-webpage.json +0 -68
- package/library/web_applications-education_learning/recipe-search-system-frontend-backend-java.json +0 -68
- package/library/web_applications-education_learning/runnable-laboratory-website-template.json +0 -68
- package/library/web_applications-education_learning/school-network-framework-semantic-ui.json +0 -68
- package/library/web_applications-education_learning/second-grade-multiplication-arithmetic-mini-program.json +0 -68
- package/library/web_applications-education_learning/seventh-grade-west-asia-southeast-asia-quiz.json +0 -68
- package/library/web_applications-education_learning/shaanlu-elementary-english-word-quiz.json +0 -68
- package/library/web_applications-education_learning/shang-han-lun-tcm-diagnostic-app.json +0 -68
- package/library/web_applications-education_learning/side-by-side-translation-comparison-reading.json +0 -68
- package/library/web_applications-education_learning/spelling-flashcards-apple-cat-dog.json +0 -68
- package/library/web_applications-education_learning/spring-wellness-guide-march-12-2025.json +0 -68
- package/library/web_applications-education_learning/star-trail-app-wechat-mini-program.json +0 -68
- package/library/web_applications-education_learning/streamlit-ocr-math-solver-app.json +0 -68
- package/library/web_applications-education_learning/student-id-verification-webpage.json +0 -68
- package/library/web_applications-education_learning/student-preview-assignment-with-answer-check.json +0 -68
- package/library/web_applications-education_learning/student-table-display-with-gender-grouping.json +0 -68
- package/library/web_applications-education_learning/student-teacher-course-selection-system.json +0 -68
- package/library/web_applications-education_learning/su-shi-poems-with-traditional-chinese-style.json +0 -68
- package/library/web_applications-education_learning/teaching-website-7th-grade-asia-focus.json +0 -68
- package/library/web_applications-education_learning/technical-article-aggregation-platform-with-subscriptions.json +0 -68
- package/library/web_applications-education_learning/to-do-list-with-learning-reminders.json +0 -68
- package/library/web_applications-education_learning/traditional-intangible-cultural-heritage-webpage.json +0 -68
- package/library/web_applications-education_learning/travel-guide-weather-amap-integration.json +0 -68
- package/library/web_applications-education_learning/typing-training-simulator.json +0 -68
- package/library/web_applications-education_learning/uniapp-mini-program-creation.json +0 -68
- package/library/web_applications-education_learning/university-homepage-vue.json +0 -68
- package/library/web_applications-education_learning/university-homework-assignment-mini-program.json +0 -68
- package/library/web_applications-education_learning/valorant-tutorial-page-html-multimedia.json +0 -68
- package/library/web_applications-education_learning/video-interactive-q-a-creation-tool.json +0 -68
- package/library/web_applications-education_learning/virtual-spread-plate-experiment-webpage.json +0 -68
- package/library/web_applications-education_learning/visualization-based-q-a-software-20-questions.json +0 -68
- package/library/web_applications-education_learning/vocabulary-learning-app.json +0 -68
- package/library/web_applications-education_learning/vocabulary-learning-webpage.json +0 -68
- package/library/web_applications-education_learning/vocabulary-memorization-pep-8th-grade-english.json +0 -68
- package/library/web_applications-education_learning/vocabulary-practice-app-chinese-8th-grade.json +0 -68
- package/library/web_applications-education_learning/vue-3-offline-deepseek-application.json +0 -68
- package/library/web_applications-education_learning/vue-3-pdf-analysis-page.json +0 -68
- package/library/web_applications-education_learning/vue-3-sql-query-beautify-results.json +0 -68
- package/library/web_applications-education_learning/vue-blockly-project-generation.json +0 -68
- package/library/web_applications-education_learning/vue-example-for-comprehensive-understanding.json +0 -68
- package/library/web_applications-education_learning/vue-mathlive-web-applications.json +0 -68
- package/library/web_applications-education_learning/vue-reader-template-text-splitting-page-turning.json +0 -68
- package/library/web_applications-education_learning/vue-simple-news-webpage.json +0 -68
- package/library/web_applications-education_learning/vue3-sql-to-er-diagram-converter.json +0 -68
- package/library/web_applications-education_learning/vue3-vant-pdf-preview-functionality.json +0 -68
- package/library/web_applications-education_learning/vue3-vite-render-docx-webpage.json +0 -68
- package/library/web_applications-education_learning/web-based-text-editor.json +0 -68
- package/library/web_applications-education_learning/web-based-vocabulary-learning-program-with-import.json +0 -68
- package/library/web_applications-education_learning/web-realtime-bus-inquiry-gaode-chelaile.json +0 -68
- package/library/web_applications-education_learning/web-version-roll-call-system-css-javascript.json +0 -68
- package/library/web_applications-education_learning/webpage-api-docs-function-navigation.json +0 -68
- package/library/web_applications-education_learning/webpage-code-preview-editor.json +0 -68
- package/library/web_applications-education_learning/webpage-display-realtime-data-specific-stocks-trading-limit.json +0 -68
- package/library/web_applications-education_learning/webpage-exams-score-calculation.json +0 -68
- package/library/web_applications-education_learning/webpage-for-reading-free-novels.json +0 -68
- package/library/web_applications-education_learning/webpage-security-checklist-scl-to-word-converter.json +0 -68
- package/library/web_applications-education_learning/wechat-login-medical-knowledge-viewer.json +0 -68
- package/library/web_applications-education_learning/wechat-mini-program-intelligent-lighting-design-form.json +0 -68
- package/library/web_applications-education_learning/wechat-mini-program-novel-reader.json +0 -68
- package/library/web_applications-education_learning/wechat-mini-program-running-track-recorder.json +0 -68
- package/library/web_applications-education_learning/word-memorization-flashcards.json +0 -68
- package/library/web_applications-education_learning/zhejiang-high-school-chemistry-quiz-software.json +0 -68
- package/library/web_applications-entertainment/anime-website-creation.json +0 -68
- package/library/web_applications-entertainment/genshin-impact-gacha-simulation.json +0 -68
- package/library/web_applications-entertainment/music-player-app-with-online-playback-and-api.json +0 -68
- package/library/web_applications-entertainment/vue-3-local-music-card-layout-modern-ui.json +0 -68
- package/library/web_applications-entertainment/web-based-intelligent-music-player-with-scheduled-playlists.json +0 -68
- package/library/web_applications-entertainment/web-based-music-synthesizer-with-modules-and-export.json +0 -68
- package/library/web_applications-entertainment_platform/movie-website-login-registration-homepage.json +0 -68
- package/library/web_applications-entertainment_platform/webpage-code-for-xian-cuisine.json +0 -68
- package/library/web_applications-mapping_location_services/mapbox-kml-viewer-with-tools.json +0 -68
- package/library/web_applications-mapping_location_services/vue3-tianditu-address-search.json +0 -68
- package/library/web_applications-online_shopping/beauty-product-samples-app.json +0 -68
- package/library/web_applications-online_shopping/bootstrap-product-store-display-format.json +0 -68
- package/library/web_applications-online_shopping/clothing-customization-mini-program.json +0 -68
- package/library/web_applications-online_shopping/college-second-hand-trading-platform.json +0 -68
- package/library/web_applications-online_shopping/create-localized-jd-website-framework.json +0 -68
- package/library/web_applications-online_shopping/doce-5-in-1-payment-system-template.json +0 -68
- package/library/web_applications-online_shopping/donation-webpage-creation.json +0 -68
- package/library/web_applications-online_shopping/dynamic-clothing-purchases-webpage.json +0 -68
- package/library/web_applications-online_shopping/e-commerce-flash-sale-interface-frontend.json +0 -68
- package/library/web_applications-online_shopping/e-commerce-mini-program-homepage-info-profile.json +0 -68
- package/library/web_applications-online_shopping/e-commerce-product-detail-page.json +0 -68
- package/library/web_applications-online_shopping/e-commerce-product-management-system.json +0 -68
- package/library/web_applications-online_shopping/e-commerce-webpage-image-text-minimalist-european.json +0 -68
- package/library/web_applications-online_shopping/food-ordering-delivery-webpage.json +0 -68
- package/library/web_applications-online_shopping/frontend-payment-verification-page-callback.json +0 -68
- package/library/web_applications-online_shopping/green-hui-farm-store-pre-order-special.json +0 -68
- package/library/web_applications-online_shopping/hotel-room-reservation-system-frontend.json +0 -68
- package/library/web_applications-online_shopping/international-trade-product-website-carousel.json +0 -68
- package/library/web_applications-online_shopping/jd-ecommerce-homepage-vue.json +0 -68
- package/library/web_applications-online_shopping/online-food-recommendation-page.json +0 -68
- package/library/web_applications-online_shopping/online-furniture-shopping-platform-with-drag-and-drop.json +0 -68
- package/library/web_applications-online_shopping/online-furniture-shopping-website.json +0 -68
- package/library/web_applications-online_shopping/online-second-hand-trading-platform.json +0 -68
- package/library/web_applications-online_shopping/online-shoe-shopping-frontend-project.json +0 -68
- package/library/web_applications-online_shopping/online-shoe-shopping-website-user-center-after-sales.json +0 -68
- package/library/web_applications-online_shopping/online-shopping-platform-with-personal-recommendations.json +0 -68
- package/library/web_applications-online_shopping/online-shopping-website-with-ar-and-gift-wrapping.json +0 -68
- package/library/web_applications-online_shopping/online-shopping-website-with-recommendations.json +0 -68
- package/library/web_applications-online_shopping/pet-store-login-registration-frontend.json +0 -68
- package/library/web_applications-online_shopping/product-bundling-feature.json +0 -68
- package/library/web_applications-online_shopping/product-reviews-dianping-imitation.json +0 -68
- package/library/web_applications-online_shopping/react-retail-receipt-printing.json +0 -68
- package/library/web_applications-online_shopping/second-hand-trading-app-page.json +0 -68
- package/library/web_applications-online_shopping/shopping-app-price-aggregator-purchasing-channels.json +0 -68
- package/library/web_applications-online_shopping/shopping-mall-registration-login-page.json +0 -68
- package/library/web_applications-online_shopping/simple-secondhand-shopping-website.json +0 -68
- package/library/web_applications-online_shopping/snack-menu-mini-program-food-delivery.json +0 -68
- package/library/web_applications-online_shopping/supermarket-wechat-mini-program.json +0 -68
- package/library/web_applications-online_shopping/taobao-order-list-page.json +0 -68
- package/library/web_applications-online_shopping/tech-oriented-e-commerce-website.json +0 -68
- package/library/web_applications-online_shopping/uniapp-jd-app-four-pages.json +0 -68
- package/library/web_applications-online_shopping/uniapp-vue3-jd-product-filter-list.json +0 -68
- package/library/web_applications-online_shopping/visual-agriculture-ecommerce-mini-program.json +0 -68
- package/library/web_applications-online_shopping/vue-bootstrap-secondhand-shopping-website.json +0 -68
- package/library/web_applications-online_shopping/vue2-smart-agriculture-personal-page.json +0 -68
- package/library/web_applications-online_shopping/vue2-spring-boot-web-app-homepage-orders-personal-center.json +0 -68
- package/library/web_applications-online_shopping/vue2-springboot-mysql-e-commerce-system.json +0 -68
- package/library/web_applications-online_shopping/web-based-express-delivery-tracker.json +0 -68
- package/library/web_applications-online_shopping/web-novel-reading-project-vue-pages.json +0 -68
- package/library/web_applications-online_shopping/wechat-delivery-platform-sf-express-integration.json +0 -68
- package/library/web_applications-online_shopping/wechat-mall-app-rewards-delivery-frontend-backend.json +0 -68
- package/library/web_applications-online_shopping/wechat-menu-ordering-mini-program.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-campus-second-hand-trading.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-family-water-card.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-fast-food-ordering-system.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-hotel-booking-page.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-local-tour-waterfall.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-online-shopping.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-price-comparison-shopping.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-restaurant-homepage.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-shawls-fur-products.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-shopping-features.json +0 -68
- package/library/web_applications-online_shopping/wechat-mini-program-store-orders.json +0 -68
- package/library/web_applications-online_shopping/wechat-selling-clothes-mini-program.json +0 -68
- package/library/web_applications-online_shopping/wholesale-retail-condiments-seasonings-product-showcase.json +0 -68
- package/library/web_applications-other/create-capsule-page-with-editor.json +0 -68
- package/library/web_applications-other/mini-program-self-service-car-washing.json +0 -68
- package/library/web_applications-other/real-estate-vr-showcase.json +0 -68
- package/library/web_applications-other/vue-spring-movie-seat-selection.json +0 -68
- package/library/web_applications-other/web-30-minute-countdown-timer.json +0 -68
- package/library/web_applications-other/wechat-mini-program-self-service-car-wash.json +0 -68
- package/library/web_applications-web_visuals/3d-map-amap-vue3-custom-building-blocks-mvt-polyhedrons.json +0 -68
- package/library/web_applications-web_visuals/ai-park-innovation-platform.json +0 -68
- package/library/web_applications-web_visuals/alarm-data-overview-module.json +0 -68
- package/library/web_applications-web_visuals/birthday-card-with-oldies-music.json +0 -68
- package/library/web_applications-web_visuals/create-bouncing-heart-dev-code.json +0 -68
- package/library/web_applications-web_visuals/create-nicegui-marquee-text-scrolling-effect.json +0 -68
- package/library/web_applications-web_visuals/css-visual-effects-spring-theme.json +0 -68
- package/library/web_applications-web_visuals/customizable-rectangles-with-embedded-panel.json +0 -68
- package/library/web_applications-web_visuals/display-videos-from-local-folder-on-web-page.json +0 -68
- package/library/web_applications-web_visuals/dotnet-6-website-baidu-map-location-markers.json +0 -68
- package/library/web_applications-web_visuals/draggable-nodes-to-forms-using-vue-flow.json +0 -68
- package/library/web_applications-web_visuals/electronic-map-mark-points-insert-photos.json +0 -68
- package/library/web_applications-web_visuals/elementui-navigation-page-custom-layout.json +0 -68
- package/library/web_applications-web_visuals/engineering-graphics-3d-visualization-vue-element-plus-interface.json +0 -68
- package/library/web_applications-web_visuals/face-swapping-frontend-interface.json +0 -68
- package/library/web_applications-web_visuals/font-awesome-icon-preview-webpage.json +0 -68
- package/library/web_applications-web_visuals/frontend-online-preview-file-streams-vue2.json +0 -68
- package/library/web_applications-web_visuals/frontend-rotating-ppt-charts-program.json +0 -68
- package/library/web_applications-web_visuals/gridstackjs-vue3-designer.json +0 -68
- package/library/web_applications-web_visuals/h5-panoramic-vr-effect-code.json +0 -68
- package/library/web_applications-web_visuals/homepage-spinning-animation-loading-popup.json +0 -68
- package/library/web_applications-web_visuals/horror-game-official-website-html.json +0 -68
- package/library/web_applications-web_visuals/html-3d-street-view-renderer.json +0 -68
- package/library/web_applications-web_visuals/html-button-new-page-esp32-arduino.json +0 -68
- package/library/web_applications-web_visuals/html-code-minecraft-theme.json +0 -68
- package/library/web_applications-web_visuals/html-display-local-media.json +0 -68
- package/library/web_applications-web_visuals/html-iphone-image-video-viewer-interface.json +0 -68
- package/library/web_applications-web_visuals/html-upload-image-analyze-results.json +0 -68
- package/library/web_applications-web_visuals/html-webpage-mp3-wav-playlist-playback.json +0 -68
- package/library/web_applications-web_visuals/implement-curve-drawing-ol-js.json +0 -68
- package/library/web_applications-web_visuals/implement-windows-like-multi-window-html.json +0 -68
- package/library/web_applications-web_visuals/integrate-mapbox-gl-in-react.json +0 -68
- package/library/web_applications-web_visuals/interstellar-black-hole-html-drawing.json +0 -68
- package/library/web_applications-web_visuals/javascript-showcase-artwork-dynamic-webpages.json +0 -68
- package/library/web_applications-web_visuals/jquery-floating-text-website.json +0 -68
- package/library/web_applications-web_visuals/mobile-wallpaper-webpage.json +0 -68
- package/library/web_applications-web_visuals/nested-webpage-clickable-expandable-sections.json +0 -68
- package/library/web_applications-web_visuals/new-year-wishes-program-interface.json +0 -68
- package/library/web_applications-web_visuals/nezha-character-description-css-preprocessing.json +0 -68
- package/library/web_applications-web_visuals/nezha-sea-dragon-anime-style.json +0 -68
- package/library/web_applications-web_visuals/online-editable-menu-image-exporter.json +0 -68
- package/library/web_applications-web_visuals/online-network-topology-editor-antv-g6.json +0 -68
- package/library/web_applications-web_visuals/panoramic-photo-project-vue3-threejs.json +0 -68
- package/library/web_applications-web_visuals/prize-drawing-webpage-with-admin-panel.json +0 -68
- package/library/web_applications-web_visuals/python-semantic-ui-webpage-creation.json +0 -68
- package/library/web_applications-web_visuals/react-ant-design-text-flipping-function.json +0 -68
- package/library/web_applications-web_visuals/react-antd-windows-desktop-menu-design.json +0 -68
- package/library/web_applications-web_visuals/react-single-page-application-development.json +0 -68
- package/library/web_applications-web_visuals/rural-courtyard-six-bedrooms-html-design.json +0 -68
- package/library/web_applications-web_visuals/traffic-light-web-interface.json +0 -68
- package/library/web_applications-web_visuals/unity-cloud-rendering-html-interaction.json +0 -68
- package/library/web_applications-web_visuals/vue-3-amap-autonavi-3d-map-building-blocks.json +0 -68
- package/library/web_applications-web_visuals/vue-3-canvas-2.5d-effect-button-click.json +0 -68
- package/library/web_applications-web_visuals/vue-amap-realtime-location-monitor.json +0 -68
- package/library/web_applications-web_visuals/vue2-offline-map-cesium-zhengzhou.json +0 -68
- package/library/web_applications-web_visuals/vue3-cabinet-topology-diagram-demo.json +0 -68
- package/library/web_applications-web_visuals/vue3-categorized-video-platform-with-upload.json +0 -68
- package/library/web_applications-web_visuals/vue3-creating-openlayers.json +0 -68
- package/library/web_applications-web_visuals/vue3-element-ui-weather-app.json +0 -68
- package/library/web_applications-web_visuals/vue3-openlayers-gcj02-tile-coordinate-display.json +0 -68
- package/library/web_applications-web_visuals/vue3-vite-gis-2d-3d-layers.json +0 -68
- package/library/web_applications-web_visuals/vue3-webgis-overlay-bar-charts-offline-maps.json +0 -68
- package/library/web_applications-web_visuals/web-album-case-javascript-implementation.json +0 -68
- package/library/web_applications-web_visuals/web-editor-for-tombstone-design.json +0 -68
- package/library/web_applications-web_visuals/web-scraping-video-website-with-pagination.json +0 -68
- package/library/web_applications-web_visuals/webpage-chick-overalls-playing-basketball.json +0 -68
- package/library/web_applications-web_visuals/webpage-dancing-dog.json +0 -68
- package/library/web_applications-web_visuals/webpage-lets-farm-variety-show-html.json +0 -68
- package/library/web_applications-web_visuals/webpage-tree-growing-animation.json +0 -68
- package/library/web_applications-web_visuals/webpage-white-cat-playing-ping-pong.json +0 -68
- package/library/web_applications-web_visuals/wechat-mini-program-image-functionality.json +0 -68
- package/library/web_applications-web_visuals/xiaohongshu-style-html-image-code-for-screenshots.json +0 -68
- package/src/cli.ts +0 -81
- package/src/prompt.ts +0 -128
package/dist/cli.js
ADDED
|
@@ -0,0 +1,2515 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli.ts
|
|
4
|
+
import { CommanderError } from "commander";
|
|
5
|
+
|
|
6
|
+
// src/cli-program.ts
|
|
7
|
+
import { Command } from "commander";
|
|
8
|
+
|
|
9
|
+
// src/config.ts
|
|
10
|
+
import { access, stat } from "fs/promises";
|
|
11
|
+
import { resolve } from "path";
|
|
12
|
+
|
|
13
|
+
// src/utils/errors.ts
|
|
14
|
+
var CliError = class extends Error {
|
|
15
|
+
constructor(message, exitCode = 1) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.exitCode = exitCode;
|
|
18
|
+
this.name = "CliError";
|
|
19
|
+
}
|
|
20
|
+
exitCode;
|
|
21
|
+
};
|
|
22
|
+
function getErrorMessage(error) {
|
|
23
|
+
if (error instanceof Error) {
|
|
24
|
+
return error.message;
|
|
25
|
+
}
|
|
26
|
+
return String(error);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// src/config.ts
|
|
30
|
+
var DEFAULT_PROVIDER = "openai";
|
|
31
|
+
var DEFAULT_MODEL = "gpt-5.6";
|
|
32
|
+
var DEFAULT_MAX_STEPS = 20;
|
|
33
|
+
var DEFAULT_COMMAND_TIMEOUT_MS = 3e4;
|
|
34
|
+
var DEFAULT_MAX_OUTPUT_BYTES = 65536;
|
|
35
|
+
var DEFAULT_EXECUTOR = "none";
|
|
36
|
+
function parseNumber(name, value, fallback) {
|
|
37
|
+
if (value === void 0 || value === "") {
|
|
38
|
+
return fallback;
|
|
39
|
+
}
|
|
40
|
+
const parsed = typeof value === "number" ? value : Number.parseInt(value, 10);
|
|
41
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
42
|
+
throw new CliError(`${name} must be a non-negative integer`);
|
|
43
|
+
}
|
|
44
|
+
return Math.floor(parsed);
|
|
45
|
+
}
|
|
46
|
+
function clamp(value, min, max) {
|
|
47
|
+
return Math.min(max, Math.max(min, value));
|
|
48
|
+
}
|
|
49
|
+
function parseExecutor(value) {
|
|
50
|
+
const executor = value ?? DEFAULT_EXECUTOR;
|
|
51
|
+
if (executor !== "none" && executor !== "local" && executor !== "daytona") {
|
|
52
|
+
throw new CliError(`Unsupported executor: ${executor}. Expected one of: none, local, daytona`);
|
|
53
|
+
}
|
|
54
|
+
return executor;
|
|
55
|
+
}
|
|
56
|
+
async function resolveRunConfig(input = {}, env = process.env) {
|
|
57
|
+
const cwd = resolve(input.cwd ?? env.OLLIE_CWD ?? process.cwd());
|
|
58
|
+
const stats = await stat(cwd).catch(() => null);
|
|
59
|
+
if (!stats?.isDirectory()) {
|
|
60
|
+
throw new CliError(`Working directory does not exist or is not a directory: ${cwd}`);
|
|
61
|
+
}
|
|
62
|
+
await access(cwd);
|
|
63
|
+
const executor = parseExecutor(input.executor ?? env.OLLIE_EXECUTOR);
|
|
64
|
+
return {
|
|
65
|
+
cwd,
|
|
66
|
+
provider: input.provider ?? env.OLLIE_PROVIDER ?? DEFAULT_PROVIDER,
|
|
67
|
+
model: input.model ?? env.OLLIE_MODEL ?? DEFAULT_MODEL,
|
|
68
|
+
executor,
|
|
69
|
+
maxSteps: clamp(
|
|
70
|
+
parseNumber("max steps", input.maxSteps ?? env.OLLIE_MAX_STEPS, DEFAULT_MAX_STEPS),
|
|
71
|
+
1,
|
|
72
|
+
100
|
|
73
|
+
),
|
|
74
|
+
commandTimeoutMs: clamp(
|
|
75
|
+
parseNumber(
|
|
76
|
+
"command timeout",
|
|
77
|
+
input.timeout ?? env.OLLIE_COMMAND_TIMEOUT_MS,
|
|
78
|
+
DEFAULT_COMMAND_TIMEOUT_MS
|
|
79
|
+
),
|
|
80
|
+
1,
|
|
81
|
+
3e5
|
|
82
|
+
),
|
|
83
|
+
maxOutputBytes: clamp(
|
|
84
|
+
parseNumber(
|
|
85
|
+
"max output",
|
|
86
|
+
input.maxOutput ?? env.OLLIE_MAX_OUTPUT_BYTES,
|
|
87
|
+
DEFAULT_MAX_OUTPUT_BYTES
|
|
88
|
+
),
|
|
89
|
+
1,
|
|
90
|
+
2e6
|
|
91
|
+
),
|
|
92
|
+
ndjson: input.ndjson ?? false,
|
|
93
|
+
json: input.json ?? false,
|
|
94
|
+
color: input.color ?? !env.NO_COLOR
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/doctor.ts
|
|
99
|
+
import { access as access2, stat as stat2 } from "fs/promises";
|
|
100
|
+
|
|
101
|
+
// src/sandbox/just-bash.ts
|
|
102
|
+
import { realpathSync, statSync } from "fs";
|
|
103
|
+
import { Bash, InMemoryFs, MountableFs, ReadWriteFs } from "just-bash";
|
|
104
|
+
|
|
105
|
+
// src/sandbox/git/index.ts
|
|
106
|
+
import { posix as posix2 } from "path";
|
|
107
|
+
import { createTwoFilesPatch } from "diff";
|
|
108
|
+
import * as git from "isomorphic-git";
|
|
109
|
+
import { defineCommand } from "just-bash";
|
|
110
|
+
|
|
111
|
+
// src/sandbox/git/fs-adapter.ts
|
|
112
|
+
import { posix } from "path";
|
|
113
|
+
var ROOT = "/workspace";
|
|
114
|
+
function safePath(path) {
|
|
115
|
+
if (path.includes("\0") || path.includes("\\")) {
|
|
116
|
+
throw Object.assign(new Error("Invalid virtual Git path"), { code: "EINVAL" });
|
|
117
|
+
}
|
|
118
|
+
const normalized = posix.resolve(path);
|
|
119
|
+
if (normalized !== ROOT && !normalized.startsWith(`${ROOT}/`)) {
|
|
120
|
+
throw Object.assign(new Error("Git path is outside /workspace"), { code: "EACCES" });
|
|
121
|
+
}
|
|
122
|
+
return normalized;
|
|
123
|
+
}
|
|
124
|
+
function normalizeError(error) {
|
|
125
|
+
if (error instanceof Error) {
|
|
126
|
+
const coded = error;
|
|
127
|
+
if (!coded.code) {
|
|
128
|
+
if (/not found|does not exist|enoent/i.test(error.message)) coded.code = "ENOENT";
|
|
129
|
+
else if (/exist/i.test(error.message)) coded.code = "EEXIST";
|
|
130
|
+
else if (/directory/i.test(error.message)) coded.code = "ENOTDIR";
|
|
131
|
+
else coded.code = "EIO";
|
|
132
|
+
}
|
|
133
|
+
throw coded;
|
|
134
|
+
}
|
|
135
|
+
throw Object.assign(new Error("Virtual filesystem operation failed"), { code: "EIO" });
|
|
136
|
+
}
|
|
137
|
+
async function ensureParent(fs, path) {
|
|
138
|
+
const parent = posix.dirname(path);
|
|
139
|
+
if (!await fs.exists(parent)) await fs.mkdir(parent, { recursive: true });
|
|
140
|
+
}
|
|
141
|
+
function statShape(stat4) {
|
|
142
|
+
const typeMode = stat4.isDirectory ? 16384 : stat4.isSymbolicLink ? 40960 : 32768;
|
|
143
|
+
const mode = typeMode | stat4.mode & 4095;
|
|
144
|
+
return {
|
|
145
|
+
isFile: () => stat4.isFile,
|
|
146
|
+
isDirectory: () => stat4.isDirectory,
|
|
147
|
+
isSymbolicLink: () => stat4.isSymbolicLink,
|
|
148
|
+
mode,
|
|
149
|
+
size: stat4.size,
|
|
150
|
+
mtime: stat4.mtime,
|
|
151
|
+
mtimeMs: stat4.mtime.getTime(),
|
|
152
|
+
ctimeMs: stat4.mtime.getTime(),
|
|
153
|
+
ino: 0,
|
|
154
|
+
uid: 0,
|
|
155
|
+
gid: 0,
|
|
156
|
+
dev: 0
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function createGitFs(fs) {
|
|
160
|
+
const promises = {
|
|
161
|
+
async readFile(path, options) {
|
|
162
|
+
try {
|
|
163
|
+
const virtualPath2 = safePath(path);
|
|
164
|
+
const encoding = typeof options === "string" ? options : options?.encoding;
|
|
165
|
+
return encoding ? fs.readFile(virtualPath2, "utf8") : fs.readFileBuffer(virtualPath2);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
normalizeError(error);
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
async writeFile(path, data) {
|
|
171
|
+
try {
|
|
172
|
+
const virtualPath2 = safePath(path);
|
|
173
|
+
await ensureParent(fs, virtualPath2);
|
|
174
|
+
await fs.writeFile(virtualPath2, data);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
normalizeError(error);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
async unlink(path) {
|
|
180
|
+
try {
|
|
181
|
+
await fs.rm(safePath(path));
|
|
182
|
+
} catch (error) {
|
|
183
|
+
normalizeError(error);
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
async readdir(path) {
|
|
187
|
+
try {
|
|
188
|
+
return await fs.readdir(safePath(path));
|
|
189
|
+
} catch (error) {
|
|
190
|
+
normalizeError(error);
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
async mkdir(path) {
|
|
194
|
+
try {
|
|
195
|
+
await fs.mkdir(safePath(path), { recursive: true });
|
|
196
|
+
} catch (error) {
|
|
197
|
+
normalizeError(error);
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
async rmdir(path) {
|
|
201
|
+
try {
|
|
202
|
+
await fs.rm(safePath(path));
|
|
203
|
+
} catch (error) {
|
|
204
|
+
normalizeError(error);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
async rename(from, to) {
|
|
208
|
+
try {
|
|
209
|
+
await ensureParent(fs, safePath(to));
|
|
210
|
+
await fs.mv(safePath(from), safePath(to));
|
|
211
|
+
} catch (error) {
|
|
212
|
+
normalizeError(error);
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
async stat(path) {
|
|
216
|
+
try {
|
|
217
|
+
return statShape(await fs.stat(safePath(path)));
|
|
218
|
+
} catch (error) {
|
|
219
|
+
normalizeError(error);
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
async lstat(path) {
|
|
223
|
+
try {
|
|
224
|
+
return statShape(await fs.lstat(safePath(path)));
|
|
225
|
+
} catch (error) {
|
|
226
|
+
normalizeError(error);
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
async readlink(path) {
|
|
230
|
+
try {
|
|
231
|
+
return await fs.readlink(safePath(path));
|
|
232
|
+
} catch (error) {
|
|
233
|
+
normalizeError(error);
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
async symlink(target, path) {
|
|
237
|
+
try {
|
|
238
|
+
await fs.symlink(target, safePath(path));
|
|
239
|
+
} catch (error) {
|
|
240
|
+
normalizeError(error);
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
async chmod(path, mode) {
|
|
244
|
+
try {
|
|
245
|
+
await fs.chmod(safePath(path), mode);
|
|
246
|
+
} catch (error) {
|
|
247
|
+
normalizeError(error);
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
async utimes(path, atime, mtime) {
|
|
251
|
+
try {
|
|
252
|
+
await fs.utimes(safePath(path), atime, mtime);
|
|
253
|
+
} catch (error) {
|
|
254
|
+
normalizeError(error);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
return { promises };
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// src/sandbox/git/http-adapter.ts
|
|
262
|
+
function isPrivateLiteralHost(hostname) {
|
|
263
|
+
const host = hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
264
|
+
if (host === "localhost" || host.endsWith(".localhost") || host === "::1") return true;
|
|
265
|
+
const octets = host.split(".").map(Number);
|
|
266
|
+
if (octets.length !== 4 || octets.some((octet) => !Number.isInteger(octet))) return false;
|
|
267
|
+
return octets[0] === 10 || octets[0] === 127 || octets[0] === 169 && octets[1] === 254 || octets[0] === 172 && octets[1] >= 16 && octets[1] <= 31 || octets[0] === 192 && octets[1] === 168;
|
|
268
|
+
}
|
|
269
|
+
function validateRemoteUrl(value) {
|
|
270
|
+
let url;
|
|
271
|
+
try {
|
|
272
|
+
url = new URL(value);
|
|
273
|
+
} catch {
|
|
274
|
+
throw new Error("Only absolute HTTPS remote URLs are supported");
|
|
275
|
+
}
|
|
276
|
+
if (url.protocol !== "https:") throw new Error("Only HTTPS remote URLs are supported");
|
|
277
|
+
if (url.username || url.password) throw new Error("Remote URLs must not contain credentials");
|
|
278
|
+
if (url.hash) throw new Error("Remote URLs must not contain fragments");
|
|
279
|
+
if (isPrivateLiteralHost(url.hostname)) {
|
|
280
|
+
throw new Error("Remote URLs must not target local or private hosts");
|
|
281
|
+
}
|
|
282
|
+
return url.toString();
|
|
283
|
+
}
|
|
284
|
+
async function collectBody(body, signal) {
|
|
285
|
+
if (!body) return new Uint8Array();
|
|
286
|
+
const chunks = [];
|
|
287
|
+
let size = 0;
|
|
288
|
+
for await (const chunk of body) {
|
|
289
|
+
if (signal?.aborted) throw new Error("Git operation was aborted");
|
|
290
|
+
chunks.push(chunk);
|
|
291
|
+
size += chunk.byteLength;
|
|
292
|
+
}
|
|
293
|
+
const result = new Uint8Array(size);
|
|
294
|
+
let offset = 0;
|
|
295
|
+
for (const chunk of chunks) {
|
|
296
|
+
result.set(chunk, offset);
|
|
297
|
+
offset += chunk.byteLength;
|
|
298
|
+
}
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
async function* oneChunk(body) {
|
|
302
|
+
yield body;
|
|
303
|
+
}
|
|
304
|
+
function createGitHttp(ctx) {
|
|
305
|
+
return {
|
|
306
|
+
async request(request) {
|
|
307
|
+
if (!ctx.fetch) throw new Error("Network access is not configured for this sandbox");
|
|
308
|
+
if (ctx.signal?.aborted) throw new Error("Git operation was aborted");
|
|
309
|
+
const url = validateRemoteUrl(request.url);
|
|
310
|
+
const bytes = await collectBody(request.body, ctx.signal);
|
|
311
|
+
const response = await ctx.fetch(url, {
|
|
312
|
+
method: request.method ?? "GET",
|
|
313
|
+
headers: request.headers,
|
|
314
|
+
// SecureFetch forwards BodyInit values unchanged, but its public type is narrower.
|
|
315
|
+
body: bytes.length > 0 ? bytes : void 0,
|
|
316
|
+
followRedirects: true
|
|
317
|
+
});
|
|
318
|
+
if (ctx.signal?.aborted) throw new Error("Git operation was aborted");
|
|
319
|
+
const finalUrl = validateRemoteUrl(response.url);
|
|
320
|
+
return {
|
|
321
|
+
url: finalUrl,
|
|
322
|
+
method: request.method,
|
|
323
|
+
headers: response.headers,
|
|
324
|
+
body: oneChunk(response.body),
|
|
325
|
+
statusCode: response.status,
|
|
326
|
+
statusMessage: response.statusText
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// src/sandbox/git/index.ts
|
|
333
|
+
var WORKSPACE = "/workspace";
|
|
334
|
+
var VERSION = "ollie-git/0.1 (isomorphic-git)";
|
|
335
|
+
var COMMANDS = [
|
|
336
|
+
"init",
|
|
337
|
+
"clone",
|
|
338
|
+
"status",
|
|
339
|
+
"add",
|
|
340
|
+
"commit",
|
|
341
|
+
"log",
|
|
342
|
+
"diff",
|
|
343
|
+
"branch",
|
|
344
|
+
"checkout",
|
|
345
|
+
"remote",
|
|
346
|
+
"config",
|
|
347
|
+
"fetch",
|
|
348
|
+
"pull",
|
|
349
|
+
"push"
|
|
350
|
+
];
|
|
351
|
+
var UsageError = class extends Error {
|
|
352
|
+
};
|
|
353
|
+
function ok(stdout = "") {
|
|
354
|
+
return { stdout, stderr: "", exitCode: 0 };
|
|
355
|
+
}
|
|
356
|
+
function usage(message) {
|
|
357
|
+
throw new UsageError(message ?? "unsupported arguments");
|
|
358
|
+
}
|
|
359
|
+
function assertNotAborted(ctx) {
|
|
360
|
+
if (ctx.signal?.aborted) throw new Error("operation aborted");
|
|
361
|
+
}
|
|
362
|
+
function virtualPath(ctx, input = ".") {
|
|
363
|
+
if (input.includes("\0") || input.includes("\\")) throw new Error("invalid path");
|
|
364
|
+
const resolved = ctx.fs.resolvePath(ctx.cwd, input);
|
|
365
|
+
if (resolved !== WORKSPACE && !resolved.startsWith(`${WORKSPACE}/`)) {
|
|
366
|
+
throw new Error("path is outside /workspace");
|
|
367
|
+
}
|
|
368
|
+
return resolved;
|
|
369
|
+
}
|
|
370
|
+
async function repositoryDir(ctx) {
|
|
371
|
+
let current = virtualPath(ctx);
|
|
372
|
+
while (current === WORKSPACE || current.startsWith(`${WORKSPACE}/`)) {
|
|
373
|
+
if (await ctx.fs.exists(posix2.join(current, ".git"))) return current;
|
|
374
|
+
if (current === WORKSPACE) break;
|
|
375
|
+
current = posix2.dirname(current);
|
|
376
|
+
}
|
|
377
|
+
throw new Error("not a git repository (or any parent up to /workspace)");
|
|
378
|
+
}
|
|
379
|
+
function optionValue(args, names) {
|
|
380
|
+
let value;
|
|
381
|
+
const rest = [];
|
|
382
|
+
for (let index = 0; index < args.length; index++) {
|
|
383
|
+
const arg = args[index];
|
|
384
|
+
if (arg && names.includes(arg)) {
|
|
385
|
+
const next = args[++index];
|
|
386
|
+
if (!next) usage(`${arg} requires a value`);
|
|
387
|
+
value = next;
|
|
388
|
+
} else if (arg && names.some((name) => arg.startsWith(`${name}=`))) {
|
|
389
|
+
value = arg.slice(arg.indexOf("=") + 1);
|
|
390
|
+
} else if (arg) rest.push(arg);
|
|
391
|
+
}
|
|
392
|
+
return { value, rest };
|
|
393
|
+
}
|
|
394
|
+
function flag(args, names) {
|
|
395
|
+
let enabled = false;
|
|
396
|
+
const rest = args.filter((arg) => {
|
|
397
|
+
if (names.includes(arg)) {
|
|
398
|
+
enabled = true;
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
return true;
|
|
402
|
+
});
|
|
403
|
+
return { enabled, rest };
|
|
404
|
+
}
|
|
405
|
+
function rejectOptions(args) {
|
|
406
|
+
const unknown = args.find((arg) => arg.startsWith("-"));
|
|
407
|
+
if (unknown) usage(`unsupported option '${unknown}'`);
|
|
408
|
+
}
|
|
409
|
+
function positiveInteger(value, option) {
|
|
410
|
+
if (value === void 0) return void 0;
|
|
411
|
+
const parsed = Number(value);
|
|
412
|
+
if (!Number.isSafeInteger(parsed) || parsed <= 0) usage(`${option} requires a positive integer`);
|
|
413
|
+
return parsed;
|
|
414
|
+
}
|
|
415
|
+
function authFor(context, url) {
|
|
416
|
+
if (!url || !context.options.resolveAuth) return void 0;
|
|
417
|
+
return async () => context.options.resolveAuth?.(url);
|
|
418
|
+
}
|
|
419
|
+
async function remoteUrl(context, dir, remote) {
|
|
420
|
+
const value = await git.getConfig({ fs: context.fs, dir, path: `remote.${remote}.url` });
|
|
421
|
+
if (!value) throw new Error(`remote '${remote}' has no URL`);
|
|
422
|
+
return validateRemoteUrl(value);
|
|
423
|
+
}
|
|
424
|
+
var GLOBAL_CONFIG_PATH = "/home/user/.gitconfig";
|
|
425
|
+
async function readGlobalConfig(ctx) {
|
|
426
|
+
if (!await ctx.fs.exists(GLOBAL_CONFIG_PATH)) return /* @__PURE__ */ new Map();
|
|
427
|
+
const values = /* @__PURE__ */ new Map();
|
|
428
|
+
let section = "";
|
|
429
|
+
for (const rawLine of (await ctx.fs.readFile(GLOBAL_CONFIG_PATH)).split("\n")) {
|
|
430
|
+
const line = rawLine.trim();
|
|
431
|
+
const sectionMatch = /^\[([^\]]+)\]$/.exec(line);
|
|
432
|
+
if (sectionMatch?.[1]) {
|
|
433
|
+
section = sectionMatch[1].trim().toLowerCase();
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
const valueMatch = /^([^=]+)=(.*)$/.exec(line);
|
|
437
|
+
if (section && valueMatch?.[1] !== void 0 && valueMatch[2] !== void 0) {
|
|
438
|
+
values.set(`${section}.${valueMatch[1].trim().toLowerCase()}`, valueMatch[2].trim());
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return values;
|
|
442
|
+
}
|
|
443
|
+
async function writeGlobalConfig(ctx, values) {
|
|
444
|
+
const sections = /* @__PURE__ */ new Map();
|
|
445
|
+
for (const [path, value] of [...values].sort(([left], [right]) => left.localeCompare(right))) {
|
|
446
|
+
const separator = path.indexOf(".");
|
|
447
|
+
if (separator < 1) usage("config key must contain a section");
|
|
448
|
+
const section = path.slice(0, separator);
|
|
449
|
+
const name = path.slice(separator + 1);
|
|
450
|
+
const entries = sections.get(section) ?? [];
|
|
451
|
+
entries.push([name, value]);
|
|
452
|
+
sections.set(section, entries);
|
|
453
|
+
}
|
|
454
|
+
const content = [...sections].map(
|
|
455
|
+
([section, entries]) => `[${section}]
|
|
456
|
+
${entries.map(([key, value]) => ` ${key} = ${value}`).join("\n")}`
|
|
457
|
+
).join("\n");
|
|
458
|
+
await ctx.fs.mkdir(posix2.dirname(GLOBAL_CONFIG_PATH), { recursive: true });
|
|
459
|
+
await ctx.fs.writeFile(GLOBAL_CONFIG_PATH, content ? `${content}
|
|
460
|
+
` : "");
|
|
461
|
+
}
|
|
462
|
+
async function handleInit(context, args) {
|
|
463
|
+
const branchOpt = optionValue(args, ["-b", "--initial-branch"]);
|
|
464
|
+
rejectOptions(branchOpt.rest);
|
|
465
|
+
if (branchOpt.rest.length > 1) usage("git init accepts at most one directory");
|
|
466
|
+
const dir = virtualPath(context.command, branchOpt.rest[0]);
|
|
467
|
+
await context.command.fs.mkdir(dir, { recursive: true }).catch(async () => {
|
|
468
|
+
if (!await context.command.fs.exists(dir))
|
|
469
|
+
throw new Error("cannot create repository directory");
|
|
470
|
+
});
|
|
471
|
+
await git.init({ fs: context.fs, dir, defaultBranch: branchOpt.value ?? "main" });
|
|
472
|
+
return ok(`Initialized empty Git repository in ${posix2.join(dir, ".git")}/
|
|
473
|
+
`);
|
|
474
|
+
}
|
|
475
|
+
async function handleStatus(context, args) {
|
|
476
|
+
const shortFlag = flag(args, ["-s", "--short", "--porcelain"]);
|
|
477
|
+
rejectOptions(shortFlag.rest);
|
|
478
|
+
if (shortFlag.rest.length) usage();
|
|
479
|
+
const dir = await repositoryDir(context.command);
|
|
480
|
+
const matrix = await git.statusMatrix({ fs: context.fs, dir });
|
|
481
|
+
const lines = matrix.filter(([, head, workdir, stage]) => head !== workdir || workdir !== stage).map(([path, head, workdir, stage]) => {
|
|
482
|
+
let x = " ";
|
|
483
|
+
let y = " ";
|
|
484
|
+
if (head === 0 && stage !== 0) x = "A";
|
|
485
|
+
else if (head !== stage) x = stage === 0 ? "D" : "M";
|
|
486
|
+
if (workdir !== stage) y = workdir === 0 ? "D" : "M";
|
|
487
|
+
if (head === 0 && stage === 0 && workdir !== 0) return `?? ${path}`;
|
|
488
|
+
return `${x}${y} ${path}`;
|
|
489
|
+
});
|
|
490
|
+
if (shortFlag.enabled) return ok(lines.length ? `${lines.join("\n")}
|
|
491
|
+
` : "");
|
|
492
|
+
const branch2 = await git.currentBranch({ fs: context.fs, dir }) ?? "HEAD detached";
|
|
493
|
+
return ok(
|
|
494
|
+
`On branch ${branch2}
|
|
495
|
+
${lines.length ? `${lines.join("\n")}
|
|
496
|
+
` : "nothing to commit, working tree clean\n"}`
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
async function handleAdd(context, args) {
|
|
500
|
+
const separator = args.indexOf("--");
|
|
501
|
+
const optionArgs = separator < 0 ? args : args.slice(0, separator);
|
|
502
|
+
const literalPaths = separator < 0 ? [] : args.slice(separator + 1);
|
|
503
|
+
const allFlag = flag(optionArgs, ["-A", "--all"]);
|
|
504
|
+
rejectOptions(allFlag.rest);
|
|
505
|
+
const paths = [...allFlag.rest, ...literalPaths];
|
|
506
|
+
if (!allFlag.enabled && paths.length === 0) usage("nothing specified");
|
|
507
|
+
const dir = await repositoryDir(context.command);
|
|
508
|
+
const all = allFlag.enabled || paths.includes(".");
|
|
509
|
+
if (all) {
|
|
510
|
+
const matrix = await git.statusMatrix({ fs: context.fs, dir });
|
|
511
|
+
for (const [filepath, , workdir, stage] of matrix) {
|
|
512
|
+
assertNotAborted(context.command);
|
|
513
|
+
if (workdir === stage) continue;
|
|
514
|
+
if (workdir === 0) await git.remove({ fs: context.fs, dir, filepath });
|
|
515
|
+
else await git.add({ fs: context.fs, dir, filepath });
|
|
516
|
+
}
|
|
517
|
+
} else {
|
|
518
|
+
for (const filepath of paths) {
|
|
519
|
+
if (filepath.startsWith("/") || filepath.split("/").some((segment) => segment === ".." || segment === ".git"))
|
|
520
|
+
throw new Error("invalid pathspec");
|
|
521
|
+
await git.add({ fs: context.fs, dir, filepath });
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return ok();
|
|
525
|
+
}
|
|
526
|
+
function parseAuthor(value) {
|
|
527
|
+
const match = /^(.*?)\s*<([^<>]+)>$/.exec(value);
|
|
528
|
+
if (!match?.[1] || !match[2]) usage("--author must be 'Name <email>'");
|
|
529
|
+
return { name: match[1].trim(), email: match[2] };
|
|
530
|
+
}
|
|
531
|
+
async function handleCommit(context, args) {
|
|
532
|
+
const messageOpt = optionValue(args, ["-m", "--message"]);
|
|
533
|
+
const authorOpt = optionValue(messageOpt.rest, ["--author"]);
|
|
534
|
+
rejectOptions(authorOpt.rest);
|
|
535
|
+
if (authorOpt.rest.length || !messageOpt.value) usage("git commit requires -m <message>");
|
|
536
|
+
const dir = await repositoryDir(context.command);
|
|
537
|
+
const globalConfig = await readGlobalConfig(context.command);
|
|
538
|
+
const repoName = await git.getConfig({ fs: context.fs, dir, path: "user.name" });
|
|
539
|
+
const repoEmail = await git.getConfig({ fs: context.fs, dir, path: "user.email" });
|
|
540
|
+
const configuredAuthor = repoName && repoEmail ? { name: repoName, email: repoEmail } : globalConfig.get("user.name") && globalConfig.get("user.email") ? {
|
|
541
|
+
name: globalConfig.get("user.name"),
|
|
542
|
+
email: globalConfig.get("user.email")
|
|
543
|
+
} : context.options.author;
|
|
544
|
+
const author = authorOpt.value ? parseAuthor(authorOpt.value) : configuredAuthor;
|
|
545
|
+
const matrix = await git.statusMatrix({ fs: context.fs, dir });
|
|
546
|
+
if (!matrix.some(([, headStatus, , stageStatus]) => headStatus !== stageStatus)) {
|
|
547
|
+
const message = matrix.some(([, , workdirStatus, stageStatus]) => workdirStatus !== stageStatus) ? "no changes added to commit" : "nothing to commit, working tree clean";
|
|
548
|
+
throw new Error(message);
|
|
549
|
+
}
|
|
550
|
+
const oid = await git.commit({ fs: context.fs, dir, message: messageOpt.value, author });
|
|
551
|
+
const branch2 = await git.currentBranch({ fs: context.fs, dir }) ?? "detached HEAD";
|
|
552
|
+
return ok(`[${branch2} ${oid.slice(0, 7)}] ${messageOpt.value.split("\n")[0]}
|
|
553
|
+
`);
|
|
554
|
+
}
|
|
555
|
+
async function handleLog(context, args) {
|
|
556
|
+
const countOpt = optionValue(args, ["-n", "--max-count"]);
|
|
557
|
+
const onelineFlag = flag(countOpt.rest, ["--oneline"]);
|
|
558
|
+
rejectOptions(onelineFlag.rest);
|
|
559
|
+
if (onelineFlag.rest.length > 1) usage();
|
|
560
|
+
const depth = countOpt.value ? Number.parseInt(countOpt.value, 10) : 20;
|
|
561
|
+
if (!Number.isFinite(depth) || depth < 1) usage("invalid max count");
|
|
562
|
+
const dir = await repositoryDir(context.command);
|
|
563
|
+
const commits = await git.log({ fs: context.fs, dir, ref: onelineFlag.rest[0] ?? "HEAD", depth });
|
|
564
|
+
if (onelineFlag.enabled) {
|
|
565
|
+
return ok(
|
|
566
|
+
commits.map((entry) => `${entry.oid.slice(0, 7)} ${entry.commit.message.split("\n")[0]}`).join("\n") + (commits.length ? "\n" : "")
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
return ok(
|
|
570
|
+
commits.map(
|
|
571
|
+
(entry) => `commit ${entry.oid}
|
|
572
|
+
Author: ${entry.commit.author.name} <${entry.commit.author.email}>
|
|
573
|
+
|
|
574
|
+
${entry.commit.message.trim().replaceAll("\n", "\n ")}
|
|
575
|
+
`
|
|
576
|
+
).join("\n")
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
async function handleDiff(context, args) {
|
|
580
|
+
const cachedFlag = flag(args, ["--cached", "--staged"]);
|
|
581
|
+
rejectOptions(cachedFlag.rest);
|
|
582
|
+
const dir = await repositoryDir(context.command);
|
|
583
|
+
const selected = cachedFlag.rest.map((path) => path.replace(/^\.\//, "").replace(/\/$/, ""));
|
|
584
|
+
const decoder = new TextDecoder();
|
|
585
|
+
const patch = (filepath, oldBytes, newBytes) => {
|
|
586
|
+
if (oldBytes.includes(0) || newBytes.includes(0)) {
|
|
587
|
+
return `Binary files a/${filepath} and b/${filepath} differ
|
|
588
|
+
`;
|
|
589
|
+
}
|
|
590
|
+
return createTwoFilesPatch(
|
|
591
|
+
`a/${filepath}`,
|
|
592
|
+
`b/${filepath}`,
|
|
593
|
+
decoder.decode(oldBytes),
|
|
594
|
+
decoder.decode(newBytes),
|
|
595
|
+
"",
|
|
596
|
+
"",
|
|
597
|
+
{ context: 3 }
|
|
598
|
+
);
|
|
599
|
+
};
|
|
600
|
+
const matrix = await git.statusMatrix({
|
|
601
|
+
fs: context.fs,
|
|
602
|
+
dir,
|
|
603
|
+
filepaths: selected.length ? selected : void 0
|
|
604
|
+
});
|
|
605
|
+
const stageOids = /* @__PURE__ */ new Map();
|
|
606
|
+
await git.walk({
|
|
607
|
+
fs: context.fs,
|
|
608
|
+
dir,
|
|
609
|
+
trees: [git.STAGE()],
|
|
610
|
+
map: async (filepath, [entry]) => {
|
|
611
|
+
if (entry && await entry.type() !== "tree") stageOids.set(filepath, await entry.oid());
|
|
612
|
+
}
|
|
613
|
+
});
|
|
614
|
+
const head = await git.resolveRef({ fs: context.fs, dir, ref: "HEAD" }).catch(() => void 0);
|
|
615
|
+
const empty = new Uint8Array();
|
|
616
|
+
const readStage = async (filepath) => {
|
|
617
|
+
const oid = stageOids.get(filepath);
|
|
618
|
+
return oid ? (await git.readBlob({ fs: context.fs, dir, oid })).blob : empty;
|
|
619
|
+
};
|
|
620
|
+
const patches = [];
|
|
621
|
+
for (const [filepath, headStatus, workdirStatus, stageStatus] of matrix) {
|
|
622
|
+
const changed = cachedFlag.enabled ? headStatus !== stageStatus : workdirStatus !== stageStatus;
|
|
623
|
+
if (!changed) continue;
|
|
624
|
+
const oldBytes = cachedFlag.enabled ? head && headStatus !== 0 ? (await git.readBlob({ fs: context.fs, dir, oid: head, filepath })).blob : empty : await readStage(filepath);
|
|
625
|
+
const newBytes = cachedFlag.enabled ? await readStage(filepath) : workdirStatus === 0 ? empty : await context.command.fs.readFileBuffer(posix2.join(dir, filepath));
|
|
626
|
+
patches.push(patch(filepath, oldBytes, newBytes));
|
|
627
|
+
}
|
|
628
|
+
return ok(patches.join(""));
|
|
629
|
+
}
|
|
630
|
+
async function handleBranch(context, args) {
|
|
631
|
+
const deleteFlag = flag(args, ["-d", "-D", "--delete"]);
|
|
632
|
+
rejectOptions(deleteFlag.rest);
|
|
633
|
+
const dir = await repositoryDir(context.command);
|
|
634
|
+
if (deleteFlag.enabled) {
|
|
635
|
+
if (deleteFlag.rest.length !== 1) usage("branch deletion requires one name");
|
|
636
|
+
await git.deleteBranch({ fs: context.fs, dir, ref: deleteFlag.rest[0] });
|
|
637
|
+
return ok(`Deleted branch ${deleteFlag.rest[0]}.
|
|
638
|
+
`);
|
|
639
|
+
}
|
|
640
|
+
if (deleteFlag.rest.length) {
|
|
641
|
+
if (deleteFlag.rest.length > 2) usage();
|
|
642
|
+
await git.branch({
|
|
643
|
+
fs: context.fs,
|
|
644
|
+
dir,
|
|
645
|
+
ref: deleteFlag.rest[0],
|
|
646
|
+
object: deleteFlag.rest[1]
|
|
647
|
+
});
|
|
648
|
+
return ok();
|
|
649
|
+
}
|
|
650
|
+
const [branches, current] = await Promise.all([
|
|
651
|
+
git.listBranches({ fs: context.fs, dir }),
|
|
652
|
+
git.currentBranch({ fs: context.fs, dir })
|
|
653
|
+
]);
|
|
654
|
+
return ok(
|
|
655
|
+
branches.map((name) => `${name === current ? "*" : " "} ${name}`).join("\n") + (branches.length ? "\n" : "")
|
|
656
|
+
);
|
|
657
|
+
}
|
|
658
|
+
async function readCheckoutBlob(context, dir, commitOid, filepath) {
|
|
659
|
+
let treeOid = (await git.readCommit({ fs: context.fs, dir, oid: commitOid })).commit.tree;
|
|
660
|
+
const segments = filepath.split("/").filter(Boolean);
|
|
661
|
+
for (let index = 0; index < segments.length; index++) {
|
|
662
|
+
const entries = (await git.readTree({ fs: context.fs, dir, oid: treeOid })).tree;
|
|
663
|
+
const entry = entries.find((candidate) => candidate.path === segments[index]);
|
|
664
|
+
if (!entry) throw new Error(`path '${filepath}' does not exist in the selected ref`);
|
|
665
|
+
if (entry.mode === "120000") throw new Error("symbolic links are not supported in the sandbox");
|
|
666
|
+
if (index === segments.length - 1) {
|
|
667
|
+
if (entry.type !== "blob") throw new Error(`path '${filepath}' is not a file`);
|
|
668
|
+
return (await git.readBlob({ fs: context.fs, dir, oid: entry.oid })).blob;
|
|
669
|
+
}
|
|
670
|
+
if (entry.type !== "tree") throw new Error(`path '${filepath}' is not a file`);
|
|
671
|
+
treeOid = entry.oid;
|
|
672
|
+
}
|
|
673
|
+
throw new Error("invalid checkout path");
|
|
674
|
+
}
|
|
675
|
+
async function handleCheckout(context, args) {
|
|
676
|
+
const separator = args.indexOf("--");
|
|
677
|
+
const commandArgs = separator >= 0 ? args.slice(0, separator) : args;
|
|
678
|
+
const filepaths = separator >= 0 ? args.slice(separator + 1) : [];
|
|
679
|
+
const createOpt = optionValue(commandArgs, ["-b"]);
|
|
680
|
+
const forceFlag = flag(createOpt.rest, ["-f", "--force"]);
|
|
681
|
+
rejectOptions(forceFlag.rest);
|
|
682
|
+
const dir = await repositoryDir(context.command);
|
|
683
|
+
if (filepaths.length) {
|
|
684
|
+
if (createOpt.value || forceFlag.rest.length > 1) usage();
|
|
685
|
+
if (filepaths.some((path) => path.startsWith("/") || path.split("/").includes(".."))) {
|
|
686
|
+
throw new Error("invalid checkout path");
|
|
687
|
+
}
|
|
688
|
+
const ref = forceFlag.rest[0] ?? "HEAD";
|
|
689
|
+
const oid = await git.resolveRef({ fs: context.fs, dir, ref });
|
|
690
|
+
for (const filepath of filepaths) {
|
|
691
|
+
const blob = await readCheckoutBlob(context, dir, oid, filepath);
|
|
692
|
+
await context.command.fs.writeFile(posix2.join(dir, filepath), blob);
|
|
693
|
+
}
|
|
694
|
+
return ok();
|
|
695
|
+
}
|
|
696
|
+
if (separator >= 0) usage("checkout requires at least one path after --");
|
|
697
|
+
if (createOpt.value) {
|
|
698
|
+
if (forceFlag.rest.length > 1) usage();
|
|
699
|
+
await git.branch({
|
|
700
|
+
fs: context.fs,
|
|
701
|
+
dir,
|
|
702
|
+
ref: createOpt.value,
|
|
703
|
+
object: forceFlag.rest[0],
|
|
704
|
+
checkout: true
|
|
705
|
+
});
|
|
706
|
+
await git.checkout({ fs: context.fs, dir, ref: createOpt.value, force: forceFlag.enabled });
|
|
707
|
+
return ok(`Switched to a new branch '${createOpt.value}'
|
|
708
|
+
`);
|
|
709
|
+
}
|
|
710
|
+
if (forceFlag.rest.length !== 1) usage("checkout requires one branch or ref");
|
|
711
|
+
await git.checkout({ fs: context.fs, dir, ref: forceFlag.rest[0], force: forceFlag.enabled });
|
|
712
|
+
return ok(`Switched to '${forceFlag.rest[0]}'
|
|
713
|
+
`);
|
|
714
|
+
}
|
|
715
|
+
async function handleRemote(context, args) {
|
|
716
|
+
const dir = await repositoryDir(context.command);
|
|
717
|
+
if (!args.length || args.length === 1 && args[0] === "-v") {
|
|
718
|
+
const remotes = await git.listRemotes({ fs: context.fs, dir });
|
|
719
|
+
const verbose = args[0] === "-v";
|
|
720
|
+
return ok(
|
|
721
|
+
remotes.map(
|
|
722
|
+
({ remote, url }) => verbose ? `${remote} ${url} (fetch)
|
|
723
|
+
${remote} ${url} (push)` : remote
|
|
724
|
+
).join("\n") + (remotes.length ? "\n" : "")
|
|
725
|
+
);
|
|
726
|
+
}
|
|
727
|
+
const [action, name, value, ...rest] = args;
|
|
728
|
+
if (rest.length || !name) usage();
|
|
729
|
+
if (action === "add") {
|
|
730
|
+
if (!value) usage("remote add requires a URL");
|
|
731
|
+
validateRemoteUrl(value);
|
|
732
|
+
await git.addRemote({ fs: context.fs, dir, remote: name, url: value });
|
|
733
|
+
return ok();
|
|
734
|
+
}
|
|
735
|
+
if (action === "remove" || action === "rm") {
|
|
736
|
+
if (value) usage();
|
|
737
|
+
await git.deleteRemote({ fs: context.fs, dir, remote: name });
|
|
738
|
+
return ok();
|
|
739
|
+
}
|
|
740
|
+
if (action === "get-url") {
|
|
741
|
+
if (value) usage();
|
|
742
|
+
const url = await remoteUrl(context, dir, name);
|
|
743
|
+
return ok(`${url}
|
|
744
|
+
`);
|
|
745
|
+
}
|
|
746
|
+
if (action === "set-url") {
|
|
747
|
+
if (!value) usage();
|
|
748
|
+
validateRemoteUrl(value);
|
|
749
|
+
await git.setConfig({ fs: context.fs, dir, path: `remote.${name}.url`, value });
|
|
750
|
+
return ok();
|
|
751
|
+
}
|
|
752
|
+
usage();
|
|
753
|
+
}
|
|
754
|
+
async function handleConfig(context, args) {
|
|
755
|
+
const globalFlag = flag(args, ["--global"]);
|
|
756
|
+
const unsetFlag = flag(globalFlag.rest, ["--unset"]);
|
|
757
|
+
const listFlag = flag(unsetFlag.rest, ["--list", "-l"]);
|
|
758
|
+
rejectOptions(listFlag.rest);
|
|
759
|
+
const globalValues = globalFlag.enabled ? await readGlobalConfig(context.command) : void 0;
|
|
760
|
+
const dir = globalFlag.enabled ? void 0 : await repositoryDir(context.command);
|
|
761
|
+
if (listFlag.enabled) {
|
|
762
|
+
if (listFlag.rest.length) usage();
|
|
763
|
+
if (globalValues) {
|
|
764
|
+
const output2 = [...globalValues].map(([key2, value2]) => `${key2}=${value2}`).join("\n");
|
|
765
|
+
return ok(output2 ? `${output2}
|
|
766
|
+
` : "");
|
|
767
|
+
}
|
|
768
|
+
const keys = ["user.name", "user.email", "core.repositoryformatversion", "core.bare"];
|
|
769
|
+
const values = await Promise.all(
|
|
770
|
+
keys.map(
|
|
771
|
+
async (key2) => [key2, await git.getConfig({ fs: context.fs, dir, path: key2 })]
|
|
772
|
+
)
|
|
773
|
+
);
|
|
774
|
+
const output = values.filter(([, value2]) => value2 !== void 0).map(([key2, value2]) => `${key2}=${value2}`).join("\n");
|
|
775
|
+
return ok(output ? `${output}
|
|
776
|
+
` : "");
|
|
777
|
+
}
|
|
778
|
+
const [key, value, ...rest] = listFlag.rest;
|
|
779
|
+
if (rest.length || !key) usage();
|
|
780
|
+
if (!key.includes(".")) usage("config key must contain a section");
|
|
781
|
+
if (globalValues) {
|
|
782
|
+
if (unsetFlag.enabled) {
|
|
783
|
+
if (value) usage();
|
|
784
|
+
globalValues.delete(key.toLowerCase());
|
|
785
|
+
await writeGlobalConfig(context.command, globalValues);
|
|
786
|
+
return ok();
|
|
787
|
+
}
|
|
788
|
+
if (value === void 0) {
|
|
789
|
+
const found = globalValues.get(key.toLowerCase());
|
|
790
|
+
return found === void 0 ? { stdout: "", stderr: "", exitCode: 1 } : ok(`${found}
|
|
791
|
+
`);
|
|
792
|
+
}
|
|
793
|
+
globalValues.set(key.toLowerCase(), value);
|
|
794
|
+
await writeGlobalConfig(context.command, globalValues);
|
|
795
|
+
return ok();
|
|
796
|
+
}
|
|
797
|
+
if (unsetFlag.enabled) {
|
|
798
|
+
if (value) usage();
|
|
799
|
+
await git.setConfig({ fs: context.fs, dir, path: key, value: void 0 });
|
|
800
|
+
return ok();
|
|
801
|
+
}
|
|
802
|
+
if (value === void 0) {
|
|
803
|
+
const found = await git.getConfig({ fs: context.fs, dir, path: key });
|
|
804
|
+
return found === void 0 ? { stdout: "", stderr: "", exitCode: 1 } : ok(`${found}
|
|
805
|
+
`);
|
|
806
|
+
}
|
|
807
|
+
await git.setConfig({ fs: context.fs, dir, path: key, value });
|
|
808
|
+
return ok();
|
|
809
|
+
}
|
|
810
|
+
async function handleClone(context, args) {
|
|
811
|
+
const branchOpt = optionValue(args, ["-b", "--branch"]);
|
|
812
|
+
const depthOpt = optionValue(branchOpt.rest, ["--depth"]);
|
|
813
|
+
const singleFlag = flag(depthOpt.rest, ["--single-branch"]);
|
|
814
|
+
const noCheckoutFlag = flag(singleFlag.rest, ["--no-checkout"]);
|
|
815
|
+
rejectOptions(noCheckoutFlag.rest);
|
|
816
|
+
const [rawUrl, destination, ...rest] = noCheckoutFlag.rest;
|
|
817
|
+
if (!rawUrl || rest.length) usage("clone requires a URL and optional directory");
|
|
818
|
+
const url = validateRemoteUrl(rawUrl);
|
|
819
|
+
const inferred = posix2.basename(new URL(url).pathname).replace(/\.git$/, "") || "repository";
|
|
820
|
+
const dir = virtualPath(context.command, destination ?? inferred);
|
|
821
|
+
const depth = positiveInteger(depthOpt.value, "--depth");
|
|
822
|
+
await git.clone({
|
|
823
|
+
fs: context.fs,
|
|
824
|
+
http: context.http,
|
|
825
|
+
dir,
|
|
826
|
+
url,
|
|
827
|
+
ref: branchOpt.value,
|
|
828
|
+
depth,
|
|
829
|
+
singleBranch: singleFlag.enabled || Boolean(branchOpt.value),
|
|
830
|
+
noCheckout: noCheckoutFlag.enabled,
|
|
831
|
+
onAuth: authFor(context, url)
|
|
832
|
+
});
|
|
833
|
+
return ok(`Cloning into '${destination ?? inferred}'...
|
|
834
|
+
`);
|
|
835
|
+
}
|
|
836
|
+
async function handleFetch(context, args) {
|
|
837
|
+
const depthOpt = optionValue(args, ["--depth"]);
|
|
838
|
+
rejectOptions(depthOpt.rest);
|
|
839
|
+
if (depthOpt.rest.length > 2) usage();
|
|
840
|
+
const dir = await repositoryDir(context.command);
|
|
841
|
+
const remote = depthOpt.rest[0] ?? "origin";
|
|
842
|
+
const url = await remoteUrl(context, dir, remote);
|
|
843
|
+
await git.fetch({
|
|
844
|
+
fs: context.fs,
|
|
845
|
+
http: context.http,
|
|
846
|
+
dir,
|
|
847
|
+
remote,
|
|
848
|
+
ref: depthOpt.rest[1],
|
|
849
|
+
depth: positiveInteger(depthOpt.value, "--depth"),
|
|
850
|
+
onAuth: authFor(context, url)
|
|
851
|
+
});
|
|
852
|
+
return ok();
|
|
853
|
+
}
|
|
854
|
+
async function handlePull(context, args) {
|
|
855
|
+
const ffFlag = flag(args, ["--ff-only"]);
|
|
856
|
+
rejectOptions(ffFlag.rest);
|
|
857
|
+
if (ffFlag.rest.length > 2) usage();
|
|
858
|
+
const dir = await repositoryDir(context.command);
|
|
859
|
+
const remote = ffFlag.rest[0] ?? "origin";
|
|
860
|
+
const url = await remoteUrl(context, dir, remote);
|
|
861
|
+
await git.pull({
|
|
862
|
+
fs: context.fs,
|
|
863
|
+
http: context.http,
|
|
864
|
+
dir,
|
|
865
|
+
remote,
|
|
866
|
+
ref: ffFlag.rest[1],
|
|
867
|
+
fastForwardOnly: true,
|
|
868
|
+
// isomorphic-git requires an author even when fastForwardOnly prevents merge commits.
|
|
869
|
+
author: context.options.author ?? { name: "Ollie Git", email: "git@localhost" },
|
|
870
|
+
onAuth: authFor(context, url)
|
|
871
|
+
});
|
|
872
|
+
return ok("Already up to date or fast-forwarded.\n");
|
|
873
|
+
}
|
|
874
|
+
async function handlePush(context, args) {
|
|
875
|
+
const forceFlag = flag(args, ["--force", "-f"]);
|
|
876
|
+
const upstreamFlag = flag(forceFlag.rest, ["--set-upstream", "-u"]);
|
|
877
|
+
rejectOptions(upstreamFlag.rest);
|
|
878
|
+
if (upstreamFlag.rest.length > 2) usage();
|
|
879
|
+
const dir = await repositoryDir(context.command);
|
|
880
|
+
const remote = upstreamFlag.rest[0] ?? "origin";
|
|
881
|
+
const ref = upstreamFlag.rest[1] ?? await git.currentBranch({ fs: context.fs, dir });
|
|
882
|
+
if (!ref) throw new Error("cannot determine branch to push");
|
|
883
|
+
const url = await remoteUrl(context, dir, remote);
|
|
884
|
+
const result = await git.push({
|
|
885
|
+
fs: context.fs,
|
|
886
|
+
http: context.http,
|
|
887
|
+
dir,
|
|
888
|
+
remote,
|
|
889
|
+
ref,
|
|
890
|
+
force: forceFlag.enabled,
|
|
891
|
+
onAuth: authFor(context, url)
|
|
892
|
+
});
|
|
893
|
+
if (!result.ok) {
|
|
894
|
+
const refError = Object.values(result.refs).find((status) => !status.ok)?.error;
|
|
895
|
+
throw new Error(result.error ?? refError ?? "remote rejected the push");
|
|
896
|
+
}
|
|
897
|
+
if (upstreamFlag.enabled) {
|
|
898
|
+
await git.setConfig({ fs: context.fs, dir, path: `branch.${ref}.remote`, value: remote });
|
|
899
|
+
await git.setConfig({
|
|
900
|
+
fs: context.fs,
|
|
901
|
+
dir,
|
|
902
|
+
path: `branch.${ref}.merge`,
|
|
903
|
+
value: `refs/heads/${ref}`
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
return ok(`To ${url}
|
|
907
|
+
`);
|
|
908
|
+
}
|
|
909
|
+
var handlers = {
|
|
910
|
+
init: handleInit,
|
|
911
|
+
clone: handleClone,
|
|
912
|
+
status: handleStatus,
|
|
913
|
+
add: handleAdd,
|
|
914
|
+
commit: handleCommit,
|
|
915
|
+
log: handleLog,
|
|
916
|
+
diff: handleDiff,
|
|
917
|
+
branch: handleBranch,
|
|
918
|
+
checkout: handleCheckout,
|
|
919
|
+
remote: handleRemote,
|
|
920
|
+
config: handleConfig,
|
|
921
|
+
fetch: handleFetch,
|
|
922
|
+
pull: handlePull,
|
|
923
|
+
push: handlePush
|
|
924
|
+
};
|
|
925
|
+
function redact(message, secrets) {
|
|
926
|
+
let result = message.replace(/https:\/\/[^\s/@]+@/g, "https://").replaceAll(process.cwd(), "<host>");
|
|
927
|
+
for (const secret of secrets) {
|
|
928
|
+
if (secret) result = result.replaceAll(secret, "<redacted>");
|
|
929
|
+
}
|
|
930
|
+
return result;
|
|
931
|
+
}
|
|
932
|
+
function createGitCommand(options = {}) {
|
|
933
|
+
return defineCommand("git", async (args, command) => {
|
|
934
|
+
const secrets = /* @__PURE__ */ new Set();
|
|
935
|
+
const safeOptions = options.resolveAuth ? {
|
|
936
|
+
...options,
|
|
937
|
+
resolveAuth: async (url) => {
|
|
938
|
+
const auth = await options.resolveAuth?.(url);
|
|
939
|
+
if (auth?.username) secrets.add(auth.username);
|
|
940
|
+
if (auth?.password) secrets.add(auth.password);
|
|
941
|
+
return auth;
|
|
942
|
+
}
|
|
943
|
+
} : options;
|
|
944
|
+
try {
|
|
945
|
+
if (!args.length || args[0] === "help" || args.includes("--help")) {
|
|
946
|
+
return ok(`usage: git <command> [options]
|
|
947
|
+
|
|
948
|
+
Supported commands: ${COMMANDS.join(", ")}
|
|
949
|
+
`);
|
|
950
|
+
}
|
|
951
|
+
if (args[0] === "--version" || args[0] === "-v") return ok(`${VERSION}
|
|
952
|
+
`);
|
|
953
|
+
const subcommand = args[0];
|
|
954
|
+
const handler = subcommand ? handlers[subcommand] : void 0;
|
|
955
|
+
if (!handler) usage(`'${subcommand ?? ""}' is not a supported git command`);
|
|
956
|
+
assertNotAborted(command);
|
|
957
|
+
return await handler(
|
|
958
|
+
{
|
|
959
|
+
command,
|
|
960
|
+
fs: createGitFs(command.fs),
|
|
961
|
+
http: createGitHttp(command),
|
|
962
|
+
options: safeOptions
|
|
963
|
+
},
|
|
964
|
+
args.slice(1)
|
|
965
|
+
);
|
|
966
|
+
} catch (error) {
|
|
967
|
+
const message = redact(
|
|
968
|
+
error instanceof Error ? error.message : "unknown Git failure",
|
|
969
|
+
secrets
|
|
970
|
+
);
|
|
971
|
+
const exitCode = error instanceof UsageError ? 129 : /not a git repository|NotFoundError/.test(message) ? 128 : 1;
|
|
972
|
+
return {
|
|
973
|
+
stdout: "",
|
|
974
|
+
stderr: `${error instanceof UsageError ? "error" : "fatal"}: ${message}
|
|
975
|
+
`,
|
|
976
|
+
exitCode
|
|
977
|
+
};
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// src/sandbox/just-bash.ts
|
|
983
|
+
var SANDBOX_WORKSPACE_PATH = "/workspace";
|
|
984
|
+
function canonicalizeWorkspaceRoot(workspaceRoot) {
|
|
985
|
+
const canonicalRoot = realpathSync(workspaceRoot);
|
|
986
|
+
if (!statSync(canonicalRoot).isDirectory()) {
|
|
987
|
+
throw new Error("The sandbox workspace root must be a directory");
|
|
988
|
+
}
|
|
989
|
+
return canonicalRoot;
|
|
990
|
+
}
|
|
991
|
+
function createWorkspaceFs(workspaceRoot) {
|
|
992
|
+
const root = canonicalizeWorkspaceRoot(workspaceRoot);
|
|
993
|
+
return new MountableFs({
|
|
994
|
+
base: new InMemoryFs(),
|
|
995
|
+
mounts: [
|
|
996
|
+
{
|
|
997
|
+
mountPoint: SANDBOX_WORKSPACE_PATH,
|
|
998
|
+
filesystem: new ReadWriteFs({ root, allowSymlinks: false })
|
|
999
|
+
}
|
|
1000
|
+
]
|
|
1001
|
+
});
|
|
1002
|
+
}
|
|
1003
|
+
function createJustBash(workspaceRoot, options = {}) {
|
|
1004
|
+
return new Bash({
|
|
1005
|
+
fs: createWorkspaceFs(workspaceRoot),
|
|
1006
|
+
cwd: SANDBOX_WORKSPACE_PATH,
|
|
1007
|
+
env: {
|
|
1008
|
+
HOME: "/home/user",
|
|
1009
|
+
TERM: "xterm-256color"
|
|
1010
|
+
},
|
|
1011
|
+
python: true,
|
|
1012
|
+
javascript: true,
|
|
1013
|
+
customCommands: options.git === false ? [] : [createGitCommand(options.git)],
|
|
1014
|
+
network: {
|
|
1015
|
+
dangerouslyAllowFullInternetAccess: true,
|
|
1016
|
+
maxResponseSize: 100 * 1024 * 1024
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
async function isJustBashAvailable() {
|
|
1021
|
+
try {
|
|
1022
|
+
const bash = new Bash();
|
|
1023
|
+
await bash.exec("echo ok");
|
|
1024
|
+
return true;
|
|
1025
|
+
} catch {
|
|
1026
|
+
return false;
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
// src/index.ts
|
|
1031
|
+
var packageName = "@getollie/cli";
|
|
1032
|
+
var packageVersion = "0.2.0";
|
|
1033
|
+
|
|
1034
|
+
// src/doctor.ts
|
|
1035
|
+
async function runDoctor(options) {
|
|
1036
|
+
const nodeVersion = process.versions.node;
|
|
1037
|
+
const nodeMajor = Number.parseInt(nodeVersion.split(".")[0] ?? "0", 10);
|
|
1038
|
+
const cwdStats = await stat2(options.cwd).catch(() => null);
|
|
1039
|
+
const cwdAccessible = cwdStats?.isDirectory() ? await access2(options.cwd).then(
|
|
1040
|
+
() => true,
|
|
1041
|
+
() => false
|
|
1042
|
+
) : false;
|
|
1043
|
+
const justBashAvailable = await isJustBashAvailable();
|
|
1044
|
+
const providerConfigured = options.provider === "openai" ? Boolean(process.env.OPENAI_API_KEY) : false;
|
|
1045
|
+
const report = {
|
|
1046
|
+
packageName,
|
|
1047
|
+
packageVersion,
|
|
1048
|
+
nodeVersion,
|
|
1049
|
+
nodeOk: nodeMajor >= 22,
|
|
1050
|
+
cwd: options.cwd,
|
|
1051
|
+
cwdAccessible,
|
|
1052
|
+
provider: options.provider,
|
|
1053
|
+
model: options.model,
|
|
1054
|
+
providerConfigured,
|
|
1055
|
+
justBashAvailable
|
|
1056
|
+
};
|
|
1057
|
+
if (options.json) {
|
|
1058
|
+
process.stdout.write(`${JSON.stringify(report)}
|
|
1059
|
+
`);
|
|
1060
|
+
} else {
|
|
1061
|
+
process.stdout.write(`${packageName} ${packageVersion}
|
|
1062
|
+
`);
|
|
1063
|
+
process.stdout.write(`node: ${nodeVersion} ${report.nodeOk ? "ok" : "requires >=22"}
|
|
1064
|
+
`);
|
|
1065
|
+
process.stdout.write(`workspace: ${options.cwd} ${cwdAccessible ? "ok" : "not accessible"}
|
|
1066
|
+
`);
|
|
1067
|
+
process.stdout.write(
|
|
1068
|
+
`provider: ${options.provider} / ${options.model} ${providerConfigured ? "configured" : "missing credentials"}
|
|
1069
|
+
`
|
|
1070
|
+
);
|
|
1071
|
+
process.stdout.write(`just-bash: ${justBashAvailable ? "ok" : "unavailable"}
|
|
1072
|
+
`);
|
|
1073
|
+
}
|
|
1074
|
+
return report.nodeOk && cwdAccessible && justBashAvailable ? 0 : 1;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
// src/exec.ts
|
|
1078
|
+
function timeoutSignal(timeoutMs) {
|
|
1079
|
+
const controller = new AbortController();
|
|
1080
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
1081
|
+
return {
|
|
1082
|
+
signal: controller.signal,
|
|
1083
|
+
cancel: () => clearTimeout(timer)
|
|
1084
|
+
};
|
|
1085
|
+
}
|
|
1086
|
+
function combineSignals(signals) {
|
|
1087
|
+
const active = signals.filter((signal) => Boolean(signal));
|
|
1088
|
+
if (active.length === 0) {
|
|
1089
|
+
return void 0;
|
|
1090
|
+
}
|
|
1091
|
+
const controller = new AbortController();
|
|
1092
|
+
for (const signal of active) {
|
|
1093
|
+
if (signal.aborted) {
|
|
1094
|
+
controller.abort(signal.reason);
|
|
1095
|
+
break;
|
|
1096
|
+
}
|
|
1097
|
+
signal.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
|
|
1098
|
+
}
|
|
1099
|
+
return controller.signal;
|
|
1100
|
+
}
|
|
1101
|
+
async function runExecCommand(cwd, command, options, signal) {
|
|
1102
|
+
const started = Date.now();
|
|
1103
|
+
const timeout = timeoutSignal(options.timeoutMs);
|
|
1104
|
+
const combinedSignal = combineSignals([signal, timeout.signal]);
|
|
1105
|
+
const timedOut = () => timeout.signal.aborted && !signal?.aborted;
|
|
1106
|
+
try {
|
|
1107
|
+
const bash = createJustBash(cwd);
|
|
1108
|
+
const result = await bash.exec(command, { env: options.env, signal: combinedSignal });
|
|
1109
|
+
return {
|
|
1110
|
+
...result,
|
|
1111
|
+
durationMs: Date.now() - started,
|
|
1112
|
+
timedOut: timedOut()
|
|
1113
|
+
};
|
|
1114
|
+
} catch (error) {
|
|
1115
|
+
if (timedOut()) {
|
|
1116
|
+
return {
|
|
1117
|
+
exitCode: 124,
|
|
1118
|
+
stdout: "",
|
|
1119
|
+
stderr: `Command timed out after ${options.timeoutMs} ms`,
|
|
1120
|
+
env: {},
|
|
1121
|
+
durationMs: Date.now() - started,
|
|
1122
|
+
timedOut: true
|
|
1123
|
+
};
|
|
1124
|
+
}
|
|
1125
|
+
throw error;
|
|
1126
|
+
} finally {
|
|
1127
|
+
timeout.cancel();
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
// src/render.ts
|
|
1132
|
+
import { Chalk } from "chalk";
|
|
1133
|
+
var ELLIPSIS = "\u2026";
|
|
1134
|
+
var CENTER_ELLIPSIS = ` ${ELLIPSIS} `;
|
|
1135
|
+
function singleRowJson(value) {
|
|
1136
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
1137
|
+
return JSON.stringify(value, (_key, item) => {
|
|
1138
|
+
if (typeof item === "bigint") {
|
|
1139
|
+
return item.toString();
|
|
1140
|
+
}
|
|
1141
|
+
if (item && typeof item === "object") {
|
|
1142
|
+
if (seen.has(item)) {
|
|
1143
|
+
return "[Circular]";
|
|
1144
|
+
}
|
|
1145
|
+
seen.add(item);
|
|
1146
|
+
}
|
|
1147
|
+
return item;
|
|
1148
|
+
}) ?? "null";
|
|
1149
|
+
}
|
|
1150
|
+
function isCombiningCodePoint(codePoint) {
|
|
1151
|
+
return codePoint >= 768 && codePoint <= 879 || codePoint >= 6832 && codePoint <= 6911 || codePoint >= 7616 && codePoint <= 7679 || codePoint >= 8400 && codePoint <= 8447 || codePoint >= 65056 && codePoint <= 65071;
|
|
1152
|
+
}
|
|
1153
|
+
function isFullWidthCodePoint(codePoint) {
|
|
1154
|
+
return codePoint >= 4352 && (codePoint <= 4447 || codePoint === 9001 || codePoint === 9002 || codePoint >= 11904 && codePoint <= 42191 && codePoint !== 12351 || codePoint >= 44032 && codePoint <= 55203 || codePoint >= 63744 && codePoint <= 64255 || codePoint >= 65040 && codePoint <= 65049 || codePoint >= 65072 && codePoint <= 65135 || codePoint >= 65280 && codePoint <= 65376 || codePoint >= 65504 && codePoint <= 65510 || codePoint >= 127744 && codePoint <= 128591 || codePoint >= 129280 && codePoint <= 129535 || codePoint >= 131072 && codePoint <= 262141);
|
|
1155
|
+
}
|
|
1156
|
+
function displayWidth(text) {
|
|
1157
|
+
let width = 0;
|
|
1158
|
+
for (const char of text) {
|
|
1159
|
+
const codePoint = char.codePointAt(0) ?? 0;
|
|
1160
|
+
if (codePoint === 0 || codePoint === 8205 || isCombiningCodePoint(codePoint)) {
|
|
1161
|
+
continue;
|
|
1162
|
+
}
|
|
1163
|
+
if (codePoint < 32 || codePoint >= 127 && codePoint < 160) {
|
|
1164
|
+
continue;
|
|
1165
|
+
}
|
|
1166
|
+
width += isFullWidthCodePoint(codePoint) ? 2 : 1;
|
|
1167
|
+
}
|
|
1168
|
+
return width;
|
|
1169
|
+
}
|
|
1170
|
+
function sliceStartByColumns(text, maxColumns) {
|
|
1171
|
+
let width = 0;
|
|
1172
|
+
let result = "";
|
|
1173
|
+
for (const char of text) {
|
|
1174
|
+
const charWidth = displayWidth(char);
|
|
1175
|
+
if (width + charWidth > maxColumns) {
|
|
1176
|
+
break;
|
|
1177
|
+
}
|
|
1178
|
+
result += char;
|
|
1179
|
+
width += charWidth;
|
|
1180
|
+
}
|
|
1181
|
+
return result;
|
|
1182
|
+
}
|
|
1183
|
+
function sliceEndByColumns(text, maxColumns) {
|
|
1184
|
+
let width = 0;
|
|
1185
|
+
let result = "";
|
|
1186
|
+
const chars = Array.from(text);
|
|
1187
|
+
for (let index = chars.length - 1; index >= 0; index -= 1) {
|
|
1188
|
+
const char = chars[index] ?? "";
|
|
1189
|
+
const charWidth = displayWidth(char);
|
|
1190
|
+
if (width + charWidth > maxColumns) {
|
|
1191
|
+
break;
|
|
1192
|
+
}
|
|
1193
|
+
result = `${char}${result}`;
|
|
1194
|
+
width += charWidth;
|
|
1195
|
+
}
|
|
1196
|
+
return result;
|
|
1197
|
+
}
|
|
1198
|
+
function ellipsizeToColumnParts(text, maxColumns) {
|
|
1199
|
+
if (maxColumns === void 0 || displayWidth(text) <= maxColumns) {
|
|
1200
|
+
return { head: text, marker: "", tail: "" };
|
|
1201
|
+
}
|
|
1202
|
+
if (maxColumns <= 0) {
|
|
1203
|
+
return { head: "", marker: "", tail: "" };
|
|
1204
|
+
}
|
|
1205
|
+
if (maxColumns === 1) {
|
|
1206
|
+
return { head: "", marker: ELLIPSIS, tail: "" };
|
|
1207
|
+
}
|
|
1208
|
+
const marker = maxColumns >= displayWidth(CENTER_ELLIPSIS) ? CENTER_ELLIPSIS : ELLIPSIS;
|
|
1209
|
+
const targetWidth = maxColumns - displayWidth(marker);
|
|
1210
|
+
const head = sliceStartByColumns(text, Math.ceil(targetWidth / 2));
|
|
1211
|
+
const tail = sliceEndByColumns(text, targetWidth - displayWidth(head));
|
|
1212
|
+
return { head, marker, tail };
|
|
1213
|
+
}
|
|
1214
|
+
function getStderrColumns() {
|
|
1215
|
+
return process.stderr.columns && process.stderr.columns > 0 ? process.stderr.columns : void 0;
|
|
1216
|
+
}
|
|
1217
|
+
function resolveToolRowColumns(columns) {
|
|
1218
|
+
return Math.min(columns ?? 120, 120);
|
|
1219
|
+
}
|
|
1220
|
+
function formatToolRow(options) {
|
|
1221
|
+
const prefix = `${options.symbol} ${options.toolName} `;
|
|
1222
|
+
const maxPayloadColumns = Math.max(1, options.columns - displayWidth(prefix));
|
|
1223
|
+
return ellipsizeToColumnParts(singleRowJson(options.value), maxPayloadColumns);
|
|
1224
|
+
}
|
|
1225
|
+
function colorToolRow(c, row) {
|
|
1226
|
+
return `${c.dim(row.head)}${c.yellow(row.marker)}${c.dim(row.tail)}`;
|
|
1227
|
+
}
|
|
1228
|
+
function toolSymbol(arrow, source) {
|
|
1229
|
+
return source === "delegate" ? ` \u21B3 ${arrow}` : arrow;
|
|
1230
|
+
}
|
|
1231
|
+
function createRenderer(options) {
|
|
1232
|
+
if (options.ndjson) {
|
|
1233
|
+
return {
|
|
1234
|
+
render(event) {
|
|
1235
|
+
process.stdout.write(`${singleRowJson(event)}
|
|
1236
|
+
`);
|
|
1237
|
+
}
|
|
1238
|
+
};
|
|
1239
|
+
}
|
|
1240
|
+
const c = new Chalk({ level: options.color ? 1 : 0 });
|
|
1241
|
+
const columns = resolveToolRowColumns(options.columns ?? getStderrColumns());
|
|
1242
|
+
return {
|
|
1243
|
+
render(event) {
|
|
1244
|
+
switch (event.type) {
|
|
1245
|
+
case "text":
|
|
1246
|
+
process.stdout.write(event.text);
|
|
1247
|
+
break;
|
|
1248
|
+
case "tool-call": {
|
|
1249
|
+
const symbol = toolSymbol("\u2192", event.source);
|
|
1250
|
+
process.stderr.write(
|
|
1251
|
+
`${c.dim(symbol)} ${c.cyan(event.toolName)} ${colorToolRow(
|
|
1252
|
+
c,
|
|
1253
|
+
formatToolRow({
|
|
1254
|
+
symbol,
|
|
1255
|
+
toolName: event.toolName,
|
|
1256
|
+
value: event.input,
|
|
1257
|
+
columns
|
|
1258
|
+
})
|
|
1259
|
+
)}
|
|
1260
|
+
`
|
|
1261
|
+
);
|
|
1262
|
+
break;
|
|
1263
|
+
}
|
|
1264
|
+
case "tool-result": {
|
|
1265
|
+
const symbol = toolSymbol("\u2190", event.source);
|
|
1266
|
+
process.stderr.write(
|
|
1267
|
+
`${c.dim(symbol)} ${c.green(event.toolName)} ${colorToolRow(
|
|
1268
|
+
c,
|
|
1269
|
+
formatToolRow({
|
|
1270
|
+
symbol,
|
|
1271
|
+
toolName: event.toolName,
|
|
1272
|
+
value: event.output,
|
|
1273
|
+
columns
|
|
1274
|
+
})
|
|
1275
|
+
)}
|
|
1276
|
+
`
|
|
1277
|
+
);
|
|
1278
|
+
break;
|
|
1279
|
+
}
|
|
1280
|
+
case "error":
|
|
1281
|
+
process.stderr.write(`${c.red("error:")} ${event.message}
|
|
1282
|
+
`);
|
|
1283
|
+
break;
|
|
1284
|
+
case "done":
|
|
1285
|
+
process.stderr.write(c.dim("\n[done]\n"));
|
|
1286
|
+
break;
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
};
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
// src/runner.ts
|
|
1293
|
+
import { stepCountIs as stepCountIs2, streamText } from "ai";
|
|
1294
|
+
|
|
1295
|
+
// src/executor/controller.ts
|
|
1296
|
+
var ExecutorController = class {
|
|
1297
|
+
constructor(provider, delegator) {
|
|
1298
|
+
this.provider = provider;
|
|
1299
|
+
this.delegator = delegator;
|
|
1300
|
+
}
|
|
1301
|
+
provider;
|
|
1302
|
+
delegator;
|
|
1303
|
+
#session;
|
|
1304
|
+
#creatingSession;
|
|
1305
|
+
#running = false;
|
|
1306
|
+
#disposed = false;
|
|
1307
|
+
async delegateTask(task, signal) {
|
|
1308
|
+
if (this.#disposed) throw new Error("Executor controller has been disposed");
|
|
1309
|
+
if (this.#running) throw new Error("Executor delegation is already in progress");
|
|
1310
|
+
signal?.throwIfAborted();
|
|
1311
|
+
this.#running = true;
|
|
1312
|
+
let session;
|
|
1313
|
+
let result;
|
|
1314
|
+
let taskError;
|
|
1315
|
+
try {
|
|
1316
|
+
session = await this.#getSession(signal);
|
|
1317
|
+
await session.resume(signal);
|
|
1318
|
+
result = await this.delegator.runTask({ session, task, signal });
|
|
1319
|
+
} catch (error) {
|
|
1320
|
+
taskError = error;
|
|
1321
|
+
}
|
|
1322
|
+
let pauseError;
|
|
1323
|
+
try {
|
|
1324
|
+
await session?.pause(signal?.aborted ? void 0 : signal);
|
|
1325
|
+
} catch (error) {
|
|
1326
|
+
pauseError = error;
|
|
1327
|
+
} finally {
|
|
1328
|
+
this.#running = false;
|
|
1329
|
+
}
|
|
1330
|
+
if (taskError !== void 0) throw taskError;
|
|
1331
|
+
if (pauseError !== void 0) throw pauseError;
|
|
1332
|
+
if (!result) throw new Error("Delegated task completed without a result");
|
|
1333
|
+
return result;
|
|
1334
|
+
}
|
|
1335
|
+
async dispose() {
|
|
1336
|
+
if (this.#disposed) return;
|
|
1337
|
+
this.#disposed = true;
|
|
1338
|
+
const session = this.#session ?? await this.#creatingSession?.catch(() => void 0);
|
|
1339
|
+
await session?.dispose();
|
|
1340
|
+
}
|
|
1341
|
+
async #getSession(signal) {
|
|
1342
|
+
if (this.#session) return this.#session;
|
|
1343
|
+
if (!this.#creatingSession) {
|
|
1344
|
+
this.#creatingSession = this.provider.createSession({ signal }).then((session) => {
|
|
1345
|
+
this.#session = session;
|
|
1346
|
+
return session;
|
|
1347
|
+
});
|
|
1348
|
+
}
|
|
1349
|
+
return this.#creatingSession;
|
|
1350
|
+
}
|
|
1351
|
+
};
|
|
1352
|
+
|
|
1353
|
+
// src/executor/daytona.ts
|
|
1354
|
+
import { randomUUID } from "crypto";
|
|
1355
|
+
import { mkdir, readdir, readFile, rm, stat as stat3, writeFile } from "fs/promises";
|
|
1356
|
+
import { dirname, isAbsolute, relative, resolve as resolve2, sep } from "path";
|
|
1357
|
+
import {
|
|
1358
|
+
Daytona,
|
|
1359
|
+
DaytonaProcessExecutionTimeoutError
|
|
1360
|
+
} from "@daytona/sdk";
|
|
1361
|
+
var DEFAULT_REMOTE_WORKSPACE = "/workspace";
|
|
1362
|
+
var DEFAULT_TTL_MINUTES = 10;
|
|
1363
|
+
function timeoutSeconds(timeoutMs) {
|
|
1364
|
+
return Math.max(1, Math.ceil(timeoutMs / 1e3));
|
|
1365
|
+
}
|
|
1366
|
+
function abortable(promise, signal) {
|
|
1367
|
+
signal?.throwIfAborted();
|
|
1368
|
+
if (!signal) return promise;
|
|
1369
|
+
return new Promise((resolvePromise, reject) => {
|
|
1370
|
+
const onAbort = () => reject(signal.reason ?? new Error("Daytona operation aborted"));
|
|
1371
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
1372
|
+
promise.then(
|
|
1373
|
+
(value) => {
|
|
1374
|
+
signal.removeEventListener("abort", onAbort);
|
|
1375
|
+
resolvePromise(value);
|
|
1376
|
+
},
|
|
1377
|
+
(error) => {
|
|
1378
|
+
signal.removeEventListener("abort", onAbort);
|
|
1379
|
+
reject(error);
|
|
1380
|
+
}
|
|
1381
|
+
);
|
|
1382
|
+
});
|
|
1383
|
+
}
|
|
1384
|
+
function shellQuote(value) {
|
|
1385
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
1386
|
+
}
|
|
1387
|
+
async function listLocalFiles(root) {
|
|
1388
|
+
const files = /* @__PURE__ */ new Map();
|
|
1389
|
+
async function visit(directory) {
|
|
1390
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
1391
|
+
const absolutePath = resolve2(directory, entry.name);
|
|
1392
|
+
if (entry.isDirectory()) {
|
|
1393
|
+
await visit(absolutePath);
|
|
1394
|
+
} else if (entry.isFile()) {
|
|
1395
|
+
const path = relative(root, absolutePath).split(sep).join("/");
|
|
1396
|
+
files.set(path, (await stat3(absolutePath)).size);
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
await visit(root);
|
|
1401
|
+
return files;
|
|
1402
|
+
}
|
|
1403
|
+
var DaytonaSandbox = class {
|
|
1404
|
+
#sandbox;
|
|
1405
|
+
#workspacePath;
|
|
1406
|
+
#commandTimeoutMs;
|
|
1407
|
+
#signal;
|
|
1408
|
+
#disposed = false;
|
|
1409
|
+
constructor(sandbox, options) {
|
|
1410
|
+
this.#sandbox = sandbox;
|
|
1411
|
+
this.#workspacePath = options.workspacePath;
|
|
1412
|
+
this.#commandTimeoutMs = options.commandTimeoutMs;
|
|
1413
|
+
this.#signal = options.signal;
|
|
1414
|
+
}
|
|
1415
|
+
async executeCommand(command) {
|
|
1416
|
+
this.#assertActive();
|
|
1417
|
+
this.#signal?.throwIfAborted();
|
|
1418
|
+
const marker = `__OLLIE_STDERR_${randomUUID()}__`;
|
|
1419
|
+
const stderrPath = `/tmp/ollie-stderr-${randomUUID()}`;
|
|
1420
|
+
const wrapped = `( ${command}
|
|
1421
|
+
) 2>${shellQuote(stderrPath)}; ollie_code=$?; printf '
|
|
1422
|
+
${marker}
|
|
1423
|
+
'; base64 < ${shellQuote(stderrPath)}; rm -f ${shellQuote(stderrPath)}; exit $ollie_code`;
|
|
1424
|
+
try {
|
|
1425
|
+
const response = await abortable(
|
|
1426
|
+
this.#sandbox.process.executeCommand(
|
|
1427
|
+
wrapped,
|
|
1428
|
+
this.#workspacePath,
|
|
1429
|
+
void 0,
|
|
1430
|
+
timeoutSeconds(this.#commandTimeoutMs)
|
|
1431
|
+
),
|
|
1432
|
+
this.#signal
|
|
1433
|
+
);
|
|
1434
|
+
const separator = `
|
|
1435
|
+
${marker}
|
|
1436
|
+
`;
|
|
1437
|
+
const markerIndex = response.result.lastIndexOf(separator);
|
|
1438
|
+
if (markerIndex < 0) {
|
|
1439
|
+
return { exitCode: response.exitCode, stdout: response.result, stderr: "" };
|
|
1440
|
+
}
|
|
1441
|
+
const encodedStderr = response.result.slice(markerIndex + separator.length).trim();
|
|
1442
|
+
return {
|
|
1443
|
+
exitCode: response.exitCode,
|
|
1444
|
+
stdout: response.result.slice(0, markerIndex),
|
|
1445
|
+
stderr: encodedStderr ? Buffer.from(encodedStderr, "base64").toString("utf8") : ""
|
|
1446
|
+
};
|
|
1447
|
+
} catch (error) {
|
|
1448
|
+
if (error instanceof DaytonaProcessExecutionTimeoutError) {
|
|
1449
|
+
return {
|
|
1450
|
+
exitCode: 124,
|
|
1451
|
+
stdout: "",
|
|
1452
|
+
stderr: `Command timed out after ${this.#commandTimeoutMs} ms`
|
|
1453
|
+
};
|
|
1454
|
+
}
|
|
1455
|
+
throw error;
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
async readFile(path) {
|
|
1459
|
+
this.#assertActive();
|
|
1460
|
+
const content = await this.#sandbox.fs.downloadFile(this.#resolvePath(path));
|
|
1461
|
+
return content.toString("utf8");
|
|
1462
|
+
}
|
|
1463
|
+
async writeFiles(files) {
|
|
1464
|
+
this.#assertActive();
|
|
1465
|
+
for (const file of files) {
|
|
1466
|
+
const target = this.#resolvePath(file.path);
|
|
1467
|
+
await this.#sandbox.process.executeCommand(`mkdir -p ${shellQuote(dirname(target))}`);
|
|
1468
|
+
await this.#sandbox.fs.uploadFile(Buffer.from(file.content), target);
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
dispose() {
|
|
1472
|
+
this.#disposed = true;
|
|
1473
|
+
}
|
|
1474
|
+
#resolvePath(path) {
|
|
1475
|
+
const target = isAbsolute(path) ? resolve2(path) : resolve2(this.#workspacePath, path);
|
|
1476
|
+
if (target !== this.#workspacePath && !target.startsWith(`${this.#workspacePath}/`)) {
|
|
1477
|
+
throw new Error(`Path is outside the Daytona workspace: ${path}`);
|
|
1478
|
+
}
|
|
1479
|
+
return target;
|
|
1480
|
+
}
|
|
1481
|
+
#assertActive() {
|
|
1482
|
+
if (this.#disposed) throw new Error("Daytona executor session has been disposed");
|
|
1483
|
+
}
|
|
1484
|
+
};
|
|
1485
|
+
var DaytonaWorkspaceSynchronizer = class {
|
|
1486
|
+
#cwd;
|
|
1487
|
+
#remoteWorkspacePath;
|
|
1488
|
+
#sandbox;
|
|
1489
|
+
#knownFiles = /* @__PURE__ */ new Set();
|
|
1490
|
+
constructor(cwd, remoteWorkspacePath, sandbox) {
|
|
1491
|
+
this.#cwd = resolve2(cwd);
|
|
1492
|
+
this.#remoteWorkspacePath = remoteWorkspacePath;
|
|
1493
|
+
this.#sandbox = sandbox;
|
|
1494
|
+
}
|
|
1495
|
+
async syncToExecutor(signal) {
|
|
1496
|
+
signal?.throwIfAborted();
|
|
1497
|
+
const prepareResult = await abortable(
|
|
1498
|
+
this.#sandbox.process.executeCommand(`mkdir -p ${shellQuote(this.#remoteWorkspacePath)}`),
|
|
1499
|
+
signal
|
|
1500
|
+
);
|
|
1501
|
+
if (prepareResult.exitCode !== 0) {
|
|
1502
|
+
throw new Error(
|
|
1503
|
+
`Failed to create Daytona workspace ${this.#remoteWorkspacePath}: ${prepareResult.result}`
|
|
1504
|
+
);
|
|
1505
|
+
}
|
|
1506
|
+
const localFiles = await listLocalFiles(this.#cwd);
|
|
1507
|
+
let filesCreated = 0;
|
|
1508
|
+
let filesUpdated = 0;
|
|
1509
|
+
let filesDeleted = 0;
|
|
1510
|
+
let bytesTransferred = 0;
|
|
1511
|
+
for (const path of this.#knownFiles) {
|
|
1512
|
+
if (localFiles.has(path)) continue;
|
|
1513
|
+
await abortable(
|
|
1514
|
+
this.#sandbox.fs.deleteFile(this.#remotePath(path)).catch(() => void 0),
|
|
1515
|
+
signal
|
|
1516
|
+
);
|
|
1517
|
+
filesDeleted++;
|
|
1518
|
+
}
|
|
1519
|
+
for (const [path, size] of localFiles) {
|
|
1520
|
+
signal?.throwIfAborted();
|
|
1521
|
+
await abortable(
|
|
1522
|
+
this.#sandbox.fs.uploadFile(resolve2(this.#cwd, path), this.#remotePath(path)),
|
|
1523
|
+
signal
|
|
1524
|
+
);
|
|
1525
|
+
if (this.#knownFiles.has(path)) filesUpdated++;
|
|
1526
|
+
else filesCreated++;
|
|
1527
|
+
bytesTransferred += size;
|
|
1528
|
+
}
|
|
1529
|
+
this.#knownFiles = new Set(localFiles.keys());
|
|
1530
|
+
return this.#result(filesCreated, filesUpdated, filesDeleted, bytesTransferred);
|
|
1531
|
+
}
|
|
1532
|
+
async syncToLocal(signal) {
|
|
1533
|
+
signal?.throwIfAborted();
|
|
1534
|
+
const response = await abortable(
|
|
1535
|
+
this.#sandbox.process.executeCommand(
|
|
1536
|
+
"find . -type f -print0 | base64 -w0",
|
|
1537
|
+
this.#remoteWorkspacePath
|
|
1538
|
+
),
|
|
1539
|
+
signal
|
|
1540
|
+
);
|
|
1541
|
+
if (response.exitCode !== 0) {
|
|
1542
|
+
throw new Error(`Failed to enumerate Daytona workspace files: ${response.result}`);
|
|
1543
|
+
}
|
|
1544
|
+
const decoded = response.result.trim() ? Buffer.from(response.result.trim(), "base64").toString("utf8") : "";
|
|
1545
|
+
const remoteFiles = new Set(
|
|
1546
|
+
decoded.split("\0").filter(Boolean).map((path) => path.startsWith("./") ? path.slice(2) : path)
|
|
1547
|
+
);
|
|
1548
|
+
let filesCreated = 0;
|
|
1549
|
+
let filesUpdated = 0;
|
|
1550
|
+
let filesDeleted = 0;
|
|
1551
|
+
let bytesTransferred = 0;
|
|
1552
|
+
for (const path of this.#knownFiles) {
|
|
1553
|
+
if (remoteFiles.has(path)) continue;
|
|
1554
|
+
await rm(resolve2(this.#cwd, path), { force: true });
|
|
1555
|
+
filesDeleted++;
|
|
1556
|
+
}
|
|
1557
|
+
for (const path of remoteFiles) {
|
|
1558
|
+
signal?.throwIfAborted();
|
|
1559
|
+
const localPath = this.#localPath(path);
|
|
1560
|
+
const existed = await stat3(localPath).then(
|
|
1561
|
+
() => true,
|
|
1562
|
+
() => false
|
|
1563
|
+
);
|
|
1564
|
+
const content = await abortable(
|
|
1565
|
+
this.#sandbox.fs.downloadFile(this.#remotePath(path)),
|
|
1566
|
+
signal
|
|
1567
|
+
);
|
|
1568
|
+
await mkdir(dirname(localPath), { recursive: true });
|
|
1569
|
+
const previous = existed ? await readFile(localPath) : void 0;
|
|
1570
|
+
if (!previous?.equals(content)) {
|
|
1571
|
+
await writeFile(localPath, content);
|
|
1572
|
+
if (existed) filesUpdated++;
|
|
1573
|
+
else filesCreated++;
|
|
1574
|
+
bytesTransferred += content.byteLength;
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
this.#knownFiles = remoteFiles;
|
|
1578
|
+
return this.#result(filesCreated, filesUpdated, filesDeleted, bytesTransferred);
|
|
1579
|
+
}
|
|
1580
|
+
#remotePath(path) {
|
|
1581
|
+
return `${this.#remoteWorkspacePath}/${path}`;
|
|
1582
|
+
}
|
|
1583
|
+
#localPath(path) {
|
|
1584
|
+
const target = resolve2(this.#cwd, path);
|
|
1585
|
+
if (target !== this.#cwd && !target.startsWith(`${this.#cwd}${sep}`)) {
|
|
1586
|
+
throw new Error(`Daytona returned a path outside the workspace: ${path}`);
|
|
1587
|
+
}
|
|
1588
|
+
return target;
|
|
1589
|
+
}
|
|
1590
|
+
#result(filesCreated, filesUpdated, filesDeleted, bytesTransferred) {
|
|
1591
|
+
return {
|
|
1592
|
+
status: filesCreated || filesUpdated || filesDeleted || bytesTransferred ? "synchronized" : "no-changes",
|
|
1593
|
+
filesCreated,
|
|
1594
|
+
filesUpdated,
|
|
1595
|
+
filesDeleted,
|
|
1596
|
+
bytesTransferred
|
|
1597
|
+
};
|
|
1598
|
+
}
|
|
1599
|
+
};
|
|
1600
|
+
var DaytonaExecutorSession = class {
|
|
1601
|
+
sandbox;
|
|
1602
|
+
context;
|
|
1603
|
+
#remote;
|
|
1604
|
+
#synchronizer;
|
|
1605
|
+
#stopped = false;
|
|
1606
|
+
#disposed = false;
|
|
1607
|
+
constructor(remote, options, signal) {
|
|
1608
|
+
const workspacePath = options.remoteWorkspacePath ?? DEFAULT_REMOTE_WORKSPACE;
|
|
1609
|
+
this.#remote = remote;
|
|
1610
|
+
this.#synchronizer = new DaytonaWorkspaceSynchronizer(options.cwd, workspacePath, remote);
|
|
1611
|
+
this.sandbox = new DaytonaSandbox(remote, {
|
|
1612
|
+
workspacePath,
|
|
1613
|
+
commandTimeoutMs: options.commandTimeoutMs,
|
|
1614
|
+
signal
|
|
1615
|
+
});
|
|
1616
|
+
this.context = {
|
|
1617
|
+
kind: "daytona",
|
|
1618
|
+
workspacePath,
|
|
1619
|
+
isolated: true,
|
|
1620
|
+
networkAccess: "full"
|
|
1621
|
+
};
|
|
1622
|
+
}
|
|
1623
|
+
async resume(signal) {
|
|
1624
|
+
this.#assertActive();
|
|
1625
|
+
signal?.throwIfAborted();
|
|
1626
|
+
if (this.#stopped) {
|
|
1627
|
+
await abortable(this.#remote.start(), signal);
|
|
1628
|
+
this.#stopped = false;
|
|
1629
|
+
}
|
|
1630
|
+
await this.syncWorkspace({ destination: "executor", signal });
|
|
1631
|
+
}
|
|
1632
|
+
async pause(signal) {
|
|
1633
|
+
this.#assertActive();
|
|
1634
|
+
signal?.throwIfAborted();
|
|
1635
|
+
await this.syncWorkspace({ destination: "local", signal });
|
|
1636
|
+
await abortable(this.#remote.stop(), signal);
|
|
1637
|
+
this.#stopped = true;
|
|
1638
|
+
}
|
|
1639
|
+
async syncWorkspace(options) {
|
|
1640
|
+
this.#assertActive();
|
|
1641
|
+
return options.destination === "executor" ? this.#synchronizer.syncToExecutor(options.signal) : this.#synchronizer.syncToLocal(options.signal);
|
|
1642
|
+
}
|
|
1643
|
+
async dispose() {
|
|
1644
|
+
if (this.#disposed) return;
|
|
1645
|
+
this.#disposed = true;
|
|
1646
|
+
this.sandbox.dispose();
|
|
1647
|
+
await this.#remote.delete(60, true);
|
|
1648
|
+
}
|
|
1649
|
+
#assertActive() {
|
|
1650
|
+
if (this.#disposed) throw new Error("Daytona executor session has been disposed");
|
|
1651
|
+
}
|
|
1652
|
+
};
|
|
1653
|
+
var DaytonaExecutorProvider = class {
|
|
1654
|
+
systemPrompt = `Executor-backed delegation:
|
|
1655
|
+
- The delegateTask tool starts a fresh delegated agent with native workspace tools in an isolated Daytona sandbox.
|
|
1656
|
+
- Use delegateTask when the task requires unavailable executables, package managers, full system tooling, or native test/build commands.
|
|
1657
|
+
- The delegated agent cannot delegate further. Its trajectory and exact final summary are returned to you.
|
|
1658
|
+
- The Daytona workspace uses a provider-selected writable path that differs from your /workspace path. In delegated task descriptions, say "the workspace root" and do not hardcode /workspace; the child receives its actual workspace path.
|
|
1659
|
+
- One remote executor session is reused for this run. Workspace changes are synchronized back before delegateTask returns and are then visible through your workspace tools.
|
|
1660
|
+
- Remote startup and workspace transfer have overhead, so delegate bounded, substantial work rather than individual commands.
|
|
1661
|
+
- Do not claim delegated work succeeded unless the returned trajectory or summary confirms it.`;
|
|
1662
|
+
#options;
|
|
1663
|
+
#client;
|
|
1664
|
+
constructor(options) {
|
|
1665
|
+
this.#options = options;
|
|
1666
|
+
this.#client = options.client;
|
|
1667
|
+
}
|
|
1668
|
+
async createSession({ signal }) {
|
|
1669
|
+
signal?.throwIfAborted();
|
|
1670
|
+
const client = this.#client ?? new Daytona();
|
|
1671
|
+
const remote = await abortable(
|
|
1672
|
+
client.create(
|
|
1673
|
+
{
|
|
1674
|
+
...this.#options.snapshot ? { snapshot: this.#options.snapshot } : {},
|
|
1675
|
+
autoStopInterval: 0,
|
|
1676
|
+
autoDeleteInterval: 3,
|
|
1677
|
+
ttlMinutes: this.#options.ttlMinutes ?? DEFAULT_TTL_MINUTES,
|
|
1678
|
+
labels: { managedBy: "ollie" }
|
|
1679
|
+
},
|
|
1680
|
+
{ timeout: 120 }
|
|
1681
|
+
),
|
|
1682
|
+
signal
|
|
1683
|
+
);
|
|
1684
|
+
try {
|
|
1685
|
+
const workDir = await abortable(remote.getWorkDir(), signal);
|
|
1686
|
+
if (!workDir) throw new Error("Daytona did not report a writable working directory");
|
|
1687
|
+
const remoteWorkspacePath = this.#options.remoteWorkspacePath ?? `${workDir.replace(/\/+$/, "")}/ollie-workspace`;
|
|
1688
|
+
return new DaytonaExecutorSession(remote, { ...this.#options, remoteWorkspacePath }, signal);
|
|
1689
|
+
} catch (error) {
|
|
1690
|
+
await remote.delete(60, true).catch(() => void 0);
|
|
1691
|
+
throw error;
|
|
1692
|
+
}
|
|
1693
|
+
}
|
|
1694
|
+
};
|
|
1695
|
+
|
|
1696
|
+
// src/executor/delegator.ts
|
|
1697
|
+
import { generateText, stepCountIs } from "ai";
|
|
1698
|
+
|
|
1699
|
+
// src/prompt.ts
|
|
1700
|
+
function buildSystemPrompt(options) {
|
|
1701
|
+
const executorSection = options.executorInstructions ? `
|
|
1702
|
+
|
|
1703
|
+
${options.executorInstructions}` : "";
|
|
1704
|
+
return `You are Terminus, a concise one-shot CLI evaluation agent inspired by Harbor Terminus-2.
|
|
1705
|
+
|
|
1706
|
+
Terminus-2 spirit:
|
|
1707
|
+
- Prefer terminal-centric operation through the bash tool.
|
|
1708
|
+
- Treat bash as the primary terminal environment: inspect files, list directories, search text, run tests, and gather state by issuing shell commands.
|
|
1709
|
+
- Operate autonomously and finish the user's task in this single run.
|
|
1710
|
+
- Do not ask for interactive confirmation or user input during execution.
|
|
1711
|
+
- Prefer concrete terminal inspection over speculation. Verify facts through shell output before claiming them.
|
|
1712
|
+
- Keep actions minimal, bounded, and relevant to the task.
|
|
1713
|
+
- Explain failures clearly and recover where practical.
|
|
1714
|
+
- Do not claim a command, file observation, test result, or search result succeeded unless shell output confirms it.
|
|
1715
|
+
- Summarize final findings and important command results clearly.
|
|
1716
|
+
|
|
1717
|
+
Runtime context:
|
|
1718
|
+
- Working directory: ${SANDBOX_WORKSPACE_PATH}
|
|
1719
|
+
- Current time: ${options.now.toISOString()}
|
|
1720
|
+
- Maximum model/tool steps: ${options.maxSteps}
|
|
1721
|
+
- Per-command timeout: ${options.commandTimeoutMs} ms
|
|
1722
|
+
|
|
1723
|
+
Environment capabilities and limitations:
|
|
1724
|
+
- This is a restricted Bash environment. Only the provided built-in commands and Ollie's Git command can run.
|
|
1725
|
+
- Arbitrary executables and package managers such as node, npm, pnpm, npx, bun, deno, and system Python are unavailable; downloading a binary does not make it executable.
|
|
1726
|
+
- Use python/python3 (CPython compiled to WebAssembly) or js-exec (QuickJS) for supported scripting. They are not full Python or Node.js environments and cannot install or import arbitrary packages.
|
|
1727
|
+
- Common built-ins include find, rg, grep, sed, awk, jq, yq, curl, diff, tar, and sqlite3. Run help or <command> --help when uncertain; do not repeatedly probe unavailable commands.
|
|
1728
|
+
- Shell state is isolated per bash tool call: cd, exported variables, aliases, and functions do not carry into the next call. Combine dependent shell-state operations in one call, or pass explicit paths.
|
|
1729
|
+
- There is no process/job control or background execution. Shell arithmetic is limited to signed 32-bit integers, and loops, recursion, command counts, runtime, and output are bounded.
|
|
1730
|
+
- The environment defaults to UTC. Symbolic links are disabled.
|
|
1731
|
+
- Full HTTP(S) network access is enabled through curl and compatible commands. Network requests can have permanent external side effects.${executorSection}
|
|
1732
|
+
|
|
1733
|
+
Tool policy:
|
|
1734
|
+
- There is no approval flow. Tool calls execute automatically.
|
|
1735
|
+
- Git supports a practical subset of commands. Hooks, submodules, signing, SSH remotes, editors, pagers, and advanced options are unavailable.
|
|
1736
|
+
- A successful git push or other mutating network request changes the remote permanently and is allowed only when explicitly requested by the user.
|
|
1737
|
+
- Avoid destructive actions unless the user's task explicitly requires them.`;
|
|
1738
|
+
}
|
|
1739
|
+
function buildDelegatedSystemPrompt(options) {
|
|
1740
|
+
const executionBoundary = options.context.isolated ? "Commands run natively inside an isolated remote environment." : "Commands run natively with the current user's permissions and are not isolated.";
|
|
1741
|
+
return `You are Ollie's delegated execution agent. Complete one bounded task using native workspace tools.
|
|
1742
|
+
|
|
1743
|
+
Runtime context:
|
|
1744
|
+
- Workspace root: ${options.context.workspacePath}
|
|
1745
|
+
- Current time: ${options.now.toISOString()}
|
|
1746
|
+
- Maximum model/tool steps: ${options.maxSteps}
|
|
1747
|
+
- Per-command timeout: ${options.commandTimeoutMs} ms
|
|
1748
|
+
- ${executionBoundary}
|
|
1749
|
+
|
|
1750
|
+
Operating rules:
|
|
1751
|
+
- Start at the workspace root and use relative paths for workspace files.
|
|
1752
|
+
- Inspect the relevant state before making changes.
|
|
1753
|
+
- Keep changes minimal and directly related to the delegated task.
|
|
1754
|
+
- Run appropriate native checks or tests and report their actual results.
|
|
1755
|
+
- Do not delegate work and do not attempt to synchronize the workspace; neither capability is available.
|
|
1756
|
+
- Avoid destructive or permanent external actions unless the delegated task explicitly requires them.
|
|
1757
|
+
- Finish with a concise text summary describing what you did, what changed, and how you verified it. This final text block is returned verbatim to the parent agent.`;
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
// src/tools.ts
|
|
1761
|
+
import { createBashTool } from "bash-tool";
|
|
1762
|
+
async function createWorkspaceTools(options) {
|
|
1763
|
+
const toolkit = await createBashTool({
|
|
1764
|
+
sandbox: options.sandbox,
|
|
1765
|
+
destination: options.destination,
|
|
1766
|
+
maxOutputLength: options.maxOutputBytes,
|
|
1767
|
+
extraInstructions: options.extraInstructions
|
|
1768
|
+
});
|
|
1769
|
+
return toolkit.tools;
|
|
1770
|
+
}
|
|
1771
|
+
async function createTools(options) {
|
|
1772
|
+
return createWorkspaceTools({
|
|
1773
|
+
sandbox: createJustBash(options.cwd),
|
|
1774
|
+
destination: SANDBOX_WORKSPACE_PATH,
|
|
1775
|
+
maxOutputBytes: options.maxOutputBytes,
|
|
1776
|
+
extraInstructions: "Use bash commands to inspect files, search, run tests, and gather terminal state. Sandbox-native git is available; local Git changes persist in the workspace, and git push has permanent remote effects, so destructive actions and pushes must only be used when explicitly requested. Keep commands bounded."
|
|
1777
|
+
});
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
// src/executor/delegator.ts
|
|
1781
|
+
var ModelTaskDelegator = class {
|
|
1782
|
+
constructor(options) {
|
|
1783
|
+
this.options = options;
|
|
1784
|
+
}
|
|
1785
|
+
options;
|
|
1786
|
+
async runTask({
|
|
1787
|
+
session,
|
|
1788
|
+
task,
|
|
1789
|
+
signal
|
|
1790
|
+
}) {
|
|
1791
|
+
const instructions = buildDelegatedSystemPrompt({
|
|
1792
|
+
now: this.options.now?.() ?? /* @__PURE__ */ new Date(),
|
|
1793
|
+
maxSteps: this.options.maxSteps,
|
|
1794
|
+
commandTimeoutMs: this.options.commandTimeoutMs,
|
|
1795
|
+
context: session.context
|
|
1796
|
+
});
|
|
1797
|
+
const tools = await createWorkspaceTools({
|
|
1798
|
+
sandbox: session.sandbox,
|
|
1799
|
+
destination: session.context.workspacePath,
|
|
1800
|
+
maxOutputBytes: this.options.maxOutputBytes,
|
|
1801
|
+
extraInstructions: "Use the native workspace tools to complete the delegated task. Start at the workspace root, use relative paths, keep changes focused, and verify the result before reporting it."
|
|
1802
|
+
});
|
|
1803
|
+
const result = await generateText({
|
|
1804
|
+
model: this.options.model,
|
|
1805
|
+
instructions,
|
|
1806
|
+
prompt: task,
|
|
1807
|
+
tools,
|
|
1808
|
+
stopWhen: stepCountIs(this.options.maxSteps),
|
|
1809
|
+
abortSignal: signal,
|
|
1810
|
+
maxRetries: 1,
|
|
1811
|
+
onStepFinish: async (step) => {
|
|
1812
|
+
for (const toolCall of step.toolCalls) {
|
|
1813
|
+
await this.options.onEvent?.({
|
|
1814
|
+
type: "tool-call",
|
|
1815
|
+
toolName: toolCall.toolName,
|
|
1816
|
+
input: toolCall.input,
|
|
1817
|
+
source: "delegate"
|
|
1818
|
+
});
|
|
1819
|
+
}
|
|
1820
|
+
for (const toolResult of step.toolResults) {
|
|
1821
|
+
await this.options.onEvent?.({
|
|
1822
|
+
type: "tool-result",
|
|
1823
|
+
toolName: toolResult.toolName,
|
|
1824
|
+
output: toolResult.output,
|
|
1825
|
+
source: "delegate"
|
|
1826
|
+
});
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
});
|
|
1830
|
+
const finalTextParts = result.finalStep.content.filter(
|
|
1831
|
+
(part) => part.type === "text"
|
|
1832
|
+
);
|
|
1833
|
+
const summary = finalTextParts.at(-1)?.text;
|
|
1834
|
+
if (summary === void 0) {
|
|
1835
|
+
throw new Error("Delegated agent did not return a final text summary");
|
|
1836
|
+
}
|
|
1837
|
+
const trajectory = [
|
|
1838
|
+
{ role: "system", content: instructions },
|
|
1839
|
+
{ role: "user", content: task },
|
|
1840
|
+
...result.responseMessages
|
|
1841
|
+
];
|
|
1842
|
+
return { trajectory, summary };
|
|
1843
|
+
}
|
|
1844
|
+
};
|
|
1845
|
+
|
|
1846
|
+
// src/executor/local.ts
|
|
1847
|
+
import { spawn } from "child_process";
|
|
1848
|
+
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
|
|
1849
|
+
import { dirname as dirname2, isAbsolute as isAbsolute2, resolve as resolve3 } from "path";
|
|
1850
|
+
var LocalSandbox = class {
|
|
1851
|
+
#cwd;
|
|
1852
|
+
#commandTimeoutMs;
|
|
1853
|
+
#env;
|
|
1854
|
+
#signal;
|
|
1855
|
+
#processes = /* @__PURE__ */ new Set();
|
|
1856
|
+
#disposed = false;
|
|
1857
|
+
constructor(options, signal) {
|
|
1858
|
+
this.#cwd = resolve3(options.cwd);
|
|
1859
|
+
this.#commandTimeoutMs = options.commandTimeoutMs;
|
|
1860
|
+
this.#env = options.env ?? process.env;
|
|
1861
|
+
this.#signal = signal;
|
|
1862
|
+
}
|
|
1863
|
+
async executeCommand(command) {
|
|
1864
|
+
this.#assertActive();
|
|
1865
|
+
this.#signal?.throwIfAborted();
|
|
1866
|
+
return new Promise((resolveResult, reject) => {
|
|
1867
|
+
const child = spawn("/bin/sh", ["-lc", command], {
|
|
1868
|
+
cwd: this.#cwd,
|
|
1869
|
+
env: this.#env,
|
|
1870
|
+
detached: true,
|
|
1871
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
1872
|
+
});
|
|
1873
|
+
this.#processes.add(child);
|
|
1874
|
+
let stdout = "";
|
|
1875
|
+
let stderr = "";
|
|
1876
|
+
let timedOut = false;
|
|
1877
|
+
let abortReason;
|
|
1878
|
+
let forceTimer;
|
|
1879
|
+
let settled = false;
|
|
1880
|
+
const finish = (callback) => {
|
|
1881
|
+
if (settled) return;
|
|
1882
|
+
settled = true;
|
|
1883
|
+
clearTimeout(timer);
|
|
1884
|
+
if (forceTimer) clearTimeout(forceTimer);
|
|
1885
|
+
this.#signal?.removeEventListener("abort", onAbort);
|
|
1886
|
+
this.#processes.delete(child);
|
|
1887
|
+
callback();
|
|
1888
|
+
};
|
|
1889
|
+
const terminate = (signal) => {
|
|
1890
|
+
if (!child.pid) return;
|
|
1891
|
+
try {
|
|
1892
|
+
process.kill(-child.pid, signal);
|
|
1893
|
+
} catch {
|
|
1894
|
+
child.kill(signal);
|
|
1895
|
+
}
|
|
1896
|
+
};
|
|
1897
|
+
const beginTermination = () => {
|
|
1898
|
+
terminate("SIGTERM");
|
|
1899
|
+
forceTimer = setTimeout(() => terminate("SIGKILL"), 100);
|
|
1900
|
+
forceTimer.unref();
|
|
1901
|
+
};
|
|
1902
|
+
const onAbort = () => {
|
|
1903
|
+
abortReason = this.#signal?.reason ?? new Error("Executor command aborted");
|
|
1904
|
+
beginTermination();
|
|
1905
|
+
};
|
|
1906
|
+
const timer = setTimeout(() => {
|
|
1907
|
+
timedOut = true;
|
|
1908
|
+
beginTermination();
|
|
1909
|
+
}, this.#commandTimeoutMs);
|
|
1910
|
+
child.stdout?.setEncoding("utf8");
|
|
1911
|
+
child.stderr?.setEncoding("utf8");
|
|
1912
|
+
child.stdout?.on("data", (chunk) => {
|
|
1913
|
+
stdout += chunk;
|
|
1914
|
+
});
|
|
1915
|
+
child.stderr?.on("data", (chunk) => {
|
|
1916
|
+
stderr += chunk;
|
|
1917
|
+
});
|
|
1918
|
+
child.once("error", (error) => finish(() => reject(error)));
|
|
1919
|
+
child.once("close", (code, signal) => {
|
|
1920
|
+
finish(() => {
|
|
1921
|
+
if (abortReason !== void 0) {
|
|
1922
|
+
reject(abortReason);
|
|
1923
|
+
return;
|
|
1924
|
+
}
|
|
1925
|
+
if (timedOut) {
|
|
1926
|
+
resolveResult({
|
|
1927
|
+
exitCode: 124,
|
|
1928
|
+
stdout,
|
|
1929
|
+
stderr: `${stderr}${stderr ? "\n" : ""}Command timed out after ${this.#commandTimeoutMs} ms`
|
|
1930
|
+
});
|
|
1931
|
+
return;
|
|
1932
|
+
}
|
|
1933
|
+
resolveResult({
|
|
1934
|
+
exitCode: code ?? (signal ? 128 : 1),
|
|
1935
|
+
stdout,
|
|
1936
|
+
stderr
|
|
1937
|
+
});
|
|
1938
|
+
});
|
|
1939
|
+
});
|
|
1940
|
+
this.#signal?.addEventListener("abort", onAbort, { once: true });
|
|
1941
|
+
});
|
|
1942
|
+
}
|
|
1943
|
+
async readFile(path) {
|
|
1944
|
+
this.#assertActive();
|
|
1945
|
+
return readFile2(this.#resolvePath(path), "utf8");
|
|
1946
|
+
}
|
|
1947
|
+
async writeFiles(files) {
|
|
1948
|
+
this.#assertActive();
|
|
1949
|
+
await Promise.all(
|
|
1950
|
+
files.map(async ({ path, content }) => {
|
|
1951
|
+
const target = this.#resolvePath(path);
|
|
1952
|
+
await mkdir2(dirname2(target), { recursive: true });
|
|
1953
|
+
await writeFile2(target, content);
|
|
1954
|
+
})
|
|
1955
|
+
);
|
|
1956
|
+
}
|
|
1957
|
+
dispose() {
|
|
1958
|
+
if (this.#disposed) return;
|
|
1959
|
+
this.#disposed = true;
|
|
1960
|
+
for (const child of this.#processes) {
|
|
1961
|
+
if (!child.pid) continue;
|
|
1962
|
+
try {
|
|
1963
|
+
process.kill(-child.pid, "SIGTERM");
|
|
1964
|
+
} catch {
|
|
1965
|
+
child.kill("SIGTERM");
|
|
1966
|
+
}
|
|
1967
|
+
}
|
|
1968
|
+
this.#processes.clear();
|
|
1969
|
+
}
|
|
1970
|
+
#resolvePath(path) {
|
|
1971
|
+
return isAbsolute2(path) ? path : resolve3(this.#cwd, path);
|
|
1972
|
+
}
|
|
1973
|
+
#assertActive() {
|
|
1974
|
+
if (this.#disposed) throw new Error("Local executor session has been disposed");
|
|
1975
|
+
}
|
|
1976
|
+
};
|
|
1977
|
+
var LocalExecutorSession = class {
|
|
1978
|
+
sandbox;
|
|
1979
|
+
context;
|
|
1980
|
+
#disposed = false;
|
|
1981
|
+
constructor(options, signal) {
|
|
1982
|
+
const workspacePath = resolve3(options.cwd);
|
|
1983
|
+
this.sandbox = new LocalSandbox(options, signal);
|
|
1984
|
+
this.context = {
|
|
1985
|
+
kind: "local",
|
|
1986
|
+
workspacePath,
|
|
1987
|
+
isolated: false,
|
|
1988
|
+
networkAccess: "full"
|
|
1989
|
+
};
|
|
1990
|
+
}
|
|
1991
|
+
async resume(signal) {
|
|
1992
|
+
this.#assertActive();
|
|
1993
|
+
signal?.throwIfAborted();
|
|
1994
|
+
}
|
|
1995
|
+
async pause(signal) {
|
|
1996
|
+
this.#assertActive();
|
|
1997
|
+
signal?.throwIfAborted();
|
|
1998
|
+
}
|
|
1999
|
+
async dispose() {
|
|
2000
|
+
if (this.#disposed) return;
|
|
2001
|
+
this.#disposed = true;
|
|
2002
|
+
this.sandbox.dispose();
|
|
2003
|
+
}
|
|
2004
|
+
#assertActive() {
|
|
2005
|
+
if (this.#disposed) throw new Error("Local executor session has been disposed");
|
|
2006
|
+
}
|
|
2007
|
+
};
|
|
2008
|
+
var LocalExecutorProvider = class {
|
|
2009
|
+
constructor(options) {
|
|
2010
|
+
this.options = options;
|
|
2011
|
+
}
|
|
2012
|
+
options;
|
|
2013
|
+
systemPrompt = `Executor-backed delegation:
|
|
2014
|
+
- The delegateTask tool starts a fresh delegated agent with native workspace tools at the current local workspace root.
|
|
2015
|
+
- Use delegateTask when the task requires unavailable executables, package managers, full system tooling, or native test/build commands.
|
|
2016
|
+
- Native execution runs with the current user's permissions and is not isolated. Delegate only bounded, task-relevant work.
|
|
2017
|
+
- The delegated agent cannot delegate further. Its trajectory and exact final summary are returned to you.
|
|
2018
|
+
- One executor session is reused for this run. Because the local executor shares the workspace, its file changes are immediately visible through your workspace tools.
|
|
2019
|
+
- Do not claim delegated work succeeded unless the returned trajectory or summary confirms it.`;
|
|
2020
|
+
async createSession({ signal }) {
|
|
2021
|
+
signal?.throwIfAborted();
|
|
2022
|
+
return new LocalExecutorSession(this.options, signal);
|
|
2023
|
+
}
|
|
2024
|
+
};
|
|
2025
|
+
|
|
2026
|
+
// src/executor/tools.ts
|
|
2027
|
+
import { jsonSchema, tool } from "ai";
|
|
2028
|
+
function createExecutorTools(controller) {
|
|
2029
|
+
return {
|
|
2030
|
+
delegateTask: tool({
|
|
2031
|
+
description: "Delegate one bounded task to a fresh agent with native workspace tools in the configured execution environment.",
|
|
2032
|
+
inputSchema: jsonSchema({
|
|
2033
|
+
type: "object",
|
|
2034
|
+
additionalProperties: false,
|
|
2035
|
+
required: ["task"],
|
|
2036
|
+
properties: {
|
|
2037
|
+
task: {
|
|
2038
|
+
type: "string",
|
|
2039
|
+
minLength: 1,
|
|
2040
|
+
description: "A complete, self-contained description of the task to perform"
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
}),
|
|
2044
|
+
execute: async ({ task }, { abortSignal }) => {
|
|
2045
|
+
const trimmedTask = task.trim();
|
|
2046
|
+
if (!trimmedTask) throw new Error("Delegated task must not be empty");
|
|
2047
|
+
return controller.delegateTask(trimmedTask, abortSignal);
|
|
2048
|
+
}
|
|
2049
|
+
})
|
|
2050
|
+
};
|
|
2051
|
+
}
|
|
2052
|
+
|
|
2053
|
+
// src/provider.ts
|
|
2054
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
2055
|
+
function createLanguageModel({
|
|
2056
|
+
provider,
|
|
2057
|
+
model,
|
|
2058
|
+
env = process.env
|
|
2059
|
+
}) {
|
|
2060
|
+
if (provider !== "openai") {
|
|
2061
|
+
throw new CliError(
|
|
2062
|
+
`Unsupported provider: ${provider}. The reference implementation currently supports openai.`
|
|
2063
|
+
);
|
|
2064
|
+
}
|
|
2065
|
+
if (!env.OPENAI_API_KEY) {
|
|
2066
|
+
throw new CliError("OPENAI_API_KEY is required when using the openai provider.");
|
|
2067
|
+
}
|
|
2068
|
+
const openai = createOpenAI({ apiKey: env.OPENAI_API_KEY });
|
|
2069
|
+
return openai(model);
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
// src/runner.ts
|
|
2073
|
+
function createExecutorProvider(options) {
|
|
2074
|
+
switch (options.executor) {
|
|
2075
|
+
case "none":
|
|
2076
|
+
return void 0;
|
|
2077
|
+
case "local":
|
|
2078
|
+
return new LocalExecutorProvider({
|
|
2079
|
+
cwd: options.cwd,
|
|
2080
|
+
commandTimeoutMs: options.commandTimeoutMs
|
|
2081
|
+
});
|
|
2082
|
+
case "daytona":
|
|
2083
|
+
return new DaytonaExecutorProvider({
|
|
2084
|
+
cwd: options.cwd,
|
|
2085
|
+
commandTimeoutMs: options.commandTimeoutMs,
|
|
2086
|
+
snapshot: process.env.OLLIE_DAYTONA_SNAPSHOT
|
|
2087
|
+
});
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
async function runOneShot(options) {
|
|
2091
|
+
let executorController;
|
|
2092
|
+
try {
|
|
2093
|
+
const model = createLanguageModel({
|
|
2094
|
+
provider: options.provider,
|
|
2095
|
+
model: options.model
|
|
2096
|
+
});
|
|
2097
|
+
const workspaceTools = await createTools({
|
|
2098
|
+
cwd: options.cwd,
|
|
2099
|
+
maxOutputBytes: options.maxOutputBytes
|
|
2100
|
+
});
|
|
2101
|
+
const executorProvider = createExecutorProvider(options);
|
|
2102
|
+
if (executorProvider) {
|
|
2103
|
+
executorController = new ExecutorController(
|
|
2104
|
+
executorProvider,
|
|
2105
|
+
new ModelTaskDelegator({
|
|
2106
|
+
model,
|
|
2107
|
+
maxSteps: options.maxSteps,
|
|
2108
|
+
maxOutputBytes: options.maxOutputBytes,
|
|
2109
|
+
commandTimeoutMs: options.commandTimeoutMs,
|
|
2110
|
+
onEvent: options.onEvent
|
|
2111
|
+
})
|
|
2112
|
+
);
|
|
2113
|
+
}
|
|
2114
|
+
const tools = {
|
|
2115
|
+
...workspaceTools,
|
|
2116
|
+
...executorController ? createExecutorTools(executorController) : {}
|
|
2117
|
+
};
|
|
2118
|
+
const result = streamText({
|
|
2119
|
+
model,
|
|
2120
|
+
tools,
|
|
2121
|
+
instructions: buildSystemPrompt({
|
|
2122
|
+
now: /* @__PURE__ */ new Date(),
|
|
2123
|
+
maxSteps: options.maxSteps,
|
|
2124
|
+
commandTimeoutMs: options.commandTimeoutMs,
|
|
2125
|
+
executorInstructions: executorProvider?.systemPrompt
|
|
2126
|
+
}),
|
|
2127
|
+
prompt: options.prompt,
|
|
2128
|
+
stopWhen: stepCountIs2(options.maxSteps),
|
|
2129
|
+
abortSignal: options.signal,
|
|
2130
|
+
maxRetries: 1
|
|
2131
|
+
});
|
|
2132
|
+
for await (const part of result.stream) {
|
|
2133
|
+
switch (part.type) {
|
|
2134
|
+
case "text-delta":
|
|
2135
|
+
await options.onEvent({ type: "text", text: part.text });
|
|
2136
|
+
break;
|
|
2137
|
+
case "tool-call":
|
|
2138
|
+
await options.onEvent({ type: "tool-call", toolName: part.toolName, input: part.input });
|
|
2139
|
+
break;
|
|
2140
|
+
case "tool-result":
|
|
2141
|
+
await options.onEvent({
|
|
2142
|
+
type: "tool-result",
|
|
2143
|
+
toolName: part.toolName,
|
|
2144
|
+
output: part.output
|
|
2145
|
+
});
|
|
2146
|
+
break;
|
|
2147
|
+
case "tool-error":
|
|
2148
|
+
await options.onEvent({
|
|
2149
|
+
type: "error",
|
|
2150
|
+
message: `${part.toolName}: ${getErrorMessage(part.error)}`
|
|
2151
|
+
});
|
|
2152
|
+
break;
|
|
2153
|
+
case "error":
|
|
2154
|
+
await options.onEvent({ type: "error", message: getErrorMessage(part.error) });
|
|
2155
|
+
break;
|
|
2156
|
+
case "finish":
|
|
2157
|
+
await options.onEvent({ type: "done", usage: part.totalUsage });
|
|
2158
|
+
break;
|
|
2159
|
+
}
|
|
2160
|
+
}
|
|
2161
|
+
return 0;
|
|
2162
|
+
} catch (error) {
|
|
2163
|
+
if (options.signal?.aborted) {
|
|
2164
|
+
await options.onEvent({ type: "error", message: "aborted" });
|
|
2165
|
+
return 130;
|
|
2166
|
+
}
|
|
2167
|
+
await options.onEvent({ type: "error", message: getErrorMessage(error) });
|
|
2168
|
+
return 1;
|
|
2169
|
+
} finally {
|
|
2170
|
+
await executorController?.dispose();
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
// src/sandbox/runtime.ts
|
|
2175
|
+
import { once } from "events";
|
|
2176
|
+
import { posix as posix3 } from "path";
|
|
2177
|
+
import { createInterface } from "readline";
|
|
2178
|
+
function isRecord(value) {
|
|
2179
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2180
|
+
}
|
|
2181
|
+
function parseRequest(line) {
|
|
2182
|
+
let value;
|
|
2183
|
+
try {
|
|
2184
|
+
value = JSON.parse(line);
|
|
2185
|
+
} catch {
|
|
2186
|
+
throw new Error("Invalid JSON request");
|
|
2187
|
+
}
|
|
2188
|
+
if (!isRecord(value)) {
|
|
2189
|
+
throw new Error("Request must be a JSON object");
|
|
2190
|
+
}
|
|
2191
|
+
if (typeof value.id !== "string" && typeof value.id !== "number") {
|
|
2192
|
+
throw new Error("Request id must be a string or number");
|
|
2193
|
+
}
|
|
2194
|
+
if (value.method !== "exec" && value.method !== "readFile" && value.method !== "writeFile") {
|
|
2195
|
+
throw new Error("Unknown worker method");
|
|
2196
|
+
}
|
|
2197
|
+
if (!isRecord(value.params)) {
|
|
2198
|
+
throw new Error("Request params must be a JSON object");
|
|
2199
|
+
}
|
|
2200
|
+
return {
|
|
2201
|
+
id: value.id,
|
|
2202
|
+
method: value.method,
|
|
2203
|
+
params: value.params
|
|
2204
|
+
};
|
|
2205
|
+
}
|
|
2206
|
+
function requireString(params, name) {
|
|
2207
|
+
const value = params[name];
|
|
2208
|
+
if (typeof value !== "string") {
|
|
2209
|
+
throw new Error(`Parameter ${name} must be a string`);
|
|
2210
|
+
}
|
|
2211
|
+
return value;
|
|
2212
|
+
}
|
|
2213
|
+
function validateVirtualPath(path) {
|
|
2214
|
+
if (!posix3.isAbsolute(path) || path.includes("\\") || path.includes("\0") || posix3.normalize(path) !== path || path.split("/").some((component) => component === "." || component === "..")) {
|
|
2215
|
+
throw new Error("Path must be a normalized absolute virtual path");
|
|
2216
|
+
}
|
|
2217
|
+
return path;
|
|
2218
|
+
}
|
|
2219
|
+
function requestIdFromLine(line) {
|
|
2220
|
+
try {
|
|
2221
|
+
const value = JSON.parse(line);
|
|
2222
|
+
if (isRecord(value) && (typeof value.id === "string" || typeof value.id === "number")) {
|
|
2223
|
+
return value.id;
|
|
2224
|
+
}
|
|
2225
|
+
} catch {
|
|
2226
|
+
}
|
|
2227
|
+
return null;
|
|
2228
|
+
}
|
|
2229
|
+
function safeErrorMessage(error, workspaceRoot) {
|
|
2230
|
+
const message = error instanceof Error ? error.message : "Worker operation failed";
|
|
2231
|
+
return message.split(workspaceRoot).join("<workspace>");
|
|
2232
|
+
}
|
|
2233
|
+
async function handleWorkerLine(bash, line, workspaceRoot) {
|
|
2234
|
+
const fallbackId = requestIdFromLine(line);
|
|
2235
|
+
try {
|
|
2236
|
+
const request = parseRequest(line);
|
|
2237
|
+
switch (request.method) {
|
|
2238
|
+
case "exec": {
|
|
2239
|
+
const command = requireString(request.params, "command");
|
|
2240
|
+
const result = await bash.exec(command);
|
|
2241
|
+
return {
|
|
2242
|
+
id: request.id,
|
|
2243
|
+
result: {
|
|
2244
|
+
stdout: result.stdout,
|
|
2245
|
+
stderr: result.stderr,
|
|
2246
|
+
exitCode: result.exitCode
|
|
2247
|
+
}
|
|
2248
|
+
};
|
|
2249
|
+
}
|
|
2250
|
+
case "readFile": {
|
|
2251
|
+
const path = validateVirtualPath(requireString(request.params, "path"));
|
|
2252
|
+
return { id: request.id, result: await bash.fs.readFile(path) };
|
|
2253
|
+
}
|
|
2254
|
+
case "writeFile": {
|
|
2255
|
+
const path = validateVirtualPath(requireString(request.params, "path"));
|
|
2256
|
+
const content = requireString(request.params, "content");
|
|
2257
|
+
await bash.fs.writeFile(path, content);
|
|
2258
|
+
return { id: request.id, result: null };
|
|
2259
|
+
}
|
|
2260
|
+
}
|
|
2261
|
+
} catch (error) {
|
|
2262
|
+
return { id: fallbackId, error: { message: safeErrorMessage(error, workspaceRoot) } };
|
|
2263
|
+
}
|
|
2264
|
+
}
|
|
2265
|
+
async function writeResponse(output, response) {
|
|
2266
|
+
if (!output.write(`${JSON.stringify(response)}
|
|
2267
|
+
`)) {
|
|
2268
|
+
await once(output, "drain");
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
async function runWorker(options = {}) {
|
|
2272
|
+
const workspaceRoot = options.cwd ?? process.cwd();
|
|
2273
|
+
const input = options.input ?? process.stdin;
|
|
2274
|
+
const output = options.output ?? process.stdout;
|
|
2275
|
+
const bash = createJustBash(workspaceRoot);
|
|
2276
|
+
const lines = createInterface({ input, crlfDelay: Number.POSITIVE_INFINITY });
|
|
2277
|
+
const close = () => lines.close();
|
|
2278
|
+
if (options.signal?.aborted) {
|
|
2279
|
+
close();
|
|
2280
|
+
} else {
|
|
2281
|
+
options.signal?.addEventListener("abort", close, { once: true });
|
|
2282
|
+
}
|
|
2283
|
+
try {
|
|
2284
|
+
for await (const line of lines) {
|
|
2285
|
+
await writeResponse(output, await handleWorkerLine(bash, line, workspaceRoot));
|
|
2286
|
+
}
|
|
2287
|
+
} finally {
|
|
2288
|
+
options.signal?.removeEventListener("abort", close);
|
|
2289
|
+
lines.close();
|
|
2290
|
+
}
|
|
2291
|
+
}
|
|
2292
|
+
|
|
2293
|
+
// src/utils/output.ts
|
|
2294
|
+
var encoder = new TextEncoder();
|
|
2295
|
+
function truncateText(input, maxBytes) {
|
|
2296
|
+
if (maxBytes <= 0) {
|
|
2297
|
+
return {
|
|
2298
|
+
text: "\n[truncated: output limit is 0 bytes]",
|
|
2299
|
+
truncated: input.length > 0
|
|
2300
|
+
};
|
|
2301
|
+
}
|
|
2302
|
+
if (encoder.encode(input).byteLength <= maxBytes) {
|
|
2303
|
+
return { text: input, truncated: false };
|
|
2304
|
+
}
|
|
2305
|
+
let bytes = 0;
|
|
2306
|
+
let end = 0;
|
|
2307
|
+
for (const char of input) {
|
|
2308
|
+
const size = encoder.encode(char).byteLength;
|
|
2309
|
+
if (bytes + size > maxBytes) {
|
|
2310
|
+
break;
|
|
2311
|
+
}
|
|
2312
|
+
bytes += size;
|
|
2313
|
+
end += char.length;
|
|
2314
|
+
}
|
|
2315
|
+
return {
|
|
2316
|
+
text: `${input.slice(0, end)}
|
|
2317
|
+
[truncated: output exceeded ${maxBytes} bytes]`,
|
|
2318
|
+
truncated: true
|
|
2319
|
+
};
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
// src/cli-program.ts
|
|
2323
|
+
function addExecOptions(command, ndjsonDescription = "emit one JSON result record") {
|
|
2324
|
+
return command.option("--cwd <path>", "working directory").option("--timeout <ms>", "command timeout in milliseconds").option("--max-output <bytes>", "maximum retained output").option("--ndjson", ndjsonDescription);
|
|
2325
|
+
}
|
|
2326
|
+
function addAgentOptions(command) {
|
|
2327
|
+
return addExecOptions(command, "emit newline-delimited JSON event records").option("--provider <provider>", "model provider", "openai").option("--model <model>", "model id").option(
|
|
2328
|
+
"--executor <executor>",
|
|
2329
|
+
"delegated executor: none, local, or daytona (local is unisolated; daytona requires DAYTONA_API_KEY)",
|
|
2330
|
+
"none"
|
|
2331
|
+
).option("--max-steps <number>", "maximum model/tool steps").option("--no-color", "disable color output");
|
|
2332
|
+
}
|
|
2333
|
+
async function runAgent(promptParts, options) {
|
|
2334
|
+
const prompt = promptParts.join(" ").trim();
|
|
2335
|
+
if (!prompt) {
|
|
2336
|
+
throw new CliError('A prompt is required. Example: ollie agent "summarize this repository"');
|
|
2337
|
+
}
|
|
2338
|
+
const config = await resolveRunConfig(options);
|
|
2339
|
+
const renderer = createRenderer({ ndjson: config.ndjson, color: config.color });
|
|
2340
|
+
const controller = new AbortController();
|
|
2341
|
+
const onSigint = () => controller.abort();
|
|
2342
|
+
process.once("SIGINT", onSigint);
|
|
2343
|
+
try {
|
|
2344
|
+
const exitCode = await runOneShot({
|
|
2345
|
+
...config,
|
|
2346
|
+
prompt,
|
|
2347
|
+
signal: controller.signal,
|
|
2348
|
+
onEvent: (event) => renderer.render(event)
|
|
2349
|
+
});
|
|
2350
|
+
process.exitCode = exitCode;
|
|
2351
|
+
} finally {
|
|
2352
|
+
process.removeListener("SIGINT", onSigint);
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
async function runExec(commandParts, options) {
|
|
2356
|
+
const shellCommand = commandParts.join(" ").trim();
|
|
2357
|
+
if (!shellCommand) {
|
|
2358
|
+
throw new CliError('A command is required. Example: ollie "pwd && ls -la"');
|
|
2359
|
+
}
|
|
2360
|
+
const config = await resolveRunConfig(options);
|
|
2361
|
+
const controller = new AbortController();
|
|
2362
|
+
let signalExitCode;
|
|
2363
|
+
const onSigint = () => {
|
|
2364
|
+
signalExitCode = 130;
|
|
2365
|
+
controller.abort();
|
|
2366
|
+
};
|
|
2367
|
+
const onSigterm = () => {
|
|
2368
|
+
signalExitCode = 143;
|
|
2369
|
+
controller.abort();
|
|
2370
|
+
};
|
|
2371
|
+
process.once("SIGINT", onSigint);
|
|
2372
|
+
process.once("SIGTERM", onSigterm);
|
|
2373
|
+
try {
|
|
2374
|
+
const result = await runExecCommand(
|
|
2375
|
+
config.cwd,
|
|
2376
|
+
shellCommand,
|
|
2377
|
+
{
|
|
2378
|
+
timeoutMs: config.commandTimeoutMs,
|
|
2379
|
+
env: process.env
|
|
2380
|
+
},
|
|
2381
|
+
controller.signal
|
|
2382
|
+
);
|
|
2383
|
+
const stdout = truncateText(result.stdout, config.maxOutputBytes);
|
|
2384
|
+
const stderr = truncateText(result.stderr, config.maxOutputBytes);
|
|
2385
|
+
if (config.ndjson) {
|
|
2386
|
+
process.stdout.write(
|
|
2387
|
+
`${JSON.stringify({
|
|
2388
|
+
exitCode: result.exitCode,
|
|
2389
|
+
stdout: stdout.text,
|
|
2390
|
+
stderr: stderr.text,
|
|
2391
|
+
durationMs: result.durationMs,
|
|
2392
|
+
timedOut: result.timedOut,
|
|
2393
|
+
truncated: stdout.truncated || stderr.truncated
|
|
2394
|
+
})}
|
|
2395
|
+
`
|
|
2396
|
+
);
|
|
2397
|
+
} else {
|
|
2398
|
+
if (stdout.text) {
|
|
2399
|
+
process.stdout.write(stdout.text);
|
|
2400
|
+
}
|
|
2401
|
+
if (stderr.text) {
|
|
2402
|
+
process.stderr.write(stderr.text);
|
|
2403
|
+
}
|
|
2404
|
+
}
|
|
2405
|
+
process.exitCode = signalExitCode ?? (result.timedOut ? 124 : result.exitCode);
|
|
2406
|
+
} catch (error) {
|
|
2407
|
+
if (signalExitCode !== void 0) {
|
|
2408
|
+
process.exitCode = signalExitCode;
|
|
2409
|
+
return;
|
|
2410
|
+
}
|
|
2411
|
+
throw error;
|
|
2412
|
+
} finally {
|
|
2413
|
+
process.removeListener("SIGINT", onSigint);
|
|
2414
|
+
process.removeListener("SIGTERM", onSigterm);
|
|
2415
|
+
}
|
|
2416
|
+
}
|
|
2417
|
+
async function runSandbox(options) {
|
|
2418
|
+
const controller = new AbortController();
|
|
2419
|
+
let signalExitCode;
|
|
2420
|
+
const onSigint = () => {
|
|
2421
|
+
signalExitCode = 130;
|
|
2422
|
+
controller.abort();
|
|
2423
|
+
};
|
|
2424
|
+
const onSigterm = () => {
|
|
2425
|
+
signalExitCode = 143;
|
|
2426
|
+
controller.abort();
|
|
2427
|
+
};
|
|
2428
|
+
process.once("SIGINT", onSigint);
|
|
2429
|
+
process.once("SIGTERM", onSigterm);
|
|
2430
|
+
try {
|
|
2431
|
+
await runWorker({
|
|
2432
|
+
cwd: options.cwd,
|
|
2433
|
+
signal: controller.signal
|
|
2434
|
+
});
|
|
2435
|
+
if (signalExitCode !== void 0) {
|
|
2436
|
+
process.exitCode = signalExitCode;
|
|
2437
|
+
}
|
|
2438
|
+
} finally {
|
|
2439
|
+
process.removeListener("SIGINT", onSigint);
|
|
2440
|
+
process.removeListener("SIGTERM", onSigterm);
|
|
2441
|
+
}
|
|
2442
|
+
}
|
|
2443
|
+
function createRootProgram() {
|
|
2444
|
+
const program = new Command();
|
|
2445
|
+
program.name("ollie").description(`${packageName}: sandboxed command runner and optional model agent`).version(packageVersion).enablePositionalOptions().passThroughOptions().exitOverride();
|
|
2446
|
+
addExecOptions(program.argument("[command...]", "command to execute in a fresh sandbox")).action(
|
|
2447
|
+
async (commandParts, options) => {
|
|
2448
|
+
await runExec(commandParts, options);
|
|
2449
|
+
}
|
|
2450
|
+
);
|
|
2451
|
+
return program;
|
|
2452
|
+
}
|
|
2453
|
+
function createProgram() {
|
|
2454
|
+
const program = createRootProgram();
|
|
2455
|
+
const agent = addAgentOptions(
|
|
2456
|
+
program.command("agent").description("run a one-shot model agent task").argument("[prompt...]", "task prompt").enablePositionalOptions().passThroughOptions()
|
|
2457
|
+
);
|
|
2458
|
+
agent.action(async (prompt, options) => {
|
|
2459
|
+
await runAgent(prompt, options);
|
|
2460
|
+
});
|
|
2461
|
+
program.command("sandbox").description("run the persistent sandbox NDJSON command interface").option("--cwd <path>", "working directory").action(async (options) => {
|
|
2462
|
+
await runSandbox(options);
|
|
2463
|
+
});
|
|
2464
|
+
program.command("doctor").description("validate the local Ollie setup without making model calls").option("--cwd <path>", "working directory").option("--provider <provider>", "model provider", "openai").option("--model <model>", "model id").option("--json", "emit JSON report").action(async (options) => {
|
|
2465
|
+
const config = await resolveRunConfig(options);
|
|
2466
|
+
process.exitCode = await runDoctor(config);
|
|
2467
|
+
});
|
|
2468
|
+
return program;
|
|
2469
|
+
}
|
|
2470
|
+
var RESERVED_SUBCOMMANDS = /* @__PURE__ */ new Set(["agent", "sandbox", "doctor"]);
|
|
2471
|
+
var ROOT_OPTIONS_WITH_VALUES = /* @__PURE__ */ new Set(["--cwd", "--timeout", "--max-output"]);
|
|
2472
|
+
function rootBoundaryPrecedesCommand(args) {
|
|
2473
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
2474
|
+
const token = args[index] ?? "";
|
|
2475
|
+
if (token === "--") {
|
|
2476
|
+
return true;
|
|
2477
|
+
}
|
|
2478
|
+
if (RESERVED_SUBCOMMANDS.has(token)) {
|
|
2479
|
+
return false;
|
|
2480
|
+
}
|
|
2481
|
+
if (ROOT_OPTIONS_WITH_VALUES.has(token)) {
|
|
2482
|
+
index += 1;
|
|
2483
|
+
continue;
|
|
2484
|
+
}
|
|
2485
|
+
if ([...ROOT_OPTIONS_WITH_VALUES].some((option) => token.startsWith(`${option}=`))) {
|
|
2486
|
+
continue;
|
|
2487
|
+
}
|
|
2488
|
+
if (token === "--ndjson") {
|
|
2489
|
+
continue;
|
|
2490
|
+
}
|
|
2491
|
+
return false;
|
|
2492
|
+
}
|
|
2493
|
+
return false;
|
|
2494
|
+
}
|
|
2495
|
+
async function main(argv = process.argv) {
|
|
2496
|
+
const args = argv.slice(2);
|
|
2497
|
+
const program = rootBoundaryPrecedesCommand(args) ? createRootProgram() : createProgram();
|
|
2498
|
+
if (args.length === 0) {
|
|
2499
|
+
program.outputHelp();
|
|
2500
|
+
throw new CliError('A command is required. Example: ollie "pwd && ls -la"');
|
|
2501
|
+
}
|
|
2502
|
+
await program.parseAsync(argv);
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
// src/cli.ts
|
|
2506
|
+
main().catch((error) => {
|
|
2507
|
+
if (error instanceof CommanderError) {
|
|
2508
|
+
process.exitCode = error.exitCode;
|
|
2509
|
+
return;
|
|
2510
|
+
}
|
|
2511
|
+
process.stderr.write(`error: ${getErrorMessage(error)}
|
|
2512
|
+
`);
|
|
2513
|
+
process.exitCode = 1;
|
|
2514
|
+
});
|
|
2515
|
+
//# sourceMappingURL=cli.js.map
|