osdy-pi 1.11.6 → 1.11.7

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 CHANGED
@@ -488,18 +488,18 @@ While work is active, Osdy Pi centers an activity label and compact animated gly
488
488
  | `Delegating...` | ✧ ✦ ✧ | Subagent handoffs. |
489
489
  | `Executing...` | ◴ ◷ ◶ ◵ | Unknown or ambiguous tools. |
490
490
 
491
- **Subagent assignment is not live activity.** While a `subagent_run` or `subagent_continue` parent call is active, the indicator distinguishes the two:
491
+ **Subagent fallback is not live activity.** While a `subagent_run` or `subagent_continue` parent call is active, the indicator distinguishes the two:
492
492
 
493
493
  | Source | Example | Meaning |
494
494
  | --- | --- | --- |
495
- | Validated public `agent` and optional `label` arguments | `explore · Task: map footer data` | Submitted assignment, not a claimed tool operation. This provider-neutral fallback works with Gentle Agents, which currently emits no live child progress. |
496
- | Public foreground progress from Joker (`pi-subagents-j0k3r`) | `scout · read` | Observable child activity; takes precedence over assignment copy. |
495
+ | Validated public `agent` argument | `explore · Working...` | Generic fallback, not measured progress or a claimed editing operation. This provider-neutral fallback works with Gentle Agents, which currently emits no live child progress. |
496
+ | Public foreground progress from Joker (`pi-subagents-j0k3r`) | `scout · read` | Observable child activity; takes precedence over generic fallback copy. |
497
497
 
498
- Without a usable label, assignment copy is `Task assigned`; continuations without agent identity use `Subagent`, never an inferred identity. Full tasks, prompts and context are never read or displayed. Model activity uses fixed `Waiting on model` / `Responding` labels, never reasoning or response text.
498
+ The fallback is `<agent> · Working...` regardless of optional `label` metadata; continuations without agent identity use `Subagent`, never an inferred identity. Full tasks, prompts and context are never read or displayed. Model activity uses fixed `Waiting on model` / `Responding` labels, never reasoning or response text.
499
499
 
500
- For multiple running children, the indicator uses the first child in snapshot order with a compact additional-child count. Missing, malformed or no-running-child progress restores the assignment, or ordinary parent activity when assignment metadata is unavailable. Labels are bounded, control-safe and clipped to terminal width. Matching tool end, agent/session end and reload cleanup discard per-call state.
500
+ For multiple running children, the indicator uses the first child in snapshot order with a compact additional-child count. Missing, malformed or no-running-child progress restores the agent's generic fallback, or ordinary parent activity when validated agent identity is unavailable. Labels are bounded, control-safe and clipped to terminal width. Matching tool end, agent/session end and reload cleanup discard per-call state.
501
501
 
502
- **Background limitation:** assignments appear only while their parent call is active. There is no persistent background live feed, polling or task cache.
502
+ **Background limitation:** agent fallbacks appear only while their parent call is active. There is no persistent background live feed, polling or task cache.
503
503
 
504
504
  When tools overlap, the latest remaining tool owns the display. All glyphs share a brightness pulse through the active theme's `mdQuoteBorder`, `thinkingHigh`, `accent`, and `borderAccent` colors; the animation signals activity, not measured percentage progress. Glyphs and labels use a single 80 ms timer, with no new controls or settings.
505
505
 
@@ -9,21 +9,22 @@ registerHooks({ resolve(specifier, context, nextResolve) {
9
9
  } });
10
10
  const { childActivityLabel, childAssignmentLabel: assignment } = await import("./working-child-activity.js");
11
11
 
