@jkwd/inbase 0.1.22 → 0.1.24

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.
package/README.md CHANGED
@@ -55,7 +55,7 @@ A normal chat request connects to the next empty slot. Use `/coral add a login p
55
55
 
56
56
  If several slots are waiting, the next Cursor chat attaches the oldest empty session. Sessions that already have an LLM are skipped, and the map window does not need to be focused.
57
57
 
58
- With **Step by step** on, click **Create proposal** to start a step, then **Accept proposal** when the patch is ready. **Explain proposal** sits next to both and has the LLM walk the current plan step or pending patch on the map. With Step by step off, the LLM implements the full plan; you can still walk Previous/Next over the diffs, then **Accept proposal**. Send an alternative instruction from the HUD to update the current proposal, or **Stop** to end the session.
58
+ With **Step by step** on, click **Create proposal** to start a step, then **Accept proposal** when the patch is ready. **Explain proposal** stays greyed out until that patch exists, then has the LLM walk it on the map. With Step by step off, the LLM implements the full plan; you can still walk Previous/Next over the diffs, then **Accept proposal**. Send an alternative instruction from the HUD to update the current proposal, or **Stop** to end the session.
59
59
 
60
60
  When no LLM is currently making changes, turn on **Show branch changes** (or press **G**) to highlight the current git branch against its base — committed, unstaged, and untracked files — instead of LLM patch files. The control is disabled while an LLM session is writing or reviewing a patch.
61
61
 
@@ -838,6 +838,7 @@ button {
838
838
  max-height: 100%;
839
839
  overflow-x: hidden;
840
840
  overflow-y: auto;
841
+ pointer-events: auto;
841
842
  }
842
843
 
843
844
  .hud-left-stack .hud-panel-planned[data-minimized='true'] {
@@ -1242,6 +1243,11 @@ button {
1242
1243
  min-width: 0;
1243
1244
  }
1244
1245
 
1246
+ .hud-step-title {
1247
+ flex: 1 1 100%;
1248
+ min-width: 0;
1249
+ }
1250
+
1245
1251
  .hud-steps li[data-active='true']:not([data-done='true']) {
1246
1252
  color: #ffffff;
1247
1253
  }
@@ -1274,11 +1280,20 @@ button {
1274
1280
  text-decoration: none;
1275
1281
  }
1276
1282
 
1283
+ .hud-run-step:disabled {
1284
+ opacity: 0.4;
1285
+ border-color: #3a4250;
1286
+ color: #8b95a5;
1287
+ }
1288
+
1277
1289
  .hud-step-actions {
1278
1290
  display: flex;
1279
1291
  flex-wrap: wrap;
1280
1292
  flex: 1 1 100%;
1281
1293
  gap: 6px;
1294
+ position: relative;
1295
+ z-index: 1;
1296
+ pointer-events: auto;
1282
1297
  }
1283
1298
 
1284
1299
  .hud-panel-planned .hud-section-title {
@@ -1085,7 +1085,16 @@ function SessionPanel({
1085
1085
  data-minimized={minimized}
1086
1086
  data-focused={focused}
1087
1087
  data-attached={llmConnected && !llmDisconnected}
1088
- onPointerDown={onFocus}
1088
+ onPointerDown={(event) => {
1089
+ const target = event.target
1090
+ if (
1091
+ target instanceof Element &&
1092
+ target.closest('button, textarea, input, a, label')
1093
+ ) {
1094
+ return
1095
+ }
1096
+ onFocus()
1097
+ }}
1089
1098
  >
1090
1099
  <PanelChrome
1091
1100
  title={
@@ -1256,17 +1265,17 @@ function SessionPanel({
1256
1265
  type="button"
1257
1266
  disabled={creating}
1258
1267
  aria-busy={creating}
1259
- onClick={() =>
1260
- proposed
1261
- ? lastStep
1262
- ? act('continue')
1263
- : act('invoke', {
1264
- step: step.index + 1,
1265
- })
1266
- : act('invoke', {
1267
- step: step.index,
1268
- })
1269
- }
1268
+ onPointerDown={(event) => event.stopPropagation()}
1269
+ onClick={(event) => {
1270
+ event.stopPropagation()
1271
+ if (creating) return
1272
+ if (proposed) {
1273
+ if (lastStep) act('continue')
1274
+ else act('invoke', { step: step.index + 1 })
1275
+ return
1276
+ }
1277
+ act('invoke', { step: step.index })
1278
+ }}
1270
1279
  >
1271
1280
  {proposed
1272
1281
  ? 'Accept proposal'
@@ -1274,29 +1283,35 @@ function SessionPanel({
1274
1283
  ? 'Creating proposal…'
1275
1284
  : 'Create proposal'}
1276
1285
  </button>
1277
- {!creating && (
1278
- <button
1279
- className="hud-button hud-button-approve hud-run-step"
1280
- type="button"
1281
- disabled={explaining}
1282
- aria-busy={explaining}
1283
- onClick={() => {
1284
- setStartingExplain(true)
1285
- void Promise.resolve(
1286
- onWorkflowAction(
1287
- sessionId,
1288
- 'explain_proposal',
1289
- ),
1290
- ).then((ok) => {
1291
- if (ok === false) setStartingExplain(false)
1292
- })
1293
- }}
1294
- >
1295
- {explaining
1296
- ? 'Starting explanation…'
1297
- : 'Explain proposal'}
1298
- </button>
1299
- )}
1286
+ <button
1287
+ className="hud-button hud-button-approve hud-run-step"
1288
+ type="button"
1289
+ disabled={!proposed || explaining}
1290
+ aria-busy={explaining}
1291
+ title={
1292
+ proposed
1293
+ ? undefined
1294
+ : 'Available once a proposal exists'
1295
+ }
1296
+ onPointerDown={(event) => event.stopPropagation()}
1297
+ onClick={(event) => {
1298
+ event.stopPropagation()
1299
+ if (!proposed || explaining) return
1300
+ setStartingExplain(true)
1301
+ void Promise.resolve(
1302
+ onWorkflowAction(
1303
+ sessionId,
1304
+ 'explain_proposal',
1305
+ ),
1306
+ ).then((ok) => {
1307
+ if (ok === false) setStartingExplain(false)
1308
+ })
1309
+ }}
1310
+ >
1311
+ {explaining
1312
+ ? 'Starting explanation…'
1313
+ : 'Explain proposal'}
1314
+ </button>
1300
1315
  </span>
1301
1316
  )}
1302
1317
  </span>
package/bin/project.mjs CHANGED
@@ -55,13 +55,15 @@ export function resolveOptionalPath(value, fallback) {
55
55
 
56
56
  export const INSTANCE_FILE = 'instance.json'
57
57
 
58
- function isPidAlive(pid) {
58
+ export function isPidAlive(pid) {
59
59
  if (!Number.isInteger(pid)) return true
60
60
  try {
61
61
  process.kill(pid, 0)
62
62
  return true
63
- } catch {
64
- return false
63
+ } catch (error) {
64
+ // Cursor's agent sandbox cannot signal other processes (EPERM) even when
65
+ // they are alive. POSIX EPERM means the pid exists; only ESRCH is gone.
66
+ return error?.code === 'EPERM'
65
67
  }
66
68
  }
67
69
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jkwd/inbase",
3
- "version": "0.1.22",
3
+ "version": "0.1.24",
4
4
  "description": "A first-person 3D map of a codebase, with a visual coding workflow for Cursor.",
5
5
  "license": "MIT",
6
6
  "author": "Joris Kuijper",