@tuan_son.dinh/gsd 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +453 -0
  3. package/dist/app-paths.d.ts +4 -0
  4. package/dist/app-paths.js +6 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.js +269 -0
  7. package/dist/loader.d.ts +2 -0
  8. package/dist/loader.js +70 -0
  9. package/dist/logo.d.ts +16 -0
  10. package/dist/logo.js +25 -0
  11. package/dist/onboarding.d.ts +43 -0
  12. package/dist/onboarding.js +418 -0
  13. package/dist/pi-migration.d.ts +14 -0
  14. package/dist/pi-migration.js +57 -0
  15. package/dist/resource-loader.d.ts +22 -0
  16. package/dist/resource-loader.js +60 -0
  17. package/dist/tool-bootstrap.d.ts +4 -0
  18. package/dist/tool-bootstrap.js +74 -0
  19. package/dist/wizard.d.ts +7 -0
  20. package/dist/wizard.js +25 -0
  21. package/package.json +60 -0
  22. package/patches/@mariozechner+pi-coding-agent+0.57.1.patch +108 -0
  23. package/patches/@mariozechner+pi-tui+0.57.1.patch +47 -0
  24. package/pkg/dist/modes/interactive/theme/dark.json +85 -0
  25. package/pkg/dist/modes/interactive/theme/light.json +84 -0
  26. package/pkg/dist/modes/interactive/theme/theme-schema.json +335 -0
  27. package/pkg/dist/modes/interactive/theme/theme.d.ts +78 -0
  28. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  29. package/pkg/dist/modes/interactive/theme/theme.js +949 -0
  30. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -0
  31. package/pkg/package.json +8 -0
  32. package/scripts/postinstall.js +127 -0
  33. package/src/resources/GSD-WORKFLOW.md +661 -0
  34. package/src/resources/agents/researcher.md +29 -0
  35. package/src/resources/agents/scout.md +56 -0
  36. package/src/resources/agents/worker.md +31 -0
  37. package/src/resources/extensions/ask-user-questions.ts +249 -0
  38. package/src/resources/extensions/bg-shell/index.ts +2808 -0
  39. package/src/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  40. package/src/resources/extensions/browser-tools/core.js +1057 -0
  41. package/src/resources/extensions/browser-tools/index.ts +4989 -0
  42. package/src/resources/extensions/browser-tools/package.json +20 -0
  43. package/src/resources/extensions/context7/index.ts +428 -0
  44. package/src/resources/extensions/context7/package.json +11 -0
  45. package/src/resources/extensions/get-secrets-from-user.ts +352 -0
  46. package/src/resources/extensions/google-search/index.ts +323 -0
  47. package/src/resources/extensions/google-search/package.json +9 -0
  48. package/src/resources/extensions/gsd/activity-log.ts +69 -0
  49. package/src/resources/extensions/gsd/auto.ts +2744 -0
  50. package/src/resources/extensions/gsd/commands.ts +313 -0
  51. package/src/resources/extensions/gsd/crash-recovery.ts +85 -0
  52. package/src/resources/extensions/gsd/dashboard-overlay.ts +521 -0
  53. package/src/resources/extensions/gsd/docs/preferences-reference.md +176 -0
  54. package/src/resources/extensions/gsd/doctor.ts +690 -0
  55. package/src/resources/extensions/gsd/files.ts +732 -0
  56. package/src/resources/extensions/gsd/git-service.ts +597 -0
  57. package/src/resources/extensions/gsd/gitignore.ts +168 -0
  58. package/src/resources/extensions/gsd/guided-flow.ts +817 -0
  59. package/src/resources/extensions/gsd/index.ts +558 -0
  60. package/src/resources/extensions/gsd/metrics.ts +374 -0
  61. package/src/resources/extensions/gsd/migrate/command.ts +218 -0
  62. package/src/resources/extensions/gsd/migrate/index.ts +42 -0
  63. package/src/resources/extensions/gsd/migrate/parser.ts +323 -0
  64. package/src/resources/extensions/gsd/migrate/parsers.ts +624 -0
  65. package/src/resources/extensions/gsd/migrate/preview.ts +48 -0
  66. package/src/resources/extensions/gsd/migrate/transformer.ts +346 -0
  67. package/src/resources/extensions/gsd/migrate/types.ts +370 -0
  68. package/src/resources/extensions/gsd/migrate/validator.ts +55 -0
  69. package/src/resources/extensions/gsd/migrate/writer.ts +539 -0
  70. package/src/resources/extensions/gsd/observability-validator.ts +408 -0
  71. package/src/resources/extensions/gsd/package.json +11 -0
  72. package/src/resources/extensions/gsd/paths.ts +308 -0
  73. package/src/resources/extensions/gsd/preferences.ts +757 -0
  74. package/src/resources/extensions/gsd/prompt-loader.ts +50 -0
  75. package/src/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
  76. package/src/resources/extensions/gsd/prompts/complete-slice.md +29 -0
  77. package/src/resources/extensions/gsd/prompts/discuss.md +189 -0
  78. package/src/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
  79. package/src/resources/extensions/gsd/prompts/execute-task.md +61 -0
  80. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -0
  81. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -0
  82. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +59 -0
  83. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -0
  84. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +23 -0
  85. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -0
  86. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +11 -0
  87. package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  88. package/src/resources/extensions/gsd/prompts/plan-milestone.md +65 -0
  89. package/src/resources/extensions/gsd/prompts/plan-slice.md +51 -0
  90. package/src/resources/extensions/gsd/prompts/queue.md +85 -0
  91. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
  92. package/src/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  93. package/src/resources/extensions/gsd/prompts/research-milestone.md +37 -0
  94. package/src/resources/extensions/gsd/prompts/research-slice.md +28 -0
  95. package/src/resources/extensions/gsd/prompts/review-migration.md +66 -0
  96. package/src/resources/extensions/gsd/prompts/run-uat.md +109 -0
  97. package/src/resources/extensions/gsd/prompts/system.md +187 -0
  98. package/src/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
  99. package/src/resources/extensions/gsd/session-forensics.ts +487 -0
  100. package/src/resources/extensions/gsd/skill-discovery.ts +137 -0
  101. package/src/resources/extensions/gsd/state.ts +460 -0
  102. package/src/resources/extensions/gsd/templates/context.md +76 -0
  103. package/src/resources/extensions/gsd/templates/decisions.md +8 -0
  104. package/src/resources/extensions/gsd/templates/milestone-summary.md +73 -0
  105. package/src/resources/extensions/gsd/templates/plan.md +131 -0
  106. package/src/resources/extensions/gsd/templates/preferences.md +24 -0
  107. package/src/resources/extensions/gsd/templates/project.md +31 -0
  108. package/src/resources/extensions/gsd/templates/reassessment.md +28 -0
  109. package/src/resources/extensions/gsd/templates/requirements.md +81 -0
  110. package/src/resources/extensions/gsd/templates/research.md +46 -0
  111. package/src/resources/extensions/gsd/templates/roadmap.md +118 -0
  112. package/src/resources/extensions/gsd/templates/slice-context.md +58 -0
  113. package/src/resources/extensions/gsd/templates/slice-summary.md +99 -0
  114. package/src/resources/extensions/gsd/templates/state.md +19 -0
  115. package/src/resources/extensions/gsd/templates/task-plan.md +52 -0
  116. package/src/resources/extensions/gsd/templates/task-summary.md +57 -0
  117. package/src/resources/extensions/gsd/templates/uat.md +54 -0
  118. package/src/resources/extensions/gsd/tests/activity-log-prune.test.ts +327 -0
  119. package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +56 -0
  120. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  121. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +225 -0
  122. package/src/resources/extensions/gsd/tests/cost-projection.test.ts +160 -0
  123. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +341 -0
  124. package/src/resources/extensions/gsd/tests/derive-state.test.ts +689 -0
  125. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +38 -0
  126. package/src/resources/extensions/gsd/tests/doctor.test.ts +505 -0
  127. package/src/resources/extensions/gsd/tests/git-service.test.ts +1313 -0
  128. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +308 -0
  129. package/src/resources/extensions/gsd/tests/metrics-io.test.ts +201 -0
  130. package/src/resources/extensions/gsd/tests/metrics.test.ts +217 -0
  131. package/src/resources/extensions/gsd/tests/migrate-command.test.ts +390 -0
  132. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +786 -0
  133. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +657 -0
  134. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +443 -0
  135. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +318 -0
  136. package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +420 -0
  137. package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +309 -0
  138. package/src/resources/extensions/gsd/tests/parsers.test.ts +1351 -0
  139. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +163 -0
  140. package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +386 -0
  141. package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +171 -0
  142. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
  143. package/src/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  144. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +521 -0
  145. package/src/resources/extensions/gsd/tests/requirements.test.ts +125 -0
  146. package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +34 -0
  147. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
  148. package/src/resources/extensions/gsd/tests/run-uat.test.ts +348 -0
  149. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +247 -0
  150. package/src/resources/extensions/gsd/tests/workflow-config.test.mjs +53 -0
  151. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +94 -0
  152. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +253 -0
  153. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +160 -0
  154. package/src/resources/extensions/gsd/tests/worktree.test.ts +264 -0
  155. package/src/resources/extensions/gsd/types.ts +159 -0
  156. package/src/resources/extensions/gsd/unit-runtime.ts +184 -0
  157. package/src/resources/extensions/gsd/workspace-index.ts +203 -0
  158. package/src/resources/extensions/gsd/worktree-command.ts +845 -0
  159. package/src/resources/extensions/gsd/worktree-manager.ts +392 -0
  160. package/src/resources/extensions/gsd/worktree.ts +183 -0
  161. package/src/resources/extensions/mac-tools/index.ts +852 -0
  162. package/src/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  163. package/src/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  164. package/src/resources/extensions/mcporter/index.ts +429 -0
  165. package/src/resources/extensions/remote-questions/config.ts +81 -0
  166. package/src/resources/extensions/remote-questions/discord-adapter.ts +128 -0
  167. package/src/resources/extensions/remote-questions/format.ts +163 -0
  168. package/src/resources/extensions/remote-questions/manager.ts +192 -0
  169. package/src/resources/extensions/remote-questions/remote-command.ts +307 -0
  170. package/src/resources/extensions/remote-questions/slack-adapter.ts +92 -0
  171. package/src/resources/extensions/remote-questions/status.ts +31 -0
  172. package/src/resources/extensions/remote-questions/store.ts +77 -0
  173. package/src/resources/extensions/remote-questions/types.ts +75 -0
  174. package/src/resources/extensions/search-the-web/cache.ts +78 -0
  175. package/src/resources/extensions/search-the-web/command-search-provider.ts +95 -0
  176. package/src/resources/extensions/search-the-web/format.ts +258 -0
  177. package/src/resources/extensions/search-the-web/http.ts +238 -0
  178. package/src/resources/extensions/search-the-web/index.ts +65 -0
  179. package/src/resources/extensions/search-the-web/native-search.ts +157 -0
  180. package/src/resources/extensions/search-the-web/provider.ts +118 -0
  181. package/src/resources/extensions/search-the-web/tavily.ts +116 -0
  182. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +519 -0
  183. package/src/resources/extensions/search-the-web/tool-llm-context.ts +561 -0
  184. package/src/resources/extensions/search-the-web/tool-search.ts +576 -0
  185. package/src/resources/extensions/search-the-web/url-utils.ts +91 -0
  186. package/src/resources/extensions/shared/confirm-ui.ts +126 -0
  187. package/src/resources/extensions/shared/interview-ui.ts +613 -0
  188. package/src/resources/extensions/shared/next-action-ui.ts +197 -0
  189. package/src/resources/extensions/shared/progress-widget.ts +282 -0
  190. package/src/resources/extensions/shared/terminal.ts +23 -0
  191. package/src/resources/extensions/shared/thinking-widget.ts +107 -0
  192. package/src/resources/extensions/shared/ui.ts +400 -0
  193. package/src/resources/extensions/shared/wizard-ui.ts +551 -0
  194. package/src/resources/extensions/slash-commands/audit.ts +88 -0
  195. package/src/resources/extensions/slash-commands/clear.ts +10 -0
  196. package/src/resources/extensions/slash-commands/create-extension.ts +297 -0
  197. package/src/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  198. package/src/resources/extensions/slash-commands/index.ts +12 -0
  199. package/src/resources/extensions/subagent/agents.ts +126 -0
  200. package/src/resources/extensions/subagent/index.ts +1020 -0
  201. package/src/resources/extensions/voice/index.ts +195 -0
  202. package/src/resources/extensions/voice/speech-recognizer.swift +154 -0
  203. package/src/resources/skills/debug-like-expert/SKILL.md +231 -0
  204. package/src/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  205. package/src/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  206. package/src/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  207. package/src/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  208. package/src/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  209. package/src/resources/skills/frontend-design/SKILL.md +45 -0
  210. package/src/resources/skills/swiftui/SKILL.md +208 -0
  211. package/src/resources/skills/swiftui/references/animations.md +921 -0
  212. package/src/resources/skills/swiftui/references/architecture.md +1561 -0
  213. package/src/resources/skills/swiftui/references/layout-system.md +1186 -0
  214. package/src/resources/skills/swiftui/references/navigation.md +1492 -0
  215. package/src/resources/skills/swiftui/references/networking-async.md +214 -0
  216. package/src/resources/skills/swiftui/references/performance.md +1706 -0
  217. package/src/resources/skills/swiftui/references/platform-integration.md +204 -0
  218. package/src/resources/skills/swiftui/references/state-management.md +1443 -0
  219. package/src/resources/skills/swiftui/references/swiftdata.md +297 -0
  220. package/src/resources/skills/swiftui/references/testing-debugging.md +247 -0
  221. package/src/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
  222. package/src/resources/skills/swiftui/workflows/add-feature.md +191 -0
  223. package/src/resources/skills/swiftui/workflows/build-new-app.md +311 -0
  224. package/src/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
  225. package/src/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
  226. package/src/resources/skills/swiftui/workflows/ship-app.md +203 -0
  227. package/src/resources/skills/swiftui/workflows/write-tests.md +235 -0
