pi-goal-list-loop-audit 0.34.0 → 0.34.2

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.
@@ -196,11 +196,14 @@ export function buildStatusText(state: State, audit?: AuditDisplayProgress | nul
196
196
  // v0.28.22: the status line names the ACTIONABILITY, not the reason —
197
197
  // "decision needed" / "action needed" / "waiting" tell you at a glance
198
198
  // whether the session needs you. Legacy pauses keep the reason dump.
199
+ // v0.34.1: the policy word leaves the status line — the widget's head
200
+ // chip already names the type ("list item"), so "glla: list ⏸ …" doubled
201
+ // it. Status line = state/actionability only.
199
202
  const kind = pauseKind(g);
200
- if (kind === "decision") return `glla: ${g.policy} ${paint(theme, "accent", "⏸ decision needed")}${heldSuffix}`;
201
- if (kind === "error") return `glla: ${g.policy} ${paint(theme, "error", `⏸ action needed — ${truncate(g.pauseReason ?? "", 30)}`)}${heldSuffix}`;
202
- if (kind === "wait") return `glla: ${g.policy} ${paint(theme, "dim", `⏳ waiting${g.pauseResumeAt ? ` · resumes ${shortClock(g.pauseResumeAt)}` : ""}`)}${heldSuffix}`;
203
- const label = `${g.policy} paused ⏸ ${truncate(g.pauseReason ?? "", 40)}`;
203
+ if (kind === "decision") return `glla: ${paint(theme, "accent", "⏸ decision needed")}${heldSuffix}`;
204
+ if (kind === "error") return `glla: ${paint(theme, "error", `⏸ action needed — ${truncate(g.pauseReason ?? "", 30)}`)}${heldSuffix}`;
205
+ if (kind === "wait") return `glla: ${paint(theme, "dim", `⏳ waiting${g.pauseResumeAt ? ` · resumes ${shortClock(g.pauseResumeAt)}` : ""}`)}${heldSuffix}`;
206
+ const label = `paused ⏸ ${truncate(g.pauseReason ?? "", 40)}`;
204
207
  return `glla: ${paint(theme, pauseIsError(g) ? "error" : "warning", label)}${heldSuffix}`;
205
208
  }
206
209
  if (g.status === "active") {
@@ -208,7 +211,7 @@ export function buildStatusText(state: State, audit?: AuditDisplayProgress | nul
208
211
  // v0.29.11: the fresh session HOLDS it (hold-everything restore gate;
209
212
  // autoresume=on resumes for you) — name the verb, don't promise auto.
210
213
  if (g.interruptedAt) {
211
- return `glla: ${g.policy} ${paint(theme, "error", "⚠ interrupted — stale handle · /reload → /glla resume")}${heldSuffix}`;
214
+ return `glla: ${paint(theme, "error", "⚠ interrupted — stale handle · /reload → /glla resume")}${heldSuffix}`;
212
215
  }
213
216
  // v0.24.7: list policy gets its own wording — a queue item is not a goal.
214
217
  // v0.28.11 (U10): goal policy joins it — "list 29" read as a command
@@ -217,7 +220,10 @@ export function buildStatusText(state: State, audit?: AuditDisplayProgress | nul
217
220
  const n = state.list?.length ?? 0;
218
221
  const queue = n === 0 ? "" : ` · ${n} queued`;
219
222
  const tasks = g.taskList ? ` ${countDone(g)}/${countTotal(g)} tasks ·` : "";
220
- return `glla: ${g.policy} ${paint(theme, "success", "●")}${tasks} ${fmtElapsed(now - Date.parse(g.createdAt))}${queue}${heldSuffix}`;
223
+ // v0.34.1: no policy word here either — "glla: list ●" duplicated the
224
+ // widget's "list item" chip (field screenshot 2026-08-01). The queue
225
+ // suffix still hints list context when the widget is scrolled away.
226
+ return `glla: ${paint(theme, "success", "●")}${tasks} ${fmtElapsed(now - Date.parse(g.createdAt))}${queue}${heldSuffix}`;
221
227
  }
222
228
  // complete/aborted → clear — but a held loop still shows.
223
229
  if (held) return `glla: loop ${paint(theme, "warning", "⏸ held")} · iter ${held.iteration} — /loop to resume`;
@@ -2023,7 +2023,14 @@ async function cmdResume(ctx: ExtensionContext): Promise<void> {
2023
2023
  const usage = state.goal.usage
2024
2024
  ? { tokensUsed: state.goal.usage.tokensUsed, tokensLimit: freshLimit }
2025
2025
  : undefined;
2026
- updateGoal({ status: "active", pauseReason: undefined, pauseSuggestedAction: undefined, pauseKind: undefined, pauseOptions: undefined, pauseRecommended: undefined, pauseResumeAt: undefined, ...(staleEntry ? { interruptedAt: nowIso(), interruptedReason: "resumed in a stale session" } : {}), ...(usage ? { usage } : {}) }, ctx);
2026
+ // v0.34.2: clear the stale-handle interrupt marker on a MANUAL resume too
2027
+ // the only clear-site used to be the autoResume restore path, so with
2028
+ // autoresume=off a resumed goal kept the red "⚠ interrupted — stale handle"
2029
+ // status line forever while actively working (hegemon, 2026-08-01). The
2030
+ // marker's promise ("a fresh session will resume you") is fulfilled by a
2031
+ // manual resume exactly as by an automatic one. (staleEntry still re-marks
2032
+ // below — a resume inside a stale session is a NEW interrupt.)
2033
+ updateGoal({ status: "active", pauseReason: undefined, pauseSuggestedAction: undefined, pauseKind: undefined, pauseOptions: undefined, pauseRecommended: undefined, pauseResumeAt: undefined, interruptedAt: undefined, interruptedReason: undefined, ...(staleEntry ? { interruptedAt: nowIso(), interruptedReason: "resumed in a stale session" } : {}), ...(usage ? { usage } : {}) }, ctx);
2027
2034
  if (staleEntry) return;
2028
2035
  // v0.22.5: say what was resumed — with a non-empty list this also resumes
2029
2036
  // the queue (the active goal IS the list's head item).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-goal-list-loop-audit",
3
- "version": "0.34.0",
3
+ "version": "0.34.2",
4
4
  "description": "Mission control for autonomous pi: interview-drafted goals, an audited task queue, and forever-loops (metric, spec, project-audit) that run for hours. An isolated extension-less auditor re-verifies every completion with raw evidence; confirmed drafts, decision pauses and consent gates keep you in charge.",
5
5
  "license": "MIT",
6
6
  "author": "dracon",