aicodeman 1.9.9 → 1.11.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 (133) hide show
  1. package/README.md +2 -0
  2. package/README.zh-CN.md +2 -0
  3. package/dist/config/file-editing.d.ts +39 -0
  4. package/dist/config/file-editing.d.ts.map +1 -0
  5. package/dist/config/file-editing.js +148 -0
  6. package/dist/config/file-editing.js.map +1 -0
  7. package/dist/remote-hosts.d.ts +13 -0
  8. package/dist/remote-hosts.d.ts.map +1 -1
  9. package/dist/remote-hosts.js +48 -6
  10. package/dist/remote-hosts.js.map +1 -1
  11. package/dist/session.d.ts.map +1 -1
  12. package/dist/tmux-manager.d.ts.map +1 -1
  13. package/dist/tmux-manager.js +36 -6
  14. package/dist/tmux-manager.js.map +1 -1
  15. package/dist/tunnel-manager.d.ts.map +1 -1
  16. package/dist/tunnel-manager.js +5 -18
  17. package/dist/tunnel-manager.js.map +1 -1
  18. package/dist/types/common.d.ts +15 -0
  19. package/dist/types/common.d.ts.map +1 -1
  20. package/dist/types/session.d.ts +2 -0
  21. package/dist/types/session.d.ts.map +1 -1
  22. package/dist/types/session.js.map +1 -1
  23. package/dist/utils/claude-cli-resolver.d.ts +6 -0
  24. package/dist/utils/claude-cli-resolver.d.ts.map +1 -1
  25. package/dist/utils/claude-cli-resolver.js +8 -0
  26. package/dist/utils/claude-cli-resolver.js.map +1 -1
  27. package/dist/utils/cloudflared-resolver.d.ts +27 -0
  28. package/dist/utils/cloudflared-resolver.d.ts.map +1 -0
  29. package/dist/utils/cloudflared-resolver.js +60 -0
  30. package/dist/utils/cloudflared-resolver.js.map +1 -0
  31. package/dist/utils/index.d.ts +1 -1
  32. package/dist/utils/index.d.ts.map +1 -1
  33. package/dist/utils/index.js +1 -1
  34. package/dist/utils/index.js.map +1 -1
  35. package/dist/utils/shell-resolver.d.ts +17 -0
  36. package/dist/utils/shell-resolver.d.ts.map +1 -1
  37. package/dist/utils/shell-resolver.js +31 -0
  38. package/dist/utils/shell-resolver.js.map +1 -1
  39. package/dist/web/public/admin-ui.js.gz +0 -0
  40. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  41. package/dist/web/public/{app.8ae6a2ad.js → app.166af5f1.js} +5 -5
  42. package/dist/web/public/app.166af5f1.js.br +0 -0
  43. package/dist/web/public/app.166af5f1.js.gz +0 -0
  44. package/dist/web/public/constants.e7175b95.js.gz +0 -0
  45. package/dist/web/public/cron-ui.js.gz +0 -0
  46. package/dist/web/public/entrance-animations.js.gz +0 -0
  47. package/dist/web/public/i18n.0fbea500.js +1 -0
  48. package/dist/web/public/i18n.0fbea500.js.br +0 -0
  49. package/dist/web/public/i18n.0fbea500.js.gz +0 -0
  50. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  51. package/dist/web/public/index.html +30 -13
  52. package/dist/web/public/index.html.br +0 -0
  53. package/dist/web/public/index.html.gz +0 -0
  54. package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
  55. package/dist/web/public/keyboard-accessory.9936227d.js.gz +0 -0
  56. package/dist/web/public/mobile-handlers.bc2b8c1d.js.gz +0 -0
  57. package/dist/web/public/mobile-overview.js.gz +0 -0
  58. package/dist/web/public/{mobile.e56d787a.css → mobile.32cacde5.css} +1 -1
  59. package/dist/web/public/mobile.32cacde5.css.br +0 -0
  60. package/dist/web/public/{mobile.e56d787a.css.gz → mobile.32cacde5.css.gz} +0 -0
  61. package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
  62. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  63. package/dist/web/public/{panels-ui.600881ae.js → panels-ui.1d4203e0.js} +63 -62
  64. package/dist/web/public/panels-ui.1d4203e0.js.br +0 -0
  65. package/dist/web/public/panels-ui.1d4203e0.js.gz +0 -0
  66. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  67. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  68. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  69. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  70. package/dist/web/public/session-ui.1356a4f4.js +68 -0
  71. package/dist/web/public/session-ui.1356a4f4.js.br +0 -0
  72. package/dist/web/public/session-ui.1356a4f4.js.gz +0 -0
  73. package/dist/web/public/{settings-ui.726e1c19.js → settings-ui.ed9cdb3f.js} +2 -2
  74. package/dist/web/public/settings-ui.ed9cdb3f.js.br +0 -0
  75. package/dist/web/public/settings-ui.ed9cdb3f.js.gz +0 -0
  76. package/dist/web/public/{styles.7e638f69.css → styles.2e8dc8b7.css} +1 -1
  77. package/dist/web/public/styles.2e8dc8b7.css.br +0 -0
  78. package/dist/web/public/styles.2e8dc8b7.css.gz +0 -0
  79. package/dist/web/public/subagent-windows.4cc8b005.js.gz +0 -0
  80. package/dist/web/public/sw.js.gz +0 -0
  81. package/dist/web/public/terminal-ui.3ac6f8c2.js +3 -0
  82. package/dist/web/public/terminal-ui.3ac6f8c2.js.br +0 -0
  83. package/dist/web/public/terminal-ui.3ac6f8c2.js.gz +0 -0
  84. package/dist/web/public/ultracode-panel.js.gz +0 -0
  85. package/dist/web/public/ultracode-windows.js.gz +0 -0
  86. package/dist/web/public/upload.html.gz +0 -0
  87. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  88. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  89. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  90. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  91. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  92. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  93. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  94. package/dist/web/public/vendor/xterm.css.gz +0 -0
  95. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  96. package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
  97. package/dist/web/public/webview-tabs.js.gz +0 -0
  98. package/dist/web/routes/file-routes.d.ts +4 -1
  99. package/dist/web/routes/file-routes.d.ts.map +1 -1
  100. package/dist/web/routes/file-routes.js +215 -5
  101. package/dist/web/routes/file-routes.js.map +1 -1
  102. package/dist/web/routes/session-routes.d.ts.map +1 -1
  103. package/dist/web/routes/session-routes.js +67 -4
  104. package/dist/web/routes/session-routes.js.map +1 -1
  105. package/dist/web/routes/system-routes.d.ts.map +1 -1
  106. package/dist/web/routes/system-routes.js +9 -1
  107. package/dist/web/routes/system-routes.js.map +1 -1
  108. package/dist/web/schemas.d.ts +21 -0
  109. package/dist/web/schemas.d.ts.map +1 -1
  110. package/dist/web/schemas.js +26 -0
  111. package/dist/web/schemas.js.map +1 -1
  112. package/dist/web/server.d.ts.map +1 -1
  113. package/dist/web/server.js +33 -0
  114. package/dist/web/server.js.map +1 -1
  115. package/package.json +1 -1
  116. package/dist/web/public/app.8ae6a2ad.js.br +0 -0
  117. package/dist/web/public/app.8ae6a2ad.js.gz +0 -0
  118. package/dist/web/public/i18n.8a202f9d.js +0 -1
  119. package/dist/web/public/i18n.8a202f9d.js.br +0 -0
  120. package/dist/web/public/i18n.8a202f9d.js.gz +0 -0
  121. package/dist/web/public/mobile.e56d787a.css.br +0 -0
  122. package/dist/web/public/panels-ui.600881ae.js.br +0 -0
  123. package/dist/web/public/panels-ui.600881ae.js.gz +0 -0
  124. package/dist/web/public/session-ui.dbc88443.js +0 -68
  125. package/dist/web/public/session-ui.dbc88443.js.br +0 -0
  126. package/dist/web/public/session-ui.dbc88443.js.gz +0 -0
  127. package/dist/web/public/settings-ui.726e1c19.js.br +0 -0
  128. package/dist/web/public/settings-ui.726e1c19.js.gz +0 -0
  129. package/dist/web/public/styles.7e638f69.css.br +0 -0
  130. package/dist/web/public/styles.7e638f69.css.gz +0 -0
  131. package/dist/web/public/terminal-ui.edf4d683.js +0 -3
  132. package/dist/web/public/terminal-ui.edf4d683.js.br +0 -0
  133. package/dist/web/public/terminal-ui.edf4d683.js.gz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"claude-cli-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/claude-cli-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAwB7C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAazC;AAKD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAyBnD"}