package/dist/wizard.js ADDED
@@ -0,0 +1,25 @@
1
+ // ─── Env hydration ────────────────────────────────────────────────────────────
2
+ /**
3
+ * Hydrate process.env from stored auth.json credentials for optional tool keys.
4
+ * Runs on every launch so extensions see Brave/Context7/Jina keys stored via the
5
+ * wizard on prior launches.
6
+ */
7
+ export function loadStoredEnvKeys(authStorage) {
8
+ const providers = [
9
+ ['brave', 'BRAVE_API_KEY'],
10
+ ['brave_answers', 'BRAVE_ANSWERS_KEY'],
11
+ ['context7', 'CONTEXT7_API_KEY'],
12
+ ['jina', 'JINA_API_KEY'],
13
+ ['tavily', 'TAVILY_API_KEY'],
14
+ ['slack_bot', 'SLACK_BOT_TOKEN'],
15
+ ['discord_bot', 'DISCORD_BOT_TOKEN'],
16
+ ];
17
+ for (const [provider, envVar] of providers) {
18
+ if (!process.env[envVar]) {
19
+ const cred = authStorage.get(provider);
20
+ if (cred?.type === 'api_key' && cred.key) {
21
+ process.env[envVar] = cred.key;
22
+ }
23
+ }
24
+ }
25
+ }
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@tuan_son.dinh/gsd",
3
+ "version": "2.6.0",
4
+ "description": "GSD — Get Shit Done coding agent",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/glittercowboy/gsd-pi.git"
9
+ },
10
+ "homepage": "https://github.com/glittercowboy/gsd-pi#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/glittercowboy/gsd-pi/issues"
13
+ },
14
+ "type": "module",
15
+ "bin": {
16
+ "gsd": "dist/loader.js",
17
+ "gsd-cli": "dist/loader.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "patches",
22
+ "pkg",
23
+ "src/resources",
24
+ "scripts/postinstall.js",
25
+ "package.json",
26
+ "README.md"
27
+ ],
28
+ "piConfig": {
29
+ "name": "gsd",
30
+ "configDir": ".gsd"
31
+ },
32
+ "engines": {
33
+ "node": ">=20.6.0"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc && npm run copy-themes",
37
+ "copy-themes": "node -e \"const{mkdirSync,cpSync}=require('fs');const{resolve}=require('path');const src=resolve(__dirname,'node_modules/@mariozechner/pi-coding-agent/dist/modes/interactive/theme');mkdirSync('pkg/dist/modes/interactive/theme',{recursive:true});cpSync(src,'pkg/dist/modes/interactive/theme',{recursive:true})\"",
38
+ "test": "node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/*.test.ts src/resources/extensions/gsd/tests/*.test.mjs src/tests/*.test.ts",
39
+ "dev": "tsc --watch",
40
+ "postinstall": "node scripts/postinstall.js",
41
+ "pi:install-global": "node scripts/install-pi-global.js",
42
+ "pi:uninstall-global": "node scripts/uninstall-pi-global.js",
43
+ "sync-pkg-version": "node scripts/sync-pkg-version.cjs",
44
+ "prepublishOnly": "npm run sync-pkg-version && npm run build"
45
+ },
46
+ "dependencies": {
47
+ "@clack/prompts": "^1.1.0",
48
+ "@mariozechner/pi-coding-agent": "^0.57.1",
49
+ "picocolors": "^1.1.1",
50
+ "playwright": "^1.58.2"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^22.0.0",
54
+ "patch-package": "^8.0.1",
55
+ "typescript": "^5.4.0"
56
+ },
57
+ "overrides": {
58
+ "gaxios": "7.1.4"
59
+ }
60
+ }
@@ -0,0 +1,108 @@
1
+ diff --git a/node_modules/@mariozechner/pi-coding-agent/dist/core/agent-session.js b/node_modules/@mariozechner/pi-coding-agent/dist/core/agent-session.js
2
+ index 90622c2..cff094b 100644
3
+ --- a/node_modules/@mariozechner/pi-coding-agent/dist/core/agent-session.js
4
+ +++ b/node_modules/@mariozechner/pi-coding-agent/dist/core/agent-session.js
5
+ @@ -1007,7 +1007,7 @@ export class AgentSession {
6
+ * Validates API key, saves to session and settings.
7
+ * @throws Error if no API key available for the model
8
+ */
9
+ - async setModel(model) {
10
+ + async setModel(model, options) {
11
+ const apiKey = await this._modelRegistry.getApiKey(model);
12
+ if (!apiKey) {
13
+ throw new Error(`No API key for ${model.provider}/${model.id}`);
14
+ @@ -1016,7 +1016,9 @@ export class AgentSession {
15
+ const thinkingLevel = this._getThinkingLevelForModelSwitch();
16
+ this.agent.setModel(model);
17
+ this.sessionManager.appendModelChange(model.provider, model.id);
18
+ - this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
19
+ + if (options?.persist !== false) {
20
+ + this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
21
+ + }
22
+ // Re-clamp thinking level for new model's capabilities
23
+ this.setThinkingLevel(thinkingLevel);
24
+ await this._emitModelSelect(model, previousModel, "set");
25
+ @@ -1067,7 +1069,9 @@ export class AgentSession {
26
+ // Apply model
27
+ this.agent.setModel(next.model);
28
+ this.sessionManager.appendModelChange(next.model.provider, next.model.id);
29
+ - this.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);
30
+ + if (options?.persist !== false) {
31
+ + this.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);
32
+ + }
33
+ // Apply thinking level.
34
+ // - Explicit scoped model thinking level overrides current session level
35
+ // - Undefined scoped model thinking level inherits the current session preference
36
+ @@ -1094,7 +1098,9 @@ export class AgentSession {
37
+ const thinkingLevel = this._getThinkingLevelForModelSwitch();
38
+ this.agent.setModel(nextModel);
39
+ this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);
40
+ - this.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);
41
+ + if (options?.persist !== false) {
42
+ + this.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);
43
+ + }
44
+ // Re-clamp thinking level for new model's capabilities
45
+ this.setThinkingLevel(thinkingLevel);
46
+ await this._emitModelSelect(nextModel, currentModel, "cycle");
47
+ @@ -1659,11 +1665,11 @@ export class AgentSession {
48
+ setActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),
49
+ refreshTools: () => this._refreshToolRegistry(),
50
+ getCommands,
51
+ - setModel: async (model) => {
52
+ + setModel: async (model, options) => {
53
+ const key = await this.modelRegistry.getApiKey(model);
54
+ if (!key)
55
+ return false;
56
+ - await this.setModel(model);
57
+ + await this.setModel(model, options);
58
+ return true;
59
+ },
60
+ getThinkingLevel: () => this.thinkingLevel,
61
+ diff --git a/node_modules/@mariozechner/pi-coding-agent/dist/core/tools/bash.js b/node_modules/@mariozechner/pi-coding-agent/dist/core/tools/bash.js
62
+ index 27fe820..68f277f 100644
63
+ --- a/node_modules/@mariozechner/pi-coding-agent/dist/core/tools/bash.js
64
+ +++ b/node_modules/@mariozechner/pi-coding-agent/dist/core/tools/bash.js
65
+ @@ -1,11 +1,35 @@
66
+ import { randomBytes } from "node:crypto";
67
+ import { createWriteStream, existsSync } from "node:fs";
68
+ +import { createRequire } from "node:module";
69
+ import { tmpdir } from "node:os";
70
+ import { join } from "node:path";
71
+ import { Type } from "@sinclair/typebox";
72
+ import { spawn } from "child_process";
73
+ import { getShellConfig, getShellEnv, killProcessTree } from "../../utils/shell.js";
74
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateTail } from "./truncate.js";
75
+ +// Cached Win32 FFI handles for restoring VT input after child processes
76
+ +let _vtHandles = null;
77
+ +function restoreWindowsVTInput() {
78
+ + if (process.platform !== "win32") return;
79
+ + try {
80
+ + if (!_vtHandles) {
81
+ + const cjsRequire = createRequire(import.meta.url);
82
+ + const koffi = cjsRequire("koffi");
83
+ + const k32 = koffi.load("kernel32.dll");
84
+ + const GetStdHandle = k32.func("void* __stdcall GetStdHandle(int)");
85
+ + const GetConsoleMode = k32.func("bool __stdcall GetConsoleMode(void*, _Out_ uint32_t*)");
86
+ + const SetConsoleMode = k32.func("bool __stdcall SetConsoleMode(void*, uint32_t)");
87
+ + const handle = GetStdHandle(-10);
88
+ + _vtHandles = { GetConsoleMode, SetConsoleMode, handle };
89
+ + }
90
+ + const ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200;
91
+ + const mode = new Uint32Array(1);
92
+ + _vtHandles.GetConsoleMode(_vtHandles.handle, mode);
93
+ + if (!(mode[0] & ENABLE_VIRTUAL_TERMINAL_INPUT)) {
94
+ + _vtHandles.SetConsoleMode(_vtHandles.handle, mode[0] | ENABLE_VIRTUAL_TERMINAL_INPUT);
95
+ + }
96
+ + } catch { }
97
+ +}
98
+ /**
99
+ * Generate a unique temp file path for bash output
100
+ */
101
+ @@ -76,6 +100,7 @@ const defaultBashOperations = {
102
+ }
103
+ // Handle process exit
104
+ child.on("close", (code) => {
105
+ + restoreWindowsVTInput();
106
+ if (timeoutHandle)
107
+ clearTimeout(timeoutHandle);
108
+ if (signal)
@@ -0,0 +1,47 @@
1
+ diff --git a/node_modules/@mariozechner/pi-tui/dist/terminal.js b/node_modules/@mariozechner/pi-tui/dist/terminal.js
2
+ index cd20330..e836fcd 100644
3
+ --- a/node_modules/@mariozechner/pi-tui/dist/terminal.js
4
+ +++ b/node_modules/@mariozechner/pi-tui/dist/terminal.js
5
+ @@ -7,6 +7,7 @@ const cjsRequire = createRequire(import.meta.url);
6
+ * Real terminal using process.stdin/stdout
7
+ */
8
+ export class ProcessTerminal {
9
+ + static _vtHandles = null;
10
+ wasRaw = false;
11
+ inputHandler;
12
+ resizeHandler;
13
+ @@ -126,20 +127,23 @@ export class ProcessTerminal {
14
+ if (process.platform !== "win32")
15
+ return;
16
+ try {
17
+ - // Dynamic require to avoid bundling koffi's 74MB of cross-platform
18
+ - // native binaries into every compiled binary. Koffi is only needed
19
+ - // on Windows for VT input support.
20
+ - const koffi = cjsRequire("koffi");
21
+ - const k32 = koffi.load("kernel32.dll");
22
+ - const GetStdHandle = k32.func("void* __stdcall GetStdHandle(int)");
23
+ - const GetConsoleMode = k32.func("bool __stdcall GetConsoleMode(void*, _Out_ uint32_t*)");
24
+ - const SetConsoleMode = k32.func("bool __stdcall SetConsoleMode(void*, uint32_t)");
25
+ - const STD_INPUT_HANDLE = -10;
26
+ + if (!ProcessTerminal._vtHandles) {
27
+ + const koffi = cjsRequire("koffi");
28
+ + const k32 = koffi.load("kernel32.dll");
29
+ + const GetStdHandle = k32.func("void* __stdcall GetStdHandle(int)");
30
+ + const GetConsoleMode = k32.func("bool __stdcall GetConsoleMode(void*, _Out_ uint32_t*)");
31
+ + const SetConsoleMode = k32.func("bool __stdcall SetConsoleMode(void*, uint32_t)");
32
+ + const STD_INPUT_HANDLE = -10;
33
+ + const handle = GetStdHandle(STD_INPUT_HANDLE);
34
+ + ProcessTerminal._vtHandles = { GetConsoleMode, SetConsoleMode, handle };
35
+ + }
36
+ const ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200;
37
+ - const handle = GetStdHandle(STD_INPUT_HANDLE);
38
+ + const { GetConsoleMode, SetConsoleMode, handle } = ProcessTerminal._vtHandles;
39
+ const mode = new Uint32Array(1);
40
+ GetConsoleMode(handle, mode);
41
+ - SetConsoleMode(handle, mode[0] | ENABLE_VIRTUAL_TERMINAL_INPUT);
42
+ + if (!(mode[0] & ENABLE_VIRTUAL_TERMINAL_INPUT)) {
43
+ + SetConsoleMode(handle, mode[0] | ENABLE_VIRTUAL_TERMINAL_INPUT);
44
+ + }
45
+ }
46
+ catch {
47
+ // koffi not available — Shift+Tab won't be distinguishable from Tab
@@ -0,0 +1,85 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "dark",
4
+ "vars": {
5
+ "cyan": "#00d7ff",
6
+ "blue": "#5f87ff",
7
+ "green": "#b5bd68",
8
+ "red": "#cc6666",
9
+ "yellow": "#ffff00",
10
+ "gray": "#808080",
11
+ "dimGray": "#666666",
12
+ "darkGray": "#505050",
13
+ "accent": "#8abeb7",
14
+ "selectedBg": "#3a3a4a",
15
+ "userMsgBg": "#343541",
16
+ "toolPendingBg": "#282832",
17
+ "toolSuccessBg": "#283228",
18
+ "toolErrorBg": "#3c2828",
19
+ "customMsgBg": "#2d2838"
20
+ },
21
+ "colors": {
22
+ "accent": "accent",
23
+ "border": "blue",
24
+ "borderAccent": "cyan",
25
+ "borderMuted": "darkGray",
26
+ "success": "green",
27
+ "error": "red",
28
+ "warning": "yellow",
29
+ "muted": "gray",
30
+ "dim": "dimGray",
31
+ "text": "",
32
+ "thinkingText": "gray",
33
+
34
+ "selectedBg": "selectedBg",
35
+ "userMessageBg": "userMsgBg",
36
+ "userMessageText": "",
37
+ "customMessageBg": "customMsgBg",
38
+ "customMessageText": "",
39
+ "customMessageLabel": "#9575cd",
40
+ "toolPendingBg": "toolPendingBg",
41
+ "toolSuccessBg": "toolSuccessBg",
42
+ "toolErrorBg": "toolErrorBg",
43
+ "toolTitle": "",
44
+ "toolOutput": "gray",
45
+
46
+ "mdHeading": "#f0c674",
47
+ "mdLink": "#81a2be",
48
+ "mdLinkUrl": "dimGray",
49
+ "mdCode": "accent",
50
+ "mdCodeBlock": "green",
51
+ "mdCodeBlockBorder": "gray",
52
+ "mdQuote": "gray",
53
+ "mdQuoteBorder": "gray",
54
+ "mdHr": "gray",
55
+ "mdListBullet": "accent",
56
+
57
+ "toolDiffAdded": "green",
58
+ "toolDiffRemoved": "red",
59
+ "toolDiffContext": "gray",
60
+
61
+ "syntaxComment": "#6A9955",
62
+ "syntaxKeyword": "#569CD6",
63
+ "syntaxFunction": "#DCDCAA",
64
+ "syntaxVariable": "#9CDCFE",
65
+ "syntaxString": "#CE9178",
66
+ "syntaxNumber": "#B5CEA8",
67
+ "syntaxType": "#4EC9B0",
68
+ "syntaxOperator": "#D4D4D4",
69
+ "syntaxPunctuation": "#D4D4D4",
70
+
71
+ "thinkingOff": "darkGray",
72
+ "thinkingMinimal": "#6e6e6e",
73
+ "thinkingLow": "#5f87af",
74
+ "thinkingMedium": "#81a2be",
75
+ "thinkingHigh": "#b294bb",
76
+ "thinkingXhigh": "#d183e8",
77
+
78
+ "bashMode": "green"
79
+ },
80
+ "export": {
81
+ "pageBg": "#18181e",
82
+ "cardBg": "#1e1e24",
83
+ "infoBg": "#3c3728"
84
+ }
85
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "light",
4
+ "vars": {
5
+ "teal": "#5a8080",
6
+ "blue": "#547da7",
7
+ "green": "#588458",
8
+ "red": "#aa5555",
9
+ "yellow": "#9a7326",
10
+ "mediumGray": "#6c6c6c",
11
+ "dimGray": "#767676",
12
+ "lightGray": "#b0b0b0",
13
+ "selectedBg": "#d0d0e0",
14
+ "userMsgBg": "#e8e8e8",
15
+ "toolPendingBg": "#e8e8f0",
16
+ "toolSuccessBg": "#e8f0e8",
17
+ "toolErrorBg": "#f0e8e8",
18
+ "customMsgBg": "#ede7f6"
19
+ },
20
+ "colors": {
21
+ "accent": "teal",
22
+ "border": "blue",
23
+ "borderAccent": "teal",
24
+ "borderMuted": "lightGray",
25
+ "success": "green",
26
+ "error": "red",
27
+ "warning": "yellow",
28
+ "muted": "mediumGray",
29
+ "dim": "dimGray",
30
+ "text": "",
31
+ "thinkingText": "mediumGray",
32
+
33
+ "selectedBg": "selectedBg",
34
+ "userMessageBg": "userMsgBg",
35
+ "userMessageText": "",
36
+ "customMessageBg": "customMsgBg",
37
+ "customMessageText": "",
38
+ "customMessageLabel": "#7e57c2",
39
+ "toolPendingBg": "toolPendingBg",
40
+ "toolSuccessBg": "toolSuccessBg",
41
+ "toolErrorBg": "toolErrorBg",
42
+ "toolTitle": "",
43
+ "toolOutput": "mediumGray",
44
+
45
+ "mdHeading": "yellow",
46
+ "mdLink": "blue",
47
+ "mdLinkUrl": "dimGray",
48
+ "mdCode": "teal",
49
+ "mdCodeBlock": "green",
50
+ "mdCodeBlockBorder": "mediumGray",
51
+ "mdQuote": "mediumGray",
52
+ "mdQuoteBorder": "mediumGray",
53
+ "mdHr": "mediumGray",
54
+ "mdListBullet": "green",
55
+
56
+ "toolDiffAdded": "green",
57
+ "toolDiffRemoved": "red",
58
+ "toolDiffContext": "mediumGray",
59
+
60
+ "syntaxComment": "#008000",
61
+ "syntaxKeyword": "#0000FF",
62
+ "syntaxFunction": "#795E26",
63
+ "syntaxVariable": "#001080",
64
+ "syntaxString": "#A31515",
65
+ "syntaxNumber": "#098658",
66
+ "syntaxType": "#267F99",
67
+ "syntaxOperator": "#000000",
68
+ "syntaxPunctuation": "#000000",
69
+
70
+ "thinkingOff": "lightGray",
71
+ "thinkingMinimal": "#767676",
72
+ "thinkingLow": "blue",
73
+ "thinkingMedium": "teal",
74
+ "thinkingHigh": "#875f87",
75
+ "thinkingXhigh": "#8b008b",
76
+
77
+ "bashMode": "green"
78
+ },
79
+ "export": {
80
+ "pageBg": "#f8f8f8",
81
+ "cardBg": "#ffffff",
82
+ "infoBg": "#fffae6"
83
+ }
84
+ }