@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 +1 -1
- package/apps/explorer/src/index.css +15 -0
- package/apps/explorer/src/ui/HUD.tsx +50 -35
- package/bin/project.mjs +5 -3
- package/package.json +1 -1
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**
|
|
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={
|
|
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
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
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
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
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
|
-
|
|
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
|
|