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
|
|
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`
|
|
496
|
-
| Public foreground progress from Joker (`pi-subagents-j0k3r`) | `scout · read` | Observable child activity; takes precedence over
|
|
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
|
-
|
|
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
|
|
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:**
|
|
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("
|
|
13
|
-
assert.equal(assignment("subagent_run", { agent: "explore", label: "map footer data" }), "explore ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 + " ·
|
|
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
|
-
|
|
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("
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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 ·
|
|
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.
|
|
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": "
|
|
86
|
+
"releaseSource": "fa08213880378e71ddcadea11cd71da3406d7cf6",
|
|
87
87
|
"repository": {
|
|
88
88
|
"type": "git",
|
|
89
89
|
"url": "git+https://github.com/OsdyOrtiz/Osdy-Pi.git"
|