@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 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; the two hosts are
131
- qualified separately, including native Android/Termux. Node.js is required; see
132
- [development prerequisites](docs/development.md). Source installs on Android also
133
- need an Android-native `tsgo` on PATH; the prebuilt npm package does not need a
134
- compiler. See [native Android/Termux](docs/development.md#native-androidtermux).
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.
@@ -1 +1 @@
1
- export const EXTENSION_BUILD = Object.freeze({"version":"0.52.11","sha256":"afeb6d4b7e13dfe796c199d39eddf3836e8f7ee7185f302254f4182659a0388c"});
1
+ export const EXTENSION_BUILD = Object.freeze({"version":"0.52.13","sha256":"239fe0f6aa0caf99a00fff7fe7a1031b902d697eab9a95f5dae05c3458b58cf0"});
@@ -1,7 +1,7 @@
1
- import { getMarkdownTheme, keyHint, truncateToVisualLines, } from "@earendil-works/pi-coding-agent";
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, showHint = true) {
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${showHint ? ` · ${keyHint("app.tools.expand", "to expand")}` : ""}`);
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, { expanded, outputPad }, theme) => {
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, false));
65
+ box.addChild(preview(markdown, expanded, theme));
63
66
  return box;
64
67
  });
65
68
  }
@@ -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.
@@ -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 1.3.0 and 1.4.0 do not export that resolver. Older fork runtimes also
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.11",
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.4.0",
108
- "@earendil-works/pi-ai": "1.4.0",
109
- "@earendil-works/pi-coding-agent": "1.4.0",
110
- "@earendil-works/pi-tui": "1.4.0",
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
  }
@@ -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(content: Component, expanded: boolean, theme: Theme, showHint = true): Component {
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${showHint ? ` · ${keyHint("app.tools.expand", "to expand")}` : ""}`,
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, { expanded, outputPad }, theme) => {
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, false));
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",