@staff0rd/assist 0.329.2 → 0.330.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.329.2",
9
+ version: "0.330.0",
10
10
  type: "module",
11
11
  main: "dist/index.js",
12
12
  bin: {
@@ -6226,6 +6226,68 @@ async function openInCode(req, res) {
6226
6226
  }
6227
6227
  }
6228
6228
 
6229
+ // src/commands/sessions/web/createCachedGhJson.ts
6230
+ import { execFile as execFile2 } from "child_process";
6231
+ import { promisify as promisify3 } from "util";
6232
+ var execFileAsync2 = promisify3(execFile2);
6233
+ var CACHE_TTL_MS = 3e4;
6234
+ function createCachedGhJson(args, parse3, fallback) {
6235
+ const cache = /* @__PURE__ */ new Map();
6236
+ return async (cwd) => {
6237
+ const now = Date.now();
6238
+ const cached = cache.get(cwd);
6239
+ if (cached && cached.expires > now) return cached.value;
6240
+ let value = fallback;
6241
+ try {
6242
+ const { stdout } = await execFileAsync2("gh", args, {
6243
+ encoding: "utf8",
6244
+ cwd: windowsCwdToWslPath(cwd)
6245
+ });
6246
+ value = parse3(stdout);
6247
+ } catch {
6248
+ value = fallback;
6249
+ }
6250
+ cache.set(cwd, { value, expires: now + CACHE_TTL_MS });
6251
+ return value;
6252
+ };
6253
+ }
6254
+
6255
+ // src/commands/sessions/web/prList.ts
6256
+ var getOpenPrs = createCachedGhJson(
6257
+ ["pr", "list", "--state", "open", "--json", "number,title,author,createdAt"],
6258
+ (stdout) => {
6259
+ const parsed = JSON.parse(stdout);
6260
+ if (!Array.isArray(parsed)) return [];
6261
+ return parsed.map((pr) => ({
6262
+ number: pr.number,
6263
+ title: pr.title,
6264
+ author: pr.author?.name || pr.author?.login || "unknown",
6265
+ createdAt: pr.createdAt
6266
+ }));
6267
+ },
6268
+ []
6269
+ );
6270
+ async function prList(req, res) {
6271
+ const cwd = getCwdParam(req, res);
6272
+ if (!cwd) return;
6273
+ respondJson(res, 200, { prs: await getOpenPrs(cwd) });
6274
+ }
6275
+
6276
+ // src/commands/sessions/web/prStatus.ts
6277
+ var getPrNumber = createCachedGhJson(
6278
+ ["pr", "view", "--json", "number"],
6279
+ (stdout) => {
6280
+ const parsed = JSON.parse(stdout);
6281
+ return typeof parsed.number === "number" ? parsed.number : null;
6282
+ },
6283
+ null
6284
+ );
6285
+ async function prStatus(req, res) {
6286
+ const cwd = getCwdParam(req, res);
6287
+ if (!cwd) return;
6288
+ respondJson(res, 200, { number: await getPrNumber(cwd) });
6289
+ }
6290
+
6229
6291
  // src/commands/sessions/daemon/stopDaemon.ts
6230
6292
  var STOP_TIMEOUT_MS = 5e3;
