@staff0rd/assist 0.394.0 → 0.395.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.
- package/README.md +1 -1
- package/dist/commands/sessions/web/bundle.js +86 -86
- package/dist/index.js +80 -42
- package/package.json +1 -1
- package/pi/status-driver.ts +22 -0
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { Command } from "commander";
|
|
|
6
6
|
// package.json
|
|
7
7
|
var package_default = {
|
|
8
8
|
name: "@staff0rd/assist",
|
|
9
|
-
version: "0.
|
|
9
|
+
version: "0.395.0",
|
|
10
10
|
type: "module",
|
|
11
11
|
main: "dist/index.js",
|
|
12
12
|
bin: {
|
|
@@ -6437,6 +6437,7 @@ import { dirname as dirname16, join as join20 } from "path";
|
|
|
6437
6437
|
import { z as z4 } from "zod";
|
|
6438
6438
|
var activitySchema = z4.object({
|
|
6439
6439
|
kind: z4.enum(["command", "backlog"]),
|
|
6440
|
+
harness: z4.enum(["claude", "codex", "pi"]).optional(),
|
|
6440
6441
|
name: z4.string().optional(),
|
|
6441
6442
|
itemId: z4.number().optional(),
|
|
6442
6443
|
itemName: z4.string().optional(),
|
|
@@ -23666,9 +23667,6 @@ function reportStrays(pids) {
|
|
|
23666
23667
|
// src/commands/sessions/daemon/drainDaemon.ts
|
|
23667
23668
|
import { createInterface as createInterface6 } from "readline";
|
|
23668
23669
|
|
|
23669
|
-
// src/commands/sessions/daemon/loadPersistedSessions.ts
|
|
23670
|
-
import { z as z5 } from "zod";
|
|
23671
|
-
|
|
23672
23670
|
// src/commands/sessions/daemon/daemonLog.ts
|
|
23673
23671
|
var RING_CAPACITY = 1e3;
|
|
23674
23672
|
var ring = [];
|
|
@@ -23692,13 +23690,14 @@ function recentDaemonLogLines() {
|
|
|
23692
23690
|
return [...ring];
|
|
23693
23691
|
}
|
|
23694
23692
|
|
|
23695
|
-
// src/commands/sessions/daemon/
|
|
23696
|
-
|
|
23693
|
+
// src/commands/sessions/daemon/persistedSessionSchema.ts
|
|
23694
|
+
import { z as z5 } from "zod";
|
|
23697
23695
|
var persistedSessionSchema = z5.object({
|
|
23698
23696
|
name: z5.string(),
|
|
23699
23697
|
title: z5.string().optional(),
|
|
23700
23698
|
subtitle: z5.string().optional(),
|
|
23701
23699
|
commandType: z5.enum(["claude", "run", "assist"]),
|
|
23700
|
+
harness: z5.enum(["claude", "codex", "pi"]).optional(),
|
|
23702
23701
|
status: z5.enum(["running", "waiting", "done", "error"]).optional(),
|
|
23703
23702
|
cwd: z5.string(),
|
|
23704
23703
|
startedAt: z5.number(),
|
|
@@ -23711,6 +23710,34 @@ var persistedSessionSchema = z5.object({
|
|
|
23711
23710
|
activity: activitySchema.optional(),
|
|
23712
23711
|
starred: z5.boolean().optional()
|
|
23713
23712
|
});
|
|
23713
|
+
|
|
23714
|
+
// src/commands/sessions/daemon/toPersistedSession.ts
|
|
23715
|
+
function toPersistedSession(session) {
|
|
23716
|
+
return {
|
|
23717
|
+
name: session.name,
|
|
23718
|
+
title: session.title,
|
|
23719
|
+
subtitle: session.subtitle,
|
|
23720
|
+
commandType: session.commandType,
|
|
23721
|
+
harness: session.harness,
|
|
23722
|
+
status: session.status,
|
|
23723
|
+
cwd: session.cwd ?? process.cwd(),
|
|
23724
|
+
startedAt: session.startedAt,
|
|
23725
|
+
runningMs: accumulatedRunningMs(session),
|
|
23726
|
+
claudeSessionId: session.claudeSessionId,
|
|
23727
|
+
initialPrompt: session.initialPrompt,
|
|
23728
|
+
runName: session.runName,
|
|
23729
|
+
runArgs: session.runArgs,
|
|
23730
|
+
assistArgs: session.assistArgs,
|
|
23731
|
+
activity: session.activity,
|
|
23732
|
+
starred: session.starred
|
|
23733
|
+
};
|
|
23734
|
+
}
|
|
23735
|
+
function accumulatedRunningMs(session) {
|
|
23736
|
+
return session.runningSince != null ? session.runningMs + Date.now() - session.runningSince : session.runningMs;
|
|
23737
|
+
}
|
|
23738
|
+
|
|
23739
|
+
// src/commands/sessions/daemon/loadPersistedSessions.ts
|
|
23740
|
+
var SESSIONS_FILE = "sessions.json";
|
|
23714
23741
|
function loadPersistedSessions() {
|
|
23715
23742
|
const data = loadJson(SESSIONS_FILE);
|
|
23716
23743
|
if (!Array.isArray(data)) return [];
|
|
@@ -23738,28 +23765,6 @@ function logPersist(live) {
|
|
|
23738
23765
|
live.length > 0 ? `persisted ${live.length} session(s): ${live.map((s) => s.name).join(", ")}` : "persisted 0 sessions (sessions.json cleared)"
|
|
23739
23766
|
);
|
|
23740
23767
|
}
|
|
23741
|
-
function toPersistedSession(session) {
|
|
23742
|
-
return {
|
|
23743
|
-
name: session.name,
|
|
23744
|
-
title: session.title,
|
|
23745
|
-
subtitle: session.subtitle,
|
|
23746
|
-
commandType: session.commandType,
|
|
23747
|
-
status: session.status,
|
|
23748
|
-
cwd: session.cwd ?? process.cwd(),
|
|
23749
|
-
startedAt: session.startedAt,
|
|
23750
|
-
runningMs: accumulatedRunningMs(session),
|
|
23751
|
-
claudeSessionId: session.claudeSessionId,
|
|
23752
|
-
initialPrompt: session.initialPrompt,
|
|
23753
|
-
runName: session.runName,
|
|
23754
|
-
runArgs: session.runArgs,
|
|
23755
|
-
assistArgs: session.assistArgs,
|
|
23756
|
-
activity: session.activity,
|
|
23757
|
-
starred: session.starred
|
|
23758
|
-
};
|
|
23759
|
-
}
|
|
23760
|
-
function accumulatedRunningMs(session) {
|
|
23761
|
-
return session.runningSince != null ? session.runningMs + Date.now() - session.runningSince : session.runningMs;
|
|
23762
|
-
}
|
|
23763
23768
|
|
|
23764
23769
|
// src/commands/sessions/daemon/drainDaemon.ts
|
|
23765
23770
|
var DRAIN_TIMEOUT_MS = 5e3;
|
|
@@ -23870,6 +23875,7 @@ function toSessionInfo({
|
|
|
23870
23875
|
title,
|
|
23871
23876
|
subtitle,
|
|
23872
23877
|
commandType,
|
|
23878
|
+
harness,
|
|
23873
23879
|
status: status3,
|
|
23874
23880
|
startedAt,
|
|
23875
23881
|
runningMs,
|
|
@@ -23893,6 +23899,7 @@ function toSessionInfo({
|
|
|
23893
23899
|
title,
|
|
23894
23900
|
subtitle,
|
|
23895
23901
|
commandType,
|
|
23902
|
+
harness,
|
|
23896
23903
|
status: status3,
|
|
23897
23904
|
startedAt,
|
|
23898
23905
|
runningMs,
|
|
@@ -24100,6 +24107,13 @@ function buildArgs3(opts) {
|
|
|
24100
24107
|
return base;
|
|
24101
24108
|
}
|
|
24102
24109
|
|
|
24110
|
+
// src/commands/sessions/daemon/spawnPi.ts
|
|
24111
|
+
function spawnPi2(opts = {}) {
|
|
24112
|
+
const args = ["pi"];
|
|
24113
|
+
if (opts.prompt) args.push(opts.prompt);
|
|
24114
|
+
return spawnPty(args, opts.cwd, opts.sessionId);
|
|
24115
|
+
}
|
|
24116
|
+
|
|
24103
24117
|
// src/commands/sessions/daemon/spawnRun.ts
|
|
24104
24118
|
function spawnRun(opts) {
|
|
24105
24119
|
return spawnPty(["assist", "run", opts.name, ...opts.args ?? []], opts.cwd);
|
|
@@ -24119,7 +24133,8 @@ function sessionBase(id, status3) {
|
|
|
24119
24133
|
scrollback: ""
|
|
24120
24134
|
};
|
|
24121
24135
|
}
|
|
24122
|
-
function createSession(id, prompt, cwd, design) {
|
|
24136
|
+
function createSession(id, prompt, cwd, design, harness) {
|
|
24137
|
+
if (harness === "pi") return createPiSession(id, prompt, cwd);
|
|
24123
24138
|
const claudeSessionId = randomUUID4();
|
|
24124
24139
|
return {
|
|
24125
24140
|
...sessionBase(id, prompt ? "running" : "waiting"),
|
|
@@ -24132,6 +24147,17 @@ function createSession(id, prompt, cwd, design) {
|
|
|
24132
24147
|
design
|
|
24133
24148
|
};
|
|
24134
24149
|
}
|
|
24150
|
+
function createPiSession(id, prompt, cwd) {
|
|
24151
|
+
return {
|
|
24152
|
+
...sessionBase(id, prompt ? "running" : "waiting"),
|
|
24153
|
+
name: prompt?.slice(0, 40) || `Session ${id}`,
|
|
24154
|
+
commandType: "claude",
|
|
24155
|
+
harness: "pi",
|
|
24156
|
+
pty: spawnPi2({ prompt, cwd, sessionId: id }),
|
|
24157
|
+
cwd,
|
|
24158
|
+
initialPrompt: prompt
|
|
24159
|
+
};
|
|
24160
|
+
}
|
|
24135
24161
|
function createRunSession(id, runName, runArgs, cwd) {
|
|
24136
24162
|
return {
|
|
24137
24163
|
...sessionBase(id, "running"),
|
|
@@ -24796,6 +24822,7 @@ function restoreBase(id, persisted) {
|
|
|
24796
24822
|
title: persisted.title,
|
|
24797
24823
|
subtitle: persisted.subtitle,
|
|
24798
24824
|
commandType: persisted.commandType,
|
|
24825
|
+
harness: persisted.harness,
|
|
24799
24826
|
scrollback: "",
|
|
24800
24827
|
cwd: persisted.cwd,
|
|
24801
24828
|
assistArgs: persisted.assistArgs,
|
|
@@ -25809,8 +25836,10 @@ var SessionManager = class {
|
|
|
25809
25836
|
return session.id;
|
|
25810
25837
|
}
|
|
25811
25838
|
spawnWith = (create) => this.add(create(sessionLimits.nextId(this.sessions.size, this.idCounter)));
|
|
25812
|
-
spawn(prompt, cwd, design) {
|
|
25813
|
-
return this.spawnWith(
|
|
25839
|
+
spawn(prompt, cwd, design, harness) {
|
|
25840
|
+
return this.spawnWith(
|
|
25841
|
+
(id) => createSession(id, prompt, cwd, design, harness)
|
|
25842
|
+
);
|
|
25814
25843
|
}
|
|
25815
25844
|
spawnRun(runName, runArgs, cwd) {
|
|
25816
25845
|
return this.spawnWith((id) => createRunSession(id, runName, runArgs, cwd));
|
|
@@ -26009,12 +26038,16 @@ var lifecycleHandlers = {
|
|
|
26009
26038
|
// src/commands/sessions/daemon/spawnCreate.ts
|
|
26010
26039
|
function spawnCreate(m, d) {
|
|
26011
26040
|
const design = d.design === true;
|
|
26041
|
+
const harness = d.harness;
|
|
26012
26042
|
if (design)
|
|
26013
26043
|
daemonLog(`create: design session (cwd=${d.cwd ?? ""})`);
|
|
26044
|
+
if (harness && harness !== "claude")
|
|
26045
|
+
daemonLog(`create: ${harness} session (cwd=${d.cwd ?? ""})`);
|
|
26014
26046
|
return m.spawn(
|
|
26015
26047
|
d.prompt,
|
|
26016
26048
|
d.cwd,
|
|
26017
|
-
design
|
|
26049
|
+
design,
|
|
26050
|
+
harness
|
|
26018
26051
|
);
|
|
26019
26052
|
}
|
|
26020
26053
|
|
|
@@ -26850,16 +26883,21 @@ import * as path63 from "path";
|
|
|
26850
26883
|
// src/commands/sync/syncPiHooks.ts
|
|
26851
26884
|
import * as fs43 from "fs";
|
|
26852
26885
|
import * as path62 from "path";
|
|
26853
|
-
|
|
26854
|
-
|
|
26855
|
-
|
|
26856
|
-
|
|
26857
|
-
|
|
26858
|
-
|
|
26859
|
-
fs43.
|
|
26860
|
-
|
|
26886
|
+
function piExtensionsDir() {
|
|
26887
|
+
return path62.join(harnesses.pi.homeDir, "extensions");
|
|
26888
|
+
}
|
|
26889
|
+
function syncPiHooks(sourceDir) {
|
|
26890
|
+
const target = piExtensionsDir();
|
|
26891
|
+
fs43.mkdirSync(target, { recursive: true });
|
|
26892
|
+
const files = fs43.readdirSync(sourceDir).filter((f) => f.endsWith(".ts"));
|
|
26893
|
+
for (const file of files) {
|
|
26894
|
+
fs43.copyFileSync(
|
|
26895
|
+
path62.join(sourceDir, file),
|
|
26896
|
+
path62.join(target, `assist-${file}`)
|
|
26897
|
+
);
|
|
26898
|
+
}
|
|
26861
26899
|
console.log(
|
|
26862
|
-
|
|
26900
|
+
`Registered ${files.length} assist extension(s) in ~/.pi/agent/extensions`
|
|
26863
26901
|
);
|
|
26864
26902
|
}
|
|
26865
26903
|
|
|
@@ -26892,7 +26930,7 @@ function syncPi(claudeDir) {
|
|
|
26892
26930
|
harnesses.pi,
|
|
26893
26931
|
commandToPrompt
|
|
26894
26932
|
);
|
|
26895
|
-
syncPiHooks(path63.join(claudeDir, "..", "pi"
|
|
26933
|
+
syncPiHooks(path63.join(claudeDir, "..", "pi"));
|
|
26896
26934
|
console.log(
|
|
26897
26935
|
`Synced ${synced} prompt(s) to ~/.pi/agent/prompts and CLAUDE.md to ~/.pi/agent/AGENTS.md`
|
|
26898
26936
|
);
|
package/package.json
CHANGED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
|
|
4
|
+
function setStatus(status: "running" | "waiting"): void {
|
|
5
|
+
try {
|
|
6
|
+
const child = spawn("assist", ["sessions", "set-status", status], {
|
|
7
|
+
stdio: "ignore",
|
|
8
|
+
detached: true,
|
|
9
|
+
});
|
|
10
|
+
child.on("error", () => {});
|
|
11
|
+
child.unref();
|
|
12
|
+
} catch {}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default function (pi: ExtensionAPI) {
|
|
16
|
+
pi.on("agent_start", () => {
|
|
17
|
+
setStatus("running");
|
|
18
|
+
});
|
|
19
|
+
pi.on("agent_settled", () => {
|
|
20
|
+
setStatus("waiting");
|
|
21
|
+
});
|
|
22
|
+
}
|