function | | Callback function triggered when the retry button is clicked. |
| [options.onSelect] | function | | Callback function triggered when the task is selected from the dropdown. |
| [options.progressPercent] | number | | Initial progress percentage of the task. |
+| [options.hideProgressBar] | boolean | | Hide progress for tasks waiting on a user action. |
| [options.noSpinnerNotification] | boolean | | If set to true, will not show the task spinners for this task. This can be used for silent background tasks where user attention is not needed. |
**Example**
diff --git a/docs/API-Reference/utils/DragAndDrop.md b/docs/API-Reference/utils/DragAndDrop.md
index 5800006e76..b1caeda9b8 100644
--- a/docs/API-Reference/utils/DragAndDrop.md
+++ b/docs/API-Reference/utils/DragAndDrop.md
@@ -18,7 +18,8 @@ Returns true if the drag and drop items contains valid drop objects.
## openDroppedFiles(paths) ⇒ Promise
-Open dropped files
+Open dropped files in order so the last file becomes active, regardless of load times.
+Continue processing the remaining paths if an earlier file cannot be opened.
**Kind**: global function
**Returns**: Promise - Promise that is resolved if all files are opened, or rejected
diff --git a/package-lock.json b/package-lock.json
index b4e819d156..b785839fa6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "phoenix",
- "version": "5.5.3-0",
+ "version": "5.5.6-0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "phoenix",
- "version": "5.5.3-0",
+ "version": "5.5.6-0",
"hasInstallScript": true,
"dependencies": {
"@bugsnag/js": "^7.18.0",
diff --git a/src-node/package-lock.json b/src-node/package-lock.json
index 2832561ed2..5c98351674 100644
--- a/src-node/package-lock.json
+++ b/src-node/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@phcode/node-core",
- "version": "5.5.5-0",
+ "version": "5.5.6-0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@phcode/node-core",
- "version": "5.5.5-0",
+ "version": "5.5.6-0",
"hasInstallScript": true,
"license": "GNU-AGPL3.0",
"dependencies": {
@@ -21,6 +21,7 @@
"node-pty": "^1.1.0",
"npm": "11.8.0",
"open": "^10.1.0",
+ "phoenix": "file:..",
"vscode-langservers-extracted": "4.10.0",
"which": "^2.0.1",
"ws": "^8.17.1",
@@ -30,6 +31,76 @@
"node": "24"
}
},
+ "..": {
+ "version": "5.5.6-0",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@bugsnag/js": "^7.18.0",
+ "@floating-ui/dom": "^0.5.4",
+ "@fortawesome/fontawesome-free": "^6.1.2",
+ "@highlightjs/cdn-assets": "^11.5.1",
+ "@phcode/fs": "^4.0.2",
+ "@phcode/language-support": "^1.1.0",
+ "@pixelbrackets/gfm-stylesheet": "^1.1.0",
+ "@prettier/plugin-php": "^0.22.2",
+ "@uiw/file-icons": "^1.3.2",
+ "@xterm/addon-fit": "0.12.0-beta.301",
+ "@xterm/addon-search": "0.17.0-beta.301",
+ "@xterm/addon-web-links": "0.13.0-beta.301",
+ "@xterm/addon-webgl": "0.20.0-beta.300",
+ "@xterm/xterm": "6.1.0-beta.304",
+ "bootstrap": "^5.1.3",
+ "browser-mime": "^1.0.1",
+ "codemirror": "^5.65.16",
+ "cross-env": "^7.0.3",
+ "devicon": "^2.15.1",
+ "emmet": "^2.4.11",
+ "file-saver": "^2.0.5",
+ "idb-keyval": "^6.2.1",
+ "jshint": "^2.13.5",
+ "jszip": "^3.8.0",
+ "less": "^4.1.3",
+ "lodash": "^4.18.1",
+ "lru-cache": "^10.2.0",
+ "marked": "^4.0.18",
+ "mime-db": "^1.52.0",
+ "mustache": "^4.2.0",
+ "prettier": "^3.2.5",
+ "requirejs": "^2.3.7",
+ "tern": "^0.24.3",
+ "tinycolor2": "^1.4.2",
+ "underscore": "^1.13.4"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^16.0.2",
+ "@commitlint/config-conventional": "^16.0.0",
+ "@playwright/test": "^1.38.1",
+ "del": "^6.0.0",
+ "eslint": "^8.18.0",
+ "glob": "^8.1.0",
+ "gulp": "^4.0.2",
+ "gulp-concat": "^2.6.1",
+ "gulp-cssnano": "^2.1.3",
+ "gulp-flatten": "^0.4.0",
+ "gulp-if": "^3.0.0",
+ "gulp-minify": "^3.1.0",
+ "gulp-rename": "^2.0.0",
+ "gulp-sourcemaps": "^3.0.0",
+ "gulp-uglify": "^3.0.2",
+ "gulp-useref": "^5.0.0",
+ "gulp-webserver": "^0.9.1",
+ "gulp-zip": "^5.1.0",
+ "http-proxy": "^1.18.1",
+ "http-server": "14.1.0",
+ "husky": "^7.0.4",
+ "jasmine-core": "^4.2.0",
+ "jasmine-reporters": "^2.5.0",
+ "jsdoc-to-markdown": "^9.1.1",
+ "lmdb": "^3.5.1",
+ "readable-stream": "^3.6.0",
+ "through2": "^4.0.2"
+ }
+ },
"node_modules/@anthropic-ai/claude-agent-sdk": {
"version": "0.3.280",
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.3.280.tgz",
@@ -3748,6 +3819,10 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/phoenix": {
+ "resolved": "..",
+ "link": true
+ },
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
diff --git a/src-node/package.json b/src-node/package.json
index 62b0f24b0e..7d8f88a340 100644
--- a/src-node/package.json
+++ b/src-node/package.json
@@ -31,6 +31,7 @@
"node-pty": "^1.1.0",
"npm": "11.8.0",
"open": "^10.1.0",
+ "phoenix": "file:..",
"vscode-langservers-extracted": "4.10.0",
"which": "^2.0.1",
"ws": "^8.17.1",
diff --git a/src/assets/aiDemos/0000-dave-jungle-temple.json b/src/assets/aiDemos/0000-dave-jungle-temple.json
new file mode 100644
index 0000000000..6b14cef45a
--- /dev/null
+++ b/src/assets/aiDemos/0000-dave-jungle-temple.json
@@ -0,0 +1 @@
+{"format":"phoenix-ai-panel-recording","version":1,"recordedAt":"2026-09-21T13:43:53.372Z","appVersion":"5.5.3-0","durationMs":1798755,"preferredSpeed":8,"builtWith":"Claude Fable 5","userMessage":"Surprise me!","prompt":"Surprise me — build a small playable game (specifically: dave (Dangerous Dave-style platformer)) in vanilla HTML/CSS/JS that I can preview right now. Aesthetic: a tropical jungle palette (deep green, papaya, ivory). Make it visually impressive, modern, and polished. The specific pick and the aesthetic are FIXED for your decisions — don't substitute a different game / widget / piece if you think it's safer, and don't drift to a different palette on your own initiative mid-build. How you design and structure the build is fully up to you. If I ask for a different category, aesthetic, theme, or palette in a follow-up, my follow-up wins. Avoid the word \"aurora\" anywhere in the page or filenames — pick fresh names.\n\nThis one has to run smoothly on low-end student laptops and still look great, so:\n- World-building first: a side-scrolling jungle-temple level a few screens wide with parallax background layers, animated water, torches and vines, collectible gems and a key, a few patrolling enemies, hazards, and an exit door that needs the key. Pixel-art style, with every sprite and tile drawn in code — no external assets, fonts or libraries.\n- Render on a small fixed internal canvas (about 320x180) scaled up with CSS image-rendering: pixelated. 2D canvas only — no WebGL or 3D. Pre-render tiles and sprites to offscreen canvases once. No shadowBlur, no getImageData or per-pixel work, no large particle counts. Step the game with delta time, cap the step, and pause when the tab is hidden.\n- Attract mode: until the player presses a key or taps, the game plays itself (a simple scripted player runs the level on a loop) so the preview is alive with nobody touching it. Show a small 'Press any key to play' prompt; any input hands control to the player.\n- Controls: arrow keys / WASD and Space to jump, plus on-screen touch buttons for trackpad and touch users. HUD with gems, key and lives. Win and game-over screens with restart.\n- Sound off by default (tiny WebAudio bleeps behind a mute toggle are fine).\n- When you test with execJsInLivePreview keep every check short and cheap: read state, no long synchronous loops, no simulating long stretches of gameplay in one call, no canvas readbacks, no synthetic input storms. A few quick checks and screenshots are enough.\n\nCRITICAL: Always create a BRAND NEW HTML file for this build. Do NOT Read, Edit, or Write into any file that already existed before this task started — whatever file the user has open is irrelevant, do not touch it. Call getEditorState ONCE up front if you need to learn the project root path (so your Write call uses a correct absolute path), but ignore the active file it reports — that's not your target. Pick a fresh filename that matches the pick (e.g. `←"}},{"t":1569219,"name":"aiToolStream","data":{"toolId":44,"toolName":"Edit","append":" → / A D move · "}},{"t":1569470,"name":"aiToolStream","data":{"toolId":44,"toolName":"Edit","append":"Space jump · M sound
\\n← → / A D move · Space jump · M sound
\n← → / A D move · Space jump · M sound
\n