@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/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.394.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/loadPersistedSessions.ts
23696
- var SESSIONS_FILE = "sessions.json";
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((id) => createSession(id, prompt, cwd, design));
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
- var PI_PERMISSION_GATE_FILE = "assist-permission-gate.ts";
26854
- function piPermissionGateTarget() {
26855
- return path62.join(harnesses.pi.homeDir, "extensions", PI_PERMISSION_GATE_FILE);
26856
- }
26857
- function syncPiHooks(sourcePath) {
26858
- const target = piPermissionGateTarget();
26859
- fs43.mkdirSync(path62.dirname(target), { recursive: true });
26860
- fs43.copyFileSync(sourcePath, target);
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
- "Registered assist permission-gate extension in ~/.pi/agent/extensions"
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", "permission-gate.ts"));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staff0rd/assist",
3
- "version": "0.394.0",
3
+ "version": "0.395.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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
+ }