@fitchmultz/pi-subagents 0.52.11 → 0.52.13
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/CHANGELOG.md +26 -0
- package/README.md +6 -6
- package/dist/build-info.js +1 -1
- package/dist/shared/compact-cards.js +11 -8
- package/docs/code-quality.md +44 -0
- package/docs/development.md +0 -6
- package/docs/reference.md +1 -1
- package/package.json +5 -10
- package/scripts/linux-smoke.sh +2 -2
- package/src/shared/compact-cards.ts +14 -6
- package/tsconfig.json +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## 0.52.13 - 2026-11-02
|
|
6
|
+
|
|
7
|
+
<!-- npm-release:unreleased:start -->
|
|
8
|
+
<!-- npm-release:unreleased:end -->
|
|
9
|
+
|
|
10
|
+
- Raise the Pi floor to 1.5.0 (#329) ([fdc15e0](https://github.com/fitchmultz/pi-subagents/commit/fdc15e09fff7bedb74901b09374779b1e8fe4449))
|
|
11
|
+
|
|
12
|
+
### What's Changed
|
|
13
|
+
|
|
14
|
+
- Raise the Pi floor to 1.5.0 by @fitchmultz in https://github.com/fitchmultz/pi-subagents/pull/329
|
|
15
|
+
|
|
16
|
+
**Full Changelog**: https://github.com/fitchmultz/pi-subagents/compare/v0.52.12...v0.52.13
|
|
17
|
+
|
|
18
|
+
## 0.52.12 - 2026-11-02
|
|
19
|
+
|
|
20
|
+
<!-- npm-release:unreleased:start -->
|
|
21
|
+
<!-- npm-release:unreleased:end -->
|
|
22
|
+
|
|
23
|
+
- Merge pull request #326 from fitchmultz/chore/oxlint-v512-records ([e8ff5c5](https://github.com/fitchmultz/pi-subagents/commit/e8ff5c54a0efc481875949e98f96223c4d46ffc4))
|
|
24
|
+
|
|
25
|
+
### What's Changed
|
|
26
|
+
|
|
27
|
+
- Adopt the strict standard records and policy integrity keeper (5/5) by @fitchmultz in https://github.com/fitchmultz/pi-subagents/pull/326
|
|
28
|
+
|
|
29
|
+
**Full Changelog**: https://github.com/fitchmultz/pi-subagents/compare/v0.52.11...v0.52.12
|
|
30
|
+
|
|
5
31
|
## 0.52.11 - 2026-11-02
|
|
6
32
|
|
|
7
33
|
<!-- npm-release:unreleased:start -->
|
package/README.md
CHANGED
|
@@ -127,9 +127,9 @@ It never runs during startup/install, deletes data, or reclaims disk space.
|
|
|
127
127
|
- [Development and qualification](docs/development.md)
|
|
128
128
|
- [Diagnosis, baseline, and measurable rebuild gates](docs/single-agent-rebuild.md)
|
|
129
129
|
|
|
130
|
-
Supports official Pi and the maintained `fitchmultz/pi` fork
|
|
131
|
-
qualified separately, including native Android/Termux. Node.js
|
|
132
|
-
[development prerequisites](docs/development.md). Source
|
|
133
|
-
need an Android-native `tsgo` on PATH; the prebuilt npm
|
|
134
|
-
compiler. See
|
|
135
|
-
MIT licensed.
|
|
130
|
+
Supports official Pi and the maintained `fitchmultz/pi` fork at 1.5.0 or later;
|
|
131
|
+
the two hosts are qualified separately, including native Android/Termux. Node.js
|
|
132
|
+
is required; see [development prerequisites](docs/development.md). Source
|
|
133
|
+
installs on Android also need an Android-native `tsgo` on PATH; the prebuilt npm
|
|
134
|
+
package does not need a compiler. See
|
|
135
|
+
[native Android/Termux](docs/development.md#native-androidtermux). MIT licensed.
|
package/dist/build-info.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const EXTENSION_BUILD = Object.freeze({"version":"0.52.
|
|
1
|
+
export const EXTENSION_BUILD = Object.freeze({"version":"0.52.13","sha256":"239fe0f6aa0caf99a00fff7fe7a1031b902d697eab9a95f5dae05c3458b58cf0"});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { getMarkdownTheme,
|
|
1
|
+
import { getMarkdownTheme, truncateToVisualLines, } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import { Box, Container, Markdown, Spacer, Text, truncateToWidth, } from "@earendil-works/pi-tui";
|
|
3
3
|
import { actionText } from "./tui-action.js";
|
|
4
|
-
function preview(content, expanded, theme,
|
|
4
|
+
function preview(content, expanded, theme, expandHint) {
|
|
5
5
|
if (expanded) {
|
|
6
6
|
return content;
|
|
7
7
|
}
|
|
@@ -10,7 +10,7 @@ function preview(content, expanded, theme, showHint = true) {
|
|
|
10
10
|
render(width) {
|
|
11
11
|
if (cache?.width !== width) {
|
|
12
12
|
const { visualLines, skippedCount } = truncateToVisualLines(content.render(width).join("\n"), 4, width, 0, "start");
|
|
13
|
-
const hint = theme.fg("dim", `… ${skippedCount} more lines${
|
|
13
|
+
const hint = theme.fg("dim", `… ${skippedCount} more lines${expandHint === undefined ? "" : ` · ${expandHint}`}`);
|
|
14
14
|
cache = {
|
|
15
15
|
width,
|
|
16
16
|
lines: skippedCount > 0 ? [...visualLines, truncateToWidth(hint, width)] : visualLines,
|
|
@@ -24,10 +24,12 @@ function preview(content, expanded, theme, showHint = true) {
|
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
export const renderCompactResult = (result, { expanded }, theme) => preview(new Text(theme.fg("toolOutput", result.content
|
|
27
|
+
export const renderCompactResult = (result, { expanded }, theme, context) => preview(new Text(theme.fg("toolOutput", result.content
|
|
28
28
|
.filter((block) => block.type === "text")
|
|
29
29
|
.map((block) => block.text)
|
|
30
|
-
.join("\n")), 0, 0), expanded, theme
|
|
30
|
+
.join("\n")), 0, 0), expanded, theme,
|
|
31
|
+
// Pi injects keyHint so the hint shows the user's configured keys.
|
|
32
|
+
context.keyHint("app.tools.expand", "to expand"));
|
|
31
33
|
export function registerCompactMessages(pi, types) {
|
|
32
34
|
let ui;
|
|
33
35
|
pi.on("session_start", (_event, ctx) => {
|
|
@@ -37,7 +39,8 @@ export function registerCompactMessages(pi, types) {
|
|
|
37
39
|
ui = undefined;
|
|
38
40
|
});
|
|
39
41
|
for (const type of types) {
|
|
40
|
-
pi.registerMessageRenderer(type, (message,
|
|
42
|
+
pi.registerMessageRenderer(type, (message, options, theme) => {
|
|
43
|
+
const { expanded, outputPad } = options;
|
|
41
44
|
const text = typeof message.content === "string"
|
|
42
45
|
? message.content
|
|
43
46
|
: message.content
|
|
@@ -53,13 +56,13 @@ export function registerCompactMessages(pi, types) {
|
|
|
53
56
|
this.clear();
|
|
54
57
|
const label = theme.fg("customMessageLabel", theme.bold(`[${type}]`));
|
|
55
58
|
this.addChild(markdown.render(width).length > 4
|
|
56
|
-
? actionText(`${label} · ${keyHint("app.tools.expand", expanded ? "to collapse" : "to expand")}`, () => ui?.setToolsExpanded(!expanded))
|
|
59
|
+
? actionText(`${label} · ${options.keyHint("app.tools.expand", expanded ? "to collapse" : "to expand")}`, () => ui?.setToolsExpanded(!expanded))
|
|
57
60
|
: new Text(label, 0, 0));
|
|
58
61
|
return super.render(width);
|
|
59
62
|
}
|
|
60
63
|
})());
|
|
61
64
|
box.addChild(new Spacer(1));
|
|
62
|
-
box.addChild(preview(markdown, expanded, theme
|
|
65
|
+
box.addChild(preview(markdown, expanded, theme));
|
|
63
66
|
return box;
|
|
64
67
|
});
|
|
65
68
|
}
|
package/docs/code-quality.md
CHANGED
|
@@ -39,3 +39,47 @@ substitutes the selected host graph. The retired workflow schema generator and
|
|
|
39
39
|
its patching dependency are not part of the new runtime. `npm run check:size`
|
|
40
40
|
still reports source and production line counts for visibility; no line count
|
|
41
41
|
is mandated. The 1 MiB byte ceiling and all lint limits stay unchanged.
|
|
42
|
+
|
|
43
|
+
## Adoption record
|
|
44
|
+
|
|
45
|
+
Repository: `fitchmultz/pi-subagents`. Adopted standard: strict Oxlint/Oxfmt
|
|
46
|
+
engineering standard v5.1.2, kept as the repository copy at
|
|
47
|
+
`docs/strict-oxlint-oxfmt-standard.md`. Exception records live in
|
|
48
|
+
[Quality exceptions](quality-exceptions.md) and follow the standard's Appendix B.
|
|
49
|
+
|
|
50
|
+
Supported runtime and package manager: Node `>=24.21.0` with npm and the
|
|
51
|
+
committed lockfile. Installed tool versions (devDependencies): oxlint 1.90.0,
|
|
52
|
+
oxlint-tsgolint 7.0.2005, oxfmt 0.75.0, `@types/node` 24.19.2, typebox 1.4.3.
|
|
53
|
+
|
|
54
|
+
Configuration and acceptance paths: lint `.oxlintrc.json`, formatting
|
|
55
|
+
`.oxfmtrc.json`, compiler `tsconfig.json`. Local acceptance commands are
|
|
56
|
+
`npm run lint`, `npm run format:check` and `npm run typecheck`; the aggregate
|
|
57
|
+
acceptance command is hosted `npm run ci` (lint, formatting, TypeScript, byte
|
|
58
|
+
ceiling, package/install smokes and the complete test suites, plus separate
|
|
59
|
+
official-Pi and fork qualification jobs).
|
|
60
|
+
|
|
61
|
+
Compiler projects and source profiles: one `tsc --noEmit` project covers all
|
|
62
|
+
maintained TypeScript and checked-JavaScript (`src`, `scripts`, `test`,
|
|
63
|
+
`.github`) with `strict`, `checkJs`, `noUncheckedIndexedAccess`,
|
|
64
|
+
`exactOptionalPropertyTypes` and the full strict flag set. Lint profiles:
|
|
65
|
+
production limits (complexity 10, depth 3, parameters 4, statements 40,
|
|
66
|
+
function lines 80, file lines 500), test/fixture limits (complexity 15, depth
|
|
67
|
+
4, parameters 6, no size limits) and declaration files with size limits off.
|
|
68
|
+
|
|
69
|
+
Formatter and generator ownership: oxfmt formats all maintained source at
|
|
70
|
+
width 100; npm owns lockfile formatting; build outputs keep their own bytes.
|
|
71
|
+
|
|
72
|
+
Migration status: complete. The toolchain, baseline configuration, strict
|
|
73
|
+
TypeScript compiler options, checked-JavaScript coverage and this records
|
|
74
|
+
policy landed as PRs #319, #320, #321, #325 and the records PR; the policy
|
|
75
|
+
integrity keeper `test/unit/strict-oxlint-policy.test.ts` pins the effective
|
|
76
|
+
configuration, the four-entry overrides inventory and the directive rule-name
|
|
77
|
+
inventory against drift.
|
|
78
|
+
|
|
79
|
+
Integrated verification: hosted `npm run ci` on the merge of each part, with
|
|
80
|
+
the single-agent-runtime, agent-receipts, pi-intercom-native-replay and
|
|
81
|
+
retired-history-archive keepers exercising the native contracts. Locally
|
|
82
|
+
verified state for the checked-JavaScript part is recorded in PR #325; the
|
|
83
|
+
retired-history-archive suite requires passwordless `sudo` and
|
|
84
|
+
`scripts/package-smoke.mjs` requires a short Unix socket directory, so hosted
|
|
85
|
+
CI is the authoritative gate for both.
|
package/docs/development.md
CHANGED
|
@@ -53,12 +53,6 @@ hosted CI; do not substitute a weakened checker or incompatible Linux executable
|
|
|
53
53
|
|
|
54
54
|
## Runtime qualification
|
|
55
55
|
|
|
56
|
-
The official development SDK 1.4.0 pins Undici 8.10.2 exactly. A parent-scoped
|
|
57
|
-
override selects 8.12.3 for that development graph to fix GHSA-4qv8-2p9j-2685,
|
|
58
|
-
GHSA-f72v-6w45-q472 and GHSA-xjj6-f33q-929c. Remove the override when an official
|
|
59
|
-
SDK release supplies a fixed version. It does not replace a consumer's host SDK
|
|
60
|
-
or Node's built-in fetch.
|
|
61
|
-
|
|
62
56
|
Qualify the latest stable official Pi and the intended fork revision separately.
|
|
63
57
|
Record the exact package root, revision/build, Node binary, and executed test
|
|
64
58
|
commands. Matching versions do not establish matching runtime behavior.
|
package/docs/reference.md
CHANGED
|
@@ -29,7 +29,7 @@ unknown IDs and invalid suffixes fail without fuzzy matching or another provider
|
|
|
29
29
|
Native resolution follows Pi's case-insensitive ID matching. Pi still applies the
|
|
30
30
|
selected model's native thinking capabilities.
|
|
31
31
|
|
|
32
|
-
Official Pi
|
|
32
|
+
Official Pi, including 1.5.0, does not export that resolver. Older fork runtimes also
|
|
33
33
|
lack the export. Those hosts retain
|
|
34
34
|
case-sensitive literal-ID overrides and inherited thinking; suffix requests fail with an upgrade
|
|
35
35
|
message rather than being parsed by an extension-side replacement. This requires
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fitchmultz/pi-subagents",
|
|
3
|
-
"version": "0.52.
|
|
3
|
+
"version": "0.52.13",
|
|
4
4
|
"description": "Pi extension for subagent orchestration and local session coordination",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -104,10 +104,10 @@
|
|
|
104
104
|
}
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
|
-
"@earendil-works/pi-agent-core": "1.
|
|
108
|
-
"@earendil-works/pi-ai": "1.
|
|
109
|
-
"@earendil-works/pi-coding-agent": "1.
|
|
110
|
-
"@earendil-works/pi-tui": "1.
|
|
107
|
+
"@earendil-works/pi-agent-core": "1.5.0",
|
|
108
|
+
"@earendil-works/pi-ai": "1.5.0",
|
|
109
|
+
"@earendil-works/pi-coding-agent": "1.5.0",
|
|
110
|
+
"@earendil-works/pi-tui": "1.5.0",
|
|
111
111
|
"@types/node": "24.19.2",
|
|
112
112
|
"@types/sinon": "22.0.2",
|
|
113
113
|
"oxfmt": "0.75.0",
|
|
@@ -123,10 +123,5 @@
|
|
|
123
123
|
},
|
|
124
124
|
"engines": {
|
|
125
125
|
"node": ">=24.21.0"
|
|
126
|
-
},
|
|
127
|
-
"overrides": {
|
|
128
|
-
"@earendil-works/pi-coding-agent": {
|
|
129
|
-
"undici": "8.12.3"
|
|
130
|
-
}
|
|
131
126
|
}
|
|
132
127
|
}
|
package/scripts/linux-smoke.sh
CHANGED
|
@@ -4,7 +4,7 @@ set -euo pipefail
|
|
|
4
4
|
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
|
5
5
|
printf '%s\n' 'Usage: bash scripts/linux-smoke.sh
|
|
6
6
|
|
|
7
|
-
Validate committed HEAD in Docker against a credential-free, prebuilt Pi 1.0
|
|
7
|
+
Validate committed HEAD in Docker against a credential-free, prebuilt Pi 1.5.0+
|
|
8
8
|
Linux archive with a single top-level pi/ directory and built SDK/CLI output.
|
|
9
9
|
|
|
10
10
|
Example:
|
|
@@ -21,7 +21,7 @@ if [[ $# -ne 0 ]]; then
|
|
|
21
21
|
printf '%s\n' 'No arguments accepted; use --help.' >&2
|
|
22
22
|
exit 2
|
|
23
23
|
fi
|
|
24
|
-
: "${PI_LINUX_PI_ARCHIVE:?Set PI_LINUX_PI_ARCHIVE to an absolute path to a credential-free prebuilt Linux Pi 1.0 .tar.gz (top-level pi/) with its Linux dependencies and built SDK/CLI.}"
|
|
24
|
+
: "${PI_LINUX_PI_ARCHIVE:?Set PI_LINUX_PI_ARCHIVE to an absolute path to a credential-free prebuilt Linux Pi 1.5.0+ .tar.gz (top-level pi/) with its Linux dependencies and built SDK/CLI.}"
|
|
25
25
|
|
|
26
26
|
# Validate committed HEAD without passing host credentials or mounting the checkout.
|
|
27
27
|
git -C "$(dirname "$0")/.." archive HEAD | docker run --rm --init -i \
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getMarkdownTheme,
|
|
3
|
-
keyHint,
|
|
4
3
|
truncateToVisualLines,
|
|
5
4
|
type ExtensionAPI,
|
|
6
5
|
type ExtensionContext,
|
|
@@ -18,7 +17,12 @@ import {
|
|
|
18
17
|
} from "@earendil-works/pi-tui";
|
|
19
18
|
import { actionText } from "./tui-action.ts";
|
|
20
19
|
|
|
21
|
-
function preview(
|
|
20
|
+
function preview(
|
|
21
|
+
content: Component,
|
|
22
|
+
expanded: boolean,
|
|
23
|
+
theme: Theme,
|
|
24
|
+
expandHint?: string,
|
|
25
|
+
): Component {
|
|
22
26
|
if (expanded) {
|
|
23
27
|
return content;
|
|
24
28
|
}
|
|
@@ -35,7 +39,7 @@ function preview(content: Component, expanded: boolean, theme: Theme, showHint =
|
|
|
35
39
|
);
|
|
36
40
|
const hint = theme.fg(
|
|
37
41
|
"dim",
|
|
38
|
-
`… ${skippedCount} more lines${
|
|
42
|
+
`… ${skippedCount} more lines${expandHint === undefined ? "" : ` · ${expandHint}`}`,
|
|
39
43
|
);
|
|
40
44
|
cache = {
|
|
41
45
|
width,
|
|
@@ -55,6 +59,7 @@ export const renderCompactResult: NonNullable<ToolDefinition["renderResult"]> =
|
|
|
55
59
|
result,
|
|
56
60
|
{ expanded },
|
|
57
61
|
theme,
|
|
62
|
+
context,
|
|
58
63
|
) =>
|
|
59
64
|
preview(
|
|
60
65
|
new Text(
|
|
@@ -70,6 +75,8 @@ export const renderCompactResult: NonNullable<ToolDefinition["renderResult"]> =
|
|
|
70
75
|
),
|
|
71
76
|
expanded,
|
|
72
77
|
theme,
|
|
78
|
+
// Pi injects keyHint so the hint shows the user's configured keys.
|
|
79
|
+
context.keyHint("app.tools.expand", "to expand"),
|
|
73
80
|
);
|
|
74
81
|
|
|
75
82
|
export function registerCompactMessages(pi: ExtensionAPI, types: readonly string[]): void {
|
|
@@ -81,7 +88,8 @@ export function registerCompactMessages(pi: ExtensionAPI, types: readonly string
|
|
|
81
88
|
ui = undefined;
|
|
82
89
|
});
|
|
83
90
|
for (const type of types) {
|
|
84
|
-
pi.registerMessageRenderer(type, (message,
|
|
91
|
+
pi.registerMessageRenderer(type, (message, options, theme) => {
|
|
92
|
+
const { expanded, outputPad } = options;
|
|
85
93
|
const text =
|
|
86
94
|
typeof message.content === "string"
|
|
87
95
|
? message.content
|
|
@@ -101,7 +109,7 @@ export function registerCompactMessages(pi: ExtensionAPI, types: readonly string
|
|
|
101
109
|
this.addChild(
|
|
102
110
|
markdown.render(width).length > 4
|
|
103
111
|
? actionText(
|
|
104
|
-
`${label} · ${keyHint("app.tools.expand", expanded ? "to collapse" : "to expand")}`,
|
|
112
|
+
`${label} · ${options.keyHint("app.tools.expand", expanded ? "to collapse" : "to expand")}`,
|
|
105
113
|
() => ui?.setToolsExpanded(!expanded),
|
|
106
114
|
)
|
|
107
115
|
: new Text(label, 0, 0),
|
|
@@ -111,7 +119,7 @@ export function registerCompactMessages(pi: ExtensionAPI, types: readonly string
|
|
|
111
119
|
})(),
|
|
112
120
|
);
|
|
113
121
|
box.addChild(new Spacer(1));
|
|
114
|
-
box.addChild(preview(markdown, expanded, theme
|
|
122
|
+
box.addChild(preview(markdown, expanded, theme));
|
|
115
123
|
return box;
|
|
116
124
|
});
|
|
117
125
|
}
|
package/tsconfig.json
CHANGED
|
@@ -23,7 +23,12 @@
|
|
|
23
23
|
"exactOptionalPropertyTypes": true,
|
|
24
24
|
"noUncheckedSideEffectImports": true,
|
|
25
25
|
"forceConsistentCasingInFileNames": true,
|
|
26
|
-
"noCheck": false
|
|
26
|
+
"noCheck": false,
|
|
27
|
+
"paths": {
|
|
28
|
+
"@earendil-works/pi-ai": [
|
|
29
|
+
"./node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/pi-ai-extension-view.d.ts"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
27
32
|
},
|
|
28
33
|
"include": [
|
|
29
34
|
"**/*.ts",
|