Huanqi Cao
089f4dfad8
feat(picker): open the Win32 folder dialog in-process over koffi
...
The modern IFileOpenDialog becomes the primary win32 tier: a koffi-driven
COM conversation on a worker_threads worker (the modal Show never blocks
the host event loop), per-monitor-v2 DPI via SetThreadDpiAwarenessContext,
and abort service by re-posting WM_CLOSE to the dialog thread's windows,
with terminate+unref as the last resort (Node cannot interrupt a thread
blocked in native code, and such a worker must never hold the process open).
The PowerShell chain stays as the fallback tier with its trigger widened
from ENOENT to any pwsh failure, closing the review-flagged PowerShell 6
regression (no WinForms: exit 1, not ENOENT, so 5.1 never ran).
Layering keeps per-file coverage honest on every host: pure sequencing and
the driver test against fakes anywhere; the bindings run against a mocked
koffi COM world (the session-persistence-jsonl technique); POSIX hosts
drive the real spawn plumbing to its koffi-load rejection; win32 hosts run
a real open-and-abort-close smoke. The smoke joins processBoundTests: a
worker blocked in a native modal wedges the threads pool's teardown, while
a fork contains it. The worker bundles as its own CJS tsdown entry
(workflow-workerthread's pattern; no TLA), and the host module is imported
statically so the node-half bundle stays chunk-free.
Built-plane and real-COM behavior verified on native Windows: standalone
probes for the source worker, the built CJS worker, and the driver's abort
path all open and close the real dialog.
Agent Notes: new implemented/feature/2026-08-02-win32-in-process-folder-dialog
(bilingual) owns the decision; the DPI note is re-scoped to the fallback tier
it now describes and its AutoUpgradeEnabled attribution corrected (.NET Core
3.0 rewrote FolderBrowserDialog; the opt-out arrived in .NET 6).
2026-08-05 00:31:43 +08:00
..
2026-07-25 01:58:42 +08:00
2026-07-24 23:43:10 +08:00
2026-07-25 01:58:42 +08:00
2026-07-27 14:01:15 +08:00
2026-07-27 14:01:15 +08:00
2026-07-27 14:01:15 +08:00
2026-07-23 19:48:00 +08:00
2026-07-23 19:33:30 +08:00
2026-07-23 19:48:00 +08:00
2026-07-30 17:40:25 +08:00
2026-07-30 17:40:25 +08:00
2026-07-30 17:40:25 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-07-28 10:26:15 -07:00
2026-07-28 10:26:15 -07:00
2026-07-28 10:26:15 -07:00
2026-07-28 05:22:47 -07:00
2026-07-28 05:22:47 -07:00
2026-07-28 05:22:47 -07:00
2026-07-28 17:58:09 +08:00
2026-07-28 17:58:09 +08:00
2026-07-28 17:58:09 +08:00
2026-07-29 23:15:15 +08:00
2026-07-29 23:15:15 +08:00
2026-07-29 23:15:15 +08:00
2026-07-29 23:15:15 +08:00
2026-07-29 23:15:15 +08:00
2026-07-29 23:15:15 +08:00
2026-07-27 17:38:42 +08:00
2026-07-27 17:38:42 +08:00
2026-07-27 17:38:42 +08:00
2026-07-30 21:28:13 +08:00
2026-07-30 21:28:13 +08:00
2026-07-30 21:28:13 +08:00
2026-07-25 01:58:42 +08:00
2026-07-24 23:43:10 +08:00
2026-07-25 01:58:42 +08:00
2026-08-04 13:20:28 +08:00
2026-08-04 13:20:28 +08:00
2026-08-04 13:20:28 +08:00
2026-07-31 13:49:41 +08:00
2026-07-31 13:49:41 +08:00
2026-07-31 13:49:41 +08:00
2026-07-24 13:57:16 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 13:57:16 +08:00
2026-07-31 15:19:59 +08:00
2026-07-31 15:19:59 +08:00
2026-07-31 15:19:59 +08:00
2026-07-28 10:26:15 -07:00
2026-07-28 10:26:15 -07:00
2026-07-28 10:26:15 -07:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-07-29 21:15:42 +08:00
2026-07-29 21:15:42 +08:00
2026-07-29 21:15:42 +08:00
2026-07-27 04:14:51 +08:00
2026-07-27 04:14:51 +08:00
2026-07-27 04:14:51 +08:00
2026-07-29 22:10:26 +08:00
2026-07-29 22:10:26 +08:00
2026-07-29 22:10:26 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-26 23:06:00 +08:00
2026-07-24 17:39:22 +08:00
2026-07-22 23:07:14 +08:00
2026-07-24 17:39:22 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-26 02:33:29 +08:00
2026-07-22 21:37:30 +08:00
2026-07-22 21:37:30 +08:00
2026-07-22 21:37:30 +08:00
2026-07-25 16:43:07 +08:00
2026-07-25 16:43:07 +08:00
2026-07-25 16:43:07 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-28 10:26:15 -07:00
2026-07-28 10:26:15 -07:00
2026-07-28 10:26:15 -07:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-07-24 01:40:25 +08:00
2026-08-02 05:58:45 -07:00
2026-08-02 05:58:45 -07:00
2026-08-02 05:58:45 -07:00
2026-07-20 20:35:15 +08:00
2026-07-20 20:35:15 +08:00
2026-07-20 20:35:15 +08:00
2026-07-24 22:12:23 +08:00
2026-07-24 22:12:23 +08:00
2026-07-24 22:12:23 +08:00
2026-07-26 14:29:30 +08:00
2026-07-26 14:05:33 +08:00
2026-07-26 14:05:33 +08:00
2026-07-27 21:20:06 +08:00
2026-07-27 21:20:06 +08:00
2026-07-27 21:20:06 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-07-28 13:58:06 +08:00
2026-07-28 13:58:06 +08:00
2026-07-28 13:58:06 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-22 14:29:52 +08:00
2026-07-29 20:10:42 +08:00
2026-07-29 20:10:42 +08:00
2026-07-29 20:10:42 +08:00
2026-08-02 12:45:36 +08:00
2026-08-02 12:45:36 +08:00
2026-08-02 12:45:36 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-08-02 12:51:09 +08:00
2026-07-22 20:35:38 +08:00
2026-07-22 20:35:38 +08:00
2026-07-22 20:35:38 +08:00
2026-07-27 21:30:28 +08:00
2026-07-27 21:30:28 +08:00
2026-07-27 21:30:28 +08:00
2026-07-30 20:26:33 +08:00
2026-07-30 20:26:33 +08:00
2026-07-30 20:26:33 +08:00
2026-08-04 20:28:23 +08:00
2026-08-04 20:28:23 +08:00
2026-08-04 20:28:23 +08:00
2026-07-28 17:58:09 +08:00
2026-07-28 17:58:09 +08:00
2026-07-28 17:58:09 +08:00
2026-08-02 03:56:25 +08:00
2026-08-02 03:56:25 +08:00
2026-08-02 03:56:25 +08:00
2026-07-26 01:16:41 +08:00
2026-07-26 01:16:41 +08:00
2026-07-26 01:16:41 +08:00
2026-07-30 10:34:21 +08:00
2026-07-30 10:11:38 +08:00
2026-07-30 10:11:38 +08:00
2026-07-31 18:37:34 +08:00
2026-07-31 18:37:34 +08:00
2026-07-31 18:37:34 +08:00
2026-07-29 00:39:56 +08:00
2026-07-29 00:39:56 +08:00
2026-07-29 00:39:56 +08:00
2026-07-31 18:37:34 +08:00
2026-07-31 18:37:34 +08:00
2026-07-31 18:37:34 +08:00
2026-07-26 22:53:47 +08:00
2026-07-26 22:53:47 +08:00
2026-07-26 22:53:47 +08:00
2026-07-26 03:29:22 +08:00
2026-07-26 02:43:34 +08:00
2026-07-26 03:29:22 +08:00
2026-07-26 04:24:13 +08:00
2026-07-26 04:02:38 +08:00
2026-07-26 04:24:13 +08:00
2026-07-26 15:26:52 +08:00
2026-07-26 15:26:52 +08:00
2026-07-26 15:26:52 +08:00
2026-08-05 00:31:43 +08:00
2026-08-05 00:31:43 +08:00
2026-08-05 00:31:43 +08:00
2026-07-29 22:27:49 +08:00
2026-07-29 22:27:49 +08:00
2026-07-29 22:27:49 +08:00
2026-07-31 18:25:03 +08:00
2026-07-31 18:25:03 +08:00
2026-07-31 18:25:03 +08:00
2026-08-03 14:02:54 +08:00
2026-08-03 14:02:54 +08:00
2026-08-03 14:02:54 +08:00
2026-07-28 01:41:32 +08:00
2026-07-28 01:41:32 +08:00
2026-07-28 01:41:32 +08:00
2026-08-02 16:25:02 +08:00
2026-08-02 16:25:02 +08:00
2026-08-02 16:25:02 +08:00
2026-07-30 09:40:38 +08:00
2026-07-30 09:40:38 +08:00
2026-07-30 09:40:38 +08:00
2026-08-03 13:31:19 +08:00
2026-08-03 13:31:19 +08:00
2026-08-03 13:31:19 +08:00
2026-07-31 18:37:34 +08:00
2026-07-31 18:37:34 +08:00
2026-07-31 18:37:34 +08:00
2026-08-02 12:51:10 +08:00
2026-08-02 12:51:10 +08:00
2026-08-02 12:51:10 +08:00
2026-07-31 16:49:55 +08:00
2026-07-31 16:49:55 +08:00
2026-07-31 16:49:55 +08:00
2026-07-30 21:04:00 +08:00
2026-07-30 21:04:00 +08:00
2026-07-30 21:04:00 +08:00
2026-08-04 13:20:28 +08:00
2026-08-04 13:20:28 +08:00
2026-08-04 13:20:28 +08:00
2026-07-28 19:43:56 +08:00
2026-07-28 19:43:56 +08:00
2026-07-28 19:43:56 +08:00
2026-07-28 14:24:41 +08:00
2026-07-28 14:24:41 +08:00
2026-07-28 14:24:41 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-08-02 17:53:07 +08:00
2026-08-02 17:53:07 +08:00
2026-08-02 17:53:07 +08:00
2026-07-29 14:12:01 +08:00
2026-07-29 14:12:01 +08:00
2026-07-29 14:12:01 +08:00
2026-07-29 21:09:02 +08:00
2026-07-29 21:09:02 +08:00
2026-07-29 21:09:02 +08:00
2026-07-31 14:28:52 +08:00
2026-07-31 14:28:52 +08:00
2026-07-31 14:28:52 +08:00
2026-07-31 01:27:56 +08:00
2026-07-31 01:27:56 +08:00
2026-07-31 01:27:56 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 01:29:04 +08:00
2026-08-02 20:09:05 +08:00
2026-08-02 20:09:05 +08:00
2026-08-02 20:09:05 +08:00
2026-07-31 13:49:41 +08:00
2026-07-31 13:49:41 +08:00
2026-07-31 13:49:41 +08:00
2026-07-31 10:29:20 +08:00
2026-07-31 10:29:20 +08:00
2026-07-31 10:29:20 +08:00
2026-07-31 16:20:54 +08:00
2026-07-31 16:20:54 +08:00
2026-07-31 16:20:54 +08:00
2026-07-30 19:38:18 +08:00
2026-07-30 19:38:18 +08:00
2026-07-30 19:38:18 +08:00
2026-07-30 22:00:34 +08:00
2026-07-30 22:00:34 +08:00
2026-07-30 22:00:34 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-08-03 18:35:26 +08:00
2026-08-03 18:35:26 +08:00
2026-08-03 18:35:26 +08:00
2026-07-30 17:26:44 +08:00
2026-07-30 17:26:44 +08:00
2026-07-30 17:26:44 +08:00
2026-07-30 16:20:34 +08:00
2026-07-30 16:20:34 +08:00
2026-07-30 16:20:34 +08:00
2026-07-31 15:27:24 +08:00
2026-07-31 15:27:24 +08:00
2026-07-31 15:27:24 +08:00
2026-08-02 17:53:07 +08:00
2026-08-02 17:53:07 +08:00
2026-08-02 17:53:07 +08:00
2026-07-30 21:28:38 +08:00
2026-07-30 21:28:38 +08:00
2026-07-30 21:28:38 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-07-30 20:26:33 +08:00
2026-07-30 20:26:33 +08:00
2026-07-30 20:26:33 +08:00
2026-08-03 16:35:37 +08:00
2026-08-03 16:35:37 +08:00
2026-08-03 16:35:37 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-08-04 15:25:30 +08:00
2026-07-30 22:49:41 +08:00
2026-07-30 22:49:41 +08:00
2026-07-30 22:49:41 +08:00
2026-08-04 14:23:34 +08:00
2026-08-04 14:23:34 +08:00
2026-08-04 14:23:34 +08:00
2026-07-31 15:49:59 +08:00
2026-07-31 15:49:59 +08:00
2026-07-31 15:49:59 +08:00
2026-08-04 13:20:28 +08:00
2026-08-04 13:20:28 +08:00
2026-08-04 13:20:28 +08:00
2026-07-31 13:24:30 +08:00
2026-07-31 13:24:30 +08:00
2026-07-31 13:24:30 +08:00
2026-07-31 16:13:12 +08:00
2026-07-31 16:13:12 +08:00
2026-07-31 16:13:12 +08:00
2026-07-31 20:39:53 +08:00
2026-07-31 20:39:53 +08:00
2026-07-31 20:39:53 +08:00
2026-07-31 14:08:13 +08:00
2026-07-31 14:08:13 +08:00
2026-07-31 14:08:13 +08:00
2026-07-31 14:28:03 +08:00
2026-07-31 14:28:03 +08:00
2026-07-31 14:28:03 +08:00
2026-07-31 02:34:52 -07:00
2026-07-31 02:34:52 -07:00
2026-07-31 02:34:52 -07:00
2026-07-31 16:34:16 +08:00
2026-07-31 16:34:16 +08:00
2026-07-31 16:34:16 +08:00
2026-08-01 06:15:16 -07:00
2026-08-01 06:15:16 -07:00
2026-08-01 06:15:16 -07:00
2026-08-04 15:18:48 +08:00
2026-08-04 15:18:48 +08:00
2026-08-04 15:18:48 +08:00
2026-07-31 20:39:53 +08:00
2026-07-31 20:39:53 +08:00
2026-07-31 20:39:53 +08:00
2026-08-02 14:18:55 +08:00
2026-08-02 14:18:55 +08:00
2026-08-02 14:18:55 +08:00
2026-08-03 23:16:53 +08:00
2026-08-03 23:16:53 +08:00
2026-08-03 23:16:53 +08:00
2026-08-02 03:56:25 +08:00
2026-08-02 03:56:25 +08:00
2026-08-02 03:56:25 +08:00
2026-08-02 05:29:25 -07:00
2026-08-02 05:29:25 -07:00
2026-08-02 05:29:25 -07:00
2026-08-05 00:31:43 +08:00
2026-08-05 00:31:43 +08:00
2026-08-05 00:31:43 +08:00
2026-08-03 18:58:44 +08:00
2026-08-03 18:58:44 +08:00
2026-08-03 18:58:44 +08:00
2026-08-04 15:55:07 +08:00
2026-08-04 15:55:07 +08:00
2026-08-04 15:55:07 +08:00
2026-08-04 15:42:39 +08:00
2026-08-04 15:42:39 +08:00
2026-08-04 15:42:39 +08:00
2026-08-04 14:14:12 +08:00
2026-08-04 14:14:12 +08:00
2026-08-04 14:14:12 +08:00