6231
6293
  async function stopDaemon() {
@@ -6357,6 +6419,8 @@ var routes2 = {
6357
6419
  "POST /api/restart": restartWeb,
6358
6420
  "GET /api/github-url": githubUrl,
6359
6421
  "GET /api/git-status": gitStatus,
6422
+ "GET /api/pr-status": prStatus,
6423
+ "GET /api/pr-list": prList,
6360
6424
  "GET /api/news/items": listNewsItems,
6361
6425
  "GET /api/usage/history": listUsageHistory,
6362
6426
  "GET /api/backups/list": getBackups
@@ -20596,6 +20660,8 @@ function broadcast(clients, msg) {
20596
20660
  function toSessionInfo({
20597
20661
  id: id2,
20598
20662
  name,
20663
+ title,
20664
+ subtitle,
20599
20665
  commandType,
20600
20666
  status: status2,
20601
20667
  startedAt,
@@ -20614,6 +20680,8 @@ function toSessionInfo({
20614
20680
  return {
20615
20681
  id: id2,
20616
20682
  name,
20683
+ title,
20684
+ subtitle,
20617
20685
  commandType,
20618
20686
  status: status2,
20619
20687
  startedAt,
@@ -20730,7 +20798,7 @@ function ensureSpawnHelperExecutable() {
20730
20798
  function spawnPty(args, cwd, sessionId) {
20731
20799
  ensureSpawnHelperExecutable();
20732
20800
  const shell = process.platform === "win32" ? "cmd.exe" : process.env.SHELL ?? "bash";
20733
- const shellArgs = process.platform === "win32" ? ["/c", ...args] : ["-c", `exec ${args.map(shellEscape).join(" ")}`];
20801
+ const shellArgs = process.platform === "win32" ? ["/c", ...args] : ["-l", "-c", `exec ${args.map(shellEscape).join(" ")}`];
20734
20802
  const { CLAUDE_CODE_CHILD_SESSION: _childSession, ...parentEnv } = process.env;
20735
20803
  return pty.spawn(shell, shellArgs, {
20736
20804
  name: "xterm-256color",
@@ -20739,6 +20807,7 @@ function spawnPty(args, cwd, sessionId) {
20739
20807
  cwd: cwd ?? process.cwd(),
20740
20808
  env: {
20741
20809
  ...parentEnv,
20810
+ ASSIST_SESSION: "1",
20742
20811
  ...sessionId && {
20743
20812
  ASSIST_SESSION_ID: sessionId,
20744
20813
  ASSIST_ACTIVITY_ID: sessionId
@@ -20751,11 +20820,13 @@ function shellEscape(s) {
20751
20820
  }
20752
20821
 
20753
20822
  // src/commands/sessions/daemon/createAssistSession.ts
20754
- function createAssistSession(id2, assistArgs, cwd) {
20823
+ function createAssistSession(id2, assistArgs, cwd, meta) {
20755
20824
  const startedAt = Date.now();
20756
20825
  return {
20757
20826
  id: id2,
20758
20827
  name: `assist ${assistArgs.join(" ")}`,
20828
+ title: meta?.title,
20829
+ subtitle: meta?.subtitle,
20759
20830
  commandType: "assist",
20760
20831
  status: "running",
20761
20832
  startedAt,
@@ -21983,8 +22054,10 @@ var SessionManager = class {
21983
22054
  spawnRun(runName, runArgs, cwd) {
21984
22055
  return this.spawnWith((id2) => createRunSession(id2, runName, runArgs, cwd));
21985
22056
  }
21986
- spawnAssist(assistArgs, cwd) {
21987
- return this.spawnWith((id2) => createAssistSession(id2, assistArgs, cwd));
22057
+ spawnAssist(assistArgs, cwd, meta) {
22058
+ return this.spawnWith(
22059
+ (id2) => createAssistSession(id2, assistArgs, cwd, meta)
22060
+ );
21988
22061
  }
21989
22062
  resume(sessionId, cwd, name) {
21990
22063
  return this.spawnWith((id2) => resumeSession(id2, sessionId, cwd, name));
@@ -22051,7 +22124,14 @@ import * as fs30 from "fs";
22051
22124
  import * as path50 from "path";
22052
22125
 
22053
22126
  // src/commands/sessions/shared/deriveHistoryFields.ts
22054
- var KNOWN = ["draft", "next", "bug", "refine", "run"];
22127
+ var KNOWN = [
22128
+ "draft",
22129
+ "next",
22130
+ "bug",
22131
+ "refine",
22132
+ "review",
22133
+ "run"
22134
+ ];
22055
22135
  function deriveHistoryFields(commandName, commandArgs, name) {
22056
22136
  const fields = {};
22057
22137
  const sessionType = deriveSessionType(commandName, name);
@@ -22318,13 +22398,7 @@ function safeParse2(line) {
22318
22398
  }
22319
22399
  }
22320
22400
 
22321
- // src/commands/sessions/daemon/messageHandlers.ts
22322
- function creator(isNew, spawn12) {
22323
- return (client, m, d) => {
22324
- if (m.windowsProxy.route(client, d)) return;
22325
- sendTo(client, { type: "created", sessionId: spawn12(m, d), isNew });
22326
- };
22327
- }
22401
+ // src/commands/sessions/daemon/lifecycleHandlers.ts
22328
22402
  function handleHistory(client) {
22329
22403
  discoverSessions().then(
22330
22404
  (sessions) => sendTo(client, { type: "history", sessions })
@@ -22341,6 +22415,19 @@ function handleShutdown(client, manager) {
22341
22415
  sendTo(client, { type: "shutting-down" });
22342
22416
  setImmediate(() => process.exit(0));
22343
22417
  }
22418
+ var lifecycleHandlers = {
22419
+ history: handleHistory,
22420
+ "fetch-transcript": handleFetchTranscript,
22421
+ shutdown: handleShutdown
22422
+ };
22423
+
22424
+ // src/commands/sessions/daemon/messageHandlers.ts
22425
+ function creator(isNew, spawn12) {
22426
+ return (client, m, d) => {
22427
+ if (m.windowsProxy.route(client, d)) return;
22428
+ sendTo(client, { type: "created", sessionId: spawn12(m, d), isNew });
22429
+ };
22430
+ }
22344
22431
  function routed(local) {
22345
22432
  return (client, m, d) => {
22346
22433
  if (!m.windowsProxy.route(client, d)) local(client, m, d);
@@ -22366,7 +22453,11 @@ var messageHandlers = {
22366
22453
  true,
22367
22454
  (m, d) => m.spawnAssist(
22368
22455
  d.assistArgs ?? [],
22369
- d.cwd
22456
+ d.cwd,
22457
+ {
22458
+ title: d.title,
22459
+ subtitle: d.subtitle
22460
+ }
22370
22461
  )
22371
22462
  ),
22372
22463
  resume: creator(
@@ -22377,9 +22468,7 @@ var messageHandlers = {
22377
22468
  d.name
22378
22469
  )
22379
22470
  ),
22380
- history: handleHistory,
22381
- "fetch-transcript": handleFetchTranscript,
22382
- shutdown: handleShutdown,
22471
+ ...lifecycleHandlers,
22383
22472
  drain: (client, m) => sendTo(client, { type: "drained", count: m.drain() }),
22384
22473
  limits: (_client, m, d) => m.clients.updateLimits(d.rateLimits),
22385
22474
  input: routed(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staff0rd/assist",
3
- "version": "0.329.2",
3
+ "version": "0.330.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {