Compare commits

...

480 Commits

Author SHA1 Message Date
Andrew Pareles 47998e4ee5 Merge pull request #325 from voideditor/v1.0.2
V1.0.2
2025-03-21 22:41:28 -07:00
Andrew Pareles 995f39b61f No X button 2025-03-21 22:38:26 -07:00
Andrew Pareles ec2ae0e190 more persistent update message 2025-03-21 22:31:24 -07:00
Andrew Pareles 2bef719754 Merge pull request #324 from voideditor/model-selection
Command Bar for Changes + Tool UI
2025-03-21 21:57:02 -07:00
Andrew Pareles c6376eb1db 1 2025-03-21 21:55:20 -07:00
Andrew Pareles db2c60db82 rm 2025-03-21 21:53:42 -07:00
Andrew Pareles a6f1b1e0ad window 2025-03-21 21:52:53 -07:00
Andrew Pareles 9edca589a0 1.0.2 2025-03-21 21:49:08 -07:00
Andrew Pareles da6710a079 current file fix will vs did 2025-03-21 21:45:17 -07:00
Andrew Pareles f60d5cad2f void agent 2025-03-21 21:22:21 -07:00
Andrew Pareles 75f1a2d79b format 2025-03-21 21:20:57 -07:00
Andrew Pareles 22dd42ba70 misc improvements 2025-03-21 21:20:41 -07:00
Mathew Pareles 1675879fa4 ux for commandbar 2025-03-21 20:14:55 -07:00
Andrew Pareles d6a7921526 Merge remote-tracking branch 'origin/main' into model-selection 2025-03-21 19:58:41 -07:00
Andrew Pareles 00734ce327 update commandbar 2025-03-21 19:58:41 -07:00
Mathew Pareles 3e584d01a3 focus on chatmessage edit 2025-03-21 19:53:12 -07:00
Mathew Pareles 847b57c406 bug 2025-03-21 19:40:59 -07:00
Andrew Pareles d4e9dbb82a rm titles and add .fsPaths 2025-03-21 19:33:03 -07:00
Andrew Pareles f3451d5077 command bar state + accept/reject all 2025-03-21 19:23:06 -07:00
Mathew Pareles 159d52a716 styles 2025-03-21 19:21:13 -07:00
Mathew Pareles 29f8fa6e1d improve selections 2025-03-21 19:09:49 -07:00
Andrew Pareles 9dc7632d9b Merge pull request #279 from jcommaret/voidVersion-from-tag
⚙️ - Void version from : tag (semver) commit and date
2025-03-21 15:25:49 -07:00
Andrew Pareles e1d16b3de4 + 2025-03-21 15:23:40 -07:00
Andrew Pareles 4301eb2bb1 version 2025-03-21 15:21:23 -07:00
Andrew Pareles 4ad82cff07 format 2025-03-21 15:19:07 -07:00
Andrew Pareles 22a16974f9 keep versioning, revert mistral (will review separately) 2025-03-21 15:18:29 -07:00
Andrew Pareles cf9eca0564 copy 2025-03-21 14:47:17 -07:00
Mathew Pareles 2eafda9132 fix opacity 2025-03-21 06:44:17 -07:00
Andrew Pareles c889acadc0 interruption handling 2025-03-21 06:44:05 -07:00
Mathew Pareles b3522ad73c better styling for commandbar 2025-03-21 06:42:07 -07:00
Andrew Pareles 96867326ae prompt 2025-03-21 05:59:49 -07:00
Andrew Pareles 4946d3c2a0 copy 2025-03-21 05:56:18 -07:00
Andrew Pareles 6a6cb56d87 add visual feedback for tool that's being loaded (eg edit tool) 2025-03-21 05:50:31 -07:00
Andrew Pareles eed71d9582 minor changes 2025-03-21 04:18:25 -07:00
Andrew Pareles 90a282a1f7 minor prompt fix 2025-03-21 02:54:52 -07:00
Andrew Pareles 8511681710 fixed events and interrupts during agent mode 2025-03-21 02:54:52 -07:00
Mathew Pareles 4dff3e216a command bar decent 2025-03-21 00:22:53 -07:00
Mathew Pareles e894be803b command bar draft 2025-03-21 00:22:53 -07:00
Andrew Pareles 07e995fc2f strict:true 2025-03-20 07:24:57 -07:00
Andrew Pareles cffe053226 merge 2025-03-20 06:03:37 -07:00
Andrew Pareles dafc509fa1 always add tool_request 2025-03-20 05:56:56 -07:00
Mathew Pareles 794c4593e6 styles 2025-03-20 04:44:10 -07:00
Mathew Pareles 5d825ad970 styles better 2025-03-20 04:43:06 -07:00
Andrew Pareles cc4115c8c4 misc fixes 2025-03-20 04:19:33 -07:00
Andrew Pareles b86356d2af misc bug fixes with oai-compat and agent 2025-03-20 04:03:37 -07:00
Andrew Pareles 8dab3ac854 tool error styles 2025-03-20 02:52:44 -07:00
Andrew Pareles 1326f19a5e add openrouter claude thinking 2025-03-20 02:37:04 -07:00
Andrew Pareles 69697542ba misc fixes 2025-03-20 00:46:10 -07:00
Andrew Pareles a7728a6030 show current tool running + misc style fixes + chat interrupt stops tool too 2025-03-19 23:00:26 -07:00
Andrew Pareles 9ee14e6a71 tense 2025-03-19 23:00:26 -07:00
Mathew Pareles 2ae098ee96 improvements 2025-03-19 22:19:51 -07:00
Mathew Pareles 0dae638be7 add automatic file adding 2025-03-19 21:58:14 -07:00
Andrew Pareles dd321121e3 prompt 2025-03-19 18:55:13 -07:00
Andrew Pareles 932b4974e9 prompt 2025-03-19 18:30:42 -07:00
Andrew Pareles 20d89cd07c prompt update 2025-03-19 18:28:38 -07:00
Andrew Pareles f75dee39b3 fix 2025-03-19 17:44:53 -07:00
Andrew Pareles acd711f93b fix 2025-03-19 16:32:36 -07:00
Andrew Pareles 744d387fe1 editCodeService and voidCommandBar service!!! + VoidCommandBar.tsx 2025-03-19 16:15:09 -07:00
Mathew Pareles ec505b653b debug fastapply mutiple changes (unsolved) 2025-03-18 22:35:57 -07:00
Mathew Pareles ad471a3015 fixes 2025-03-18 21:22:13 -07:00
Andrew Pareles 86fddaa0e0 text_search 2025-03-18 04:56:59 -07:00
Andrew Pareles b9405a76cd auto-approve 2025-03-18 04:51:23 -07:00
Mathew Pareles 730758cbec small changes.. 2025-03-18 03:43:12 -07:00
Andrew Pareles b26b62998d settings page 2025-03-18 03:42:53 -07:00
Andrew Pareles 6856e23e2a just revert all SEARCH/REPLACE on error + history reorder 2025-03-18 03:35:54 -07:00
Andrew Pareles b305fc5034 keep-conflicts on apply 2025-03-18 02:41:45 -07:00
Andrew Pareles 9ab3ec3c11 add autoapply 2025-03-18 00:33:40 -07:00
Andrew Pareles 5b3471a7d7 changes + potentially fix error finding SEARCH block 2025-03-17 23:47:35 -07:00
Mathew Pareles 6bb0966eea draft 2025-03-17 22:58:32 -07:00
Andrew Pareles 5d0a4c8157 misc 2025-03-17 22:51:23 -07:00
Andrew Pareles a1c7b254d3 flex instead of observer 2025-03-17 22:38:45 -07:00
Andrew Pareles 4cf79f7a3b styles 2025-03-17 22:25:41 -07:00
Andrew Pareles b1e50798d8 apply improvements 2025-03-17 20:55:37 -07:00
Andrew Pareles a320323aa1 promise resolves when abort to free space 2025-03-17 18:39:14 -07:00
Andrew Pareles ad2e5f2616 misc 2025-03-17 16:26:33 -07:00
Andrew Pareles f64f6b54b4 styles + fixes 2025-03-17 16:18:26 -07:00
Jérôme Commaret 6d8f843b12 Merge branch 'main' into voidVersion-from-tag 2025-03-17 18:25:35 +01:00
Jérôme Commaret a96e2f9a08 Update scripts/update-version.js
let try this.

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
2025-03-17 18:20:56 +01:00
Jérôme Commaret e08e728fc8 Bump: voidVersion 2025-03-17 17:34:37 +01:00
Jérôme Commaret 18d2d9f5ee Merge branch 'dev' into voidVersion-from-tag 2025-03-17 17:33:30 +01:00
Andrew Pareles f2caa9876c isRunning: tool | message 2025-03-17 04:33:00 -07:00
Andrew Pareles 4a06d79170 type fix 2025-03-17 04:09:31 -07:00
Andrew Pareles 9a8814cc50 jump to file for edit request 2025-03-17 04:00:18 -07:00
Andrew Pareles d6327f2b03 explicit dependence on threadId in agentloop 2025-03-17 03:47:44 -07:00
Andrew Pareles 4528270937 add Void in file menu 2025-03-17 03:00:56 -07:00
Andrew Pareles 8ef693b218 comment 2025-03-17 02:47:11 -07:00
Andrew Pareles 46db2c6e95 + 2025-03-17 02:46:38 -07:00
Andrew Pareles 6b897a6f71 state simplify 2025-03-17 02:44:49 -07:00
Andrew Pareles 7aecbe25cd minor change 2025-03-17 02:39:55 -07:00
Andrew Pareles f79d438084 update styles 2025-03-17 02:19:51 -07:00
Andrew Pareles 35eb93d829 finally bg edits seem to actually work 2025-03-17 01:06:37 -07:00
Andrew Pareles 9350c0dcdf misc state fixes and fix model background (add voidModelService, delete voidFileService) 2025-03-16 23:19:22 -07:00
Mathew Pareles 39e989d3cc codespan link 2025-03-16 22:48:17 -07:00
Mathew Pareles a3cfd0d023 fix codespan links 2025-03-16 22:29:17 -07:00
Jérôme Commaret 7b3a82f1d2 Removed log 2025-03-16 21:13:57 +01:00
Jérôme Commaret 17ac9c081c Mistral FIM Method : seems to be the good one 2025-03-16 21:07:04 +01:00
Andrew Pareles 97b44a94e4 redesign how tool use loop works 2025-03-16 02:55:47 -07:00
Mathew Pareles 4a9af17736 commandbar draft (broken) 2025-03-15 21:55:14 -07:00
Mathew Pareles a33160f33e loading 2025-03-15 21:55:14 -07:00
Mathew Pareles 4bd6f4f8ac loading symbol Cmd+K 2025-03-15 21:54:48 -07:00
Mathew Pareles 71dc1ab93e change default setting for tailwind autosuggestions 2025-03-15 21:54:48 -07:00
Mathew Pareles 0ec9e4a54e codespan shorten paths 2025-03-15 21:54:48 -07:00
Mathew Pareles 4284461b06 fix height issue 2025-03-15 21:54:22 -07:00
Mathew Pareles 3f7f2fb40c commandbar draft 2025-03-15 21:54:22 -07:00
Andrew Pareles 47e93d1cf3 fix up settings 2025-03-15 17:00:21 -07:00
Andrew Pareles a99d1c99a5 agent mode must use tool models only 2025-03-15 16:23:14 -07:00
Andrew Pareles 7b76df235a reasoning component when streaming 2025-03-15 16:00:03 -07:00
Jérôme Commaret c6d246f783 main branch conflicts fixed 2025-03-15 16:07:33 +01:00
Jérôme Commaret ec8eb8bded Merge branch 'main' into dev 2025-03-15 15:02:41 +01:00
Jérôme Commaret 39fb3bc304 Merge branch 'feat_mistral-199' into dev 2025-03-15 14:01:18 +01:00
Andrew Pareles aca5deb814 desc 2025-03-15 04:24:39 -07:00
Andrew Pareles 824de11f21 setting 2025-03-15 04:21:01 -07:00
Andrew Pareles a4d93ac95a chatMode and agent mode UI 2025-03-15 04:19:30 -07:00
Andrew Pareles c1e83e458b header uri name 2025-03-15 03:42:21 -07:00
Andrew Pareles 7ea5870a11 alive ping 2025-03-15 03:38:36 -07:00
Andrew Pareles cf6cef8e0e massively improve styles 2025-03-15 03:24:48 -07:00
Andrew Pareles bf2843b1bd edit state and apply state should work, edit UI 2025-03-15 02:59:32 -07:00
Andrew Pareles 8a6b75b6bb style updates progress 2025-03-15 01:17:13 -07:00
Andrew Pareles e7e5e5ebf8 Merge pull request #320 from ZorinFoss/main
Enhance appimage creation
2025-03-14 19:46:01 -07:00
Jérôme Commaret 00e57dd1bf Merge pull request #3 from jcommaret/feat_mistral-199
Feat mistral 199
2025-03-14 23:23:15 +01:00
Jérôme Commaret 744841b092 Merge branch 'main' into feat_mistral-199 2025-03-14 23:22:37 +01:00
Jérôme Commaret 136840cca4 😻 : Miaou ! 2025-03-14 11:54:43 +01:00
Andrew Pareles dbdd40bd3d add better settings 2025-03-14 02:23:58 -07:00
Andrew Pareles 8f3a752562 sync fast apply to chat 2025-03-14 00:41:17 -07:00
Andrew Pareles fa43a9f937 language detection 2025-03-14 00:20:03 -07:00
Andrew Pareles c222a801a8 fix CtrlK model selection 2025-03-13 21:29:45 -07:00
Andrew Pareles def78affb4 ensureModelExists (forceModel) and fix quick edit state 2025-03-13 21:05:44 -07:00
Andrew Pareles edefe841d5 changes in the BG work!! + autosave 2025-03-13 16:54:31 -07:00
Jérôme Commaret 27b782ff32 HOURRA ! 2025-03-13 18:24:05 +01:00
Jérôme Commaret 654b577ce6 Looks really hacky, but working ! YES ! 2025-03-13 18:23:05 +01:00
Jérôme Commaret 8dcc3bf187 fix to do to types of Mistral connexion 2025-03-13 04:04:51 +01:00
Mathew Pareles cd512402d9 collab 2025-03-12 14:34:58 -07:00
Jérôme Commaret bc6f68e105 Hope it works 2025-03-12 18:52:54 +01:00
Jérôme Commaret b7f764799c stuff changed there also 2025-03-12 15:34:35 +01:00
Jérôme Commaret 6e39b225b2 - FIM is seems ok but disabled (have to find where to change it)
- Send Mistral chat to fix [error 422]
2025-03-12 15:34:02 +01:00
Andrew Pareles 744f0ed852 style 2025-03-12 05:33:38 -07:00
Andrew Pareles 1b6d81f4e0 approve tool works even if closed void and reopened 2025-03-12 05:16:42 -07:00
Mathew Pareles bb370b390c logic 2025-03-12 05:06:16 -07:00
Mathew Pareles 378ef493b5 fix gratuitous error 2025-03-12 04:35:12 -07:00
Mathew Pareles a70f606362 fix faulty changes 2025-03-12 03:41:08 -07:00
Andrew Pareles f66fbcd911 agentLoop improvements 2025-03-12 03:19:24 -07:00
Mathew Pareles 1c2e8c0c59 minh 2025-03-12 03:09:00 -07:00
Mathew Pareles 09ba9387bc fix refactor 2025-03-12 02:54:36 -07:00
Andrew Pareles b97c5089ce update approve/reject state 2025-03-12 02:26:55 -07:00
Andrew Pareles 7563f595f3 misc 2025-03-12 02:06:30 -07:00
Andrew Pareles 79ef6b5773 fix stream state 2025-03-12 02:02:25 -07:00
Andrew Pareles 11d376325e tool UI progress + terminal fix + misc fixes 2025-03-12 01:24:21 -07:00
Andrew Pareles 1ef8011bb0 tool UI step 1 (BROKEN) 2025-03-12 00:51:17 -07:00
Mathew Pareles fa1f407b76 fix naming for tool response 2025-03-12 00:37:30 -07:00
Mathew Pareles 094e05070a size 2025-03-12 00:20:21 -07:00
Mathew Pareles 6d5d4c34d7 size 2025-03-12 00:11:14 -07:00
Mathew Pareles 967f7dc85e make apply actually work 2025-03-12 00:06:28 -07:00
Jérôme Commaret d541d8fbb6 Merge branch 'voideditor:main' into main 2025-03-12 01:45:00 +01:00
Jérôme Commaret 89ac7738e4 sendLLMMessageToProviverImplementation : Mistral SendChat 2025-03-11 16:21:49 +01:00
Jérôme Commaret 7aca03de5c ADD : defaultModelsOfProvider : mistral - codestral-latest 2025-03-11 16:19:34 +01:00
Jérôme Commaret 4e9dc5ce4a defaultProviderSettings : mistral option 2025-03-11 16:12:14 +01:00
Andrew Pareles d6d5f77183 terminal progress + misc 2025-03-11 06:53:54 -07:00
Zorin FOSS 62b3a7d7be Add files via upload 2025-03-11 06:25:39 +02:00
Zorin FOSS 437244540a Enhance appimage script 2025-03-11 06:25:04 +02:00
Zorin FOSS 05d102f354 Enhance void.desktop 2025-03-11 05:27:42 +02:00
Andrew Pareles e4b0061f66 Merge remote-tracking branch 'origin/model-selection' 2025-03-10 19:14:29 -07:00
Jérôme Commaret e70e5d4208 Merge branch 'voideditor:main' into main 2025-03-11 00:36:08 +01:00
Andrew Pareles ccd0db635b Merge pull request #319 from voideditor/model-selection
Terminal Service Progress + Fix Import Issue
2025-03-10 15:38:39 -07:00
Andrew Pareles ab81479340 terminalService 2025-03-10 15:36:00 -07:00
Andrew Pareles 65be47d970 ancilary terminal tool 2025-03-10 15:36:00 -07:00
Mathew Pareles 217a33cc2e tool call improvements (error message + better ux) 2025-03-10 00:39:50 -07:00
Andrew Pareles 6a55abcd81 split into common/ and browser/ so terminal works 2025-03-09 18:09:35 -07:00
Jérôme Commaret 330092d023 mistral npm updated 2025-03-09 21:55:20 +01:00
Jérôme Commaret 7b665d05cf Merge pull request #1 from jcommaret/fix-pb
Fix pb
2025-03-09 05:35:38 +01:00
Jérôme Commaret 352496fc3a Merge branch 'main' into fix-pb 2025-03-09 05:35:16 +01:00
Jérôme Commaret eda11f29d9 FIM : I think it works as expected 2025-03-09 03:30:23 +01:00
Mathew Pareles 2300559081 links to code 2025-03-08 03:09:50 -08:00
Mathew Pareles 4a9c0c864f links draft 1 2025-03-08 03:09:50 -08:00
Andrew Pareles 4212e50ac5 Merge pull request #312 from voideditor/model-selection
Tool use improvements + Clear settings
2025-03-08 02:51:25 -08:00
Andrew Pareles 009dfbef37 improve prompt 2025-03-08 02:24:39 -08:00
Andrew Pareles 75ef9d5528 rm id and add tool_use_id 2025-03-07 23:59:58 -08:00
Jérôme Commaret ec4c52aff9 remove package 2025-03-08 08:23:40 +01:00
Jérôme Commaret bccc6a64ef Mistral FIM maybe 2025-03-08 08:23:20 +01:00
Andrew Pareles 93c0bb1d04 rename 2025-03-07 23:03:11 -08:00
Andrew Pareles 4061e6382a rm console.logs 2025-03-07 22:58:17 -08:00
Andrew Pareles b5dbd42eed make it so model does not change during agent mode even if user switches 2025-03-07 22:55:06 -08:00
Andrew Pareles c42a782bde rm void- 2025-03-07 20:56:03 -08:00
Andrew Pareles 6be0b74047 update 2025-03-07 20:55:42 -08:00
Andrew Pareles 0fb9222f3a switch 2025-03-07 20:54:55 -08:00
Andrew Pareles db7ec0272a don't display empty assistant messages (these are only used for LLMMessage) 2025-03-07 20:48:57 -08:00
Andrew Pareles 7558d4dc1c anthropic reasoning works with tools 2025-03-07 20:28:23 -08:00
Andrew Pareles f89b036d17 fix empty message order 2025-03-07 19:37:39 -08:00
Andrew Pareles 2b7df8c604 remove rawAnthropicContent 2025-03-07 19:37:33 -08:00
Jérôme Commaret ac2fb9e36d Mistral : Added, not fim 2025-03-07 14:30:33 +01:00
Andrew Pareles 5ad5fe7014 clickable tool requests 2025-03-07 03:14:20 -08:00
Andrew Pareles 5eb2bcfef6 Merge pull request #310 from voideditor/model-selection
Tool use progress + UI
2025-03-07 03:08:22 -08:00
Andrew Pareles cd532435c2 tool use is getting close! minor fixes + UI 2025-03-07 03:07:06 -08:00
Andrew Pareles 6e2a803628 tool use UI 2025-03-07 02:20:03 -08:00
Andrew Pareles 1e5e3d7f01 update prompt 2025-03-07 01:18:03 -08:00
Andrew Pareles ae15fd1f38 thinking slider backend support, QwQ 2025-03-07 00:28:54 -08:00
Andrew Pareles bc1a9d692e qwq + groq reasoning 2025-03-06 19:24:14 -08:00
Andrew Pareles dce3f392ce force placeholder color 2025-03-06 18:52:30 -08:00
Andrew Pareles 6d3de34818 style 2025-03-06 04:38:17 -08:00
Andrew Pareles f292fa8df6 xxs 2025-03-06 03:43:11 -08:00
Andrew Pareles 82ffd4e8f4 slider styles 2025-03-06 03:34:57 -08:00
Andrew Pareles 6b5792aaf7 thinking slider UI 2025-03-06 02:51:48 -08:00
Andrew Pareles e1a1ca6275 w-full 2025-03-06 02:06:03 -08:00
Andrew Pareles d2e096957e add reasoning slider (still need to hook it up) 2025-03-06 02:01:08 -08:00
Andrew Pareles 3bb9d5b3a5 xAI -> Grok 2025-03-06 02:00:52 -08:00
Andrew Pareles 1be8d17899 add autocomplete UI and filtering 2025-03-06 02:00:52 -08:00
Andrew Pareles 46e8fb1ea5 anthropic thinking output 2025-03-06 02:00:25 -08:00
Andrew Pareles 02d8527244 updated settings for 3.7 2025-03-06 02:00:25 -08:00
Andrew Pareles aeb3f4f97c split model capabilities 2025-03-06 02:00:25 -08:00
Andrew Pareles 46a8e147d0 contrib 2025-03-06 02:00:25 -08:00
Andrew Pareles a5b68448b5 agent 2025-03-06 02:00:25 -08:00
Andrew Pareles c0ea6cc4d8 update contrib 2025-03-06 02:00:24 -08:00
Mathew Pareles 1086b6272a minor change 2025-03-06 00:19:29 -08:00
Mathew Pareles cc6a231b3c fix markdown stylings with prose 2025-03-06 00:09:58 -08:00
Mathew Pareles ead1d9229f fix markdown spacing draft 2025-03-06 00:08:26 -08:00
Mathew Pareles 1b77fc7091 prepare large refactor 2025-03-06 00:07:55 -08:00
Mathew Pareles ee6d5e47ec dropdown + styles 2025-03-06 00:06:14 -08:00
Mathew Pareles a6c9b5f089 edit message bug fixes 2025-03-06 00:06:05 -08:00
Andrew Pareles c9984ce011 Merge pull request #308 from jcommaret/fix-node-version-in-contribution
[Update]node version  in CONTRIBUTING.md
2025-03-05 19:26:57 -08:00
Jérôme Commaret 4eaffd90d1 Update node version in CONTRIBUTING.md 2025-03-06 04:14:02 +01:00
Andrew Pareles 027c0ee6bd the retry loop works! 2025-03-04 05:20:23 -08:00
Andrew Pareles 4ba7352374 fix substr logic + nuanced FINAL_ logic 2025-03-04 03:33:44 -08:00
Andrew Pareles 866547df79 fix extractCodeFromResult Search/Replace 2025-03-04 02:24:25 -08:00
Andrew Pareles 7f278aafcb fix SEARCH/REPLACE detection 2025-03-04 01:18:10 -08:00
Andrew Pareles 5c5a44e4ac stop omitting system message 2025-03-03 23:54:57 -08:00
Andrew Pareles 83f9ff54ab update 2025-03-03 23:35:36 -08:00
Andrew Pareles 1259e71589 update prompt and add accept/reject ui 2025-03-03 23:01:24 -08:00
Andrew Pareles c9cc6cc6a1 properly deal with VSCode chat 2025-03-03 22:46:40 -08:00
Andrew Pareles dc65016ecb clarity 2025-03-03 22:11:21 -08:00
Andrew Pareles 9aae56682e sweep to fix lint 2025-03-03 21:59:47 -08:00
Andrew Pareles 176d302258 lint 2025-03-03 21:53:57 -08:00
Andrew Pareles e23fee5191 fix untraceable import error that breaks everything 2025-03-03 21:53:14 -08:00
Andrew Pareles 4f34af61f3 Merge remote-tracking branch 'origin/fix-css' into model-selection 2025-03-03 21:17:19 -08:00
Andrew Pareles 7311f3eaf7 + 2025-03-03 20:55:04 -08:00
Andrew Pareles 1257e54ebe tools are getting close 2025-03-03 20:13:26 -08:00
Andrew Pareles fcbad101a4 tool use progress (partial) 2025-03-02 20:31:02 -08:00
Andrew Pareles d2b5531a33 Update VOID_USEFUL_LINKS.md 2025-03-02 19:46:39 -08:00
Andrew Pareles 993c171e06 Merge pull request #304 from voideditor/model-selection
Fix tailwind
2025-03-01 19:23:32 -08:00
Andrew Pareles b6ea05948f fix tw 2025-03-01 19:22:40 -08:00
Andrew Pareles 495dc45c10 downgrade tailwind (v3) 2025-03-01 19:21:33 -08:00
Andrew Pareles e4cf30ef07 fix tailwind version issue 2025-03-01 19:18:51 -08:00
Andrew Pareles 5655280d45 Merge remote-tracking branch 'origin/main' into model-selection 2025-03-01 19:06:40 -08:00
Andrew Pareles c793db8aeb rename 2025-03-01 19:06:30 -08:00
Andrew Pareles f711c68798 Merge pull request #289 from bawsdeep/main
Needed rework of my script to generate the Appimage
2025-03-01 18:50:14 -08:00
Andrew Pareles dbc14a0713 Merge pull request #303 from voideditor/model-selection
Add reasoning parsing, marketplace URL, chat selection state, misc UI
2025-03-01 18:35:58 -08:00
Andrew Pareles 417259123b Merge remote-tracking branch 'origin/main' into model-selection 2025-03-01 18:34:23 -08:00
Andrew Pareles b82d668437 Merge pull request #301 from voideditor/merge-vscode-2
Rebase vscode  onto void (microsoft/vscode 0480008e3221e6743799332fc0018a98e8e90457 -> voideditor/void 1e09852b3c)
2025-03-01 17:50:18 -08:00
Mathew Pareles 93d40be1ac Merge remote-tracking branch 'origin/main' into model-selection 2025-03-01 17:43:18 -08:00
Mathew Pareles cfc39b83bb styles 2025-03-01 17:42:17 -08:00
Mathew Pareles 9c76a35837 outline 2025-03-01 17:42:17 -08:00
Mathew Pareles 4a00bd3e00 Cmd+L selections open better ux 2025-03-01 17:42:17 -08:00
Mathew Pareles 6d6e2fa974 fix annoying refactor 2025-03-01 17:42:17 -08:00
Mathew Pareles 971ce88df2 style 2025-03-01 17:40:29 -08:00
Andrew Pareles abfd426d3f Lint, window.setInterval, + remove ignored files from git tracking 2025-03-01 17:27:24 -08:00
Andrew Pareles a2b2fd6ad5 gitignore 2025-03-01 01:24:06 -08:00
Andrew Pareles 76a6a36d29 fix 2025-03-01 01:23:35 -08:00
Andrew Pareles 1e09852b3c rebase 2025-03-01 00:02:18 -08:00
Andrew Pareles 3b901ad60f init 2025-02-28 18:01:53 -08:00
Andrew Pareles 7e34037ffe Merge pull request #288 from eswaldots/main
Fix encryption service not working on Linux
2025-02-28 14:11:52 -08:00
Andrew Pareles aa835d468b misc 2025-02-27 20:13:50 -08:00
Mathew Pareles 661eba3ae9 fix selection state bug 2025-02-27 17:08:49 -08:00
Mathew Pareles de17b3add1 styles 2025-02-27 16:27:34 -08:00
Mathew Pareles 6fa3901ab0 small style 2025-02-27 16:22:13 -08:00
Andrew Pareles d14a2f1fff marketplace URL 2025-02-26 02:22:58 -08:00
Andrew Pareles c1f3b92c51 fix manual reasoning parsing 2025-02-26 02:14:00 -08:00
Andrew Pareles 0de63a088d reasoning UI! 2025-02-26 02:01:04 -08:00
Andrew Pareles 0de1c20551 progress 2025-02-26 02:01:03 -08:00
Mathew Pareles a769eb4db0 Merge branch 'recovered-branch' into model-selection 2025-02-25 19:09:28 -08:00
Mathew Pareles 3e7e54b88f Merge branch 'model-selection' into HEAD 2025-02-25 18:48:38 -08:00
Mathew Pareles 1b43799371 prepare merg 2025-02-25 18:48:17 -08:00
Andrew Pareles 8438f80834 updates 2025-02-25 15:23:34 -08:00
Andrew Pareles 63b15af385 add claude 3.7 init 2025-02-25 15:23:34 -08:00
Andrew Pareles 57c9184f4e Update CONTRIBUTING.md 2025-02-24 18:53:42 -08:00
Andrew Pareles 0b6dd721e9 Update CONTRIBUTING.md 2025-02-24 18:53:18 -08:00
Andrew Pareles 88ac766f53 Update CONTRIBUTING.md 2025-02-24 18:51:56 -08:00
Andrew Pareles 58466afe72 Merge pull request #287 from jhacksman/devin/1739626558-fix-think-tag-apply
Fix Apply failure with <think> tags (#283)
2025-02-24 14:58:10 -08:00
Andrew Pareles 04efe1d235 added extractReasoningFromText in extractCodeFromResult instead 2025-02-24 14:57:50 -08:00
Andrew Pareles aa9a102b71 Merge remote-tracking branch 'origin/main' into pr/jhacksman/287 2025-02-24 14:55:01 -08:00
Andrew Pareles dc0f9bdada Merge pull request #282 from bjoaquinc/remote-ssh-extension
Added remote-ssh extension to /extensions
2025-02-24 14:52:40 -08:00
Andrew Pareles 75f30bf7cd Merge pull request #294 from voideditor/model-selection
Provider Settings + UX improvements
2025-02-24 06:24:08 -08:00
Andrew Pareles 4a43b628d4 improvements 2025-02-24 06:23:24 -08:00
Mathew Pareles 38370c751e + 2025-02-24 05:59:56 -08:00
Mathew Pareles 764b1a2ccf improve input box 2025-02-24 05:47:58 -08:00
Andrew Pareles 5c047b78f3 style+FIM prompt 2025-02-24 05:33:45 -08:00
Andrew Pareles 5cbd0a19a4 minor fixes 2025-02-24 04:38:08 -08:00
Andrew Pareles d2fb0fb4ff maxTokens for anthropic 2025-02-24 04:32:53 -08:00
Mathew Pareles 1dffbfb061 style 2025-02-24 04:09:09 -08:00
Andrew Pareles 3ae8f75641 remove mistral, finish(?) models! 2025-02-24 04:01:00 -08:00
Mathew Pareles df6de2d7fc styles for tool use 2025-02-24 03:51:59 -08:00
Mathew Pareles 4ebfa91a83 fix URI staleness bug in local storage 2025-02-24 00:46:03 -08:00
Andrew Pareles 9f20476eea provider support progress
Co-authored-by: Mathew Pareles <mathewpareles@users.noreply.github.com>
2025-02-23 21:37:34 -08:00
Andrew Pareles fd5e523434 models 2025-02-23 16:58:43 -08:00
Andrew Pareles 2c2714273e partway through adding better support for more providers 2025-02-23 01:28:51 -08:00
Mathew Pareles c650091418 style 2025-02-22 21:11:58 -08:00
Mathew Pareles d96a9d5f6b fix typeerror 2025-02-22 21:11:58 -08:00
Mathew Pareles a9b3cc146b refactor 2025-02-22 21:11:58 -08:00
Mathew Pareles bdb897d032 tool UI draft 2025-02-22 21:11:58 -08:00
Andrew Pareles 2a876d8efe + 2025-02-22 21:08:34 -08:00
Andrew Pareles bf4392a52f safe 2025-02-22 17:53:14 -08:00
Andrew Pareles dd24c3180d + 2025-02-22 17:52:58 -08:00
Andrew Pareles f40acd76f1 endpoint 2025-02-22 17:52:28 -08:00
Andrew Pareles 96de4f028f remove unnecessary check 2025-02-22 04:35:56 -08:00
Andrew Pareles 2ecce822f3 fix react - tedious 2025-02-22 04:30:17 -08:00
Andrew Pareles ea10765abd remove applybox stuff from editCode 2025-02-22 03:41:16 -08:00
Andrew Pareles 16f6181395 + 2025-02-22 03:23:44 -08:00
Andrew Pareles 19ebf4a1a2 seems to work! some annoying react state stuff.. 2025-02-22 03:03:05 -08:00
Andrew Pareles 63b71dec24 should work, just need to debug 2025-02-22 00:40:46 -08:00
Andrew Pareles 1079893527 add codeBoxId, but now will change to uri 2025-02-21 23:31:06 -08:00
Andrew Pareles 64ac6d4a12 ctrlK 2025-02-21 21:09:03 -08:00
Andrew Pareles 9005de65a6 quick edit stream state? 2025-02-21 20:53:09 -08:00
Andrew Pareles 86dfc5521d more progress (still broken) + fix weird _useThread() + rm initStreamingDiffZoneId 2025-02-21 20:10:02 -08:00
Andrew Pareles b005b1e95a progress (BROKEN) 2025-02-21 18:53:55 -08:00
Andrew Pareles ce14986d2f split apply buttons 2025-02-21 16:19:01 -08:00
Andrew Pareles 06ce9e1017 settings styles + password field 2025-02-21 15:06:42 -08:00
Andrew Pareles 09f5d3e14b nitpick style 2025-02-21 00:19:58 -08:00
Andrew Pareles 73c3a8133a massively simplified, seems to work! 2025-02-20 23:59:16 -08:00
Andrew Pareles 8918a14404 almost there 2025-02-20 23:23:58 -08:00
Andrew Pareles 1959c53d75 progress 2025-02-20 23:23:55 -08:00
Andrew Pareles 33d80bed80 progress 2025-02-20 17:25:53 -08:00
Andrew Pareles 970f0bdb9d revert "Void's" on the button 2025-02-20 01:28:46 -08:00
Andrew Pareles 7711c74ef0 reorder 2025-02-20 01:21:56 -08:00
Andrew Pareles e14aab632d multiple find/replace blocks almost work. only 1 diffarea per find/replace application 2025-02-20 01:21:28 -08:00
Andrew Pareles 62c2622ced Void's settings 2025-02-19 17:57:40 -08:00
Andrew Pareles 0f26ee2288 misc fixes 2025-02-19 00:47:03 -08:00
Andrew Pareles 6a44d668db + 2025-02-19 00:16:25 -08:00
Mathew Pareles 858b6f6a91 file service read 2025-02-19 00:12:51 -08:00
Andrew Pareles 7206209743 Merge pull request #290 from voideditor/model-selection
Tool use progress
2025-02-19 00:03:01 -08:00
Andrew Pareles 02f64b7ff6 finish tool pagination 2025-02-18 22:28:04 -08:00
Andrew Pareles ac1788ae9a tool pages work, improve prompt 2025-02-18 21:25:23 -08:00
Andrew Pareles 5699cf19f4 merge updates 2025-02-18 16:12:16 -08:00
Andrew Pareles 9ab9196b38 Merge remote-tracking branch 'origin/edit-chats' into model-selection 2025-02-18 16:12:11 -08:00
Mathew Pareles baa89cc17d dummy marker service 2025-02-18 14:14:38 -08:00
Andrew Pareles 667769c987 tool update; multiple SEARCH/REPLACE blocks 2025-02-17 23:57:59 -08:00
Mathew Pareles d3aa0bc3cc fix readfile 2025-02-17 17:56:20 -08:00
Andrew Pareles d3547134e7 get ready to add searchReplaceService 2025-02-17 15:22:24 -08:00
Mathew Pareles b92420012c minor 2025-02-17 15:18:11 -08:00
Andrew Pareles 0fd10f404e tool results in ChatMessage 2025-02-17 14:12:52 -08:00
bawsdeep 08581776ae forgot some files in the final clean up 2025-02-17 14:01:13 +01:00
bawsdeep af6f9fc570 some last changes 2025-02-17 13:28:38 +01:00
bawsdeep ecdef730d5 ai thought were building any application for VOID LINUX 2025-02-17 11:32:01 +01:00
bawsdeep 0f4120c1a0 edit readme 2025-02-17 11:28:44 +01:00
bawsdeep c8db4529b2 new script to create appimage 2025-02-17 11:24:07 +01:00
Andrew Pareles 137e0068a3 add vllm 2025-02-17 01:50:28 -08:00
Andrew Pareles 366dbf0b52 add xAI and update system/tool information and system prompt 2025-02-17 01:06:21 -08:00
Mathew Pareles 89d08071fc scrollbar fix 2025-02-17 00:23:48 -08:00
Andrew Pareles 8a8ed1ac56 + 2025-02-17 00:20:01 -08:00
Andrew Pareles 491312218f + 2025-02-17 00:19:39 -08:00
Andrew Pareles b74b031906 + 2025-02-17 00:18:55 -08:00
Andrew Pareles 5608aca168 process 2025-02-17 00:17:14 -08:00
Andrew Pareles fecfbd924a error 2025-02-17 00:07:33 -08:00
Andrew Pareles a78a6169f8 tools + misc fixes 2025-02-17 00:07:11 -08:00
Andrew Pareles 628adedaec toolcalls 2025-02-16 20:51:42 -08:00
Andrew Pareles 432a1766af anthropic tool use fix 2025-02-16 20:50:07 -08:00
Mathew Pareles 74f8303803 discard star changes 2025-02-16 20:11:13 -08:00
Andrew Pareles 2bc3d67e39 minor tool use fix 2025-02-16 19:51:58 -08:00
Mathew Pareles 41fe5c50e2 fix scrollbars 2025-02-16 19:46:41 -08:00
Mathew Pareles 36b1b56690 bug 2025-02-16 19:46:41 -08:00
Mathew Pareles 249eee341d better context and file reading 2025-02-16 19:46:40 -08:00
Joaquin Coromina 2c61310077 Merge branch 'voideditor:main' into remote-ssh-extension 2025-02-16 23:32:00 +07:00
Joaquin Coromina a519100852 Added open-remote-ssh to npm install dirs and the output files in eslint ignore 2025-02-16 23:31:21 +07:00
eswaldots a38fc81a58 Fix encryption service dont working on Linux 2025-02-16 15:34:53 +00:00
Andrew Pareles af41d6a439 tool improvements 2025-02-16 03:23:37 -08:00
Andrew Pareles 7244d433dd tools should work! 2025-02-16 02:53:56 -08:00
Andrew Pareles 131493b5e1 tool structure 2025-02-16 00:43:46 -08:00
Devin AI 4c5e444bcb Improve token streaming support with character-by-character matching
Co-Authored-By: Jack Hacksman <slack@hannis.io>
2025-02-16 05:14:40 +00:00
Devin AI 2f55580e67 Improve token streaming support with character-by-character matching
Co-Authored-By: Jack Hacksman <slack@hannis.io>
2025-02-16 05:06:37 +00:00
Devin AI b24cd1ecb7 Improve token streaming support for think tags
Co-Authored-By: Jack Hacksman <slack@hannis.io>
2025-02-16 05:01:57 +00:00
Devin AI a519bd7690 Add streaming support for think tags and test cases
Co-Authored-By: Jack Hacksman <slack@hannis.io>
2025-02-16 04:59:55 +00:00
Andrew Pareles 8591d06244 tool use plugboard progress 2025-02-15 19:23:15 -08:00
Andrew Pareles a26816d597 Update src/vs/workbench/contrib/chat/common/chatModel.ts
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
2025-02-15 15:46:39 -08:00
Andrew Pareles ea6e025511 Merge pull request #284 from adrieljss/main
fix ENOENT error spawn on Windows
2025-02-15 15:37:39 -08:00
Devin AI 7849b0a107 Fix Apply failure with <think> tags (#283)
- Add utility to strip <think> tags from responses
- Strip tags before computing diffs in Apply operation
- Handle nested tags properly
- Keep original response intact for UI display

Fixes #283

Co-Authored-By: Jack Hacksman <slack@hannis.io>
2025-02-15 13:35:58 +00:00
Andrew Pareles 152e605856 tool progress! 2025-02-15 02:05:37 -08:00
Andrew Pareles bc6150aeac tools 2025-02-15 00:02:17 -08:00
Andrew Pareles 05d8b3a982 handle updates with version number instead of weird check 2025-02-15 00:01:37 -08:00
Andrew Pareles d91ec9da2e inlineDiffsService -> editCodeService 2025-02-14 21:43:38 -08:00
Mathew Pareles 198a948f6c star button commit 2025-02-14 21:30:20 -08:00
adrieljss 1839acab1f fix ENOENT error spawn on Windows 2025-02-14 17:59:56 +08:00
Andrew Pareles 6ad48ffa20 recognizedModels 2025-02-14 01:59:17 -08:00
Andrew Pareles 0975f1bf5f add developer info for models 2025-02-14 01:52:17 -08:00
Andrew Pareles 9cfcf396c1 update types for tool support 2025-02-14 01:05:10 -08:00
Andrew Pareles 0bcd88dad6 fix 2025-02-13 23:54:22 -08:00
Andrew Pareles 343ee5eb94 Apply name 2025-02-13 23:00:01 -08:00
Mathew Pareles d9e4679b65 breaking changes - ai regex 2025-02-13 22:58:42 -08:00
Joaquin Coromina 4950de2cb5 Merge branch 'voideditor:main' into remote-ssh-extension 2025-02-14 10:06:42 +07:00
Joaquin Coromina 28bf838b55 Updated void-server endpoiont to make it dynamic 2025-02-14 10:05:30 +07:00
Andrew Pareles b01684393a streaming works! 2025-02-13 00:37:43 -08:00
Andrew Pareles 34b8027fb9 streaming progress 2025-02-13 00:08:23 -08:00
Andrew Pareles f7af9c336b tokenIdx 2025-02-12 21:58:57 -08:00
Andrew Pareles a479a32ad5 small fix 2025-02-12 21:55:58 -08:00
Andrew Pareles 7cdb003c47 stream state 2025-02-12 21:51:58 -08:00
Andrew Pareles 4f9f16b93f almost works (but doesn't delete old text) 2025-02-12 21:27:39 -08:00
Mathew Pareles 7dcb08b09a comment out unwanted code 2025-02-12 20:50:04 -08:00
Andrew Pareles 7fbe8d905f Merge pull request #281 from voideditor/model-selection
Latest streaming changes
2025-02-12 18:51:55 -08:00
Jérôme Commaret c3c760c03b Merge branch 'voideditor:main' into voidVersion-from-tag 2025-02-12 21:22:07 +01:00
Joaquin Coromina 79fb8f63a7 Added Open Remote-SSH extension to Void 2025-02-13 01:33:43 +07:00
Andrew Pareles 0dfa81f637 Search and replace? 2025-02-12 01:43:50 -08:00
Andrew Pareles d504daffa5 searchRepalce 2025-02-12 00:34:24 -08:00
Andrew Pareles fc97949887 autocomplete 2025-02-11 22:02:46 -08:00
Andrew Pareles 0346e90ca7 add parsing of <<< ORIGINAL, ===, FINAL >>> 2025-02-11 21:38:56 -08:00
Mathew Pareles efeb85b48b Merge remote-tracking branch 'origin/model-selection' into edit-chats 2025-02-11 18:44:20 -08:00
Mathew Pareles d698e6f3c1 prepare fast apply 2025-02-11 18:42:40 -08:00
Andrew Pareles 2161d740df minor change 2025-02-11 16:44:40 -08:00
Andrew Pareles a3e6deb1a8 Merge pull request #278 from bjoaquinc/build-void-server
fix(build): fixes void-reh (remote host) build crashes and updates the remote-host output path to say void rather than vscode
2025-02-11 16:43:41 -08:00
Jérôme Commaret 12c686c102 Bump: voidVersion 2025-02-11 14:43:30 +01:00
Jérôme Commaret 7bceceef85 Bump: voidVersion 2025-02-11 14:21:02 +01:00
Jérôme Commaret ba15b31661 fix 2025-02-11 14:19:38 +01:00
Jérôme Commaret 3b09174587 bad hash and date, will be updated 2025-02-11 14:19:16 +01:00
Jérôme Commaret 7482e2aa82 version : tag, commit, and date from iProductConfiguration 2025-02-11 13:00:23 +01:00
Jérôme Commaret e3c826b253 Bump: voidVersion 2025-02-11 12:56:53 +01:00
Jérôme Commaret db69464ddc Bump: voidVersion 2025-02-11 12:08:53 +01:00
Jérôme Commaret 014c87bc3e Fetch and display : voidVersion into dialog handler 2025-02-11 12:08:03 +01:00
Jérôme Commaret ba606d229a Added voidVersion to IProductConfiguration 2025-02-11 12:07:06 +01:00
Jérôme Commaret fbb4faacbc added voidVersion to product.json 2025-02-11 12:06:24 +01:00
Jérôme Commaret 9b7fd09278 removed voidVersion from package.json 2025-02-11 12:05:47 +01:00
Jérôme Commaret b90973b195 Bump: voidVersion 2025-02-11 11:36:49 +01:00
Andrew Pareles 96b5b72d30 triple tick 2025-02-10 20:22:31 -08:00
Andrew Pareles e2e8279fce add back imports 2025-02-10 20:18:45 -08:00
Andrew Pareles 5ed1f465a2 MOVE VOID FILES TO WORKBENCH 2025-02-10 18:59:26 -08:00
Andrew Pareles 995357710e misc 2025-02-10 18:33:51 -08:00
Andrew Pareles a98106072c Merge remote-tracking branch 'origin/edit-chats' into model-selection 2025-02-10 15:35:37 -08:00
Andrew Pareles c1be466467 tool tests 2025-02-10 15:34:07 -08:00
Joaquin Coromina 6f6f43c46e Fixed compilation for void-reh bug by updating package.json in remote and changed destination folder to say void 2025-02-10 19:54:50 +07:00
Andrew Pareles 9cbe83b57c comment 2025-02-09 00:46:39 -08:00
Andrew Pareles e46b295449 names 2025-02-09 00:45:06 -08:00
Andrew Pareles 3fd3634257 void message 2025-02-09 00:36:03 -08:00
Andrew Pareles 231990088a uri 2025-02-09 00:28:44 -08:00
Andrew Pareles 20da82762e rm comment 2025-02-09 00:27:36 -08:00
Andrew Pareles 0d9be68aff rm comment 2025-02-09 00:27:21 -08:00
Andrew Pareles 165b5a4fd2 + 2025-02-09 00:26:58 -08:00
Andrew Pareles 812014d6d3 all tools seem to work! 2025-02-09 00:26:42 -08:00
Andrew Pareles d3e73b92e0 + 2025-02-08 22:56:55 -08:00
Andrew Pareles 00da05f24f context tools 2025-02-08 22:53:13 -08:00
Mathew Pareles e4694256eb Merge remote-tracking branch 'origin/model-selection' into edit-chats 2025-02-08 21:47:27 -08:00
Andrew Pareles 18b278577d tools 2025-02-08 21:17:38 -08:00
Mathew Pareles a252bb7a30 prepare merge 2025-02-08 17:26:28 -08:00
Mathew Pareles c240360710 edit update locally (need to test) 2025-02-08 17:14:16 -08:00
Mathew Pareles 893308c38e edits work 2025-02-07 02:06:04 -08:00
Mathew Pareles 48defe849d edit backend 2025-02-06 22:34:39 -08:00
Andrew Pareles 3c03f58488 clarify API 2025-02-06 22:16:42 -08:00
Mathew Pareles 2470e0de7f refactor 2025-02-06 19:01:15 -08:00
Mathew Pareles 387fd64db0 edit ability 2025-02-06 03:18:48 -08:00
Andrew Pareles 4ffd269db5 + 2025-02-06 03:11:26 -08:00
Andrew Pareles 5ce25e20c3 css for <html> md tags 2025-02-06 03:10:07 -08:00
Andrew Pareles 63efa219f5 div 2025-02-06 03:04:48 -08:00
Andrew Pareles 826d148305 html 2025-02-06 03:03:14 -08:00
Andrew Pareles 323d80ef55 add divs for html 2025-02-06 03:02:46 -08:00
Andrew Pareles 5fa21be9d2 Merge pull request #273 from voideditor/model-selection
UI improvements
2025-02-06 02:05:18 -08:00
Andrew Pareles 902588638d Merge remote-tracking branch 'origin/main' into model-selection 2025-02-06 02:04:48 -08:00
Andrew Pareles a1ab094652 + 2025-02-06 02:01:24 -08:00
Andrew Pareles 902b460b9c + 2025-02-06 02:00:33 -08:00
Andrew Pareles 073205ace3 warningbox and misc 2025-02-06 01:59:26 -08:00
Andrew Pareles 98c1d81875 focus() fix 2025-02-06 01:55:36 -08:00
Andrew Pareles 2f49650e15 model and provider error handling 2025-02-06 01:32:48 -08:00
Mathew Pareles 1be9300dc4 typeo 2025-02-05 18:19:04 -08:00
Andrew Pareles d9b77b67b2 prefix 2025-02-05 01:50:29 -08:00
Andrew Pareles 2f674f5323 update openai models 2025-02-05 01:10:40 -08:00
Andrew Pareles c8fa39e552 openai fim progress 2025-02-05 00:57:03 -08:00
Andrew Pareles 3b73e3ab26 metrics for sendFIM 2025-02-05 00:40:09 -08:00
Andrew Pareles c606ac4361 chat name 2025-02-05 00:38:49 -08:00
Andrew Pareles da4c9c8c40 fim better abstraction 2025-02-05 00:37:28 -08:00
Mathew Pareles 31ed11393f fix non-ollama autocomplete 2025-02-04 21:24:49 -08:00
Andrew Pareles 1c5157d97e remove hi333 2025-02-04 20:56:58 -08:00
Andrew Pareles cf241867d8 add recognizedModels code 2025-02-04 20:34:02 -08:00
Andrew Pareles 5a9f9f70d9 separate fastapply model 2025-02-04 20:34:02 -08:00
Andrew Pareles 19ff19fb80 Merge branch 'copy-icons' of https://github.com/voideditor/void into model-selection 2025-02-04 20:34:02 -08:00
Mathew Pareles 87076ed586 remove comments 2025-02-04 20:07:57 -08:00
Mathew Pareles 473250d8bc autocomplete works without context 2025-02-04 20:02:14 -08:00
Mathew Pareles cd983f0dd9 refactor input box with no noticable errors 2025-02-04 01:20:33 -08:00
Mathew Pareles 5c4753555e chatbubble add edit button (need to refactor InputBox to finish) 2025-02-03 21:06:29 -08:00
Mathew Pareles 8f79222b8b fix spacing 2025-02-03 18:45:25 -08:00
Mathew Pareles 145fd9614b changes 2025-02-03 18:27:57 -08:00
Mathew Pareles 41057c20fc autocomplete type context 2025-02-03 18:17:05 -08:00
Mathew Pareles 528b8a6b9b better model onboard 2025-02-03 18:17:05 -08:00
Andrew Pareles e3941d5565 + 2025-02-01 18:41:56 -08:00
Andrew Pareles 4d11a4fd29 Merge pull request #252 from bawsdeep/main
script to generate appimages
2025-01-31 20:52:44 -08:00
Andrew Pareles aa580351d9 Merge pull request #259 from DoctorGlitchy/main
Update voidSettingsTypes.ts
2025-01-31 01:22:16 -08:00
Adrian Chan 570e13127d Update voidSettingsTypes.ts
Removed "distil-whisper-large-v3-en" because Whisper is not a model you chat with.
Added "llama3-70b-8192" + "mixtral-8x7b-32768"
2025-01-31 13:11:33 +11:00
Andrew Pareles fb7b50b36b Merge pull request #258 from voideditor/model-selection
Latest UI updates
2025-01-30 16:39:13 -08:00
Baws Deep d1c5cf518e Add files via upload 2025-01-29 05:41:12 +01:00
Andrew Pareles 4e392bee8e start adding icons for copying files and folders in the explorer 2025-01-06 22:25:41 -08:00
3303 changed files with 378723 additions and 137012 deletions
@@ -0,0 +1,21 @@
## DO NOT MODIFY THIS FILE MANUALLY. This is part of auto-baselining from 1ES Pipeline Templates. Go to [https://aka.ms/1espt-autobaselining] for more details.
pipelines:
111:
retail:
source:
credscan:
lastModifiedDate: 2024-09-10
eslint:
lastModifiedDate: 2024-09-10
psscriptanalyzer:
lastModifiedDate: 2024-09-10
armory:
lastModifiedDate: 2024-09-10
binary:
credscan:
lastModifiedDate: 2025-02-04
binskim:
lastModifiedDate: 2025-02-04
spotbugs:
lastModifiedDate: 2025-02-04
+255
View File
@@ -0,0 +1,255 @@
{
"properties": {
"helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/baselines"
},
"version": "1.0.0",
"baselines": {
"default": {
"name": "default",
"createdDate": "2025-01-28 06:29:05Z",
"lastUpdatedDate": "2025-01-28 06:29:05Z"
}
},
"results": {
"ea3b2bf4f5b3d0bd8a6ad35cc61e49f2a1596660fd66d17d740e4806e7ed7dcc": {
"signature": "ea3b2bf4f5b3d0bd8a6ad35cc61e49f2a1596660fd66d17d740e4806e7ed7dcc",
"alternativeSignatures": [
"ff528c0b5a010ae7b5e9178b004a8b816a429a28ba98ce8336466b490a09dcef"
],
"target": ".build/win32-arm64/system-setup/VSCodeSetup-arm64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-01-30 19:19:49Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"12babbc85192ed1c8d927693da788537c1eef199bbecbe226f940a2d0e97637c": {
"signature": "12babbc85192ed1c8d927693da788537c1eef199bbecbe226f940a2d0e97637c",
"alternativeSignatures": [
"35b0519e201e56fb87fc6fb085e6fb1df5b89715142bb9086a5b2006e0fd4ced"
],
"target": ".build/win32-arm64/system-setup/VSCodeSetup-arm64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-01-30 19:19:49Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"49163bd1dc9d965d3baced1694dc8c43305b8bf96e884f478d8e4bd124454ba0": {
"signature": "49163bd1dc9d965d3baced1694dc8c43305b8bf96e884f478d8e4bd124454ba0",
"alternativeSignatures": [
"aa80bcf44aa8ddd20fb9802e9032c1257048b973896a944ded70bb195f060b2a"
],
"target": ".build/win32-arm64/user-setup/VSCodeUserSetup-arm64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-01-30 19:21:17Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"c405af02e021c3a473d4e45ec4daa658db1527ea7430c6be968d182e7b50fbd1": {
"signature": "c405af02e021c3a473d4e45ec4daa658db1527ea7430c6be968d182e7b50fbd1",
"alternativeSignatures": [
"619d2a1a77f55b4181493b8cfdf09be5261e539115752af2e4938f5ac04af132"
],
"target": ".build/win32-arm64/user-setup/VSCodeUserSetup-arm64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-01-30 19:21:17Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"71b8515b2eb51cfd5eace11cedb15189d51ce9e479095a5938334416088cbc03": {
"signature": "71b8515b2eb51cfd5eace11cedb15189d51ce9e479095a5938334416088cbc03",
"alternativeSignatures": [
"b34279fc5fec828b8dcd9ca873804e85d7d9cd78554ec109d2dd493351a7a244"
],
"target": ".build/win32-x64/system-setup/VSCodeSetup-x64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-01-30 19:51:51Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"9238de77a5320039def14694d1b6f501cc2288f13c9c688d2e0501fc5a56ee61": {
"signature": "9238de77a5320039def14694d1b6f501cc2288f13c9c688d2e0501fc5a56ee61",
"alternativeSignatures": [
"1d17616a549e9f36d814c4e802d651b1af453ce0a23d4478eef39be81adcc16b"
],
"target": ".build/win32-x64/system-setup/VSCodeSetup-x64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-01-30 19:51:51Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"bad8b698b48c1da9ece953903581c66bf98bc829ae1a6adcd3b5c2056a6fcd01": {
"signature": "bad8b698b48c1da9ece953903581c66bf98bc829ae1a6adcd3b5c2056a6fcd01",
"alternativeSignatures": [
"057376d31b97e8ce3ecf6a180a553b932d7e5be6e2b07a08027d5dfabe35e82c"
],
"target": ".build/win32-x64/user-setup/VSCodeUserSetup-x64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-01-30 19:53:13Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"cc7c248b0fd4c105e9a393ae232bf0d314ec50e65357a5e7e7d68f6f10c77077": {
"signature": "cc7c248b0fd4c105e9a393ae232bf0d314ec50e65357a5e7e7d68f6f10c77077",
"alternativeSignatures": [
"f3867098aff3368682df9926e85a35ec05cf905f27d0c157430021c3169f899d"
],
"target": ".build/win32-x64/user-setup/VSCodeUserSetup-x64-1.97.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-01-30 19:53:13Z",
"expirationDate": "2025-07-19 21:12:48Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-01-30 21:12:48Z"
},
"8c53250a171412b84dedcbb22cdab9ec365d9b52d74b09c070097fff45372de0": {
"signature": "8c53250a171412b84dedcbb22cdab9ec365d9b52d74b09c070097fff45372de0",
"alternativeSignatures": [
"314267784b0ea867006e00b809a93498fae3264e42d1a3a7745ab13180a5b6ef"
],
"target": ".build/win32-arm64/system-setup/VSCodeSetup-arm64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-02-04 06:16:33Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"a6a58d971da858f4af219672cef73ffd0aacc47f1e2c12b8b44a428e1330d3de": {
"signature": "a6a58d971da858f4af219672cef73ffd0aacc47f1e2c12b8b44a428e1330d3de",
"alternativeSignatures": [
"4e40f2f1683f0bf2245f35d0ebbcf2f446274d84b1db09d8e76ddfdcad5d4479"
],
"target": ".build/win32-arm64/system-setup/VSCodeSetup-arm64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-02-04 06:16:33Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"90e0f060e01e4a55620f609ac3241b62e8f54a059e9f4d292e93a4305fd3c39e": {
"signature": "90e0f060e01e4a55620f609ac3241b62e8f54a059e9f4d292e93a4305fd3c39e",
"alternativeSignatures": [
"377fe43ff8404d07f4a6ca763175004f360397ded6cf5d55b655646ada90e39c"
],
"target": ".build/win32-arm64/user-setup/VSCodeUserSetup-arm64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-02-04 06:17:54Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"f36c3dc19566098a923877d16d6ebfcbd971f8fcd8210afb8f5558fb5ba1f203": {
"signature": "f36c3dc19566098a923877d16d6ebfcbd971f8fcd8210afb8f5558fb5ba1f203",
"alternativeSignatures": [
"1af1f475c1617701e3d7a8fd465916bcc60c3125b8807af5d47d49137d9d468c"
],
"target": ".build/win32-arm64/user-setup/VSCodeUserSetup-arm64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-02-04 06:17:54Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"71193d108c53bb802f5c491276365bcff0645fb380be57288f3fbd6896166d3a": {
"signature": "71193d108c53bb802f5c491276365bcff0645fb380be57288f3fbd6896166d3a",
"alternativeSignatures": [
"420cae2e6e34b93d7b74fc1ffddfdf23b57650ae989d838bb2d67f28e4e1db0e"
],
"target": ".build/win32-x64/system-setup/VSCodeSetup-x64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-02-04 07:11:19Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"444c302f49bdedcafe772322a09727b2279e3265d99deb2e307defeae3ef200b": {
"signature": "444c302f49bdedcafe772322a09727b2279e3265d99deb2e307defeae3ef200b",
"alternativeSignatures": [
"4ff6ccbdb0745d43d3b61f82fb2f4d8a64fe9787525df81a6d7b825e79282085"
],
"target": ".build/win32-x64/system-setup/VSCodeSetup-x64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-02-04 07:11:19Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"4670c7c096a69ca428429ffa1f5250aac9f2e07beac0ffe587ffb37bdb1da4d4": {
"signature": "4670c7c096a69ca428429ffa1f5250aac9f2e07beac0ffe587ffb37bdb1da4d4",
"alternativeSignatures": [
"7cead96cb508ab6e37e27bcc0f8b7ed8d0761b77f4793958c46c5ff3892ab1b6"
],
"target": ".build/win32-x64/user-setup/VSCodeUserSetup-x64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2009",
"createdDate": "2025-02-04 07:13:22Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
},
"a359b4a5ed2378a73f3bba93e3fb1c595db7423c3082635d12d101bbeb0a51b8": {
"signature": "a359b4a5ed2378a73f3bba93e3fb1c595db7423c3082635d12d101bbeb0a51b8",
"alternativeSignatures": [
"125b52a21ef619a95e695085deb9492280bcf2c1decdd5e87e6416af5982d02d"
],
"target": ".build/win32-x64/user-setup/VSCodeUserSetup-x64-1.98.0-insider.exe",
"memberOf": [
"default"
],
"tool": "binskim",
"ruleId": "BA2018",
"createdDate": "2025-02-04 07:13:22Z",
"expirationDate": "2025-07-24 07:25:17Z",
"justification": "This error is baselined with an expiration date of 180 days from 2025-02-04 07:25:17Z"
}
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "Void",
"name": "Code - OSS",
"build": {
"dockerfile": "Dockerfile"
},
Regular → Executable
View File
Regular → Executable
View File
+4 -8
View File
@@ -11,7 +11,11 @@
**/extensions/markdown-language-features/notebook-out/**
**/extensions/markdown-math/notebook-out/**
**/extensions/notebook-renderers/renderer-out/index.js
**/extensions/open-remote-ssh/out/extension.js
**/extensions/simple-browser/media/index.js
**/extensions/terminal-suggest/src/completions/upstream/**
**/extensions/terminal-suggest/src/shell/zshBuiltinsCache.ts
**/extensions/terminal-suggest/third_party/**
**/extensions/typescript-language-features/test-workspace/**
**/extensions/typescript-language-features/extension.webpack.config.js
**/extensions/typescript-language-features/extension-browser.webpack.config.js
@@ -30,15 +34,7 @@
**/src/vs/*/**/*.d.ts
**/src/vs/base/test/common/filters.perf.data.js
**/src/vs/loader.js
**/src2/**/dompurify.js
**/src2/**/marked.js
**/src2/**/semver.js
**/src2/typings/**/*.d.ts
**/src2/vs/*/**/*.d.ts
**/src2/vs/base/test/common/filters.perf.data.js
**/src2/vs/loader.js
**/test/unit/assert.js
**/test/unit/assert-esm.js
**/test/automation/out/**
**/typings/**
!.vscode
@@ -12,7 +12,8 @@ export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
amdX: 'Use `import type` for import declarations, use `amdX#importAMDNodeModule` for import expressions'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -8,7 +8,8 @@ import * as eslint from 'eslint';
export = new class DeclareServiceBrand implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
fixable: 'code'
fixable: 'code',
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -13,7 +13,8 @@ export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rul
messages: {
ensure: 'Suites should include a call to `ensureNoDisposablesAreLeakedInTestSuite()` to ensure no disposables are leaked in tests.'
},
fixable: 'code'
fixable: 'code',
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
import * as path from 'path';
import minimatch from 'minimatch';
import { createImportRuleListener } from './utils';
@@ -50,7 +50,8 @@ export = new class implements eslint.Rule.RuleModule {
},
docs: {
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -249,7 +250,7 @@ export = new class implements eslint.Rule.RuleModule {
const relativeFilename = getRelativeFilename(context);
importPath = path.posix.join(path.posix.dirname(relativeFilename), importPath);
if (/^src\/vs\//.test(importPath)) {
// resolve using AMD base url
// resolve using base url
importPath = importPath.substring('src/'.length);
}
}
@@ -20,7 +20,18 @@ export = new class implements eslint.Rule.RuleModule {
},
docs: {
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
}
},
schema: [
{
type: 'object',
additionalProperties: {
type: 'array',
items: {
type: 'string'
}
}
}
]
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -0,0 +1,70 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { dirname, relative } from 'path';
import minimatch from 'minimatch';
export = new class implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
layerbreaker: 'You are only allowed to define limited top level functions.'
},
schema: {
type: "array",
items: {
type: "object",
additionalProperties: {
type: "array",
items: {
type: "string"
}
}
}
}
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
let fileRelativePath = relative(dirname(__dirname), context.getFilename());
if (!fileRelativePath.endsWith('/')) {
fileRelativePath += '/';
}
const ruleArgs = <Record<string, string[]>>context.options[0];
const matchingKey = Object.keys(ruleArgs).find(key => fileRelativePath.startsWith(key) || minimatch(fileRelativePath, key));
if (!matchingKey) {
// nothing
return {};
}
const restrictedFunctions = ruleArgs[matchingKey];
return {
FunctionDeclaration: (node: any) => {
const isTopLevel = node.parent.type === 'Program';
const functionName = node.id.name;
if (isTopLevel && !restrictedFunctions.includes(node.id.name)) {
context.report({
node,
message: `Top-level function '${functionName}' is restricted in this file. Allowed functions are: ${restrictedFunctions.join(', ')}.`
});
}
},
ExportNamedDeclaration(node: any) {
if (node.declaration && node.declaration.type === 'FunctionDeclaration') {
const functionName = node.declaration.id.name;
const isTopLevel = node.parent.type === 'Program';
if (isTopLevel && !restrictedFunctions.includes(node.declaration.id.name)) {
context.report({
node,
message: `Top-level function '${functionName}' is restricted in this file. Allowed functions are: ${restrictedFunctions.join(', ')}.`
});
}
}
}
}
}
};
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
const VALID_USES = new Set<TSESTree.AST_NODE_TYPES | undefined>([
TSESTree.AST_NODE_TYPES.AwaitExpression,
@@ -12,6 +12,9 @@ const VALID_USES = new Set<TSESTree.AST_NODE_TYPES | undefined>([
]);
export = new class MustUseResults implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
schema: false
}
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
export = new class NoDangerousTypeAssertions implements eslint.Rule.RuleModule {
@@ -10,7 +10,8 @@ export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
slow: 'Native private fields are much slower and should only be used when needed. Ignore this warning if you know what you are doing, use compile-time private otherwise. See https://github.com/microsoft/vscode/issues/185991#issuecomment-1614468158 for details',
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -12,7 +12,8 @@ export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
noNls: 'Not allowed to import vs/nls in standalone editor modules. Use standaloneStrings.ts'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -15,7 +15,8 @@ export = new class NoNlsInStandaloneEditorRule implements eslint.Rule.RuleModule
},
docs: {
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
/**
* WORKAROUND for https://github.com/evanw/esbuild/issues/3823
@@ -15,7 +15,7 @@ export = new class implements eslint.Rule.RuleModule {
function checkProperty(inNode: any) {
const classDeclaration = context.getAncestors().find(node => node.type === 'ClassDeclaration');
const classDeclaration = context.sourceCode.getAncestors(inNode).find(node => node.type === 'ClassDeclaration');
const propertyDefinition = <TSESTree.PropertyDefinition>inNode;
if (!classDeclaration || !classDeclaration.id?.name) {
@@ -33,7 +33,7 @@ export = new class implements eslint.Rule.RuleModule {
}
const name = classDeclaration.id.name;
const valueText = context.getSourceCode().getText(<any>propertyDefinition.value)
const valueText = context.sourceCode.getText(<any>propertyDefinition.value)
if (valueText.includes(name + '.')) {
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
import * as eslint from 'eslint';
function isCallExpression(node: TSESTree.Node): node is TSESTree.CallExpression {
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils';
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/utils';
function isStringLiteral(node: TSESTree.Node | null | undefined): node is TSESTree.StringLiteral {
return !!node && node.type === AST_NODE_TYPES.Literal && typeof node.value === 'string';
@@ -24,7 +24,8 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
badKey: 'The key \'{{key}}\' doesn\'t conform to a valid localize identifier.',
duplicateKey: 'Duplicate key \'{{key}}\' with different message value.',
badMessage: 'Message argument to \'{{message}}\' must be a string literal.'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -12,7 +12,7 @@
*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
import * as ESTree from 'estree';
//------------------------------------------------------------------------------
@@ -141,7 +141,7 @@ module.exports = {
return {
ExpressionStatement(node: TSESTree.ExpressionStatement) {
if (!isValidExpression(node.expression) && !isDirective(node, <TSESTree.Node[]>context.getAncestors())) {
if (!isValidExpression(node.expression) && !isDirective(node, <TSESTree.Node[]>context.sourceCode.getAncestors(node))) {
context.report({ node: <ESTree.Node>node, message: `Expected an assignment or function call and instead saw an expression. ${node.expression}` });
}
}
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
/**
* Enforces that all parameter properties have an explicit access modifier (public, protected, private).
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
import { readFileSync } from 'fs';
import { createImportRuleListener } from './utils';
@@ -16,7 +16,8 @@ export = new class TranslationRemind implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
missing: 'Please add \'{{resource}}\' to ./build/lib/i18n.resources.json file to use translations here.'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
+3
View File
@@ -0,0 +1,3 @@
{
"type": "commonjs"
}
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
export function createImportRuleListener(validateImport: (node: TSESTree.Literal, value: string) => any): eslint.Rule.RuleListener {
@@ -4,14 +4,15 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/experimental-utils';
import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/utils';
export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
noToken: 'Function lacks a cancellation token, preferable as last argument',
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,13 +4,14 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils';
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/utils';
export = new class ApiLiteralOrTypes implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
docs: { url: 'https://github.com/microsoft/vscode/wiki/Extension-API-guidelines#creating-objects' },
messages: { sync: '`createXYZ`-functions are constructor-replacements and therefore must return sync', }
messages: { sync: '`createXYZ`-functions are constructor-replacements and therefore must return sync', },
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/experimental-utils';
import { TSESTree, AST_NODE_TYPES } from '@typescript-eslint/utils';
export = new class ApiEventNaming implements eslint.Rule.RuleModule {
@@ -19,7 +19,8 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule {
verb: 'Unknown verb \'{{verb}}\' - is this really a verb? Iff so, then add this verb to the configuration',
subject: 'Unknown subject \'{{subject}}\' - This subject has not been used before but it should refer to something in the API',
unknown: 'UNKNOWN event declaration, lint-rule needs tweaking'
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
export = new class ApiInterfaceNaming implements eslint.Rule.RuleModule {
@@ -13,7 +13,8 @@ export = new class ApiInterfaceNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
naming: 'Interfaces must not be prefixed with uppercase `I`',
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,13 +4,14 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
export = new class ApiLiteralOrTypes implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
docs: { url: 'https://github.com/microsoft/vscode/wiki/Extension-API-guidelines#enums' },
messages: { useEnum: 'Use enums, not literal-or-types', }
messages: { useEnum: 'Use enums, not literal-or-types', },
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -4,14 +4,15 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
naming: 'A provider should only have functions like provideXYZ or resolveXYZ',
}
},
schema: false,
};
private static _providerFunctionNames = /^(provide|resolve|prepare).+/;
@@ -4,21 +4,21 @@
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/experimental-utils';
import { TSESTree } from '@typescript-eslint/utils';
export = new class ApiTypeDiscrimination implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
docs: { url: 'https://github.com/microsoft/vscode/wiki/Extension-API-guidelines' },
messages: {
noTypeDiscrimination: 'Do not use type descrimination properties'
}
noTypeDiscrimination: 'Do not use type discrimination properties'
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
return {
['TSPropertySignature[optional=undefined] TSTypeAnnotation TSLiteralType Literal']: (node: any) => {
['TSPropertySignature[optional=false] TSTypeAnnotation TSLiteralType Literal']: (node: any) => {
const raw = String((<TSESTree.Literal>node).raw)
if (/^('|").*\1$/.test(raw)) {
@@ -0,0 +1,32 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TSESTree } from '@typescript-eslint/utils';
import * as eslint from 'eslint';
export = new class VscodeDtsUseExport implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
useExport: `Public api types must use 'export'`,
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
return {
['TSModuleDeclaration :matches(TSInterfaceDeclaration, ClassDeclaration, VariableDeclaration, TSEnumDeclaration, TSTypeAliasDeclaration)']: (node: any) => {
const parent = (<TSESTree.Node>node).parent;
if (parent && parent.type !== TSESTree.AST_NODE_TYPES.ExportNamedDeclaration) {
context.report({
node,
messageId: 'useExport'
});
}
}
};
}
};
@@ -10,7 +10,8 @@ export = new class ApiEventNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
usage: 'Use the Thenable-type instead of the Promise type',
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -11,7 +11,8 @@ export = new class ApiVsCodeInComments implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
comment: `Don't use the term 'vs code' in comments`
}
},
schema: false,
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -1,39 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as eslint from 'eslint';
export = new class ApiEventNaming implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
comment: 'region comments should start with a camel case identifier, `:`, then either a GH issue link or owner, e.g #region myProposalName: https://github.com/microsoft/vscode/issues/<number>',
}
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const sourceCode = context.getSourceCode();
return {
['Program']: (_node: any) => {
for (const comment of sourceCode.getAllComments()) {
if (comment.type !== 'Line') {
continue;
}
if (!/^\s*#region /.test(comment.value)) {
continue;
}
if (!/^\s*#region ([a-z]+): (@[a-z]+|https:\/\/github.com\/microsoft\/vscode\/issues\/\d+)/i.test(comment.value)) {
context.report({
node: <any>comment,
messageId: 'comment',
});
}
}
}
};
}
};
-1230
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -22,4 +22,7 @@ product.overrides.json
*.snap.actual
.vscode-test
.tmp/
.tmp2/
.tool-versions
src/vs/workbench/contrib/void/browser/react/out/**
src/vs/workbench/contrib/void/browser/react/src2/**
+48 -48
View File
@@ -1,48 +1,48 @@
# Created for Void
# To learn more about how to use Nix to configure your environment
# see: https://developers.google.com/idx/guides/customize-idx-env
{pkgs}: {
# Which nixpkgs channel to use.
channel = "stable-23.11"; # or "unstable"
# Use https://search.nixos.org/packages to find packages
packages = [
pkgs.nodejs_20
pkgs.yarn
pkgs.nodePackages.pnpm
pkgs.bun
pkgs.gh
];
# Sets environment variables in the workspace
env = {};
idx = {
# Search for the extensions you want on https://open-vsx.org/ and use "publisher.id"
extensions = [
# "vscodevim.vim"
];
workspace = {
# Runs when a workspace is first created with this `dev.nix` file
onCreate = {
npm-install = "npm ci --no-audit --prefer-offline --no-progress --timing";
# Open editors for the following files by default, if they exist:
default.openFiles = [
# Cover all the variations of language, src-dir, router (app/pages)
"pages/index.tsx" "pages/index.jsx"
"src/pages/index.tsx" "src/pages/index.jsx"
"app/page.tsx" "app/page.jsx"
"src/app/page.tsx" "src/app/page.jsx"
];
};
# To run something each time the workspace is (re)started, use the `onStart` hook
};
# Enable previews and customize configuration
previews = {
enable = true;
previews = {
web = {
command = ["npm" "run" "dev" "--" "--port" "$PORT" "--hostname" "0.0.0.0"];
manager = "web";
};
};
};
};
}
# Created for Void
# To learn more about how to use Nix to configure your environment
# see: https://developers.google.com/idx/guides/customize-idx-env
{pkgs}: {
# Which nixpkgs channel to use.
channel = "stable-23.11"; # or "unstable"
# Use https://search.nixos.org/packages to find packages
packages = [
pkgs.nodejs_20
pkgs.yarn
pkgs.nodePackages.pnpm
pkgs.bun
pkgs.gh
];
# Sets environment variables in the workspace
env = {};
idx = {
# Search for the extensions you want on https://open-vsx.org/ and use "publisher.id"
extensions = [
# "vscodevim.vim"
];
workspace = {
# Runs when a workspace is first created with this `dev.nix` file
onCreate = {
npm-install = "npm ci --no-audit --prefer-offline --no-progress --timing";
# Open editors for the following files by default, if they exist:
default.openFiles = [
# Cover all the variations of language, src-dir, router (app/pages)
"pages/index.tsx" "pages/index.jsx"
"src/pages/index.tsx" "src/pages/index.jsx"
"app/page.tsx" "app/page.jsx"
"src/app/page.tsx" "src/app/page.jsx"
];
};
# To run something each time the workspace is (re)started, use the `onStart` hook
};
# Enable previews and customize configuration
previews = {
enable = true;
previews = {
web = {
command = ["npm" "run" "dev" "--" "--port" "$PORT" "--hostname" "0.0.0.0"];
manager = "web";
};
};
};
};
}
+2 -2
View File
@@ -1,6 +1,6 @@
disturl="https://electronjs.org/headers"
target="30.5.1"
ms_build_id="10262041"
target="34.2.0"
ms_build_id="11044223"
runtime="electron"
build_from_source="true"
legacy-peer-deps="true"
+1 -1
View File
@@ -1 +1 @@
20.16.0
20.18.2
+21 -3
View File
@@ -5,9 +5,15 @@
//@ts-check
const path = require('path');
import { createRequire } from 'node:module';
import { fileURLToPath } from 'url';
import * as path from 'path';
import * as os from 'os';
const require = createRequire(import.meta.url);
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const { defineConfig } = require('@vscode/test-cli');
const os = require('os');
/**
* A list of extension folders who have opted into tests, or configuration objects.
@@ -36,6 +42,16 @@ const extensions = [
workspaceFolder: `extensions/vscode-colorize-tests/test`,
mocha: { timeout: 60_000 }
},
{
label: 'terminal-suggest',
workspaceFolder: path.join(os.tmpdir(), `terminal-suggest-${Math.floor(Math.random() * 100000)}`),
mocha: { timeout: 60_000 }
},
{
label: 'vscode-colorize-perf-tests',
workspaceFolder: `extensions/vscode-colorize-perf-tests/test`,
mocha: { timeout: 6000_000 }
},
{
label: 'configuration-editing',
workspaceFolder: path.join(os.tmpdir(), `confeditout-${Math.floor(Math.random() * 100000)}`),
@@ -57,7 +73,7 @@ const defaultLaunchArgs = process.env.API_TESTS_EXTRA_ARGS?.split(' ') || [
'--disable-telemetry', '--skip-welcome', '--skip-release-notes', `--crash-reporter-directory=${__dirname}/.build/crashes`, `--logsPath=${__dirname}/.build/logs/integration-tests`, '--no-cached-data', '--disable-updates', '--use-inmemory-secretstorage', '--disable-extensions', '--disable-workspace-trust'
];
module.exports = defineConfig(extensions.map(extension => {
const config = defineConfig(extensions.map(extension => {
/** @type {import('@vscode/test-cli').TestConfiguration} */
const config = typeof extension === 'object'
? { files: `extensions/${extension.label}/out/**/*.test.js`, ...extension }
@@ -99,3 +115,5 @@ module.exports = defineConfig(extensions.map(extension => {
return config;
}));
export default config;
@@ -4,8 +4,7 @@
"description": "Test provider for the VS Code project",
"enabledApiProposals": [
"testObserver",
"testRelatedCode",
"attributableCoverage"
"testRelatedCode"
],
"engines": {
"vscode": "^1.88.0"
@@ -142,7 +142,7 @@ class ScriptCoverageTracker {
}
}
export class V8CoverageFile extends vscode.FileCoverage2 {
export class V8CoverageFile extends vscode.FileCoverage {
public details: vscode.StatementCoverage[] = [];
constructor(
@@ -86,10 +86,11 @@ export async function activate(context: vscode.ExtensionContext) {
}, uri => ctrl.items.get(uri.toString().toLowerCase()));
ctrl.relatedCodeProvider = graph;
context.subscriptions.push(
new FailureTracker(context, folder.uri.fsPath),
fileChangedEmitter.event(e => graph.didChange(e.uri, e.removed)),
);
if (context.storageUri) {
context.subscriptions.push(new FailureTracker(context.storageUri.fsPath, folder.uri.fsPath));
}
context.subscriptions.push(fileChangedEmitter.event(e => graph.didChange(e.uri, e.removed)));
});
const createRunHandler = (
@@ -33,8 +33,8 @@ export class FailureTracker {
private readonly logFile: string;
private logs?: ITrackedRemediation[];
constructor(context: vscode.ExtensionContext, private readonly rootDir: string) {
this.logFile = join(context.globalStorageUri.fsPath, '.build/vscode-test-failures.json');
constructor(storageLocation: string, private readonly rootDir: string) {
this.logFile = join(storageLocation, '.build/vscode-test-failures.json');
mkdirSync(dirname(this.logFile), { recursive: true });
const oldLogFile = join(rootDir, '.build/vscode-test-failures.json');
@@ -11,7 +11,6 @@
"src/**/*",
"../../../src/vscode-dts/vscode.d.ts",
"../../../src/vscode-dts/vscode.proposed.testObserver.d.ts",
"../../../src/vscode-dts/vscode.proposed.testRelatedCode.d.ts",
"../../../src/vscode-dts/vscode.proposed.attributableCoverage.d.ts"
"../../../src/vscode-dts/vscode.proposed.testRelatedCode.d.ts"
]
}
+18 -4
View File
@@ -202,6 +202,24 @@
"order": 5
}
},
{
"type": "extensionHost",
"request": "launch",
"name": "VS Code Tokenizer Performance Tests",
"runtimeExecutable": "${execPath}",
"args": [
"${workspaceFolder}/extensions/vscode-colorize-perf-tests/test",
"--extensionDevelopmentPath=${workspaceFolder}/extensions/vscode-colorize-perf-tests",
"--extensionTestsPath=${workspaceFolder}/extensions/vscode-colorize-perf-tests/out"
],
"outFiles": [
"${workspaceFolder}/out/**/*.js"
],
"presentation": {
"group": "5_tests",
"order": 6
}
},
{
"type": "chrome",
"request": "attach",
@@ -257,10 +275,6 @@
"presentation": {
"hidden": true,
},
// This is read by the vscode-diagnostic-tools extension
"vscode-diagnostic-tools.debuggerScripts": [
"${workspaceFolder}/scripts/hot-reload-injected-script.js"
]
},
{
"type": "node",
+1 -1
View File
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"September 2024\""
"value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"February 2025\""
},
{
"kind": 1,
+3 -3
View File
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"September 2024\""
"value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\r\n\r\n$MILESTONE=milestone:\"February 2025\""
},
{
"kind": 1,
@@ -97,7 +97,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS $MILESTONE is:issue is:closed reason:completed label:verification-needed -label:verified"
"value": "$REPOS $MILESTONE is:issue is:closed reason:completed label:verification-needed -label:verified -label:on-testplan"
},
{
"kind": 1,
@@ -112,7 +112,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS $MILESTONE is:issue is:closed reason:completed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:z-author-verified -label:unreleased -label:*not-reproducible"
"value": "$REPOS $MILESTONE is:issue is:closed reason:completed sort:updated-asc label:bug -label:verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:z-author-verified -label:unreleased -label:*not-reproducible -label:*out-of-scope"
},
{
"kind": 1,
File diff suppressed because one or more lines are too long
+5 -5
View File
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"September 2024\"\n\n$MINE=assignee:@me"
"value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"February 2025\"\n\n$MINE=assignee:@me"
},
{
"kind": 1,
@@ -62,7 +62,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:feature-request label:verification-needed -label:verified"
"value": "$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:feature-request label:verification-needed -label:verified -label:on-testplan"
},
{
"kind": 1,
@@ -87,7 +87,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed -assignee:@me -label:verified -label:z-author-verified label:feature-request label:verification-needed -label:verification-steps-needed -label:unreleased"
"value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed -assignee:@me -label:verified -label:z-author-verified label:feature-request label:verification-needed -label:verification-steps-needed -label:unreleased -label:on-testplan"
},
{
"kind": 1,
@@ -157,7 +157,7 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:*out-of-scope -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:paulacamargo25 -author:ulugbekna -author:aiday-mar -author:daviddossett -author:bhavyaus -author:justschen -author:benibenj -author:luabud -author:anthonykim1 -author:joshspicer"
"value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:*out-of-scope -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:ntrogh -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:paulacamargo25 -author:ulugbekna -author:aiday-mar -author:daviddossett -author:bhavyaus -author:justschen -author:benibenj -author:luabud -author:anthonykim1 -author:joshspicer -author:osortega -author:legomushroom"
},
{
"kind": 1,
@@ -187,6 +187,6 @@
{
"kind": 2,
"language": "github-issues",
"value": "$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:feature-request -label:on-release-notes\n$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:engineering -label:on-release-notes\n$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:plan-item -label:on-release-notes"
"value": "$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:feature-request -label:on-release-notes\r\n$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:engineering -label:on-release-notes\r\n$REPOS $MILESTONE $MINE is:issue is:closed reason:completed label:plan-item -label:on-release-notes"
}
]
File diff suppressed because one or more lines are too long
+17 -12
View File
@@ -8,6 +8,7 @@
"**/.DS_Store": true,
".vscode-test": true,
"cli/target": true,
"build/**/*.js.map": true,
"build/**/*.js": {
"when": "$(basename).ts"
}
@@ -41,8 +42,6 @@
"**/yarn.lock": true,
"**/package-lock.json": true,
"**/Cargo.lock": true,
"src/vs/workbench/workbench.web.main.css": true,
"src/vs/workbench/workbench.desktop.main.css": true,
"build/**/*.js": true,
"out/**": true,
"out-build/**": true,
@@ -52,8 +51,7 @@
"extensions/**/out/**": true,
"test/smoke/out/**": true,
"test/automation/out/**": true,
"test/integration/browser/out/**": true,
"src2/**": true,
"test/integration/browser/out/**": true
},
"files.readonlyExclude": {
"build/builtin/*.js": true,
@@ -94,13 +92,12 @@
}
],
"git.ignoreLimitWarning": true,
// Removing this for Void:
// "git.branchProtection": [
// "main",
// "distro",
// "release/*"
// ],
// "git.branchProtectionPrompt": "alwaysCommitToNewBranch",
"git.branchProtection": [
"main",
"distro",
"release/*"
],
"git.branchProtectionPrompt": "alwaysCommitToNewBranch",
"git.branchRandomName.enable": true,
"git.pullBeforeCheckout": true,
"git.mergeEditor": true,
@@ -171,5 +168,13 @@
},
"css.format.spaceAroundSelectorSeparator": true,
"typescript.enablePromptUseWorkspaceTsdk": true,
"inlineChat.experimental.onlyZoneWidget": true
"eslint.useFlatConfig": true,
"editor.occurrencesHighlightDelay": 0,
"typescript.experimental.expandableHover": true,
"git.diagnosticsCommitHook.Enabled": true,
"git.diagnosticsCommitHook.Sources": {
"*": "error",
"ts": "warning",
"eslint": "warning"
}
}
-18
View File
@@ -36,23 +36,5 @@
"private readonly _onDid$1 = new Emitter<$2>();",
"readonly onDid$1: Event<$2> = this._onDid$1.event;"
],
},
"esm-comment": {
"scope": "typescript,javascript",
"prefix": "esm-comment",
"body": [
"// ESM-comment-begin",
"$SELECTION$0",
"// ESM-comment-end",
]
},
"esm-uncomment": {
"scope": "typescript,javascript",
"prefix": "esm-uncomment",
"body": [
"// ESM-uncomment-begin",
"// $SELECTION$0",
"// ESM-uncomment-end",
]
}
}
+5 -6
View File
@@ -12,15 +12,13 @@ There are a few ways to contribute:
### Codebase Guide
We highly recommend reading [this](https://github.com/microsoft/vscode/wiki/Source-Code-Organization) article on VSCode's sourcecode organization.
We are currently putting together our own articles on VSCode and Void's sourcecode organization. The best way to get this information right now is by attending a weekly meeting.
We [highly recommend reading this](https://github.com/microsoft/vscode/wiki/Source-Code-Organization) article on VSCode's sourcecode organization too. Void's codebase is pretty simple when you know what a service is and what `browser/` and `common/` mean, and the article covers all the jargon.
<!-- ADD BLOG HERE
We wrote a [guide to working in VSCode].
-->
Most of Void's code lives in the two folders called `void/`.
Most of Void's code lives in the folder `src/vs/workbench/contrib/void/`.
@@ -63,13 +61,14 @@ To build Void, open `void/` inside VSCode. Then open your terminal and run:
3. Build Void.
- Press <kbd>Cmd+Shift+B</kbd> (Mac).
- Press <kbd>Ctrl+Shift+B</kbd> (Windows/Linux).
- This step can take ~5 min. The build is done when you see two check marks.
- This step can take ~5 min. The build is done when you see two check marks (one of the items will continue spinning indefinitely - it compiles our React code).
4. Run Void.
- Run `./scripts/code.sh` (Mac/Linux).
- Run `./scripts/code.bat` (Windows).
6. Nice-to-knows.
- You can always press <kbd>Ctrl+R</kbd> (<kbd>Cmd+R</kbd>) inside the new window to reload and see your new changes. It's faster than <kbd>Ctrl+Shift+P</kbd> and `Reload Window`.
- You might want to add the flags `--user-data-dir ./.tmp/user-data --extensions-dir ./.tmp/extensions` to the above run command, which lets you delete the `.tmp` folder to reset any IDE changes you made when testing.
- You can kill any of the build scripts by pressing `Ctrl+D` in VSCode terminal. If you press `Ctrl+C` the script will close but will keep running in the background (to open all background scripts, just re-build).
#### Building Void from Terminal
@@ -87,7 +86,7 @@ Alternatively, if you want to build Void from the terminal, instead of pressing
#### Common Fixes
- Make sure you followed the prerequisite steps.
- Make sure you have Node version `20.16.0` (the version in `.nvmrc`)!
- Make sure you have Node version `20.18.2` (the version in `.nvmrc`)!
- If you get `"TypeError: Failed to fetch dynamically imported module"`, make sure all imports end with `.js`.
- If you see missing styles, wait a few seconds and then reload.
- If you have any questions, feel free to [submit an issue](https://github.com/voideditor/void/issues/new). You can also refer to VSCode's complete [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) page.
+1 -1
View File
@@ -9,7 +9,7 @@
/>
</div>
Void is the open-source Cursor alternative.
Void is the open-source Cursor alternative.
This repo contains the full sourcecode for Void. We are currently in [open beta](https://voideditor.com/email) for Discord members (see the `announcements` channel), with a waitlist for our official release. If you're new, welcome!
+143 -30
View File
@@ -4,6 +4,34 @@ This repository incorporates material as listed below or described in the code.
---------------------------------------------------------
@fig/autocomplete-shared 1.1.2
https://github.com/withfig/autocomplete-tools
MIT License
Copyright (c) 2021 Hercules Labs Inc. (Fig)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------
---------------------------------------------------------
@iktakahiro/markdown-it-katex 4.0.2 - MIT
@@ -58,6 +86,34 @@ SOFTWARE.
---------------------------------------------------------
amazon-q-developer-cli f66e0b0e917ab185eef528dc36eca56b78ca8b5d
https://github.com/aws/amazon-q-developer-cli
MIT License
Copyright (c) 2024 Amazon.com, Inc. or its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------
---------------------------------------------------------
atom/language-clojure 0.22.8 - MIT
https://github.com/atom/language-clojure
@@ -263,6 +319,34 @@ suitability for any purpose.
---------------------------------------------------------
autocomplete 2.684.0 - MIT
https://github.com/withfig/autocomplete
MIT License
Copyright (c) 2021 Hercules Labs Inc. (Fig)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------
---------------------------------------------------------
cacheable-request 7.0.4 - MIT
@@ -440,11 +524,11 @@ Title to copyright in this work will at all times remain with copyright holders.
---------------------------------------------------------
dompurify 3.0.5 - Apache 2.0
dompurify 3.1.7 - Apache 2.0
https://github.com/cure53/DOMPurify
DOMPurify
Copyright 2024 Dr.-Ing. Mario Heiderich, Cure53
Copyright 2025 Dr.-Ing. Mario Heiderich, Cure53
DOMPurify is free software; you can redistribute it and/or modify it under the
terms of either:
@@ -1119,7 +1203,7 @@ to the base-name name of the original file, and an extension of txt, html, or si
---------------------------------------------------------
go-syntax 0.7.6 - MIT
go-syntax 0.7.9 - MIT
https://github.com/worlpaker/go-syntax
MIT License
@@ -1167,7 +1251,7 @@ without specific, written prior permission. Title to copyright in this document
---------------------------------------------------------
Ionic documentation 1.2.4 - Apache2
Ionic documentation 1.2.4 - Apache-2.0
https://github.com/ionic-team/ionic-site
Copyright Drifty Co. http://drifty.com/.
@@ -1435,7 +1519,7 @@ SOFTWARE.
---------------------------------------------------------
jlelong/vscode-latex-basics 1.9.0 - MIT
jlelong/vscode-latex-basics 1.10.0 - MIT
https://github.com/jlelong/vscode-latex-basics
Copyright (c) vscode-latex-basics authors
@@ -1551,7 +1635,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SO
---------------------------------------------------------
language-docker 0.0.0 - Apache2
language-docker 0.0.0 - Apache-2.0
https://github.com/moby/moby
Apache License
@@ -2108,7 +2192,7 @@ SOFTWARE.
---------------------------------------------------------
RedCMD/YAML-Syntax-Highlighter 1.1.2 - MIT
RedCMD/YAML-Syntax-Highlighter 1.3.2 - MIT
https://github.com/RedCMD/YAML-Syntax-Highlighter
MIT License
@@ -2164,7 +2248,7 @@ suitability for any purpose.
---------------------------------------------------------
REditorSupport/vscode-R 2.8.1 - MIT
REditorSupport/vscode-R 2.8.4 - MIT
https://github.com/REditorSupport/vscode-R
MIT License
@@ -2297,6 +2381,55 @@ SOFTWARE.
---------------------------------------------------------
Shopify/ruby-lsp 0.0.0 - MIT License
https://github.com/Shopify/ruby-lsp
The MIT License (MIT)
Copyright (c) 2022-present, Shopify Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================================================
The following files and related configuration in package.json are based on a
sequence of adaptions: grammars/ruby.cson.json, grammars/erb.cson.json,
languages/erb.json.
Copyright (c) 2016 Peng Lv
Copyright (c) 2017-2019 Stafford Brunk
https://github.com/rubyide/vscode-ruby
Released under the MIT license
https://github.com/rubyide/vscode-ruby/blob/main/LICENSE.txt
Copyright (c) 2014 GitHub Inc.
https://github.com/atom/language-ruby
Released under the MIT license
https://github.com/atom/language-ruby/blob/master/LICENSE.md
https://github.com/textmate/ruby.tmbundle
https://github.com/textmate/ruby.tmbundle#license
---------------------------------------------------------
---------------------------------------------------------
sumneko/lua.tmbundle 1.0.0 - TextMate Bundle License
https://github.com/sumneko/lua.tmbundle
@@ -2526,26 +2659,6 @@ to the base-name name of the original file, and an extension of txt, html, or si
---------------------------------------------------------
textmate/ruby.tmbundle 0.0.0 - TextMate Bundle License
https://github.com/textmate/ruby.tmbundle
Copyright (c) textmate-ruby.tmbundle project authors
If not otherwise specified (see below), files in this folder fall under the following license:
Permission to copy, use, modify, sell and distribute this
software is granted. This software is provided "as is" without
express or implied warranty, and with no claim as to its
suitability for any purpose.
An exception is made for files in readable text which contain their own license information,
or files where an accompanying file exists (in the same directory) with a "-license" suffix added
to the base-name name of the original file, and an extension of txt, html, or similar. For example
"tidy" is accompanied by "tidy-license.txt".
---------------------------------------------------------
---------------------------------------------------------
trond-snekvik/vscode-rst 1.5.3 - MIT
https://github.com/trond-snekvik/vscode-rst
@@ -3056,7 +3169,7 @@ Creative Commons may be contacted at creativecommons.org.
---------------------------------------------------------
vscode-logfile-highlighter 2.17.0 - MIT
vscode-logfile-highlighter 3.3.4 - MIT
https://github.com/emilast/vscode-logfile-highlighter
The MIT License (MIT)
@@ -3168,7 +3281,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------
Web Background Synchronization - Apache2
Web Background Synchronization - Apache-2.0
https://github.com/WICG/background-sync
Apache License
+2
View File
@@ -2,6 +2,8 @@
The Void team put together this list of links to get up and running with VSCode's sourcecode. We hope it's helpful!
For a complete guide on building Void, see [Contributing](https://github.com/voideditor/void/blob/main/CONTRIBUTING.md).
## Contributing
- [How VSCode's sourcecode is organized](https://github.com/microsoft/vscode/wiki/Source-Code-Organization) - this explains where the entry point files are, what `browser/` and `common/` mean, etc. This is the most important read on this whole list! We recommend reading the whole thing.
+1 -1
View File
@@ -1 +1 @@
2024-09-04T10:21:29.952Z
2024-12-11T00:28:56.838Z
+13 -9
View File
@@ -55,6 +55,11 @@ fsevents/test/**
@vscode/windows-registry/build/**
!@vscode/windows-registry/build/Release/*.node
@vscode/tree-sitter-wasm/wasm/tree-sitter-*.wasm
!@vscode/tree-sitter-wasm/wasm/tree-sitter-typescript.wasm
!@vscode/tree-sitter-wasm/wasm/tree-sitter-regex.wasm
!@vscode/tree-sitter-wasm/wasm/tree-sitter-ini.wasm
native-keymap/binding.gyp
native-keymap/build/**
native-keymap/src/**
@@ -110,15 +115,13 @@ node-pty/third_party/**
@parcel/watcher/src/**
!@parcel/watcher/build/Release/*.node
vsda/build/**
vsda/ci/**
vsda/src/**
vsda/.gitignore
vsda/binding.gyp
vsda/README.md
vsda/SECURITY.md
vsda/targets
vsda/**
!vsda/index.js
!vsda/index.d.ts
!vsda/package.json
!vsda/build/Release/vsda.node
!vsda/rust/web/**
!vsda/rust/bundler/**
@vscode/policy-watcher/build/**
@vscode/policy-watcher/.husky/**
@@ -132,6 +135,7 @@ vsda/targets
!@vscode/windows-ca-certs/package.json
!@vscode/windows-ca-certs/**/*.node
@vscode/node-addon-api/**/*
node-addon-api/**/*
prebuild-install/**/*
@@ -163,7 +167,7 @@ typescript/lib/tsserverlibrary.js
jschardet/index.js
jschardet/src/**
# TODO@esm uncomment when we can use jschardet.min.js again jschardet/dist/jschardet.js
jschardet/dist/jschardet.js
es6-promise/lib/**
+4 -1
View File
@@ -14,7 +14,7 @@
jschardet/index.js
jschardet/src/**
# TODO@esm uncomment when we can use jschardet.min.js again jschardet/dist/jschardet.js
jschardet/dist/jschardet.js
vscode-textmate/webpack.config.js
@@ -26,6 +26,9 @@ vscode-textmate/webpack.config.js
@xterm/addon-image/src/**
@xterm/addon-image/out/**
@xterm/addon-ligatures/src/**
@xterm/addon-ligatures/out/**
@xterm/addon-search/src/**
@xterm/addon-search/out/**
@xterm/addon-search/fixtures/**
@@ -19,13 +19,15 @@ steps:
nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- template: ../cli/cli-apply-patches.yml@self
- script: |
set -e
npm ci
workingDirectory: build
displayName: Install pipeline build
- template: ../cli/cli-apply-patches.yml@self
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Install build dependencies
- task: Npm@1
displayName: Download openssl prebuilt
@@ -10,7 +10,7 @@ steps:
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
azureSubscription: vscode
KeyVaultName: vscode-build-secrets
SecretsFilter: "github-distro-mixin-password"
@@ -59,7 +59,7 @@ steps:
- task: Docker@1
inputs:
azureSubscriptionEndpoint: "vscode-builds-subscription"
azureSubscriptionEndpoint: vscode
azureContainerRegistry: vscodehub.azurecr.io
command: "Run an image"
imageName: "vscode-linux-build-agent:alpine-$(VSCODE_ARCH)"
@@ -73,6 +73,7 @@ steps:
- script: |
set -e
for i in {1..5}; do # try 5 times
npm ci && break
if [ $i -eq 5 ]; then
+28
View File
@@ -108,6 +108,34 @@ steps:
${{ pair.key }}: ${{ pair.value }}
- ${{ if contains(parameters.VSCODE_CLI_TARGET, '-windows-') }}:
- task: PublishSymbols@2
inputs:
IndexSources: false
SymbolsFolder: $(Build.SourcesDirectory)/cli/target/${{ parameters.VSCODE_CLI_TARGET }}/release
SearchPattern: 'code.pdb'
SymbolServerType: TeamServices
SymbolsProduct: 'code'
ArtifactServices.Symbol.AccountName: microsoft
ArtifactServices.Symbol.PAT: $(System.AccessToken)
ArtifactServices.Symbol.UseAAD: false
displayName: Publish Symbols
- task: CopyFiles@2
inputs:
SourceFolder: $(Build.SourcesDirectory)/cli/target/${{ parameters.VSCODE_CLI_TARGET }}/release
Contents: 'code.*'
TargetFolder: $(Agent.TempDirectory)/binskim-cli
displayName: Copy files for BinSkim
- task: BinSkim@4
inputs:
InputType: Basic
Function: analyze
TargetPattern: guardianGlob
AnalyzeTargetGlob: $(Agent.TempDirectory)/binskim-cli/*.*
AnalyzeSymPath: $(Agent.TempDirectory)/binskim-cli
displayName: Run BinSkim
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
+17 -12
View File
@@ -4,20 +4,21 @@ parameters:
default: []
steps:
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
KeyVaultName: vscode-build-secrets
SecretsFilter: "ESRP-PKI,esrp-aad-username,esrp-aad-password"
- task: UseDotNet@2
inputs:
version: 6.x
- task: EsrpClientTool@1
continueOnError: true
displayName: Download ESRPClient
- task: EsrpCodeSigning@5
inputs:
UseMSIAuthentication: true
ConnectedServiceName: vscode-esrp
AppRegistrationClientId: $(ESRP_CLIENT_ID)
AppRegistrationTenantId: $(ESRP_TENANT_ID)
AuthAKVName: vscode-esrp
AuthSignCertName: esrp-sign
FolderPath: .
Pattern: noop
displayName: 'Install ESRP Tooling'
- ${{ each target in parameters.VSCODE_CLI_ARTIFACTS }}:
- task: DownloadPipelineArtifact@2
@@ -32,10 +33,14 @@ steps:
archiveFilePatterns: $(Build.ArtifactStagingDirectory)/pkg/${{ target }}/*.zip
destinationFolder: $(Build.ArtifactStagingDirectory)/sign/${{ target }}
- script: node build/azure-pipelines/common/sign $(Agent.ToolsDirectory)/esrpclient/*/*/net6.0/esrpcli.dll sign-darwin $(ESRP-PKI) $(esrp-aad-username) $(esrp-aad-password) $(Build.ArtifactStagingDirectory)/pkg "*.zip"
- script: node build/azure-pipelines/common/sign $(Agent.RootDirectory)/_tasks/EsrpCodeSigning_*/*/net6.0/esrpcli.dll sign-darwin $(Build.ArtifactStagingDirectory)/pkg "*.zip"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
displayName: Codesign
- script: node build/azure-pipelines/common/sign $(Agent.ToolsDirectory)/esrpclient/*/*/net6.0/esrpcli.dll notarize-darwin $(ESRP-PKI) $(esrp-aad-username) $(esrp-aad-password) $(Build.ArtifactStagingDirectory)/pkg "*.zip"
- script: node build/azure-pipelines/common/sign $(Agent.RootDirectory)/_tasks/EsrpCodeSigning_*/*/net6.0/esrpcli.dll notarize-darwin $(Build.ArtifactStagingDirectory)/pkg "*.zip"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
displayName: Notarize
- ${{ each target in parameters.VSCODE_CLI_ARTIFACTS }}:
+22 -21
View File
@@ -4,19 +4,29 @@ parameters:
default: []
steps:
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
KeyVaultName: vscode-build-secrets
SecretsFilter: "ESRP-PKI,esrp-aad-username,esrp-aad-password"
- task: UseDotNet@2
inputs:
version: 6.x
- task: EsrpClientTool@1
displayName: "Use ESRP client"
- task: EsrpCodeSigning@5
inputs:
UseMSIAuthentication: true
ConnectedServiceName: vscode-esrp
AppRegistrationClientId: $(ESRP_CLIENT_ID)
AppRegistrationTenantId: $(ESRP_TENANT_ID)
AuthAKVName: vscode-esrp
AuthSignCertName: esrp-sign
FolderPath: .
Pattern: noop
displayName: 'Install ESRP Tooling'
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
$EsrpCodeSigningTool = (gci -directory -filter EsrpCodeSigning_* $(Agent.RootDirectory)\_tasks | Select-Object -last 1).FullName
$Version = (gci -directory $EsrpCodeSigningTool | Select-Object -last 1).FullName
echo "##vso[task.setvariable variable=EsrpCliDllPath]$Version\net6.0\esrpcli.dll"
displayName: Find ESRP CLI
- ${{ each target in parameters.VSCODE_CLI_ARTIFACTS }}:
- task: DownloadPipelineArtifact@2
@@ -31,18 +41,9 @@ steps:
archiveFilePatterns: $(Build.ArtifactStagingDirectory)/pkg/${{ target }}/*.zip
destinationFolder: $(Build.ArtifactStagingDirectory)/sign/${{ target }}
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
$EsrpClientTool = (gci -directory -filter EsrpClientTool_* $(Agent.RootDirectory)\_tasks | Select-Object -last 1).FullName
$EsrpCliZip = (gci -recurse -filter esrpcli.*.zip $EsrpClientTool | Select-Object -last 1).FullName
mkdir -p $(Agent.TempDirectory)\esrpcli
Expand-Archive -Path $EsrpCliZip -DestinationPath $(Agent.TempDirectory)\esrpcli
$EsrpCliDllPath = (gci -recurse -filter esrpcli.dll $(Agent.TempDirectory)\esrpcli | Select-Object -last 1).FullName
echo "##vso[task.setvariable variable=EsrpCliDllPath]$EsrpCliDllPath"
displayName: Find ESRP CLI
- powershell: node build\azure-pipelines\common\sign $env:EsrpCliDllPath sign-windows $(ESRP-PKI) $(esrp-aad-username) $(esrp-aad-password) $(Build.ArtifactStagingDirectory)/sign "*.exe"
- powershell: node build\azure-pipelines\common\sign $env:EsrpCliDllPath sign-windows $(Build.ArtifactStagingDirectory)/sign "*.exe"
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
displayName: Codesign
- ${{ each target in parameters.VSCODE_CLI_ARTIFACTS }}:
@@ -3,12 +3,15 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../product.json'), 'utf8'));
const shasum = crypto.createHash('sha256');
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const crypto_1 = __importDefault(require("crypto"));
const productjson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '../../../product.json'), 'utf8'));
const shasum = crypto_1.default.createHash('sha256');
for (const ext of productjson.builtInExtensions) {
shasum.update(`${ext.name}@${ext.version}`);
}
@@ -3,9 +3,9 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as fs from 'fs';
import * as path from 'path';
import * as crypto from 'crypto';
import fs from 'fs';
import path from 'path';
import crypto from 'crypto';
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../product.json'), 'utf8'));
const shasum = crypto.createHash('sha256');
@@ -3,21 +3,24 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const crypto_1 = __importDefault(require("crypto"));
const { dirs } = require('../../npm/dirs');
const ROOT = path.join(__dirname, '../../../');
const shasum = crypto.createHash('sha256');
shasum.update(fs.readFileSync(path.join(ROOT, 'build/.cachesalt')));
shasum.update(fs.readFileSync(path.join(ROOT, '.npmrc')));
shasum.update(fs.readFileSync(path.join(ROOT, 'build', '.npmrc')));
shasum.update(fs.readFileSync(path.join(ROOT, 'remote', '.npmrc')));
const ROOT = path_1.default.join(__dirname, '../../../');
const shasum = crypto_1.default.createHash('sha256');
shasum.update(fs_1.default.readFileSync(path_1.default.join(ROOT, 'build/.cachesalt')));
shasum.update(fs_1.default.readFileSync(path_1.default.join(ROOT, '.npmrc')));
shasum.update(fs_1.default.readFileSync(path_1.default.join(ROOT, 'build', '.npmrc')));
shasum.update(fs_1.default.readFileSync(path_1.default.join(ROOT, 'remote', '.npmrc')));
// Add `package.json` and `package-lock.json` files
for (const dir of dirs) {
const packageJsonPath = path.join(ROOT, dir, 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
const packageJsonPath = path_1.default.join(ROOT, dir, 'package.json');
const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath).toString());
const relevantPackageJsonSections = {
dependencies: packageJson.dependencies,
devDependencies: packageJson.devDependencies,
@@ -26,8 +29,8 @@ for (const dir of dirs) {
distro: packageJson.distro
};
shasum.update(JSON.stringify(relevantPackageJsonSections));
const packageLockPath = path.join(ROOT, dir, 'package-lock.json');
shasum.update(fs.readFileSync(packageLockPath));
const packageLockPath = path_1.default.join(ROOT, dir, 'package-lock.json');
shasum.update(fs_1.default.readFileSync(packageLockPath));
}
// Add any other command line arguments
for (let i = 2; i < process.argv.length; i++) {
@@ -3,9 +3,9 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as fs from 'fs';
import * as path from 'path';
import * as crypto from 'crypto';
import fs from 'fs';
import path from 'path';
import crypto from 'crypto';
const { dirs } = require('../../npm/dirs');
const ROOT = path.join(__dirname, '../../../');
+1 -1
View File
@@ -40,7 +40,7 @@ async function main() {
assets: [],
updates: {}
};
const aadCredentials = new identity_1.ClientSecretCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], process.env['AZURE_CLIENT_SECRET']);
const aadCredentials = new identity_1.ClientAssertionCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], () => Promise.resolve(process.env['AZURE_ID_TOKEN']));
const client = new cosmos_1.CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT'], aadCredentials });
const scripts = client.database('builds').container(quality).scripts;
await (0, retry_1.retry)(() => scripts.storedProcedure('createBuild').execute('', [{ ...build, _partitionKey: '' }]));
+2 -2
View File
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ClientSecretCredential } from '@azure/identity';
import { ClientAssertionCredential } from '@azure/identity';
import { CosmosClient } from '@azure/cosmos';
import { retry } from './retry';
@@ -47,7 +47,7 @@ async function main(): Promise<void> {
updates: {}
};
const aadCredentials = new ClientSecretCredential(process.env['AZURE_TENANT_ID']!, process.env['AZURE_CLIENT_ID']!, process.env['AZURE_CLIENT_SECRET']!);
const aadCredentials = new ClientAssertionCredential(process.env['AZURE_TENANT_ID']!, process.env['AZURE_CLIENT_ID']!, () => Promise.resolve(process.env['AZURE_ID_TOKEN']!));
const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, aadCredentials });
const scripts = client.database('builds').container(quality).scripts;
await retry(() => scripts.storedProcedure('createBuild').execute('', [{ ...build, _partitionKey: '' }]));
View File
@@ -0,0 +1,47 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getAccessToken = getAccessToken;
const msal_node_1 = require("@azure/msal-node");
function e(name) {
const result = process.env[name];
if (typeof result !== 'string') {
throw new Error(`Missing env: ${name}`);
}
return result;
}
async function getAccessToken(endpoint, tenantId, clientId, idToken) {
const app = new msal_node_1.ConfidentialClientApplication({
auth: {
clientId,
authority: `https://login.microsoftonline.com/${tenantId}`,
clientAssertion: idToken
}
});
const result = await app.acquireTokenByClientCredential({ scopes: [`${endpoint}.default`] });
if (!result) {
throw new Error('Failed to get access token');
}
return {
token: result.accessToken,
expiresOnTimestamp: result.expiresOn.getTime(),
refreshAfterTimestamp: result.refreshOn?.getTime()
};
}
async function main() {
const cosmosDBAccessToken = await getAccessToken(e('AZURE_DOCUMENTDB_ENDPOINT'), e('AZURE_TENANT_ID'), e('AZURE_CLIENT_ID'), e('AZURE_ID_TOKEN'));
const blobServiceAccessToken = await getAccessToken(`https://${e('VSCODE_STAGING_BLOB_STORAGE_ACCOUNT_NAME')}.blob.core.windows.net/`, process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], process.env['AZURE_ID_TOKEN']);
console.log(JSON.stringify({ cosmosDBAccessToken, blobServiceAccessToken }));
}
if (require.main === module) {
main().then(() => {
process.exit(0);
}, err => {
console.error(err);
process.exit(1);
});
}
//# sourceMappingURL=getPublishAuthTokens.js.map
@@ -0,0 +1,54 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { AccessToken } from '@azure/core-auth';
import { ConfidentialClientApplication } from '@azure/msal-node';
function e(name: string): string {
const result = process.env[name];
if (typeof result !== 'string') {
throw new Error(`Missing env: ${name}`);
}
return result;
}
export async function getAccessToken(endpoint: string, tenantId: string, clientId: string, idToken: string): Promise<AccessToken> {
const app = new ConfidentialClientApplication({
auth: {
clientId,
authority: `https://login.microsoftonline.com/${tenantId}`,
clientAssertion: idToken
}
});
const result = await app.acquireTokenByClientCredential({ scopes: [`${endpoint}.default`] });
if (!result) {
throw new Error('Failed to get access token');
}
return {
token: result.accessToken,
expiresOnTimestamp: result.expiresOn!.getTime(),
refreshAfterTimestamp: result.refreshOn?.getTime()
};
}
async function main() {
const cosmosDBAccessToken = await getAccessToken(e('AZURE_DOCUMENTDB_ENDPOINT')!, e('AZURE_TENANT_ID')!, e('AZURE_CLIENT_ID')!, e('AZURE_ID_TOKEN')!);
const blobServiceAccessToken = await getAccessToken(`https://${e('VSCODE_STAGING_BLOB_STORAGE_ACCOUNT_NAME')}.blob.core.windows.net/`, process.env['AZURE_TENANT_ID']!, process.env['AZURE_CLIENT_ID']!, process.env['AZURE_ID_TOKEN']!);
console.log(JSON.stringify({ cosmosDBAccessToken, blobServiceAccessToken }));
}
if (require.main === module) {
main().then(() => {
process.exit(0);
}, err => {
console.error(err);
process.exit(1);
});
}
@@ -3,16 +3,19 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const path = require("path");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
if (process.argv.length !== 3) {
console.error('Usage: node listNodeModules.js OUTPUT_FILE');
process.exit(-1);
}
const ROOT = path.join(__dirname, '../../../');
const ROOT = path_1.default.join(__dirname, '../../../');
function findNodeModulesFiles(location, inNodeModules, result) {
const entries = fs.readdirSync(path.join(ROOT, location));
const entries = fs_1.default.readdirSync(path_1.default.join(ROOT, location));
for (const entry of entries) {
const entryPath = `${location}/${entry}`;
if (/(^\/out)|(^\/src$)|(^\/.git$)|(^\/.build$)/.test(entryPath)) {
@@ -20,7 +23,7 @@ function findNodeModulesFiles(location, inNodeModules, result) {
}
let stat;
try {
stat = fs.statSync(path.join(ROOT, entryPath));
stat = fs_1.default.statSync(path_1.default.join(ROOT, entryPath));
}
catch (err) {
continue;
@@ -37,5 +40,5 @@ function findNodeModulesFiles(location, inNodeModules, result) {
}
const result = [];
findNodeModulesFiles('', false, result);
fs.writeFileSync(process.argv[2], result.join('\n') + '\n');
fs_1.default.writeFileSync(process.argv[2], result.join('\n') + '\n');
//# sourceMappingURL=listNodeModules.js.map
@@ -3,8 +3,8 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as fs from 'fs';
import * as path from 'path';
import fs from 'fs';
import path from 'path';
if (process.argv.length !== 3) {
console.error('Usage: node listNodeModules.js OUTPUT_FILE');
+352 -267
View File
@@ -3,19 +3,25 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const path = require("path");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const stream_1 = require("stream");
const promises_1 = require("node:stream/promises");
const yauzl = require("yauzl");
const crypto = require("crypto");
const yauzl_1 = __importDefault(require("yauzl"));
const crypto_1 = __importDefault(require("crypto"));
const retry_1 = require("./retry");
const cosmos_1 = require("@azure/cosmos");
const identity_1 = require("@azure/identity");
const cp = require("child_process");
const os = require("os");
const child_process_1 = __importDefault(require("child_process"));
const os_1 = __importDefault(require("os"));
const node_worker_threads_1 = require("node:worker_threads");
const msal_node_1 = require("@azure/msal-node");
const storage_blob_1 = require("@azure/storage-blob");
const jws_1 = __importDefault(require("jws"));
const node_timers_1 = require("node:timers");
function e(name) {
const result = process.env[name];
if (typeof result !== 'string') {
@@ -23,260 +29,264 @@ function e(name) {
}
return result;
}
class Temp {
_files = [];
tmpNameSync() {
const file = path.join(os.tmpdir(), crypto.randomBytes(20).toString('hex'));
this._files.push(file);
return file;
}
dispose() {
for (const file of this._files) {
try {
fs.unlinkSync(file);
}
catch (err) {
// noop
}
}
}
}
function isCreateProvisionedFilesErrorResponse(response) {
return response?.ErrorDetails?.Code !== undefined;
}
class ProvisionService {
log;
accessToken;
constructor(log, accessToken) {
this.log = log;
this.accessToken = accessToken;
}
async provision(releaseId, fileId, fileName) {
const body = JSON.stringify({
ReleaseId: releaseId,
PortalName: 'VSCode',
PublisherCode: 'VSCode',
ProvisionedFilesCollection: [{
PublisherKey: fileId,
IsStaticFriendlyFileName: true,
FriendlyFileName: fileName,
MaxTTL: '1440',
CdnMappings: ['ECN']
}]
});
this.log(`Provisioning ${fileName} (releaseId: ${releaseId}, fileId: ${fileId})...`);
const res = await (0, retry_1.retry)(() => this.request('POST', '/api/v2/ProvisionedFiles/CreateProvisionedFiles', { body }));
if (isCreateProvisionedFilesErrorResponse(res) && res.ErrorDetails.Code === 'FriendlyFileNameAlreadyProvisioned') {
this.log(`File already provisioned (most likley due to a re-run), skipping: ${fileName}`);
return;
}
if (!res.IsSuccess) {
throw new Error(`Failed to submit provisioning request: ${JSON.stringify(res.ErrorDetails)}`);
}
this.log(`Successfully provisioned ${fileName}`);
}
async request(method, url, options) {
const opts = {
method,
body: options?.body,
headers: {
Authorization: `Bearer ${this.accessToken}`,
'Content-Type': 'application/json'
}
};
const res = await fetch(`https://dsprovisionapi.microsoft.com${url}`, opts);
// 400 normally means the request is bad or something is already provisioned, so we will return as retries are useless
// Otherwise log the text body and headers. We do text because some responses are not JSON.
if ((!res.ok || res.status < 200 || res.status >= 500) && res.status !== 400) {
throw new Error(`Unexpected status code: ${res.status}\nResponse Headers: ${JSON.stringify(res.headers)}\nBody Text: ${await res.text()}`);
}
return await res.json();
}
}
function hashStream(hashName, stream) {
return new Promise((c, e) => {
const shasum = crypto.createHash(hashName);
const shasum = crypto_1.default.createHash(hashName);
stream
.on('data', shasum.update.bind(shasum))
.on('error', e)
.on('close', () => c(shasum.digest('hex')));
.on('close', () => c(shasum.digest()));
});
}
class ESRPClient {
log;
tmp;
authPath;
constructor(log, tmp, tenantId, clientId, authCertSubjectName, requestSigningCertSubjectName) {
this.log = log;
this.tmp = tmp;
this.authPath = this.tmp.tmpNameSync();
fs.writeFileSync(this.authPath, JSON.stringify({
Version: '1.0.0',
AuthenticationType: 'AAD_CERT',
TenantId: tenantId,
ClientId: clientId,
AuthCert: {
SubjectName: authCertSubjectName,
StoreLocation: 'LocalMachine',
StoreName: 'My',
SendX5c: 'true'
},
RequestSigningCert: {
SubjectName: requestSigningCertSubjectName,
StoreLocation: 'LocalMachine',
StoreName: 'My'
}
}));
}
async release(version, filePath) {
this.log(`Submitting release for ${version}: ${filePath}`);
const submitReleaseResult = await this.SubmitRelease(version, filePath);
if (submitReleaseResult.submissionResponse.statusCode !== 'pass') {
throw new Error(`Unexpected status code: ${submitReleaseResult.submissionResponse.statusCode}`);
}
const releaseId = submitReleaseResult.submissionResponse.operationId;
this.log(`Successfully submitted release ${releaseId}. Polling for completion...`);
let details;
// Poll every 5 seconds, wait 60 minutes max -> poll 60/5*60=720 times
for (let i = 0; i < 720; i++) {
details = await this.ReleaseDetails(releaseId);
if (details.releaseDetails[0].statusCode === 'pass') {
break;
}
else if (details.releaseDetails[0].statusCode !== 'inprogress') {
throw new Error(`Failed to submit release: ${JSON.stringify(details)}`);
}
await new Promise(c => setTimeout(c, 5000));
}
if (details.releaseDetails[0].statusCode !== 'pass') {
throw new Error(`Timed out waiting for release ${releaseId}: ${JSON.stringify(details)}`);
}
const fileId = details.releaseDetails[0].fileDetails[0].publisherKey;
this.log('Release completed successfully with fileId: ', fileId);
return { releaseId, fileId };
}
async SubmitRelease(version, filePath) {
const policyPath = this.tmp.tmpNameSync();
fs.writeFileSync(policyPath, JSON.stringify({
Version: '1.0.0',
Audience: 'InternalLimited',
Intent: 'distribution',
ContentType: 'InstallPackage'
}));
const inputPath = this.tmp.tmpNameSync();
const size = fs.statSync(filePath).size;
const istream = fs.createReadStream(filePath);
const sha256 = await hashStream('sha256', istream);
fs.writeFileSync(inputPath, JSON.stringify({
Version: '1.0.0',
ReleaseInfo: {
ReleaseMetadata: {
Title: 'VS Code',
Properties: {
ReleaseContentType: 'InstallPackage'
},
MinimumNumberOfApprovers: 1
},
ProductInfo: {
Name: 'VS Code',
Version: version,
Description: path.basename(filePath, path.extname(filePath)),
},
Owners: [
{
Owner: {
UserPrincipalName: 'jomo@microsoft.com'
}
}
],
Approvers: [
{
Approver: {
UserPrincipalName: 'jomo@microsoft.com'
},
IsAutoApproved: true,
IsMandatory: false
}
],
AccessPermissions: {
MainPublisher: 'VSCode',
ChannelDownloadEntityDetails: {
Consumer: ['VSCode']
}
},
CreatedBy: {
UserPrincipalName: 'jomo@microsoft.com'
}
},
ReleaseBatches: [
{
ReleaseRequestFiles: [
{
SizeInBytes: size,
SourceHash: sha256,
HashType: 'SHA256',
SourceLocation: path.basename(filePath)
}
],
SourceLocationType: 'UNC',
SourceRootDirectory: path.dirname(filePath),
DestinationLocationType: 'AzureBlob'
}
]
}));
const outputPath = this.tmp.tmpNameSync();
cp.execSync(`ESRPClient SubmitRelease -a ${this.authPath} -p ${policyPath} -i ${inputPath} -o ${outputPath}`, { stdio: 'inherit' });
const output = fs.readFileSync(outputPath, 'utf8');
return JSON.parse(output);
}
async ReleaseDetails(releaseId) {
const inputPath = this.tmp.tmpNameSync();
fs.writeFileSync(inputPath, JSON.stringify({
Version: '1.0.0',
OperationIds: [releaseId]
}));
const outputPath = this.tmp.tmpNameSync();
cp.execSync(`ESRPClient ReleaseDetails -a ${this.authPath} -i ${inputPath} -o ${outputPath}`, { stdio: 'inherit' });
const output = fs.readFileSync(outputPath, 'utf8');
return JSON.parse(output);
}
var StatusCode;
(function (StatusCode) {
StatusCode["Pass"] = "pass";
StatusCode["Aborted"] = "aborted";
StatusCode["Inprogress"] = "inprogress";
StatusCode["FailCanRetry"] = "failCanRetry";
StatusCode["FailDoNotRetry"] = "failDoNotRetry";
StatusCode["PendingAnalysis"] = "pendingAnalysis";
StatusCode["Cancelled"] = "cancelled";
})(StatusCode || (StatusCode = {}));
function getCertificateBuffer(input) {
return Buffer.from(input.replace(/-----BEGIN CERTIFICATE-----|-----END CERTIFICATE-----|\n/g, ''), 'base64');
}
async function releaseAndProvision(log, releaseTenantId, releaseClientId, releaseAuthCertSubjectName, releaseRequestSigningCertSubjectName, provisionTenantId, provisionAADUsername, provisionAADPassword, version, quality, filePath) {
const fileName = `${quality}/${version}/${path.basename(filePath)}`;
const result = `${e('PRSS_CDN_URL')}/${fileName}`;
const res = await (0, retry_1.retry)(() => fetch(result));
if (res.status === 200) {
log(`Already released and provisioned: ${result}`);
function getThumbprint(input, algorithm) {
const buffer = getCertificateBuffer(input);
return crypto_1.default.createHash(algorithm).update(buffer).digest();
}
function getKeyFromPFX(pfx) {
const pfxCertificatePath = path_1.default.join(os_1.default.tmpdir(), 'cert.pfx');
const pemKeyPath = path_1.default.join(os_1.default.tmpdir(), 'key.pem');
try {
const pfxCertificate = Buffer.from(pfx, 'base64');
fs_1.default.writeFileSync(pfxCertificatePath, pfxCertificate);
child_process_1.default.execSync(`openssl pkcs12 -in "${pfxCertificatePath}" -nocerts -nodes -out "${pemKeyPath}" -passin pass:`);
const raw = fs_1.default.readFileSync(pemKeyPath, 'utf-8');
const result = raw.match(/-----BEGIN PRIVATE KEY-----[\s\S]+?-----END PRIVATE KEY-----/g)[0];
return result;
}
const tmp = new Temp();
process.on('exit', () => tmp.dispose());
const esrpclient = new ESRPClient(log, tmp, releaseTenantId, releaseClientId, releaseAuthCertSubjectName, releaseRequestSigningCertSubjectName);
const release = await esrpclient.release(version, filePath);
const credential = new identity_1.ClientSecretCredential(provisionTenantId, provisionAADUsername, provisionAADPassword);
const accessToken = await credential.getToken(['https://microsoft.onmicrosoft.com/DS.Provisioning.WebApi/.default']);
const service = new ProvisionService(log, accessToken.token);
await service.provision(release.releaseId, release.fileId, fileName);
return result;
finally {
fs_1.default.rmSync(pfxCertificatePath, { force: true });
fs_1.default.rmSync(pemKeyPath, { force: true });
}
}
function getCertificatesFromPFX(pfx) {
const pfxCertificatePath = path_1.default.join(os_1.default.tmpdir(), 'cert.pfx');
const pemCertificatePath = path_1.default.join(os_1.default.tmpdir(), 'cert.pem');
try {
const pfxCertificate = Buffer.from(pfx, 'base64');
fs_1.default.writeFileSync(pfxCertificatePath, pfxCertificate);
child_process_1.default.execSync(`openssl pkcs12 -in "${pfxCertificatePath}" -nokeys -out "${pemCertificatePath}" -passin pass:`);
const raw = fs_1.default.readFileSync(pemCertificatePath, 'utf-8');
const matches = raw.match(/-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/g);
return matches ? matches.reverse() : [];
}
finally {
fs_1.default.rmSync(pfxCertificatePath, { force: true });
fs_1.default.rmSync(pemCertificatePath, { force: true });
}
}
class ESRPReleaseService {
log;
clientId;
accessToken;
requestSigningCertificates;
requestSigningKey;
containerClient;
stagingSasToken;
static async create(log, tenantId, clientId, authCertificatePfx, requestSigningCertificatePfx, containerClient, stagingSasToken) {
const authKey = getKeyFromPFX(authCertificatePfx);
const authCertificate = getCertificatesFromPFX(authCertificatePfx)[0];
const requestSigningKey = getKeyFromPFX(requestSigningCertificatePfx);
const requestSigningCertificates = getCertificatesFromPFX(requestSigningCertificatePfx);
const app = new msal_node_1.ConfidentialClientApplication({
auth: {
clientId,
authority: `https://login.microsoftonline.com/${tenantId}`,
clientCertificate: {
thumbprintSha256: getThumbprint(authCertificate, 'sha256').toString('hex'),
privateKey: authKey,
x5c: authCertificate
}
}
});
const response = await app.acquireTokenByClientCredential({
scopes: ['https://api.esrp.microsoft.com/.default']
});
return new ESRPReleaseService(log, clientId, response.accessToken, requestSigningCertificates, requestSigningKey, containerClient, stagingSasToken);
}
static API_URL = 'https://api.esrp.microsoft.com/api/v3/releaseservices/clients/';
constructor(log, clientId, accessToken, requestSigningCertificates, requestSigningKey, containerClient, stagingSasToken) {
this.log = log;
this.clientId = clientId;
this.accessToken = accessToken;
this.requestSigningCertificates = requestSigningCertificates;
this.requestSigningKey = requestSigningKey;
this.containerClient = containerClient;
this.stagingSasToken = stagingSasToken;
}
async createRelease(version, filePath, friendlyFileName) {
const correlationId = crypto_1.default.randomUUID();
const blobClient = this.containerClient.getBlockBlobClient(correlationId);
this.log(`Uploading ${filePath} to ${blobClient.url}`);
await blobClient.uploadFile(filePath);
this.log('Uploaded blob successfully');
try {
this.log(`Submitting release for ${version}: ${filePath}`);
const submitReleaseResult = await this.submitRelease(version, filePath, friendlyFileName, correlationId, blobClient);
this.log(`Successfully submitted release ${submitReleaseResult.operationId}. Polling for completion...`);
// Poll every 5 seconds, wait 60 minutes max -> poll 60/5*60=720 times
for (let i = 0; i < 720; i++) {
await new Promise(c => setTimeout(c, 5000));
const releaseStatus = await this.getReleaseStatus(submitReleaseResult.operationId);
if (releaseStatus.status === 'pass') {
break;
}
else if (releaseStatus.status === 'aborted') {
this.log(JSON.stringify(releaseStatus));
throw new Error(`Release was aborted`);
}
else if (releaseStatus.status !== 'inprogress') {
this.log(JSON.stringify(releaseStatus));
throw new Error(`Unknown error when polling for release`);
}
}
const releaseDetails = await this.getReleaseDetails(submitReleaseResult.operationId);
if (releaseDetails.status !== 'pass') {
throw new Error(`Timed out waiting for release: ${JSON.stringify(releaseDetails)}`);
}
this.log('Successfully created release:', releaseDetails.files[0].fileDownloadDetails[0].downloadUrl);
return releaseDetails.files[0].fileDownloadDetails[0].downloadUrl;
}
finally {
this.log(`Deleting blob ${blobClient.url}`);
await blobClient.delete();
this.log('Deleted blob successfully');
}
}
async submitRelease(version, filePath, friendlyFileName, correlationId, blobClient) {
const size = fs_1.default.statSync(filePath).size;
const hash = await hashStream('sha256', fs_1.default.createReadStream(filePath));
const blobUrl = `${blobClient.url}?${this.stagingSasToken}`;
const message = {
customerCorrelationId: correlationId,
esrpCorrelationId: correlationId,
driEmail: ['joao.moreno@microsoft.com'],
createdBy: { userPrincipalName: 'jomo@microsoft.com' },
owners: [{ owner: { userPrincipalName: 'jomo@microsoft.com' } }],
approvers: [{ approver: { userPrincipalName: 'jomo@microsoft.com' }, isAutoApproved: true, isMandatory: false }],
releaseInfo: {
title: 'VS Code',
properties: {
'ReleaseContentType': 'InstallPackage'
},
minimumNumberOfApprovers: 1
},
productInfo: {
name: 'VS Code',
version,
description: 'VS Code'
},
accessPermissionsInfo: {
mainPublisher: 'VSCode',
channelDownloadEntityDetails: {
AllDownloadEntities: ['VSCode']
}
},
routingInfo: {
intent: 'filedownloadlinkgeneration'
},
files: [{
name: path_1.default.basename(filePath),
friendlyFileName,
tenantFileLocation: blobUrl,
tenantFileLocationType: 'AzureBlob',
sourceLocation: {
type: 'azureBlob',
blobUrl
},
hashType: 'sha256',
hash: Array.from(hash),
sizeInBytes: size
}]
};
message.jwsToken = await this.generateJwsToken(message);
const res = await fetch(`${ESRPReleaseService.API_URL}${this.clientId}/workflows/release/operations`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.accessToken}`
},
body: JSON.stringify(message)
});
if (!res.ok) {
const text = await res.text();
throw new Error(`Failed to submit release: ${res.statusText}\n${text}`);
}
return await res.json();
}
async getReleaseStatus(releaseId) {
const url = `${ESRPReleaseService.API_URL}${this.clientId}/workflows/release/operations/grs/${releaseId}`;
const res = await fetch(url, {
headers: {
'Authorization': `Bearer ${this.accessToken}`
}
});
if (!res.ok) {
const text = await res.text();
throw new Error(`Failed to get release status: ${res.statusText}\n${text}`);
}
return await res.json();
}
async getReleaseDetails(releaseId) {
const url = `${ESRPReleaseService.API_URL}${this.clientId}/workflows/release/operations/grd/${releaseId}`;
const res = await fetch(url, {
headers: {
'Authorization': `Bearer ${this.accessToken}`
}
});
if (!res.ok) {
const text = await res.text();
throw new Error(`Failed to get release status: ${res.statusText}\n${text}`);
}
return await res.json();
}
async generateJwsToken(message) {
return jws_1.default.sign({
header: {
alg: 'RS256',
crit: ['exp', 'x5t'],
// Release service uses ticks, not seconds :roll_eyes: (https://stackoverflow.com/a/7968483)
exp: ((Date.now() + (6 * 60 * 1000)) * 10000) + 621355968000000000,
// Release service uses hex format, not base64url :roll_eyes:
x5t: getThumbprint(this.requestSigningCertificates[0], 'sha1').toString('hex'),
// Release service uses a '.' separated string, not an array of strings :roll_eyes:
x5c: this.requestSigningCertificates.map(c => getCertificateBuffer(c).toString('base64url')).join('.'),
},
payload: message,
privateKey: this.requestSigningKey,
});
}
}
class State {
statePath;
set = new Set();
constructor() {
const pipelineWorkspacePath = e('PIPELINE_WORKSPACE');
const previousState = fs.readdirSync(pipelineWorkspacePath)
const previousState = fs_1.default.readdirSync(pipelineWorkspacePath)
.map(name => /^artifacts_processed_(\d+)$/.exec(name))
.filter((match) => !!match)
.map(match => ({ name: match[0], attempt: Number(match[1]) }))
.sort((a, b) => b.attempt - a.attempt)[0];
if (previousState) {
const previousStatePath = path.join(pipelineWorkspacePath, previousState.name, previousState.name + '.txt');
fs.readFileSync(previousStatePath, 'utf8').split(/\n/).filter(name => !!name).forEach(name => this.set.add(name));
const previousStatePath = path_1.default.join(pipelineWorkspacePath, previousState.name, previousState.name + '.txt');
fs_1.default.readFileSync(previousStatePath, 'utf8').split(/\n/).filter(name => !!name).forEach(name => this.set.add(name));
}
const stageAttempt = e('SYSTEM_STAGEATTEMPT');
this.statePath = path.join(pipelineWorkspacePath, `artifacts_processed_${stageAttempt}`, `artifacts_processed_${stageAttempt}.txt`);
fs.mkdirSync(path.dirname(this.statePath), { recursive: true });
fs.writeFileSync(this.statePath, [...this.set.values()].map(name => `${name}\n`).join(''));
this.statePath = path_1.default.join(pipelineWorkspacePath, `artifacts_processed_${stageAttempt}`, `artifacts_processed_${stageAttempt}.txt`);
fs_1.default.mkdirSync(path_1.default.dirname(this.statePath), { recursive: true });
fs_1.default.writeFileSync(this.statePath, [...this.set.values()].map(name => `${name}\n`).join(''));
}
get size() {
return this.set.size;
@@ -286,7 +296,7 @@ class State {
}
add(name) {
this.set.add(name);
fs.appendFileSync(this.statePath, `${name}\n`);
fs_1.default.appendFileSync(this.statePath, `${name}\n`);
}
[Symbol.iterator]() {
return this.set[Symbol.iterator]();
@@ -332,7 +342,7 @@ async function downloadArtifact(artifact, downloadPath) {
if (!res.ok) {
throw new Error(`Unexpected status code: ${res.status}`);
}
await (0, promises_1.pipeline)(stream_1.Readable.fromWeb(res.body), fs.createWriteStream(downloadPath));
await (0, promises_1.pipeline)(stream_1.Readable.fromWeb(res.body), fs_1.default.createWriteStream(downloadPath));
}
finally {
clearTimeout(timeout);
@@ -340,7 +350,7 @@ async function downloadArtifact(artifact, downloadPath) {
}
async function unzip(packagePath, outputPath) {
return new Promise((resolve, reject) => {
yauzl.open(packagePath, { lazyEntries: true, autoClose: true }, (err, zipfile) => {
yauzl_1.default.open(packagePath, { lazyEntries: true, autoClose: true }, (err, zipfile) => {
if (err) {
return reject(err);
}
@@ -354,9 +364,9 @@ async function unzip(packagePath, outputPath) {
if (err) {
return reject(err);
}
const filePath = path.join(outputPath, entry.fileName);
fs.mkdirSync(path.dirname(filePath), { recursive: true });
const ostream = fs.createWriteStream(filePath);
const filePath = path_1.default.join(outputPath, entry.fileName);
fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
const ostream = fs_1.default.createWriteStream(filePath);
ostream.on('finish', () => {
result.push(filePath);
zipfile.readEntry();
@@ -473,33 +483,102 @@ function getRealType(type) {
return type;
}
}
async function processArtifact(artifact, artifactFilePath) {
async function withLease(client, fn) {
const lease = client.getBlobLeaseClient();
for (let i = 0; i < 360; i++) { // Try to get lease for 30 minutes
try {
await client.uploadData(new ArrayBuffer()); // blob needs to exist for lease to be acquired
await lease.acquireLease(60);
try {
const abortController = new AbortController();
const refresher = new Promise((c, e) => {
abortController.signal.onabort = () => {
(0, node_timers_1.clearInterval)(interval);
c();
};
const interval = (0, node_timers_1.setInterval)(() => {
lease.renewLease().catch(err => {
(0, node_timers_1.clearInterval)(interval);
e(new Error('Failed to renew lease ' + err));
});
}, 30_000);
});
const result = await Promise.race([fn(), refresher]);
abortController.abort();
return result;
}
finally {
await lease.releaseLease();
}
}
catch (err) {
if (err.statusCode !== 409 && err.statusCode !== 412) {
throw err;
}
await new Promise(c => setTimeout(c, 5000));
}
}
throw new Error('Failed to acquire lease on blob after 30 minutes');
}
async function processArtifact(artifact, filePath) {
const log = (...args) => console.log(`[${artifact.name}]`, ...args);
const match = /^vscode_(?<product>[^_]+)_(?<os>[^_]+)(?:_legacy)?_(?<arch>[^_]+)_(?<unprocessedType>[^_]+)$/.exec(artifact.name);
if (!match) {
throw new Error(`Invalid artifact name: ${artifact.name}`);
}
// getPlatform needs the unprocessedType
const { cosmosDBAccessToken, blobServiceAccessToken } = JSON.parse(e('PUBLISH_AUTH_TOKENS'));
const quality = e('VSCODE_QUALITY');
const commit = e('BUILD_SOURCEVERSION');
const { product, os, arch, unprocessedType } = match.groups;
const isLegacy = artifact.name.includes('_legacy');
const platform = getPlatform(product, os, arch, unprocessedType, isLegacy);
const type = getRealType(unprocessedType);
const size = fs.statSync(artifactFilePath).size;
const stream = fs.createReadStream(artifactFilePath);
const [hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]); // CodeQL [SM04514] Using SHA1 only for legacy reasons, we are actually only respecting SHA256
const url = await releaseAndProvision(log, e('RELEASE_TENANT_ID'), e('RELEASE_CLIENT_ID'), e('RELEASE_AUTH_CERT_SUBJECT_NAME'), e('RELEASE_REQUEST_SIGNING_CERT_SUBJECT_NAME'), e('PROVISION_TENANT_ID'), e('PROVISION_AAD_USERNAME'), e('PROVISION_AAD_PASSWORD'), commit, quality, artifactFilePath);
const asset = { platform, type, url, hash, sha256hash, size, supportsFastUpdate: true };
log('Creating asset...', JSON.stringify(asset, undefined, 2));
await (0, retry_1.retry)(async (attempt) => {
log(`Creating asset in Cosmos DB (attempt ${attempt})...`);
const aadCredentials = new identity_1.ClientSecretCredential(e('AZURE_TENANT_ID'), e('AZURE_CLIENT_ID'), e('AZURE_CLIENT_SECRET'));
const client = new cosmos_1.CosmosClient({ endpoint: e('AZURE_DOCUMENTDB_ENDPOINT'), aadCredentials });
const scripts = client.database('builds').container(quality).scripts;
await scripts.storedProcedure('createAsset').execute('', [commit, asset, true]);
const version = e('BUILD_SOURCEVERSION');
const friendlyFileName = `${quality}/${version}/${path_1.default.basename(filePath)}`;
const blobServiceClient = new storage_blob_1.BlobServiceClient(`https://${e('VSCODE_STAGING_BLOB_STORAGE_ACCOUNT_NAME')}.blob.core.windows.net/`, { getToken: async () => blobServiceAccessToken });
const leasesContainerClient = blobServiceClient.getContainerClient('leases');
await leasesContainerClient.createIfNotExists();
const leaseBlobClient = leasesContainerClient.getBlockBlobClient(friendlyFileName);
log(`Acquiring lease for: ${friendlyFileName}`);
await withLease(leaseBlobClient, async () => {
log(`Successfully acquired lease for: ${friendlyFileName}`);
const url = `${e('PRSS_CDN_URL')}/${friendlyFileName}`;
const res = await (0, retry_1.retry)(() => fetch(url));
if (res.status === 200) {
log(`Already released and provisioned: ${url}`);
}
else {
const stagingContainerClient = blobServiceClient.getContainerClient('staging');
await stagingContainerClient.createIfNotExists();
const now = new Date().valueOf();
const oneHour = 60 * 60 * 1000;
const oneHourAgo = new Date(now - oneHour);
const oneHourFromNow = new Date(now + oneHour);
const userDelegationKey = await blobServiceClient.getUserDelegationKey(oneHourAgo, oneHourFromNow);
const sasOptions = { containerName: 'staging', permissions: storage_blob_1.ContainerSASPermissions.from({ read: true }), startsOn: oneHourAgo, expiresOn: oneHourFromNow };
const stagingSasToken = (0, storage_blob_1.generateBlobSASQueryParameters)(sasOptions, userDelegationKey, e('VSCODE_STAGING_BLOB_STORAGE_ACCOUNT_NAME')).toString();
const releaseService = await ESRPReleaseService.create(log, e('RELEASE_TENANT_ID'), e('RELEASE_CLIENT_ID'), e('RELEASE_AUTH_CERT'), e('RELEASE_REQUEST_SIGNING_CERT'), stagingContainerClient, stagingSasToken);
await releaseService.createRelease(version, filePath, friendlyFileName);
}
const { product, os, arch, unprocessedType } = match.groups;
const isLegacy = artifact.name.includes('_legacy');
const platform = getPlatform(product, os, arch, unprocessedType, isLegacy);
const type = getRealType(unprocessedType);
const size = fs_1.default.statSync(filePath).size;
const stream = fs_1.default.createReadStream(filePath);
const [hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]); // CodeQL [SM04514] Using SHA1 only for legacy reasons, we are actually only respecting SHA256
const asset = { platform, type, url, hash: hash.toString('hex'), sha256hash: sha256hash.toString('hex'), size, supportsFastUpdate: true };
log('Creating asset...');
const result = await (0, retry_1.retry)(async (attempt) => {
log(`Creating asset in Cosmos DB (attempt ${attempt})...`);
const client = new cosmos_1.CosmosClient({ endpoint: e('AZURE_DOCUMENTDB_ENDPOINT'), tokenProvider: () => Promise.resolve(`type=aad&ver=1.0&sig=${cosmosDBAccessToken.token}`) });
const scripts = client.database('builds').container(quality).scripts;
const { resource: result } = await scripts.storedProcedure('createAsset').execute('', [version, asset, true]);
return result;
});
if (result === 'already exists') {
log('Asset already exists!');
}
else {
log('Asset successfully created: ', JSON.stringify(asset, undefined, 2));
}
});
log('Asset successfully created');
log(`Successfully released lease for: ${friendlyFileName}`);
}
// It is VERY important that we don't download artifacts too much too fast from AZDO.
// AZDO throttles us SEVERELY if we do. Not just that, but they also close open
@@ -518,7 +597,13 @@ async function main() {
for (const name of done) {
console.log(`\u2705 ${name}`);
}
const stages = new Set(['Compile', 'CompileCLI']);
const stages = new Set(['Compile']);
if (e('VSCODE_BUILD_STAGE_LINUX') === 'True' ||
e('VSCODE_BUILD_STAGE_ALPINE') === 'True' ||
e('VSCODE_BUILD_STAGE_MACOS') === 'True' ||
e('VSCODE_BUILD_STAGE_WINDOWS') === 'True') {
stages.add('CompileCLI');
}
if (e('VSCODE_BUILD_STAGE_WINDOWS') === 'True') {
stages.add('Windows');
}
@@ -561,12 +646,12 @@ async function main() {
continue;
}
console.log(`[${artifact.name}] Found new artifact`);
const artifactZipPath = path.join(e('AGENT_TEMPDIRECTORY'), `${artifact.name}.zip`);
const artifactZipPath = path_1.default.join(e('AGENT_TEMPDIRECTORY'), `${artifact.name}.zip`);
await (0, retry_1.retry)(async (attempt) => {
const start = Date.now();
console.log(`[${artifact.name}] Downloading (attempt ${attempt})...`);
await downloadArtifact(artifact, artifactZipPath);
const archiveSize = fs.statSync(artifactZipPath).size;
const archiveSize = fs_1.default.statSync(artifactZipPath).size;
const downloadDurationS = (Date.now() - start) / 1000;
const downloadSpeedKBS = Math.round((archiveSize / 1024) / downloadDurationS);
console.log(`[${artifact.name}] Successfully downloaded after ${Math.floor(downloadDurationS)} seconds(${downloadSpeedKBS} KB/s).`);
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -31,7 +31,7 @@ async function getConfig(client, quality) {
async function main(force) {
const commit = getEnv('BUILD_SOURCEVERSION');
const quality = getEnv('VSCODE_QUALITY');
const aadCredentials = new identity_1.ClientSecretCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], process.env['AZURE_CLIENT_SECRET']);
const aadCredentials = new identity_1.ClientAssertionCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], () => Promise.resolve(process.env['AZURE_ID_TOKEN']));
const client = new cosmos_1.CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT'], aadCredentials });
if (!force) {
const config = await getConfig(client, quality);
+2 -2
View File
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ClientSecretCredential } from '@azure/identity';
import { ClientAssertionCredential } from '@azure/identity';
import { CosmosClient } from '@azure/cosmos';
import { retry } from './retry';
@@ -45,7 +45,7 @@ async function main(force: boolean): Promise<void> {
const commit = getEnv('BUILD_SOURCEVERSION');
const quality = getEnv('VSCODE_QUALITY');
const aadCredentials = new ClientSecretCredential(process.env['AZURE_TENANT_ID']!, process.env['AZURE_CLIENT_ID']!, process.env['AZURE_CLIENT_SECRET']!);
const aadCredentials = new ClientAssertionCredential(process.env['AZURE_TENANT_ID']!, process.env['AZURE_CLIENT_ID']!, () => Promise.resolve(process.env['AZURE_ID_TOKEN']!));
const client = new CosmosClient({ endpoint: process.env['AZURE_DOCUMENTDB_ENDPOINT']!, aadCredentials });
if (!force) {
+6 -6
View File
@@ -3,16 +3,16 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sign_1 = require("./sign");
const path = require("path");
const path_1 = __importDefault(require("path"));
(0, sign_1.main)([
process.env['EsrpCliDllPath'],
'sign-windows',
process.env['ESRPPKI'],
process.env['ESRPAADUsername'],
process.env['ESRPAADPassword'],
path.dirname(process.argv[2]),
path.basename(process.argv[2])
path_1.default.dirname(process.argv[2]),
path_1.default.basename(process.argv[2])
]);
//# sourceMappingURL=sign-win32.js.map
+1 -4
View File
@@ -4,14 +4,11 @@
*--------------------------------------------------------------------------------------------*/
import { main } from './sign';
import * as path from 'path';
import path from 'path';
main([
process.env['EsrpCliDllPath']!,
'sign-windows',
process.env['ESRPPKI']!,
process.env['ESRPAADUsername']!,
process.env['ESRPAADPassword']!,
path.dirname(process.argv[2]),
path.basename(process.argv[2])
]);
+63 -29
View File
@@ -3,25 +3,28 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Temp = void 0;
exports.main = main;
const cp = require("child_process");
const fs = require("fs");
const crypto = require("crypto");
const path = require("path");
const os = require("os");
const child_process_1 = __importDefault(require("child_process"));
const fs_1 = __importDefault(require("fs"));
const crypto_1 = __importDefault(require("crypto"));
const path_1 = __importDefault(require("path"));
const os_1 = __importDefault(require("os"));
class Temp {
_files = [];
tmpNameSync() {
const file = path.join(os.tmpdir(), crypto.randomBytes(20).toString('hex'));
const file = path_1.default.join(os_1.default.tmpdir(), crypto_1.default.randomBytes(20).toString('hex'));
this._files.push(file);
return file;
}
dispose() {
for (const file of this._files) {
try {
fs.unlinkSync(file);
fs_1.default.unlinkSync(file);
}
catch (err) {
// noop
@@ -105,37 +108,61 @@ function getParams(type) {
toolName: 'sign',
toolVersion: '1.0'
}];
case 'nuget':
return [{
keyCode: 'CP-401405',
operationSetCode: 'NuGetSign',
parameters: [],
toolName: 'sign',
toolVersion: '1.0'
}, {
keyCode: 'CP-401405',
operationSetCode: 'NuGetVerify',
parameters: [],
toolName: 'sign',
toolVersion: '1.0'
}];
default:
throw new Error(`Sign type ${type} not found`);
}
}
function main([esrpCliPath, type, cert, username, password, folderPath, pattern]) {
function main([esrpCliPath, type, folderPath, pattern]) {
const tmp = new Temp();
process.on('exit', () => tmp.dispose());
const key = crypto_1.default.randomBytes(32);
const iv = crypto_1.default.randomBytes(16);
const cipher = crypto_1.default.createCipheriv('aes-256-cbc', key, iv);
const encryptedToken = cipher.update(process.env['SYSTEM_ACCESSTOKEN'].trim(), 'utf8', 'hex') + cipher.final('hex');
const encryptionDetailsPath = tmp.tmpNameSync();
fs_1.default.writeFileSync(encryptionDetailsPath, JSON.stringify({ key: key.toString('hex'), iv: iv.toString('hex') }));
const encryptedTokenPath = tmp.tmpNameSync();
fs_1.default.writeFileSync(encryptedTokenPath, encryptedToken);
const patternPath = tmp.tmpNameSync();
fs.writeFileSync(patternPath, pattern);
fs_1.default.writeFileSync(patternPath, pattern);
const paramsPath = tmp.tmpNameSync();
fs.writeFileSync(paramsPath, JSON.stringify(getParams(type)));
const keyFile = tmp.tmpNameSync();
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
fs.writeFileSync(keyFile, JSON.stringify({ key: key.toString('hex'), iv: iv.toString('hex') }));
const clientkeyPath = tmp.tmpNameSync();
const clientkeyCypher = crypto.createCipheriv('aes-256-cbc', key, iv);
let clientkey = clientkeyCypher.update(password, 'utf8', 'hex');
clientkey += clientkeyCypher.final('hex');
fs.writeFileSync(clientkeyPath, clientkey);
const clientcertPath = tmp.tmpNameSync();
const clientcertCypher = crypto.createCipheriv('aes-256-cbc', key, iv);
let clientcert = clientcertCypher.update(cert, 'utf8', 'hex');
clientcert += clientcertCypher.final('hex');
fs.writeFileSync(clientcertPath, clientcert);
fs_1.default.writeFileSync(paramsPath, JSON.stringify(getParams(type)));
const dotnetVersion = child_process_1.default.execSync('dotnet --version', { encoding: 'utf8' }).trim();
const adoTaskVersion = path_1.default.basename(path_1.default.dirname(path_1.default.dirname(esrpCliPath)));
const federatedTokenData = {
jobId: process.env['SYSTEM_JOBID'],
planId: process.env['SYSTEM_PLANID'],
projectId: process.env['SYSTEM_TEAMPROJECTID'],
hub: process.env['SYSTEM_HOSTTYPE'],
uri: process.env['SYSTEM_COLLECTIONURI'],
managedIdentityId: process.env['VSCODE_ESRP_CLIENT_ID'],
managedIdentityTenantId: process.env['VSCODE_ESRP_TENANT_ID'],
serviceConnectionId: process.env['VSCODE_ESRP_SERVICE_CONNECTION_ID'],
tempDirectory: os_1.default.tmpdir(),
systemAccessToken: encryptedTokenPath,
encryptionKey: encryptionDetailsPath
};
const args = [
esrpCliPath,
'vsts.sign',
'-a', username,
'-k', clientkeyPath,
'-z', clientcertPath,
'-a', process.env['ESRP_CLIENT_ID'],
'-d', process.env['ESRP_TENANT_ID'],
'-k', JSON.stringify({ akv: 'vscode-esrp' }),
'-z', JSON.stringify({ akv: 'vscode-esrp', cert: 'esrp-sign' }),
'-f', folderPath,
'-p', patternPath,
'-u', 'false',
@@ -154,10 +181,17 @@ function main([esrpCliPath, type, cert, username, password, folderPath, pattern]
'-i', 'https://www.microsoft.com',
'-n', '5',
'-r', 'true',
'-e', keyFile,
'-w', dotnetVersion,
'-skipAdoReportAttachment', 'false',
'-pendingAnalysisWaitTimeoutMinutes', '5',
'-adoTaskVersion', adoTaskVersion,
'-resourceUri', 'https://msazurecloud.onmicrosoft.com/api.esrp.microsoft.com',
'-esrpClientId', process.env['ESRP_CLIENT_ID'],
'-useMSIAuthentication', 'true',
'-federatedTokenData', JSON.stringify(federatedTokenData)
];
try {
cp.execFileSync('dotnet', args, { stdio: 'inherit' });
child_process_1.default.execFileSync('dotnet', args, { stdio: 'inherit' });
}
catch (err) {
console.error('ESRP failed');
+58 -25
View File
@@ -3,11 +3,11 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as cp from 'child_process';
import * as fs from 'fs';
import * as crypto from 'crypto';
import * as path from 'path';
import * as os from 'os';
import cp from 'child_process';
import fs from 'fs';
import crypto from 'crypto';
import path from 'path';
import os from 'os';
export class Temp {
private _files: string[] = [];
@@ -115,44 +115,70 @@ function getParams(type: string): Params[] {
toolName: 'sign',
toolVersion: '1.0'
}];
case 'nuget':
return [{
keyCode: 'CP-401405',
operationSetCode: 'NuGetSign',
parameters: [],
toolName: 'sign',
toolVersion: '1.0'
}, {
keyCode: 'CP-401405',
operationSetCode: 'NuGetVerify',
parameters: [],
toolName: 'sign',
toolVersion: '1.0'
}];
default:
throw new Error(`Sign type ${type} not found`);
}
}
export function main([esrpCliPath, type, cert, username, password, folderPath, pattern]: string[]) {
export function main([esrpCliPath, type, folderPath, pattern]: string[]) {
const tmp = new Temp();
process.on('exit', () => tmp.dispose());
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
const encryptedToken = cipher.update(process.env['SYSTEM_ACCESSTOKEN']!.trim(), 'utf8', 'hex') + cipher.final('hex');
const encryptionDetailsPath = tmp.tmpNameSync();
fs.writeFileSync(encryptionDetailsPath, JSON.stringify({ key: key.toString('hex'), iv: iv.toString('hex') }));
const encryptedTokenPath = tmp.tmpNameSync();
fs.writeFileSync(encryptedTokenPath, encryptedToken);
const patternPath = tmp.tmpNameSync();
fs.writeFileSync(patternPath, pattern);
const paramsPath = tmp.tmpNameSync();
fs.writeFileSync(paramsPath, JSON.stringify(getParams(type)));
const keyFile = tmp.tmpNameSync();
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
fs.writeFileSync(keyFile, JSON.stringify({ key: key.toString('hex'), iv: iv.toString('hex') }));
const dotnetVersion = cp.execSync('dotnet --version', { encoding: 'utf8' }).trim();
const adoTaskVersion = path.basename(path.dirname(path.dirname(esrpCliPath)));
const clientkeyPath = tmp.tmpNameSync();
const clientkeyCypher = crypto.createCipheriv('aes-256-cbc', key, iv);
let clientkey = clientkeyCypher.update(password, 'utf8', 'hex');
clientkey += clientkeyCypher.final('hex');
fs.writeFileSync(clientkeyPath, clientkey);
const clientcertPath = tmp.tmpNameSync();
const clientcertCypher = crypto.createCipheriv('aes-256-cbc', key, iv);
let clientcert = clientcertCypher.update(cert, 'utf8', 'hex');
clientcert += clientcertCypher.final('hex');
fs.writeFileSync(clientcertPath, clientcert);
const federatedTokenData = {
jobId: process.env['SYSTEM_JOBID'],
planId: process.env['SYSTEM_PLANID'],
projectId: process.env['SYSTEM_TEAMPROJECTID'],
hub: process.env['SYSTEM_HOSTTYPE'],
uri: process.env['SYSTEM_COLLECTIONURI'],
managedIdentityId: process.env['VSCODE_ESRP_CLIENT_ID'],
managedIdentityTenantId: process.env['VSCODE_ESRP_TENANT_ID'],
serviceConnectionId: process.env['VSCODE_ESRP_SERVICE_CONNECTION_ID'],
tempDirectory: os.tmpdir(),
systemAccessToken: encryptedTokenPath,
encryptionKey: encryptionDetailsPath
};
const args = [
esrpCliPath,
'vsts.sign',
'-a', username,
'-k', clientkeyPath,
'-z', clientcertPath,
'-a', process.env['ESRP_CLIENT_ID']!,
'-d', process.env['ESRP_TENANT_ID']!,
'-k', JSON.stringify({ akv: 'vscode-esrp' }),
'-z', JSON.stringify({ akv: 'vscode-esrp', cert: 'esrp-sign' }),
'-f', folderPath,
'-p', patternPath,
'-u', 'false',
@@ -171,7 +197,14 @@ export function main([esrpCliPath, type, cert, username, password, folderPath, p
'-i', 'https://www.microsoft.com',
'-n', '5',
'-r', 'true',
'-e', keyFile,
'-w', dotnetVersion,
'-skipAdoReportAttachment', 'false',
'-pendingAnalysisWaitTimeoutMinutes', '5',
'-adoTaskVersion', adoTaskVersion,
'-resourceUri', 'https://msazurecloud.onmicrosoft.com/api.esrp.microsoft.com',
'-esrpClientId', process.env['ESRP_CLIENT_ID']!,
'-useMSIAuthentication', 'true',
'-federatedTokenData', JSON.stringify(federatedTokenData)
];
try {
@@ -0,0 +1,12 @@
{
"codebaseName": "devdiv_microsoft_vscode",
"serviceTreeID": "79c048b2-322f-4ed5-a1ea-252a1250e4b3",
"instanceUrl": "https://devdiv.visualstudio.com/defaultcollection",
"projectName": "DevDiv",
"areaPath": "DevDiv\\VS Code (compliance tracking only)\\Visual Studio Code Client",
"notificationAliases": [
"monacotools@microsoft.com"
],
"validateToolOutput": "None",
"allTools": true
}
@@ -3,6 +3,8 @@ parameters:
type: boolean
- name: VSCODE_BUILD_MACOS_ARM64
type: boolean
- name: VSCODE_QUALITY
type: string
steps:
- task: NodeTool@0
@@ -11,6 +13,14 @@ steps:
versionFilePath: .nvmrc
nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: vscode
KeyVaultName: vscode-build-secrets
SecretsFilter: "github-distro-mixin-password"
- script: node build/setup-npm-registry.js $NPM_REGISTRY build
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
@@ -43,6 +53,8 @@ steps:
echo "Npm install failed $i, trying again..."
done
workingDirectory: build
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Install build dependencies
- template: ../cli/cli-darwin-sign.yml@self
@@ -9,25 +9,49 @@ steps:
inputs:
version: 6.x
- task: EsrpClientTool@1
continueOnError: true
displayName: Download ESRPClient
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
- task: EsrpCodeSigning@5
inputs:
azureSubscription: "vscode-builds-subscription"
KeyVaultName: vscode-build-secrets
SecretsFilter: "ESRP-PKI,esrp-aad-username,esrp-aad-password"
UseMSIAuthentication: true
ConnectedServiceName: vscode-esrp
AppRegistrationClientId: $(ESRP_CLIENT_ID)
AppRegistrationTenantId: $(ESRP_TENANT_ID)
AuthAKVName: vscode-esrp
AuthSignCertName: esrp-sign
FolderPath: .
Pattern: noop
displayName: 'Install ESRP Tooling'
- script: |
# For legacy purposes, arch for x64 is just 'darwin'
case $VSCODE_ARCH in
x64) ASSET_ID="darwin" ;;
arm64) ASSET_ID="darwin-arm64" ;;
universal) ASSET_ID="darwin-universal" ;;
esac
echo "##vso[task.setvariable variable=ASSET_ID]$ASSET_ID"
displayName: Set asset id variable
- script: |
if [ -z "$(ASSET_ID)" ]; then
echo "ASSET_ID is empty"
exit 1
else
echo "ASSET_ID is set to $(ASSET_ID)"
fi
displayName: Check ASSET_ID variable
- download: current
artifact: unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive
displayName: Download $(VSCODE_ARCH) artifact
- script: node build/azure-pipelines/common/sign $(Agent.ToolsDirectory)/esrpclient/*/*/net6.0/esrpcli.dll sign-darwin $(ESRP-PKI) $(esrp-aad-username) $(esrp-aad-password) $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive VSCode-darwin-$(VSCODE_ARCH).zip
- script: node build/azure-pipelines/common/sign $(Agent.RootDirectory)/_tasks/EsrpCodeSigning_*/*/net6.0/esrpcli.dll sign-darwin $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive VSCode-darwin-$(VSCODE_ARCH).zip
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
displayName: Codesign
- script: node build/azure-pipelines/common/sign $(Agent.ToolsDirectory)/esrpclient/*/*/net6.0/esrpcli.dll notarize-darwin $(ESRP-PKI) $(esrp-aad-username) $(esrp-aad-password) $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive VSCode-darwin-$(VSCODE_ARCH).zip
- script: node build/azure-pipelines/common/sign $(Agent.RootDirectory)/_tasks/EsrpCodeSigning_*/*/net6.0/esrpcli.dll notarize-darwin $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive VSCode-darwin-$(VSCODE_ARCH).zip
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
displayName: Notarize
- script: unzip $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip -d $(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)
@@ -43,16 +67,6 @@ steps:
displayName: Verify signature
condition: and(succeeded(), ne(variables['VSCODE_ARCH'], 'arm64'))
- script: |
# For legacy purposes, arch for x64 is just 'darwin'
case $VSCODE_ARCH in
x64) ASSET_ID="darwin" ;;
arm64) ASSET_ID="darwin-arm64" ;;
universal) ASSET_ID="darwin-universal" ;;
esac
echo "##vso[task.setvariable variable=ASSET_ID]$ASSET_ID"
displayName: Set asset id variable
- script: mv $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-x64.zip $(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin.zip
displayName: Rename x64 build to its legacy name
condition: and(succeeded(), eq(variables['VSCODE_ARCH'], 'x64'))
@@ -7,9 +7,6 @@ parameters:
type: boolean
- name: VSCODE_RUN_SMOKE_TESTS
type: boolean
- name: VSCODE_BUILD_AMD
type: boolean
default: false
steps:
- script: npm exec -- npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
@@ -20,56 +17,30 @@ steps:
- ${{ if eq(parameters.VSCODE_RUN_UNIT_TESTS, true) }}:
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- ${{ if eq(parameters.VSCODE_BUILD_AMD, true) }}:
- script: ./scripts/test-amd.sh --tfs "Unit Tests"
displayName: Run unit tests (Electron) [AMD]
timeoutInMinutes: 15
- script: npm run test-node-amd
displayName: Run unit tests (node.js) [AMD]
timeoutInMinutes: 15
- script: npm run test-browser-amd-no-install -- --sequential --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit) [AMD]
timeoutInMinutes: 30
- ${{ if eq(parameters.VSCODE_BUILD_AMD, false) }}:
- script: ./scripts/test.sh --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
- script: npm run test-node
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
- script: npm run test-browser-no-install -- --sequential --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit)
timeoutInMinutes: 30
- script: ./scripts/test.sh --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
- script: npm run test-node
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
- script: npm run test-browser-no-install -- --sequential --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit)
timeoutInMinutes: 30
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- ${{ if eq(parameters.VSCODE_BUILD_AMD, true) }}:
- script: ./scripts/test-amd.sh --build --tfs "Unit Tests"
displayName: Run unit tests (Electron) [AMD]
timeoutInMinutes: 15
- script: npm run test-node-amd -- --build
displayName: Run unit tests (node.js) [AMD]
timeoutInMinutes: 15
- script: npm run test-browser-amd-no-install -- --sequential --build --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit) [AMD]
timeoutInMinutes: 30
- ${{ if eq(parameters.VSCODE_BUILD_AMD, false) }}:
- script: ./scripts/test.sh --build --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
- script: npm run test-node -- --build
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
- script: npm run test-browser-no-install -- --sequential --build --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit)
timeoutInMinutes: 30
- script: ./scripts/test.sh --build --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
- script: npm run test-node -- --build
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
- script: npm run test-browser-no-install -- --sequential --build --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit)
timeoutInMinutes: 30
- ${{ if eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true) }}:
- script: |
@@ -90,48 +61,29 @@ steps:
compile-extension:typescript-language-features \
compile-extension:vscode-api-tests \
compile-extension:vscode-colorize-tests \
compile-extension:vscode-colorize-perf-tests \
compile-extension:vscode-test-resolver
displayName: Build integration tests
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- ${{ if eq(parameters.VSCODE_BUILD_AMD, true) }}:
- script: ./scripts/test-integration-amd.sh --tfs "Integration Tests"
displayName: Run integration tests (Electron) [AMD]
timeoutInMinutes: 20
- ${{ if eq(parameters.VSCODE_BUILD_AMD, false) }}:
- script: ./scripts/test-integration --tfs "Integration Tests"
displayName: Run integration tests (Electron)
timeoutInMinutes: 20
- script: ./scripts/test-integration --tfs "Integration Tests"
displayName: Run integration tests (Electron)
timeoutInMinutes: 20
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- ${{ if eq(parameters.VSCODE_BUILD_AMD, true) }}:
- script: |
# Figure out the full absolute path of the product we just built
# including the remote server and configure the integration tests
# to run with these builds instead of running out of sources.
set -e
APP_ROOT="$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)"
APP_NAME="`ls $APP_ROOT | head -n 1`"
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
./scripts/test-integration-amd.sh --build --tfs "Integration Tests"
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)/vscode-server-darwin-$(VSCODE_ARCH)
displayName: Run integration tests (Electron) [AMD]
timeoutInMinutes: 20
- ${{ if eq(parameters.VSCODE_BUILD_AMD, false) }}:
- script: |
# Figure out the full absolute path of the product we just built
# including the remote server and configure the integration tests
# to run with these builds instead of running out of sources.
set -e
APP_ROOT="$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)"
APP_NAME="`ls $APP_ROOT | head -n 1`"
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
./scripts/test-integration.sh --build --tfs "Integration Tests"
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)/vscode-server-darwin-$(VSCODE_ARCH)
displayName: Run integration tests (Electron)
timeoutInMinutes: 20
- script: |
# Figure out the full absolute path of the product we just built
# including the remote server and configure the integration tests
# to run with these builds instead of running out of sources.
set -e
APP_ROOT="$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)"
APP_NAME="`ls $APP_ROOT | head -n 1`"
INTEGRATION_TEST_ELECTRON_PATH="$APP_ROOT/$APP_NAME/Contents/MacOS/Electron" \
./scripts/test-integration.sh --build --tfs "Integration Tests"
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)/vscode-server-darwin-$(VSCODE_ARCH)
displayName: Run integration tests (Electron)
timeoutInMinutes: 20
- script: ./scripts/test-web-integration.sh --browser webkit
env:
@@ -1,5 +1,3 @@
# Void - this looks like the relevant file for us (product-build-darwin.yml is independent and maybe just used for testing)
steps:
- task: NodeTool@0
inputs:
@@ -12,7 +10,7 @@ steps:
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
azureSubscription: vscode
KeyVaultName: vscode-build-secrets
SecretsFilter: "github-distro-mixin-password,macos-developer-certificate,macos-developer-certificate-key"
@@ -48,6 +46,8 @@ steps:
echo "Npm install failed $i, trying again..."
done
workingDirectory: build
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Install build dependencies
- download: current
@@ -61,8 +61,6 @@ steps:
- script: node build/azure-pipelines/distro/mixin-quality
displayName: Mixin distro quality
## Void - IMPORTANT
- script: |
set -e
unzip $(Pipeline.Workspace)/unsigned_vscode_client_darwin_x64_archive/VSCode-darwin-x64.zip -d $(agent.builddirectory)/VSCode-darwin-x64
@@ -70,7 +68,13 @@ steps:
DEBUG=* node build/darwin/create-universal-app.js $(agent.builddirectory)
displayName: Create Universal App
## Void - IMPORTANT
- script: |
set -e
APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"
APP_NAME="`ls $APP_ROOT | head -n 1`"
APP_PATH="$APP_ROOT/$APP_NAME" node build/darwin/verify-macho.js universal
displayName: Verify arch of Mach-O objects
- script: |
set -e
security create-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain
@@ -9,9 +9,6 @@ parameters:
type: boolean
- name: VSCODE_RUN_SMOKE_TESTS
type: boolean
- name: VSCODE_BUILD_AMD
type: boolean
default: false
steps:
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
@@ -31,7 +28,7 @@ steps:
- task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
azureSubscription: vscode
KeyVaultName: vscode-build-secrets
SecretsFilter: "github-distro-mixin-password,macos-developer-certificate,macos-developer-certificate-key"
@@ -78,16 +75,10 @@ steps:
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
- script: |
set -e
# Refs https://github.com/microsoft/vscode/issues/219893#issuecomment-2209313109
sudo xcode-select --switch /Applications/Xcode_15.2.app
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
displayName: Switch to Xcode >= 15.1
- script: |
set -e
c++ --version
xcode-select -print-path
python3 -m pip install setuptools
for i in {1..5}; do # try 5 times
@@ -164,7 +155,7 @@ steps:
displayName: Build server (web)
- ${{ else }}:
- script: npm run gulp transpile-client-swc transpile-extensions
- script: npm run gulp transpile-client-esbuild transpile-extensions
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Transpile
@@ -176,7 +167,6 @@ steps:
VSCODE_RUN_UNIT_TESTS: ${{ parameters.VSCODE_RUN_UNIT_TESTS }}
VSCODE_RUN_INTEGRATION_TESTS: ${{ parameters.VSCODE_RUN_INTEGRATION_TESTS }}
VSCODE_RUN_SMOKE_TESTS: ${{ parameters.VSCODE_RUN_SMOKE_TESTS }}
VSCODE_BUILD_AMD: ${{ parameters.VSCODE_BUILD_AMD }}
- ${{ elseif and(ne(parameters.VSCODE_CIBUILD, true), ne(parameters.VSCODE_QUALITY, 'oss')) }}:
- task: DownloadPipelineArtifact@2
@@ -198,6 +188,14 @@ steps:
chmod +x "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME"
displayName: Make CLI executable
- script: |
set -e
APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"
APP_NAME="`ls $APP_ROOT | head -n 1`"
APP_PATH="$APP_ROOT/$APP_NAME" node build/darwin/verify-macho.js $(VSCODE_ARCH)
APP_PATH="$(Agent.BuildDirectory)/vscode-server-darwin-$(VSCODE_ARCH)" node build/darwin/verify-macho.js $(VSCODE_ARCH)
displayName: Verify arch of Mach-O objects
# Setting hardened entitlements is a requirement for:
# * Apple notarization
# * Running tests on Big Sur (because Big Sur has additional security precautions)
+2 -1
View File
@@ -1,5 +1,6 @@
pool:
vmImage: "ubuntu-latest"
name: 1es-ubuntu-22.04-x64
os: linux
trigger:
branches:

Some files were not shown because too many files have changed in this diff Show More