aicodeman 1.34.0 → 1.35.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 (161) hide show
  1. package/README.md +3 -0
  2. package/dist/config/dependency-registry.d.ts +7 -0
  3. package/dist/config/dependency-registry.d.ts.map +1 -1
  4. package/dist/config/dependency-registry.js +15 -0
  5. package/dist/config/dependency-registry.js.map +1 -1
  6. package/dist/config/path-probe.d.ts +37 -0
  7. package/dist/config/path-probe.d.ts.map +1 -0
  8. package/dist/config/path-probe.js +43 -0
  9. package/dist/config/path-probe.js.map +1 -0
  10. package/dist/git-workspace-status.d.ts +220 -0
  11. package/dist/git-workspace-status.d.ts.map +1 -0
  12. package/dist/git-workspace-status.js +606 -0
  13. package/dist/git-workspace-status.js.map +1 -0
  14. package/dist/hooks-config.d.ts.map +1 -1
  15. package/dist/hooks-config.js +83 -13
  16. package/dist/hooks-config.js.map +1 -1
  17. package/dist/types/api.d.ts +7 -0
  18. package/dist/types/api.d.ts.map +1 -1
  19. package/dist/types/api.js.map +1 -1
  20. package/dist/utils/bounded-path-probe.d.ts +99 -0
  21. package/dist/utils/bounded-path-probe.d.ts.map +1 -0
  22. package/dist/utils/bounded-path-probe.js +228 -0
  23. package/dist/utils/bounded-path-probe.js.map +1 -0
  24. package/dist/utils/cli-executable-resolver.d.ts +2 -0
  25. package/dist/utils/cli-executable-resolver.d.ts.map +1 -1
  26. package/dist/utils/cli-executable-resolver.js +2 -1
  27. package/dist/utils/cli-executable-resolver.js.map +1 -1
  28. package/dist/utils/dependency-checker.d.ts +2 -0
  29. package/dist/utils/dependency-checker.d.ts.map +1 -1
  30. package/dist/utils/dependency-checker.js +37 -9
  31. package/dist/utils/dependency-checker.js.map +1 -1
  32. package/dist/utils/index.d.ts +2 -0
  33. package/dist/utils/index.d.ts.map +1 -1
  34. package/dist/utils/index.js +1 -0
  35. package/dist/utils/index.js.map +1 -1
  36. package/dist/web/case-path.d.ts +58 -0
  37. package/dist/web/case-path.d.ts.map +1 -0
  38. package/dist/web/case-path.js +182 -0
  39. package/dist/web/case-path.js.map +1 -0
  40. package/dist/web/public/admin-ui.js.gz +0 -0
  41. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  42. package/dist/web/public/app.b9516c7b.js +43 -0
  43. package/dist/web/public/app.b9516c7b.js.br +0 -0
  44. package/dist/web/public/app.b9516c7b.js.gz +0 -0
  45. package/dist/web/public/approvals-ui.js.gz +0 -0
  46. package/dist/web/public/constants.d95fade9.js.gz +0 -0
  47. package/dist/web/public/cron-ui.js.gz +0 -0
  48. package/dist/web/public/entrance-animations.js.gz +0 -0
  49. package/dist/web/public/git-status-ui.js +673 -0
  50. package/dist/web/public/git-status-ui.js.br +0 -0
  51. package/dist/web/public/git-status-ui.js.gz +0 -0
  52. package/dist/web/public/home-sessions.js.gz +0 -0
  53. package/dist/web/public/host-wake-ui.js.gz +0 -0
  54. package/dist/web/public/i18n.52f5b7cc.js +1 -0
  55. package/dist/web/public/i18n.52f5b7cc.js.br +0 -0
  56. package/dist/web/public/i18n.52f5b7cc.js.gz +0 -0
  57. package/dist/web/public/image-input.a216cf9e.js.gz +0 -0
  58. package/dist/web/public/index.html +79 -12
  59. package/dist/web/public/index.html.br +0 -0
  60. package/dist/web/public/index.html.gz +0 -0
  61. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  62. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  63. package/dist/web/public/mobile-handlers.23a85db1.js.gz +0 -0
  64. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  65. package/dist/web/public/mobile-overview.js.gz +0 -0
  66. package/dist/web/public/mobile.1aa4952d.css.gz +0 -0
  67. package/dist/web/public/notification-manager.50bb87d8.js.gz +0 -0
  68. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  69. package/dist/web/public/panels-ui.6a5898d9.js.gz +0 -0
  70. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  71. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  72. package/dist/web/public/readmymind-ui.js.gz +0 -0
  73. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  74. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  75. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  76. package/dist/web/public/session-lineage.js.gz +0 -0
  77. package/dist/web/public/session-ui.6bddf916.js +89 -0
  78. package/dist/web/public/session-ui.6bddf916.js.br +0 -0
  79. package/dist/web/public/session-ui.6bddf916.js.gz +0 -0
  80. package/dist/web/public/settings-ui.6e798b7b.js +97 -0
  81. package/dist/web/public/settings-ui.6e798b7b.js.br +0 -0
  82. package/dist/web/public/settings-ui.6e798b7b.js.gz +0 -0
  83. package/dist/web/public/styles.2d175c60.css +1 -0
  84. package/dist/web/public/styles.2d175c60.css.br +0 -0
  85. package/dist/web/public/styles.2d175c60.css.gz +0 -0
  86. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  87. package/dist/web/public/sw.js +2 -2
  88. package/dist/web/public/sw.js.br +0 -0
  89. package/dist/web/public/sw.js.gz +0 -0
  90. package/dist/web/public/tab-layout-browser.065fcba4.js +1 -0
  91. package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
  92. package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
  93. package/dist/web/public/{tab-rail-resize.dcdc5772.js → tab-rail-resize.94cd59f0.js} +1 -1
  94. package/dist/web/public/tab-rail-resize.94cd59f0.js.br +0 -0
  95. package/dist/web/public/tab-rail-resize.94cd59f0.js.gz +0 -0
  96. package/dist/web/public/terminal-keycode229-recovery.fb91b25b.js.gz +0 -0
  97. package/dist/web/public/terminal-split.js.gz +0 -0
  98. package/dist/web/public/terminal-ui.a4535311.js.gz +0 -0
  99. package/dist/web/public/ultracode-panel.js.gz +0 -0
  100. package/dist/web/public/ultracode-windows.js.gz +0 -0
  101. package/dist/web/public/upload.html.gz +0 -0
  102. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  103. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  104. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  105. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  106. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  107. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  108. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  109. package/dist/web/public/vendor/xterm-zerolag-input.bbb5f84c.js.gz +0 -0
  110. package/dist/web/public/vendor/xterm.css.gz +0 -0
  111. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  112. package/dist/web/public/voice-input.c4b51eb6.js.gz +0 -0
  113. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  114. package/dist/web/public/webview-tabs.js.gz +0 -0
  115. package/dist/web/routes/case-routes.d.ts.map +1 -1
  116. package/dist/web/routes/case-routes.js +136 -18
  117. package/dist/web/routes/case-routes.js.map +1 -1
  118. package/dist/web/routes/doctor-routes.d.ts +23 -0
  119. package/dist/web/routes/doctor-routes.d.ts.map +1 -0
  120. package/dist/web/routes/doctor-routes.js +83 -0
  121. package/dist/web/routes/doctor-routes.js.map +1 -0
  122. package/dist/web/routes/git-status-routes.d.ts +16 -0
  123. package/dist/web/routes/git-status-routes.d.ts.map +1 -0
  124. package/dist/web/routes/git-status-routes.js +71 -0
  125. package/dist/web/routes/git-status-routes.js.map +1 -0
  126. package/dist/web/routes/index.d.ts +2 -0
  127. package/dist/web/routes/index.d.ts.map +1 -1
  128. package/dist/web/routes/index.js +2 -0
  129. package/dist/web/routes/index.js.map +1 -1
  130. package/dist/web/routes/session-routes.d.ts.map +1 -1
  131. package/dist/web/routes/session-routes.js +20 -8
  132. package/dist/web/routes/session-routes.js.map +1 -1
  133. package/dist/web/schemas.d.ts +1 -0
  134. package/dist/web/schemas.d.ts.map +1 -1
  135. package/dist/web/schemas.js +7 -0
  136. package/dist/web/schemas.js.map +1 -1
  137. package/dist/web/server.d.ts.map +1 -1
  138. package/dist/web/server.js +3 -1
  139. package/dist/web/server.js.map +1 -1
  140. package/package.json +1 -1
  141. package/skills/codeman/reference/verbs.md +3 -0
  142. package/dist/web/public/app.cf0db8ce.js +0 -43
  143. package/dist/web/public/app.cf0db8ce.js.br +0 -0
  144. package/dist/web/public/app.cf0db8ce.js.gz +0 -0
  145. package/dist/web/public/i18n.398b8331.js +0 -1
  146. package/dist/web/public/i18n.398b8331.js.br +0 -0
  147. package/dist/web/public/i18n.398b8331.js.gz +0 -0
  148. package/dist/web/public/session-ui.bf66c13b.js +0 -89
  149. package/dist/web/public/session-ui.bf66c13b.js.br +0 -0
  150. package/dist/web/public/session-ui.bf66c13b.js.gz +0 -0
  151. package/dist/web/public/settings-ui.331d3b1d.js +0 -97
  152. package/dist/web/public/settings-ui.331d3b1d.js.br +0 -0
  153. package/dist/web/public/settings-ui.331d3b1d.js.gz +0 -0
  154. package/dist/web/public/styles.8c485d26.css +0 -1
  155. package/dist/web/public/styles.8c485d26.css.br +0 -0
  156. package/dist/web/public/styles.8c485d26.css.gz +0 -0
  157. package/dist/web/public/tab-layout-browser.4e0ed50c.js +0 -1
  158. package/dist/web/public/tab-layout-browser.4e0ed50c.js.br +0 -0
  159. package/dist/web/public/tab-layout-browser.4e0ed50c.js.gz +0 -0
  160. package/dist/web/public/tab-rail-resize.dcdc5772.js.br +0 -0
  161. package/dist/web/public/tab-rail-resize.dcdc5772.js.gz +0 -0