12
- void test("assignment uses only validated public agent and label metadata", () => {
13
- assert.equal(assignment("subagent_run", { agent: "explore", label: "map footer data" }), "explore · Task: map footer data");
12
+ void test("fallback uses only validated public agent identity regardless of optional label", () => {
13
+ assert.equal(assignment("subagent_run", { agent: "explore", label: "map footer data" }), "explore · Working...");
14
14
  for (const args of [undefined, null, [], "scout", {}, { agent: 1 }, { agent: "\u0000\n" }, { agent: "a".repeat(4097) }, { label: "secret" }])
15
15
  assert.equal(assignment("subagent_run", args), undefined);
16
16
  for (const label of [undefined, null, 1, [], "", "\u0000", "x".repeat(4097)])
17
- assert.equal(assignment("subagent_run", { agent: "scout", label, task: "SECRET", prompt: "SECRET", context: "SECRET" }), "scout · Task assigned");
17
+ assert.equal(assignment("subagent_run", { agent: "scout", label, task: "SECRET", prompt: "SECRET", context: "SECRET" }), "scout · Working...");
18
18
  const metadata = { agent: "scout", get task() { throw new Error("task must not be read"); },
19
19
  get prompt() { throw new Error("prompt must not be read"); }, get context() { throw new Error("context must not be read"); } };
20
- assert.equal(assignment("subagent_run", metadata), "scout · Task assigned");
20
+ assert.equal(assignment("subagent_run", metadata), "scout · Working...");
21
+ assert.equal(assignment("subagent_run", { agent: "scout" }), "scout · Working...");
21
22
  assert.equal(assignment("read", { agent: "scout", label: "map" }), undefined);
22
- assert.equal(assignment("subagent_continue", { id: "scout", label: "resume" }), "Subagent · Task: resume");
23
+ assert.equal(assignment("subagent_continue", { id: "scout", label: "resume" }), "Subagent · Working...");
23
24
  assert.equal(assignment("subagent_continue", { agent: 42, label: "resume" }), undefined);
24
- assert.equal(assignment("subagent_run", { agent: "\u001b[31m探索\u001b[0m\n\u202eagent", label: "\u001b]0;title\u0007map\t👩‍💻 footer\u0000" }), "探索 agent · Task: map 👩‍💻 footer");
25
+ assert.equal(assignment("subagent_run", { agent: "\u001b[31m探索\u001b[0m\n\u202eagent", label: "\u001b]0;title\u0007map\t👩‍💻 footer\u0000" }), "探索 agent · Working...");
25
26
  const bounded = assignment("subagent_run", { agent: "🙂".repeat(1000), label: "界".repeat(1000) });
26
- assert.equal(Array.from(bounded ?? "").length, 32 + " · Task: ".length + 80);
27
+ assert.equal(Array.from(bounded ?? "").length, 32 + " · Working...".length);
27
28
  });
28
29
 
29
30
  function task(agent = "scout", kind = "tool_running", label = "Reading files", tool_names: unknown = ["read"]) {
@@ -19,8 +19,7 @@ export function childAssignmentLabel(toolName: string, args: unknown): string |
19
19
  if (!record(args)) return undefined;
20
20
  const agent = args.agent === undefined && toolName === "subagent_continue" ? "Subagent" : safeLabel(args.agent, 32);
21
21
  if (!agent) return undefined;
22
- const label = safeLabel(args.label, 80);
23
- return `${agent} · ${label ? `Task: ${label}` : "Task assigned"}`;
22
+ return `${agent} · Working...`;
24
23
  }
25
24
 
26
25
  function observableActivity(value: unknown): string | undefined {
@@ -150,16 +150,18 @@ void test("agent/session disposal clears child progress and rejects late updates
150
150
  }
151
151
  });
152
152
 
153
- void test("assignments appear at start and survive unavailable or terminal live progress", (t) => {
153
+ void test("agent fallback appears at start and resets after unavailable, malformed or terminal live progress", (t) => {
154
154
  t.mock.timers.enable({ apis: ["setInterval"] });
155
155
  const { working, controller: c } = fixture();
156
156
  c.onToolStart("subagent_run", "a", { agent: "explore", label: "map footer data", task: "SECRET TASK", prompt: "SECRET PROMPT" });
157
- assert.equal(working.label, "explore · Task: map footer data");
157
+ assert.equal(working.label, "explore · Working...");
158
158
  c.onToolUpdate("subagent_run", "a", childProgress("explore"));
159
159
  assert.equal(working.label, "explore · read");
160
160
  for (const update of [undefined, {}, { details: { tasks: null } }, { details: { tasks: [{ agent: "explore", status: "running" }] } }, childProgress("explore", "read", "completed")]) {
161
+ c.onToolUpdate("subagent_run", "a", childProgress("explore"));
162
+ assert.equal(working.label, "explore · read");
161
163
  c.onToolUpdate("subagent_run", "a", update);
162
- assert.equal(working.label, "explore · Task: map footer data");
164
+ assert.equal(working.label, "explore · Working...");
163
165
  }
164
166
  c.onToolEnd("a"); assert.equal(working.label, "Thinking...");
165
167
  });
@@ -168,28 +170,28 @@ void test("continuations use generic identity without guessing and preserve call
168
170
  t.mock.timers.enable({ apis: ["setInterval"] });
169
171
  const { working, controller: c } = fixture();
170
172
  c.onToolStart("subagent_run", "a", { agent: "scout" });
171
- assert.equal(working.label, "scout · Task assigned");
173
+ assert.equal(working.label, "scout · Working...");
172
174
  c.onToolStart("subagent_continue", "b", { id: "a", label: "check footer" });
173
- assert.equal(working.label, "Subagent · Task: check footer");
175
+ assert.equal(working.label, "Subagent · Working...");
174
176
  c.onToolStart("subagent_continue", "a", { agent: "wrong", label: "wrong" });
175
177
  c.onToolUpdate("subagent_run", "b", childProgress("wrong"));
176
178
  c.onToolUpdate("subagent_continue", "missing", childProgress("wrong"));
177
- assert.equal(working.label, "Subagent · Task: check footer");
179
+ assert.equal(working.label, "Subagent · Working...");
178
180
  c.onToolUpdate("subagent_continue", "b", childProgress("writer", "edit"));
179
181
  assert.equal(working.label, "writer · edit");
180
182
  c.onToolUpdate("subagent_run", "a", childProgress("scout"));
181
183
  assert.equal(working.label, "writer · edit");
182
184
  c.onToolUpdate("subagent_continue", "b", {});
183
- assert.equal(working.label, "Subagent · Task: check footer");
185
+ assert.equal(working.label, "Subagent · Working...");
184
186
  c.onToolEnd("b"); assert.equal(working.label, "scout · read");
185
187
  c.onToolUpdate("subagent_continue", "b", childProgress("late"));
186
- c.onToolUpdate("subagent_run", "a", {}); assert.equal(working.label, "scout · Task assigned");
188
+ c.onToolUpdate("subagent_run", "a", {}); assert.equal(working.label, "scout · Working...");
187
189
  c.onToolEnd("a");
188
190
  c.onToolStart("subagent_continue", "c", { agent: "writer", label: "finish" });
189
- assert.equal(working.label, "writer · Task: finish");
191
+ assert.equal(working.label, "writer · Working...");
190
192
  c.onToolEnd("c");
191
193
  c.onToolStart("subagent_continue", "d", { id: "c", task: "SECRET" });
192
- assert.equal(working.label, "Subagent · Task assigned");
194
+ assert.equal(working.label, "Subagent · Working...");
193
195
  c.onToolEnd("d");
194
196
  });
195
197
 
@@ -198,7 +200,7 @@ void test("assignment metadata is cleared on agent and session cleanup", (t) =>
198
200
  const { working, controller: c } = fixture();
199
201
  for (const cleanup of [() => c.onAgentEnd(), () => c.onShutdown()]) {
200
202
  c.onToolStart("subagent_run", "a", { agent: "scout", label: "map" });
201
- assert.equal(working.label, "scout · Task: map");
203
+ assert.equal(working.label, "scout · Working...");
202
204
  cleanup(); c.onToolUpdate("subagent_run", "a", childProgress("late"));
203
205
  c.refreshWorking(); assert.equal(working.label, "Thinking...");
204
206
  assert.equal(working.active, false); assert.equal(working.timer, undefined);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osdy-pi",
3
- "version": "1.11.6",
3
+ "version": "1.11.7",
4
4
  "description": "Osdy Pi package: themes, header, and custom editor for Pi.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -83,7 +83,7 @@
83
83
  "typescript": "^5.9.3",
84
84
  "typescript-eslint": "^8.46.3"
85
85
  },
86
- "releaseSource": "58395349a28ff9d86413b6fee0d964e477543b3e",
86
+ "releaseSource": "fa08213880378e71ddcadea11cd71da3406d7cf6",
87
87
  "repository": {
88
88
  "type": "git",
89
89
  "url": "git+https://github.com/OsdyOrtiz/Osdy-Pi.git"