1
+ {"version":3,"file":"claude-cli-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/claude-cli-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAwB7C;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAazC;AAKD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAyBnD"}
@@ -22,6 +22,14 @@ const CLAUDE_SEARCH_DIRS = [
22
22
  ];
23
23
  /** Cached directory containing the claude binary (empty string = searched but not found) */
24
24
  let _claudeDir = null;
25
+ /**
26
+ * Returns true if the Claude CLI binary can be located (via `which` or one of
27
+ * the common install directories). Mirrors `isGeminiAvailable`/`isOpenCodeAvailable`/
28
+ * `isCodexAvailable` in the sibling resolvers.
29
+ */
30
+ export function isClaudeAvailable() {
31
+ return findClaudeDir() !== null;
32
+ }
25
33
  /**
26
34
  * Finds the directory containing the `claude` binary.
27
35
  * Checks `which claude` first, then falls back to common install locations.
@@ -1 +1 @@
1
- {"version":3,"file":"claude-cli-resolver.js","sourceRoot":"","sources":["../../src/utils/claude-cli-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-cli-resolver.js","sourceRoot":"","sources":["../../src/utils/claude-cli-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fileoverview Resolve the `cloudflared` binary across common install paths.
3
+ *
4
+ * Mirrors the CLI resolvers (gemini-cli-resolver.ts et al), for the same reason
5
+ * they exist: the welcome screen should not offer a button whose only possible
6
+ * outcome is an error toast.
7
+ *
8
+ * The search list is deliberately the SAME one `TunnelManager.resolveCloudflared()`
9
+ * has always used, and that method now delegates here so the two can never drift.
10
+ * The difference is the fallback: this module answers "is it installed?" honestly
11
+ * with null, while the tunnel manager keeps falling back to the bare name so a
12
+ * cloudflared that only exists somewhere on the tunnel process's PATH still
13
+ * starts. A stricter answer there would turn a working tunnel into a refusal.
14
+ *
15
+ * @module utils/cloudflared-resolver
16
+ */
17
+ /**
18
+ * Finds the `cloudflared` binary.
19
+ *
20
+ * @returns Absolute path, or null if not found
21
+ */
22
+ export declare function resolveCloudflaredPath(): string | null;
23
+ /**
24
+ * Check if cloudflared is available on the system.
25
+ */
26
+ export declare function isCloudflaredAvailable(): boolean;
27
+ //# sourceMappingURL=cloudflared-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflared-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/cloudflared-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAuBtD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @fileoverview Resolve the `cloudflared` binary across common install paths.
3
+ *
4
+ * Mirrors the CLI resolvers (gemini-cli-resolver.ts et al), for the same reason
5
+ * they exist: the welcome screen should not offer a button whose only possible
6
+ * outcome is an error toast.
7
+ *
8
+ * The search list is deliberately the SAME one `TunnelManager.resolveCloudflared()`
9
+ * has always used, and that method now delegates here so the two can never drift.
10
+ * The difference is the fallback: this module answers "is it installed?" honestly
11
+ * with null, while the tunnel manager keeps falling back to the bare name so a
12
+ * cloudflared that only exists somewhere on the tunnel process's PATH still
13
+ * starts. A stricter answer there would turn a working tunnel into a refusal.
14
+ *
15
+ * @module utils/cloudflared-resolver
16
+ */
17
+ import { execSync } from 'node:child_process';
18
+ import { existsSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { homedir } from 'node:os';
21
+ import { EXEC_TIMEOUT_MS } from '../config/exec-timeout.js';
22
+ /** Common directories where the cloudflared binary may be installed */
23
+ const CLOUDFLARED_SEARCH_DIRS = [join(homedir(), '.local', 'bin'), '/usr/local/bin'];
24
+ /** Cached path to the cloudflared binary (empty string = searched but not found) */
25
+ let _cloudflaredPath = null;
26
+ /**
27
+ * Finds the `cloudflared` binary.
28
+ *
29
+ * @returns Absolute path, or null if not found
30
+ */
31
+ export function resolveCloudflaredPath() {
32
+ if (_cloudflaredPath !== null)
33
+ return _cloudflaredPath || null;
34
+ for (const dir of CLOUDFLARED_SEARCH_DIRS) {
35
+ const candidate = join(dir, 'cloudflared');
36
+ if (existsSync(candidate)) {
37
+ _cloudflaredPath = candidate;
38
+ return candidate;
39
+ }
40
+ }
41
+ try {
42
+ const result = execSync('which cloudflared', { encoding: 'utf-8', timeout: EXEC_TIMEOUT_MS }).trim();
43
+ if (result && existsSync(result)) {
44
+ _cloudflaredPath = result;
45
+ return result;
46
+ }
47
+ }
48
+ catch {
49
+ // Not on PATH either.
50
+ }
51
+ _cloudflaredPath = ''; // mark as searched, not found
52
+ return null;
53
+ }
54
+ /**
55
+ * Check if cloudflared is available on the system.
56
+ */
57
+ export function isCloudflaredAvailable() {
58
+ return resolveCloudflaredPath() !== null;
59
+ }
60
+ //# sourceMappingURL=cloudflared-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflared-resolver.js","sourceRoot":"","sources":["../../src/utils/cloudflared-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,uEAAuE;AACvE,MAAM,uBAAuB,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAErF,oFAAoF;AACpF,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,IAAI,gBAAgB,KAAK,IAAI;QAAE,OAAO,gBAAgB,IAAI,IAAI,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,uBAAuB,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,gBAAgB,GAAG,SAAS,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrG,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,gBAAgB,GAAG,MAAM,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IAED,gBAAgB,GAAG,EAAE,CAAC,CAAC,8BAA8B;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,sBAAsB,EAAE,KAAK,IAAI,CAAC;AAC3C,CAAC"}
@@ -17,7 +17,7 @@ export { isSafePushEndpoint } from './push-endpoint-validation.js';
17
17
  export { stringSimilarity, fuzzyPhraseMatch, todoContentHash } from './string-similarity.js';
18
18
  export { assertNever } from './type-safety.js';
19
19
  export { wrapWithNice } from './nice-wrapper.js';
20
- export { resolveLocalShell } from './shell-resolver.js';
20
+ export { resolveLocalShell, loginShellArgs } from './shell-resolver.js';
21
21
  export { findClaudeDir, getAugmentedPath, getClaudeCliVersion, getClaudeBinaryPath } from './claude-cli-resolver.js';
22
22
  export { spawnPtyWithHelperRepair } from './node-pty-repair.js';
23
23
  export { resolveOpenCodeDir } from './opencode-cli-resolver.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -16,7 +16,7 @@ export { isSafePushEndpoint } from './push-endpoint-validation.js';
16
16
  export { stringSimilarity, fuzzyPhraseMatch, todoContentHash } from './string-similarity.js';
17
17
  export { assertNever } from './type-safety.js';
18
18
  export { wrapWithNice } from './nice-wrapper.js';
19
- export { resolveLocalShell } from './shell-resolver.js';
19
+ export { resolveLocalShell, loginShellArgs } from './shell-resolver.js';
20
20
  export { findClaudeDir, getAugmentedPath, getClaudeCliVersion, getClaudeBinaryPath } from './claude-cli-resolver.js';
21
21
  export { spawnPtyWithHelperRepair } from './node-pty-repair.js';
22
22
  export { resolveOpenCodeDir } from './opencode-cli-resolver.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -27,4 +27,21 @@
27
27
  * nologin-style stub. Always returns a non-empty string.
28
28
  */
29
29
  export declare function resolveLocalShell(): string;
30
+ /**
31
+ * Flags that make `shellPath` a login shell, or `''` when it takes none we trust.
32
+ *
33
+ * A tmux pane already hands the shell a tty, so it is interactive with or without
34
+ * `-i` (verified: `$-` contains `i` for a bare `/bin/bash` in a pane, which is why
35
+ * `~/.bashrc` has always been sourced). The flag that actually changes anything is
36
+ * `-l`: it makes the pane a LOGIN shell, matching what tmux itself does when it
37
+ * spawns a pane with no `default-command`, and picking up the `/etc/profile` and
38
+ * `/etc/profile.d/*` PATH entries that a systemd-spawned server never sourced.
39
+ *
40
+ * `-i` is kept alongside it because for bash the two select different files —
41
+ * login reads `~/.bash_profile`, interactive-non-login reads `~/.bashrc` — and
42
+ * asking for both is the closest thing to "the shell the user actually gets".
43
+ *
44
+ * Returns a string ready to append to an already-escaped shell path.
45
+ */
46
+ export declare function loginShellArgs(shellPath: string): string;
30
47
  //# sourceMappingURL=shell-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/shell-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA2BH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAuB1C"}
1
+ {"version":3,"file":"shell-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/shell-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuCH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAuB1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGxD"}
@@ -29,6 +29,17 @@ const FALLBACK_SHELLS = ['/bin/bash', '/bin/zsh', '/bin/sh'];
29
29
  * this module exists to prevent.
30
30
  */
31
31
  const NON_INTERACTIVE_SHELLS = new Set(['nologin', 'false', 'true', 'sync']);
32
+ /**
33
+ * Shells verified to accept BOTH `-i` and `-l`. Deliberately an allowlist, not a
34
+ * blocklist: a shell that rejects an unknown flag exits immediately, which is the
35
+ * dead-pane-on-arrival failure this module exists to prevent (#208). The passwd
36
+ * entry is user data and can name anything — nushell, elvish, and xonsh all take
37
+ * neither flag in this form, so they get a bare launch instead of a dead tab.
38
+ *
39
+ * csh/tcsh are excluded on purpose: tcsh honors `-l` only when it is the ONLY
40
+ * flag, so `-i -l` would silently not be a login shell there anyway.
41
+ */
42
+ const LOGIN_FLAG_SHELLS = new Set(['sh', 'bash', 'dash', 'ash', 'zsh', 'ksh', 'ksh93', 'mksh', 'pdksh', 'fish']);
32
43
  function isUsableShell(candidate) {
33
44
  if (!candidate.startsWith('/'))
34
45
  return false;
@@ -73,4 +84,24 @@ export function resolveLocalShell() {
73
84
  // best guess and is far better than emitting an empty command.
74
85
  return '/bin/sh';
75
86
  }
87
+ /**
88
+ * Flags that make `shellPath` a login shell, or `''` when it takes none we trust.
89
+ *
90
+ * A tmux pane already hands the shell a tty, so it is interactive with or without
91
+ * `-i` (verified: `$-` contains `i` for a bare `/bin/bash` in a pane, which is why
92
+ * `~/.bashrc` has always been sourced). The flag that actually changes anything is
93
+ * `-l`: it makes the pane a LOGIN shell, matching what tmux itself does when it
94
+ * spawns a pane with no `default-command`, and picking up the `/etc/profile` and
95
+ * `/etc/profile.d/*` PATH entries that a systemd-spawned server never sourced.
96
+ *
97
+ * `-i` is kept alongside it because for bash the two select different files —
98
+ * login reads `~/.bash_profile`, interactive-non-login reads `~/.bashrc` — and
99
+ * asking for both is the closest thing to "the shell the user actually gets".
100
+ *
101
+ * Returns a string ready to append to an already-escaped shell path.
102
+ */
103
+ export function loginShellArgs(shellPath) {
104
+ const base = shellPath.slice(shellPath.lastIndexOf('/') + 1);
105
+ return LOGIN_FLAG_SHELLS.has(base) ? ' -i -l' : '';
106
+ }
76
107
  //# sourceMappingURL=shell-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-resolver.js","sourceRoot":"","sources":["../../src/utils/shell-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,qFAAqF;AACrF,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE7D;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E,SAAS,aAAa,CAAC,SAAiB;IACtC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,CAAC;QACH,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,iFAAiF;QACjF,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7C,IAAI,WAAW;YAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IAEpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IACjD,CAAC;IAED,8EAA8E;IAC9E,+DAA+D;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"shell-resolver.js","sourceRoot":"","sources":["../../src/utils/shell-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,qFAAqF;AACrF,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE7D;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E;;;;;;;;;GASG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjH,SAAS,aAAa,CAAC,SAAiB;IACtC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,CAAC;QACH,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAI,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,iFAAiF;QACjF,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7C,IAAI,WAAW;YAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IAEpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IACjD,CAAC;IAED,8EAA8E;IAC9E,+DAA+D;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC"}
Binary file