@llblab/pi-kit 0.27.3 → 0.27.4
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/BACKLOG.md +2 -1
- package/CHANGELOG.md +4 -0
- package/README.md +3 -3
- package/node_modules/@llblab/pi-state-flow/BACKLOG.md +3 -2
- package/node_modules/@llblab/pi-state-flow/CHANGELOG.md +4 -0
- package/node_modules/@llblab/pi-state-flow/dist/lib/telegram.js +15 -18
- package/node_modules/@llblab/pi-state-flow/dist/package.json +1 -1
- package/node_modules/@llblab/pi-state-flow/docs/usage.md +1 -0
- package/node_modules/@llblab/pi-state-flow/lib/telegram.ts +15 -18
- package/node_modules/@llblab/pi-state-flow/package.json +1 -1
- package/package.json +2 -2
package/BACKLOG.md
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# Backlog
|
|
2
2
|
|
|
3
|
-
The 0.27.
|
|
3
|
+
The 0.27.4 composition is recorded in [CHANGELOG.md](./CHANGELOG.md). Package pins, resource order and bundled runtime ownership remain authoritative in `package.json`.
|
|
4
4
|
|
|
5
5
|
## Carried checks
|
|
6
6
|
|
|
7
|
+
- **Installed 0.27.4 inspection smoke (operator-owned):** After separately authorized installation/reload, inspect a large nested State Flow field in disposable storage. Confirm readable JSON layout, separate truncation notices and intact genuine string escapes. Packed validation does not certify installed Telegram clients.
|
|
7
8
|
- **Installed 0.27.3 single patch display smoke (operator-owned):** After separately authorized installation/reload, confirm one argument block followed by changed/no-op acknowledgements, compact configuration and visible rejected arguments/errors in disposable State Flow storage.
|
|
8
9
|
- **Installed 0.27.2 cascade receipt smoke (operator-owned):** After separately authorized installation/reload, close an intent owning a nested lazy key in disposable State Flow storage and confirm the receipt lists its owner path under `cascaded`, without the body. Packed validation does not certify installed clients.
|
|
9
10
|
- **Installed 0.27.1 Fast status smoke (operator-owned):** After separately authorized installation/reload, check Telegram menu Fast on/off and model switching for Codex and Claude Opus; unsupported Claude families must not show Fast. Use disposable settings and mocked quota where possible; do not mutate live stores or reconnect Telegram without separate authorization.
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@llblab/pi-kit` are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.27.4: Readable State Flow Inspection
|
|
6
|
+
|
|
7
|
+
- `Readable Inspection`: Advances the exact State Flow pin to published `0.25.3`. Large Telegram inspection fields now show pretty-printed JSON prefixes directly, with separate truncation notices instead of escaped `preview` strings. Genuine JSON string escapes and storage semantics are preserved. Other pins, resources and load order are unchanged.
|
|
8
|
+
|
|
5
9
|
## 0.27.3: State Flow Single Patch Display
|
|
6
10
|
|
|
7
11
|
- `Single Patch Display`: Advances the exact State Flow pin to published `0.25.2`. Interactive patch rows show JSON arguments once, followed by the actual acceptance, no-op or error acknowledgement. Compact configuration still hides successful arguments. Other pins, resources, load order and storage semantics are unchanged.
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Package links lead to the owning repositories for usage, documentation, issues,
|
|
|
17
17
|
| [`@llblab/pi-clean-room`](https://github.com/llblab/pi-clean-room) | `0.3.0` | Isolated nested Pi TUI with named npm extensions and compatible model selection |
|
|
18
18
|
| [`@llblab/pi-codex-usage`](https://github.com/llblab/pi-codex-usage) | `0.12.1` | Shared Codex quota/Business credit status and persistent priority Fast toggle, mirrored in Telegram |
|
|
19
19
|
| [`@llblab/pi-grow-loop`](https://github.com/llblab/pi-grow-loop) | `0.9.0` | Visible continuation scheduling and bounded worker Skills through compiled, manifest-owned resources |
|
|
20
|
-
| [`@llblab/pi-state-flow`](https://github.com/llblab/pi-state-flow) | `0.25.
|
|
20
|
+
| [`@llblab/pi-state-flow`](https://github.com/llblab/pi-state-flow) | `0.25.3` | Scoped context/memory compiler with intent-owned memory, cascade receipts, memory-inert Off, single patch display and readable Telegram inspection |
|
|
21
21
|
| [`@llblab/pi-telegram`](https://github.com/llblab/pi-telegram) | `0.51.6` | Telegram companion with connection resume, Workspace slot recovery, follower Threads, filterable Skills, files, voice, and controls |
|
|
22
22
|
| [`@llblab/skills`](https://github.com/llblab/skills) | `1.15.0` | Portable workflows for engineering, review, design, context maintenance, and other focused tasks |
|
|
23
23
|
|
|
@@ -25,7 +25,7 @@ Versions are exact by design. An upstream release does not change an installed k
|
|
|
25
25
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
|
-
Requires **Pi 1.0.0+** and **Node.js 22.19.0+**. State Flow requires its canonical checkpoint/tail storage format and does not convert unsupported stores in place. Preserve existing stores and consult the [owning package's storage guidance](https://github.com/llblab/pi-state-flow/blob/v0.25.
|
|
28
|
+
Requires **Pi 1.0.0+** and **Node.js 22.19.0+**. State Flow requires its canonical checkpoint/tail storage format and does not convert unsupported stores in place. Preserve existing stores and consult the [owning package's storage guidance](https://github.com/llblab/pi-state-flow/blob/v0.25.3/docs/usage.md#moving-a-store-and-supported-formats) before changing installations.
|
|
29
29
|
|
|
30
30
|
From npm:
|
|
31
31
|
|
|
@@ -45,7 +45,7 @@ Prefer the kit instead of separately loading the same packages. If you already u
|
|
|
45
45
|
|
|
46
46
|
## Development
|
|
47
47
|
|
|
48
|
-
The `0.27.
|
|
48
|
+
The `0.27.4` composition includes published State Flow `0.25.3` with readable Telegram inspection; all other pins, resources and load order remain unchanged. `npm run validate` checks exact installed pins, declared resources, dependency audit and bundled inventory. It does not certify installed-client rendering; carried checks remain in [Backlog](./BACKLOG.md).
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
51
|
npm install
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Backlog
|
|
2
2
|
|
|
3
|
-
The **0.25.
|
|
3
|
+
The **0.25.3: Readable Telegram Inspection** hotfix is prepared; outcomes belong in [CHANGELOG.md](CHANGELOG.md). This backlog retains installed-client gates and deferred decisions. Cascade semantics, canonical storage, stored patch records and lifecycle behaviour remain unchanged.
|
|
4
4
|
|
|
5
5
|
## Out of scope
|
|
6
6
|
|
|
@@ -10,7 +10,8 @@ The **0.25.2: Single Patch Display** hotfix is prepared; implementation outcomes
|
|
|
10
10
|
|
|
11
11
|
## Carried gates
|
|
12
12
|
|
|
13
|
-
- **0.25.
|
|
13
|
+
- **0.25.3 publication.** Validate and publish through the exact-tag workflow; verify GitHub Release and npm commit, then synchronize and release Pi Kit.
|
|
14
|
+
- **Installed 0.25.3 inspection smoke (operator-owned).** After separately authorized installation/reload, inspect a large nested field: real layout newlines/quotes, separate omitted-character notice and intact genuine JSON string escapes. Use disposable storage; local adapter tests do not certify installed Telegram clients.
|
|
14
15
|
- **Installed 0.25.2 smoke (operator-owned).** Disposable store: confirm one patch argument block followed by changed/no-op acknowledgements, compact rows with `showSuccessfulPatches: false`, and visible rejected arguments/errors.
|
|
15
16
|
- **Installed 0.25.1 smoke (operator-owned).** Disposable store: close an intent that owns a nested lazy key and confirm the receipt lists it under `cascaded`. May be combined with the open 0.25.0 smoke.
|
|
16
17
|
- **Installed 0.22.0, 0.23.0, 0.24.0 and 0.25.0 smokes** remain open as recorded.
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
> Each release keeps at most 8 outcome records of at most 512 characters.
|
|
4
4
|
|
|
5
|
+
## 0.25.3: Readable Telegram Inspection
|
|
6
|
+
|
|
7
|
+
- `Readable inspection`: Telegram memory inspection shows large fields as direct pretty-printed JSON prefixes instead of JSON-encoded `preview` strings with escaped layout and quotes. A separate notice reports omitted characters. Transport-aware budgeting preserves the Rich message ceiling and Unicode boundaries; genuine JSON string escapes, stored state and exact `read_state` results remain unchanged.
|
|
8
|
+
|
|
5
9
|
## 0.25.2: Single Patch Display
|
|
6
10
|
|
|
7
11
|
- `Single patch display`: Interactive `patch_state` rows show JSON arguments once in the call, followed by the actual acceptance, no-op or error acknowledgement instead of a second patch. `showSuccessfulPatches: false` hides call arguments while retaining compact acknowledgements; rejected arguments remain visible. Atomic publication, stored state and model-facing `state_updates` receipts are unchanged.
|
|
@@ -73,35 +73,32 @@ const STATE_FLOW_SCOPE_LABELS = {
|
|
|
73
73
|
session: "💬 Session",
|
|
74
74
|
effective: "🧬 Effective",
|
|
75
75
|
};
|
|
76
|
-
//
|
|
77
|
-
//
|
|
76
|
+
// Budget the transport-serialized text, leaving room for six fields and notices
|
|
77
|
+
// below Telegram's 32,768-character Rich message ceiling.
|
|
78
78
|
const STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS = 3_000;
|
|
79
79
|
function renderStateFlowTelegramField(value) {
|
|
80
80
|
const json = JSON.stringify(value, null, 2);
|
|
81
|
-
if (json.length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS)
|
|
82
|
-
return json;
|
|
81
|
+
if (JSON.stringify(json).length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS) {
|
|
82
|
+
return [{ type: "pre", language: "json", text: json }];
|
|
83
|
+
}
|
|
83
84
|
let low = 0;
|
|
84
|
-
let high = json.length;
|
|
85
|
-
let rendered = "";
|
|
85
|
+
let high = Math.min(json.length, STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS);
|
|
86
86
|
while (low <= high) {
|
|
87
87
|
const length = Math.floor((low + high) / 2);
|
|
88
|
-
|
|
89
|
-
truncated: true,
|
|
90
|
-
...(value !== null && typeof value === "object" && !Array.isArray(value)
|
|
91
|
-
? { keys: Object.keys(value) }
|
|
92
|
-
: {}),
|
|
93
|
-
preview: json.slice(0, length),
|
|
94
|
-
omittedChars: json.length - length,
|
|
95
|
-
}, null, 2);
|
|
96
|
-
if (candidate.length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS) {
|
|
97
|
-
rendered = candidate;
|
|
88
|
+
if (JSON.stringify(json.slice(0, length)).length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS) {
|
|
98
89
|
low = length + 1;
|
|
99
90
|
}
|
|
100
91
|
else {
|
|
101
92
|
high = length - 1;
|
|
102
93
|
}
|
|
103
94
|
}
|
|
104
|
-
|
|
95
|
+
// Do not split a Unicode surrogate pair at the preview boundary.
|
|
96
|
+
if (/[\uD800-\uDBFF]/.test(json.charAt(high - 1)))
|
|
97
|
+
high -= 1;
|
|
98
|
+
return [
|
|
99
|
+
{ type: "pre", language: "json", text: json.slice(0, high) },
|
|
100
|
+
{ type: "pre", text: `Truncated preview — ${json.length - high} characters omitted.` },
|
|
101
|
+
];
|
|
105
102
|
}
|
|
106
103
|
export function renderStateFlowRichState(scope, revisions, state) {
|
|
107
104
|
const fields = scope === "global" || scope === "cwd"
|
|
@@ -120,7 +117,7 @@ export function renderStateFlowRichState(scope, revisions, state) {
|
|
|
120
117
|
...fields.filter((field) => state[field] !== undefined && state[field] !== "").map((field) => ({
|
|
121
118
|
type: "details",
|
|
122
119
|
summary: { type: "code", text: field },
|
|
123
|
-
blocks:
|
|
120
|
+
blocks: renderStateFlowTelegramField(state[field]),
|
|
124
121
|
})),
|
|
125
122
|
],
|
|
126
123
|
skip_entity_detection: true,
|
|
@@ -224,6 +224,7 @@ When `pi-telegram` is available, its main-menu section shows `State Flow: active
|
|
|
224
224
|
**Memory inspection:**
|
|
225
225
|
|
|
226
226
|
- Owner-scope Rich snapshots show `#revision`; Effective shows the vector.
|
|
227
|
+
- Fields show pretty-printed JSON directly. Large fields show a bounded JSON prefix with a separate truncation notice and omitted-character count, not a JSON-encoded `preview` string. The preview may end mid-value; actual escapes inside JSON string values remain intact. These presentation limits never truncate stored memory or successful `read_state` results.
|
|
227
228
|
- During a failed-Passive write fence, memory-enabled inspection uses the accepted cache without a potentially conflicting refresh.
|
|
228
229
|
- Otherwise, inspection waits cancelably to load or refresh one coherent shared view, even when passive model tools are disabled. It does not initialize, publish or advance storage.
|
|
229
230
|
- Data and displayed revisions come from the same observation; absent or invalid memory stays unavailable.
|
|
@@ -191,34 +191,31 @@ const STATE_FLOW_SCOPE_LABELS: Record<StateFlowTelegramScope, string> = {
|
|
|
191
191
|
effective: "🧬 Effective",
|
|
192
192
|
};
|
|
193
193
|
|
|
194
|
-
//
|
|
195
|
-
//
|
|
194
|
+
// Budget the transport-serialized text, leaving room for six fields and notices
|
|
195
|
+
// below Telegram's 32,768-character Rich message ceiling.
|
|
196
196
|
const STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS = 3_000;
|
|
197
197
|
|
|
198
|
-
function renderStateFlowTelegramField(value: unknown):
|
|
198
|
+
function renderStateFlowTelegramField(value: unknown): StateFlowTelegramRichBlock[] {
|
|
199
199
|
const json = JSON.stringify(value, null, 2);
|
|
200
|
-
if (json.length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS)
|
|
200
|
+
if (JSON.stringify(json).length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS) {
|
|
201
|
+
return [{ type: "pre", language: "json", text: json }];
|
|
202
|
+
}
|
|
201
203
|
let low = 0;
|
|
202
|
-
let high = json.length;
|
|
203
|
-
let rendered = "";
|
|
204
|
+
let high = Math.min(json.length, STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS);
|
|
204
205
|
while (low <= high) {
|
|
205
206
|
const length = Math.floor((low + high) / 2);
|
|
206
|
-
|
|
207
|
-
truncated: true,
|
|
208
|
-
...(value !== null && typeof value === "object" && !Array.isArray(value)
|
|
209
|
-
? { keys: Object.keys(value) }
|
|
210
|
-
: {}),
|
|
211
|
-
preview: json.slice(0, length),
|
|
212
|
-
omittedChars: json.length - length,
|
|
213
|
-
}, null, 2);
|
|
214
|
-
if (candidate.length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS) {
|
|
215
|
-
rendered = candidate;
|
|
207
|
+
if (JSON.stringify(json.slice(0, length)).length <= STATE_FLOW_TELEGRAM_FIELD_MAX_CHARS) {
|
|
216
208
|
low = length + 1;
|
|
217
209
|
} else {
|
|
218
210
|
high = length - 1;
|
|
219
211
|
}
|
|
220
212
|
}
|
|
221
|
-
|
|
213
|
+
// Do not split a Unicode surrogate pair at the preview boundary.
|
|
214
|
+
if (/[\uD800-\uDBFF]/.test(json.charAt(high - 1))) high -= 1;
|
|
215
|
+
return [
|
|
216
|
+
{ type: "pre", language: "json", text: json.slice(0, high) },
|
|
217
|
+
{ type: "pre", text: `Truncated preview — ${json.length - high} characters omitted.` },
|
|
218
|
+
];
|
|
222
219
|
}
|
|
223
220
|
|
|
224
221
|
export function renderStateFlowRichState(scope: StateFlowTelegramScope, revisions: ScopeRevisions, state: StateFlowTelegramState): StateFlowTelegramRichMessage {
|
|
@@ -238,7 +235,7 @@ export function renderStateFlowRichState(scope: StateFlowTelegramScope, revision
|
|
|
238
235
|
...fields.filter((field) => state[field] !== undefined && state[field] !== "").map((field) => ({
|
|
239
236
|
type: "details" as const,
|
|
240
237
|
summary: { type: "code" as const, text: field },
|
|
241
|
-
blocks:
|
|
238
|
+
blocks: renderStateFlowTelegramField(state[field]),
|
|
242
239
|
})),
|
|
243
240
|
],
|
|
244
241
|
skip_entity_detection: true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llblab/pi-kit",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@llblab/pi-clean-room": "0.3.0",
|
|
47
47
|
"@llblab/pi-codex-usage": "0.12.1",
|
|
48
48
|
"@llblab/pi-grow-loop": "0.9.0",
|
|
49
|
-
"@llblab/pi-state-flow": "0.25.
|
|
49
|
+
"@llblab/pi-state-flow": "0.25.3",
|
|
50
50
|
"@llblab/pi-telegram": "0.51.6",
|
|
51
51
|
"@llblab/skills": "1.15.0"
|
|
52
52
|
},
|