@@ -47,6 +47,7 @@ import { dataPath, getDataDir } from '../../config/instance.js';
47
47
  import { checkRemoteTmuxAvailable, readRemoteCases, readRemoteHosts, rehydrateRemoteHostFields, toAttachedSessionRemote, toSessionRemote, } from '../../remote-hosts.js';
48
48
  import { checkDockerAvailable, checkDockerConfigDrift, probeAdoptableContainer, checkDockerTmuxAvailable, ensureAgentBaseImage, DEFAULT_AGENT_IMAGE, persistDockerCaseClaudeSessionId, readDockerCases, readDockerHosts, toSessionDocker, } from '../../docker-hosts.js';
49
49
  import { LRUMap } from '../../utils/lru-map.js';
50
+ import { describeUnknownPath, probePathKind } from '../../utils/index.js';
50
51
  import { findLatestOmpSessionId } from '../../utils/omp-session-resolver.js';
51
52
  import { scanOmpSessionsHistory } from '../../omp-transcript.js';
52
53
  import { scanCodexSessionsHistory, codexThreadBySessionId } from '../../codex-transcript.js';
@@ -760,17 +761,20 @@ options = {}) {
760
761
  if (!isWorkingDirAllowed(getAuthUser(req), workingDir)) {
761
762
  return createErrorResponse(ApiErrorCode.FORBIDDEN, 'workingDir is outside your workspace');
762
763
  }
763
- // Validate workingDir exists and is a directory
764
+ // Validate workingDir exists and is a directory. Bounded: a workingDir on a
765
+ // network mount that stopped answering must not freeze the event loop, and
766
+ // "did not answer" is reported as such, never as "does not exist".
764
767
  if (body.workingDir) {
765
- try {
766
- const stat = statSync(workingDir);
767
- if (!stat.isDirectory()) {
768
- return createErrorResponse(ApiErrorCode.INVALID_INPUT, 'workingDir is not a directory');
769
- }
768
+ const kind = await probePathKind(workingDir, { pastCap: true });
769
+ if (kind === 'unknown') {
770
+ return createErrorResponse(ApiErrorCode.OPERATION_FAILED, describeUnknownPath('workingDir', workingDir, { pastCap: true }));
770
771
  }
771
- catch {
772
+ if (kind === 'absent') {
772
773
  return createErrorResponse(ApiErrorCode.INVALID_INPUT, 'workingDir does not exist');
773
774
  }
775
+ if (kind !== 'directory') {
776
+ return createErrorResponse(ApiErrorCode.INVALID_INPUT, 'workingDir is not a directory');
777
+ }
774
778
  }
775
779
  // envOverrides flow through Session → tmux setenv (ephemeral, per-session).
776
780
  //
@@ -3175,9 +3179,17 @@ options = {}) {
3175
3179
  if (!remote && !isWorkingDirAllowed(getAuthUser(req), resolvedCasePath)) {
3176
3180
  return createErrorResponse(ApiErrorCode.FORBIDDEN, 'case path is outside your workspace');
3177
3181
  }
3182
+ // Bounded probe of a local case folder: a linked case can sit on a network mount
3183
+ // that stopped answering, and a synchronous check there froze the whole server.
3184
+ // Only a DEFINITE absence may scaffold a new case; "did not answer" must not
3185
+ // create one over the top of where the real case is mounted.
3186
+ const localCaseState = remote || docker ? undefined : await probePathKind(resolvedCasePath, { pastCap: true });
3187
+ if (localCaseState === 'unknown') {
3188
+ return createErrorResponse(ApiErrorCode.OPERATION_FAILED, describeUnknownPath('Case folder', resolvedCasePath, { pastCap: true }));
3189
+ }
3178
3190
  // Create case folder and CLAUDE.md if it doesn't exist (only for non-linked, non-remote,
3179
3191
  // non-docker cases — docker workspaces are scaffolded in their own block below)
3180
- if (!remote && !docker && !existsSync(resolvedCasePath)) {
3192
+ if (localCaseState === 'absent') {
3181
3193
  try {
3182
3194
  mkdirSync(resolvedCasePath, { recursive: true });
3183
3195
  mkdirSync(join(resolvedCasePath, 'src'), { recursive: true });