@llblab/pi-kit 0.1.13 → 0.3.0

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.
Files changed (86) hide show
  1. package/AGENTS.md +1 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +2 -2
  4. package/node_modules/@llblab/pi-actors/AGENTS.md +5 -3
  5. package/node_modules/@llblab/pi-actors/BACKLOG.md +1 -1
  6. package/node_modules/@llblab/pi-actors/CHANGELOG.md +15 -0
  7. package/node_modules/@llblab/pi-actors/README.md +5 -3
  8. package/node_modules/@llblab/pi-actors/dist/index.js +4 -1
  9. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.d.ts +2 -2
  10. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.js +42 -19
  11. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.d.ts +2 -1
  12. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.js +7 -2
  13. package/node_modules/@llblab/pi-actors/dist/lib/limits.d.ts +9 -0
  14. package/node_modules/@llblab/pi-actors/dist/lib/limits.js +9 -0
  15. package/node_modules/@llblab/pi-actors/dist/lib/observability.d.ts +10 -11
  16. package/node_modules/@llblab/pi-actors/dist/lib/observability.js +81 -56
  17. package/node_modules/@llblab/pi-actors/dist/lib/pi.d.ts +31 -0
  18. package/node_modules/@llblab/pi-actors/dist/lib/pi.js +180 -0
  19. package/node_modules/@llblab/pi-actors/dist/lib/run-delivery.d.ts +115 -0
  20. package/node_modules/@llblab/pi-actors/dist/lib/run-delivery.js +623 -0
  21. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.d.ts +3 -0
  22. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.js +341 -13
  23. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.d.ts +1 -1
  24. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.js +5 -3
  25. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.d.ts +16 -0
  26. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.js +143 -0
  27. package/node_modules/@llblab/pi-actors/dist/lib/temp.js +1 -1
  28. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.js +3 -1
  29. package/node_modules/@llblab/pi-actors/dist/scripts/async-runner.mjs +5 -19
  30. package/node_modules/@llblab/pi-actors/dist/skills/actors/SKILL.md +2 -2
  31. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/runs.md +1 -1
  32. package/node_modules/@llblab/pi-actors/dist/skills/swarm/SKILL.md +1 -1
  33. package/node_modules/@llblab/pi-actors/docs/README.md +1 -0
  34. package/node_modules/@llblab/pi-actors/docs/async-runs.md +8 -4
  35. package/node_modules/@llblab/pi-actors/docs/coordinator-delivery.md +207 -0
  36. package/node_modules/@llblab/pi-actors/index.ts +4 -1
  37. package/node_modules/@llblab/pi-actors/lib/async-runs.ts +42 -21
  38. package/node_modules/@llblab/pi-actors/lib/extension-runtime.ts +8 -3
  39. package/node_modules/@llblab/pi-actors/lib/limits.ts +9 -0
  40. package/node_modules/@llblab/pi-actors/lib/observability.ts +97 -78
  41. package/node_modules/@llblab/pi-actors/lib/pi.ts +210 -0
  42. package/node_modules/@llblab/pi-actors/lib/run-delivery.ts +800 -0
  43. package/node_modules/@llblab/pi-actors/lib/run-ui-runtime.ts +370 -18
  44. package/node_modules/@llblab/pi-actors/lib/runs-trace.ts +6 -4
  45. package/node_modules/@llblab/pi-actors/lib/session-evidence.ts +153 -0
  46. package/node_modules/@llblab/pi-actors/lib/temp.ts +1 -1
  47. package/node_modules/@llblab/pi-actors/lib/tools-inspect.ts +4 -1
  48. package/node_modules/@llblab/pi-actors/package.json +3 -3
  49. package/node_modules/@llblab/pi-actors/scripts/async-runner.mjs +5 -19
  50. package/node_modules/@llblab/pi-actors/skills/actors/SKILL.md +2 -2
  51. package/node_modules/@llblab/pi-actors/skills/actors/references/runs.md +1 -1
  52. package/node_modules/@llblab/pi-actors/skills/swarm/SKILL.md +1 -1
  53. package/node_modules/@llblab/pi-telegram/AGENTS.md +4 -4
  54. package/node_modules/@llblab/pi-telegram/CHANGELOG.md +25 -0
  55. package/node_modules/@llblab/pi-telegram/README.md +4 -4
  56. package/node_modules/@llblab/pi-telegram/docs/activity.md +4 -4
  57. package/node_modules/@llblab/pi-telegram/docs/architecture.md +10 -10
  58. package/node_modules/@llblab/pi-telegram/docs/compact-matrix-literal.md +16 -14
  59. package/node_modules/@llblab/pi-telegram/docs/inbound.md +1 -1
  60. package/node_modules/@llblab/pi-telegram/docs/outbound.md +13 -22
  61. package/node_modules/@llblab/pi-telegram/docs/public-api.md +6 -7
  62. package/node_modules/@llblab/pi-telegram/docs/ui-style.md +4 -5
  63. package/node_modules/@llblab/pi-telegram/docs/voice.md +12 -2
  64. package/node_modules/@llblab/pi-telegram/index.ts +0 -1
  65. package/node_modules/@llblab/pi-telegram/lib/activity.ts +10 -5
  66. package/node_modules/@llblab/pi-telegram/lib/bindings.ts +16 -17
  67. package/node_modules/@llblab/pi-telegram/lib/bus-leader.ts +1 -1
  68. package/node_modules/@llblab/pi-telegram/lib/commands.ts +16 -6
  69. package/node_modules/@llblab/pi-telegram/lib/config.ts +25 -25
  70. package/node_modules/@llblab/pi-telegram/lib/media.ts +12 -2
  71. package/node_modules/@llblab/pi-telegram/lib/menu-settings.ts +10 -73
  72. package/node_modules/@llblab/pi-telegram/lib/outbound-buttons.ts +9 -8
  73. package/node_modules/@llblab/pi-telegram/lib/outbound-markup.ts +212 -82
  74. package/node_modules/@llblab/pi-telegram/lib/routing.ts +78 -36
  75. package/node_modules/@llblab/pi-telegram/lib/status.ts +23 -4
  76. package/node_modules/@llblab/pi-telegram/lib/turns.ts +10 -1
  77. package/node_modules/@llblab/pi-telegram/lib/updates.ts +1 -1
  78. package/node_modules/@llblab/pi-telegram/package.json +1 -1
  79. package/node_modules/@llblab/pi-telegram/skills/generated-control-surface/SKILL.md +61 -205
  80. package/node_modules/@llblab/pi-telegram/skills/generated-control-surface/references/capability-adapters.md +27 -0
  81. package/node_modules/@llblab/pi-telegram/skills/generated-control-surface/references/layout-and-state.md +35 -0
  82. package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/SKILL.md +70 -110
  83. package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/references/configuration.md +15 -0
  84. package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/references/delivery-and-threads.md +27 -0
  85. package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/references/diagnosis.md +14 -0
  86. package/package.json +3 -3
@@ -0,0 +1,27 @@
1
+ # Capability Adapters
2
+
3
+ Read only the section matching the current controlled capability.
4
+
5
+ ## Console And System
6
+
7
+ Use the real console program as capability owner. Check exit status and stderr before rendering success. Preserve complete output when reasonably sized; otherwise label pagination, filtering, ranking, or head/tail adaptation. Process, service, package, permission, shutdown, disk, and deletion mutations retain required confirmation.
8
+
9
+ ## Filesystem
10
+
11
+ A prompt that is exactly a plausible filesystem path, including `/`, may request a generated filesystem surface. Resolve and freshly inspect it before display.
12
+
13
+ 1. Pin `⬆️ Up` first whenever the path is not root; its prompt is the exact parent path.
14
+ 2. If paginated, place available `⬅️ Previous` and `➡️ Next` together after Up. Re-inspect on traversal and use a stable 10-entry page.
15
+ 3. Sort visible directories, hidden directories, visible files, then hidden files; alphabetize within each category.
16
+ 4. Render at most 10 entries as full-width rows. Labels use the exact entry name plus semantic folder/file emoji; prompts may be exact paths because path-only prompts mean navigation here.
17
+ 5. Show compact Path and Entries metadata. Do not duplicate entries as a text inventory or add Refresh when resubmitting the path already refreshes.
18
+
19
+ Preserve the same ordering and pagination in a numbered fallback. Show a plain directory listing only when explicitly requested or established preference requires it. Never preview credential stores, keys, browser profiles, cookies, tokens, wallets, or secret-bearing files, and never raise privileges merely to enumerate a path.
20
+
21
+ ## Workflows And Actor Runs
22
+
23
+ Keep exact workflow, Recipe, Run, artifact, or task identity visible. Inspect, pause, continue, redirect, retry, or stop only through the owning runtime contract. Never simulate lifecycle state, bypass Control semantics, or treat a button as execution authority.
24
+
25
+ ## Decisions And Design
26
+
27
+ Controls may represent conversational alternatives without live inspection. State the decision and material trade-offs in visible text. Each prompt records the selected intent; it does not silently execute downstream consequences.
@@ -0,0 +1,35 @@
1
+ # Complex Layout And Interaction State
2
+
3
+ Read this reference only for complex grids, navigation collections, or repeated stateful clicks.
4
+
5
+ ## Semantic Rows
6
+
7
+ Model the surface as ordered ragged rows, not a rectangle to fill. Infer independent, peer, ordered, hierarchical, and spatial relationships before choosing row boundaries.
8
+
9
+ - Non-spatial controls default to one full-width row each.
10
+ - A horizontal pair is earned only by genuine peers with unmistakably compact labels and no plausible wrapping or truncation.
11
+ - Three through five columns are for short symbols, coordinates, glyphs, or codes whose position carries meaning.
12
+ - Six through eight columns require single-glyph or similarly minimal position-bearing labels. Never exceed eight columns on a phone surface.
13
+ - Vary row width intentionally; never pad with empty, duplicate, or no-op controls.
14
+ - Preserve reading order: orientation/navigation, primary content or choices, secondary controls, then separated destructive actions.
15
+ - Rectangular grids require genuine spatial or coordinate correspondence. Vertical continuity may justify many rows; non-spatial button walls should paginate or group.
16
+
17
+ Useful shapes include `1`, `2`, `1 → 2`, `2 → 1`, `1 → 2 → N×1`, repeated `2`, and true `R×C`. Treat these as vocabulary, never templates to impose.
18
+
19
+ ## Metadata And Collections
20
+
21
+ Use compact stacked key-value rows for path-like, numeric, identifier, or machine state, for example `- **Path:** /...` and `- **Entries:** 1–10 of 52`. Do not join unrelated metadata with decorative separators or duplicate button labels as a plain inventory.
22
+
23
+ When a Markdown grid has no semantic column headings, use its first data row as the syntactic header and render remaining rows once. Never invent blank, dash-only, or duplicate headings that add false topology.
24
+
25
+ Navigation collections may expose up to 12 scannable entries; paginate or categorize larger sets. Keep stable ordering and coordinates across regeneration.
26
+
27
+ ## Interaction State
28
+
29
+ Encode the smallest sufficient action delta when visible context establishes one unambiguous state. Add stable target or state identity when delivery may be delayed, reordered, routed elsewhere, or detached from the projection.
30
+
31
+ Keep trivial state in conversation. Persist a small human-auditable artifact when state becomes too large or long-lived for reliable reconstruction. Use a deterministic state-transition owner when rules become correctness-sensitive.
32
+
33
+ Evaluate repeated clicks against current state, not stale button appearance. Preserve tap-ahead when the transport queues each click independently. In source-then-destination interaction, retain the source selection without duplicating the whole surface; regenerate after a completed transition, invalid input, or evidence that the transport cannot preserve the intermediate view.
34
+
35
+ Omit unavailable controls when layout does not matter. Preserve occupied or selected cells when spatial topology depends on stable coordinates.
@@ -1,157 +1,117 @@
1
1
  ---
2
2
  name: telegram-bridge
3
- description: Operates pi-telegram turns, replies, attachments, direct delivery, assistant-authored buttons and voice, Threaded Mode routing, configurable handlers, and bridge diagnosis. Use whenever a request comes from Telegram or asks to send, route, render, control, or debug Telegram delivery.
3
+ description: Operate Telegram-originated turns or explicit Telegram delivery, including reply ownership, targets, files, controls, voice, and diagnosis.
4
4
  ---
5
5
 
6
6
  # Telegram Bridge
7
7
 
8
- Use pi-telegram as a mobile companion surface for the current Pi session. Preserve the current Telegram target, ordinary reply ownership, durable queue semantics, and the boundary between agent intent and bridge transport.
8
+ Use Telegram as a mobile companion to the current Pi session. Preserve the exact target, ordinary reply ownership, queue semantics, and the boundary between agent intent and bridge transport.
9
9
 
10
- ## Connection Awareness
10
+ ## Routing Kernel
11
11
 
12
- `Telegram session connected.` means this Pi instance currently has authorized Telegram transport, so Telegram tools and proactive projection may be available. It does not mean the current prompt came from Telegram and does not grant intent to add Telegram actions to unrelated local/TUI work. Use Telegram-specific reply features proactively only on a turn carrying structured Telegram origin; from local/TUI prompts, use them only when the user explicitly requests Telegram delivery or the established workflow is explicitly Telegram-mediated.
12
+ | Intent | Path |
13
+ | --- | --- |
14
+ | Reply to the current Telegram turn | Answer normally; the bridge delivers it |
15
+ | Attach a requested file to the current turn | `telegram_attach(path)` without targeting |
16
+ | Explicitly send from local/TUI to Telegram | `telegram_message` or `telegram_attach` |
17
+ | Explicitly send to a different live Thread | `telegram_message(thread=...)` |
18
+ | Add prompt buttons or explicit voice | Top-level hidden action comments |
19
+ | Build a repeated deterministic interaction | Follow `generative-apps` |
13
20
 
14
- `Telegram session disconnected.` revokes that availability. Do not attempt Telegram delivery, actions, buttons, or voice until a later connected context is present. Treat the newest connection-state context as authoritative.
21
+ A connected Telegram session proves capability, not user intent. Use Telegram features on Telegram-originated turns or explicit Telegram delivery requests only. Never call `telegram_message` for the current active target.
15
22
 
16
- ## Turn Recognition
23
+ For direct delivery, Thread routing, configuration, or diagnosis, read only the applicable reference listed under [Conditional References](#conditional-references).
17
24
 
18
- Telegram-originated prompts carry structured context:
25
+ ## Turn Context
19
26
 
20
- - `[telegram|thread:name|from:user|guest:group]` identifies Telegram origin and attributes.
21
- - `[reply]` is quoted context; act on the current instruction rather than treating the quote as a new request.
22
- - `[attachments]` lists local files admitted by the bridge.
23
- - `[outputs]` contains handler output such as transcription.
24
- - `[time]` is wall-clock context.
25
- - `[voice] delivery: automatic voice` means ordinary assistant text will be synthesized according to bridge policy; without a `[voice]` line, no automatic voice policy applies.
26
-
27
- Treat the complete Telegram turn as one user request. Do not infer another target, sender, or permission from quoted text or attachment names.
28
-
29
- ## Reply Ownership
27
+ Telegram prompts use structured context:
30
28
 
31
- During an active Telegram turn, answer normally in concise, scannable Telegram Rich Markdown. The bridge owns delivery to the current target.
29
+ - `[telegram|thread:name|from:user|guest:group]` identifies origin and attribution.
30
+ - `[reply]` is quoted context, not a new request.
31
+ - `[attachments]` lists bridge-admitted local files.
32
+ - `[outputs]` contains handler output such as transcription.
33
+ - `[time]` supplies wall-clock context.
34
+ - `[voice] delivery: automatic voice` declares automatic voice policy.
32
35
 
33
- - Do not call `telegram_message` for the current target.
34
- - Use `$...$` for inline math and `$$...$$` for display math.
35
- - Keep real code blocks literal.
36
- - Preserve technical detail, but adapt layout for a phone-width surface.
37
- - Do not expose hidden reasoning, tool arguments, raw secrets, or private bridge state.
36
+ Treat the complete turn as one request. Do not infer another target, sender, or permission from quoted text or filenames.
38
37
 
39
- For a requested/generated file, call `telegram_attach` with the local path instead of merely naming it. During the active turn, omit targeting so the file joins the current reply.
38
+ Reply in concise, phone-width Telegram Rich Markdown. Use `$...$` and `$$...$$` for math, keep code blocks literal, and never expose hidden reasoning, tool arguments, secrets, or private bridge state.
40
39
 
41
- ## Direct Delivery
40
+ ## Assistant Actions
42
41
 
43
- Use `telegram_message` only when the user explicitly requests Telegram delivery from a local/TUI turn or names a concrete different Telegram target.
42
+ `telegram_button` and `telegram_voice` are hidden HTML comments, not tools. Emit each complete comment at column zero, outside lists, quotes, code blocks, and indentation.
44
43
 
45
- - Omitted target selects the paired/default target only outside an active Telegram turn.
46
- - `chat_id` plus optional `thread_id` selects an explicit Bot API target.
47
- - `thread` selects another live Pi Thread by name or id and admits one attributed turn there.
48
- - Direct delivery requires this Pi instance to own transport or hold a live Threaded Mode registration.
49
- - Unknown, ambiguous, same, offline, unauthorized, or cross-chat targets fail closed.
44
+ ### Shared Encoding Rule
50
45
 
51
- Use `telegram_attach` outside Telegram turns only when the user explicitly requests file delivery. Registered followers default to their assigned Thread.
46
+ Choose the least verbose sufficient representation:
52
47
 
53
- ## Assistant-Authored Actions
48
+ 1. Positional CML — default.
49
+ 2. JSON — only when multiline content, named fields, or escaping earns it.
54
50
 
55
- Before compiling assistant-authored controls, inspect already-loaded capability guidance for an advertised maintained Generative App or view/controller adapter. When that owner-provided view exists and the current intent concerns repeated interaction, load and follow the bundled `generative-apps` Skill and prefer binding or invoking the existing app over synthesizing one-shot prompt buttons. This routing guidance is not permission for the bridge to discover capability-specific apps, own their state, or hard-code their identities.
51
+ CML trims atom boundaries and decodes `\|`, `\}`, and `\\`. Keep one complete action in one comment.
56
52
 
57
- Otherwise, only on Telegram-originated turns, proactively load `generated-control-surface` when a likely next decision or action may benefit from prompt buttons; do not activate it merely because Telegram is connected or local output may be projected by proactive push. Do not wait for an explicit button request on a Telegram-originated turn, and accept zero controls when its admission rules reject decorative or low-value UI.
53
+ ### Prompt Buttons
58
54
 
59
- `telegram_button` and `telegram_voice` are hidden top-level HTML comments, not tools. Emit them at column zero, outside lists, quotes, code blocks, and indentation.
55
+ Every button has a short distinct `emoji + space + text` label, a self-contained prompt, and an optional selection style. A click creates an ordinary user request; it never grants authority or bypasses confirmation.
60
56
 
61
- Button forms:
57
+ - `{prompt}` uses the same text for label and prompt.
58
+ - `{label|prompt}` separates visible label from queued prompt.
59
+ - `{label|prompt|selected_style}` accepts `primary`, `success`, or `danger`.
60
+ - Top-level cells form vertical rows; one nested row groups horizontal peers.
61
+ - Prefer one matrix comment for the complete surface.
62
62
 
63
63
  ```html
64
- <!-- telegram_button {"label":"Continue","prompt":"Continue with the current plan."} -->
65
- <!-- telegram_button value="Continue" -->
66
- <!-- telegram_button [{"label":"⬆️ Up","prompt":"/"},[{"value":"⬅️ Previous"},{"value":"➡️ Next"}],{"label":"📁 etc","prompt":"/etc"}] -->
67
- <!-- telegram_buttons [[{"value":"Approve"},{"value":"Reject"}]] -->
68
- <!-- telegram_button [{⬆️ Up|/}[{⬅️|page-1}{➡️|page-3}]{📁 etc|/etc}] -->
64
+ <!-- telegram_button [{▶️ Continue|Continue the current plan.}[{✅ Approve|Approve this.}{❌ Reject|Reject this.}]] -->
65
+ <!-- telegram_button {"label":"💡 Explain","prompt":"Explain this.\nInclude the risks."} -->
69
66
  ```
70
67
 
71
- - `telegram_button` accepts one JSON object, an adaptive JSON/CML matrix, positional Compact Matrix Literal (CML), or double-quoted attributes; `telegram_buttons` is an exact plural alias. One matrix or row may mix named JSON objects with positional cells, and commas are optional only between completed elements while JSON object internals remain strict. CML uses `{value}`, `{label|prompt}`, or `{label|prompt|selected_style}`; the optional third atom requires an explicit prompt and accepts only `primary`, `success`, or `danger`. It trims atom boundaries, preserves other printable text literally, and decodes only `\|`, `\}`, and `\\`. Prefer CML for model-authored controls whenever it can express the required surface; use expanded JSON only for multiline prompts, non-positional metadata, or a concrete parse/render failure fallback, never merely from implementation habit. Deterministic Generative App scripts may use ordinary JSON because their output does not spend model tokens. In a matrix, each top-level cell becomes a full-width row and each nested row groups one or more buttons horizontally without a parser-level width cap. Prefer one matrix comment for multiple buttons, normally keep generated rows at five columns or fewer, and use six through eight only for short position-bearing labels. Keep the complete action in one top-level comment and encode multiline content with JSON `\n`.
72
- - Use `label` plus a self-contained `prompt`, or non-empty `value` when both are identical.
73
- - Optional `selected_style` is `primary` (default), `success`, or `danger`; style never suppresses prompt admission.
74
- - If button comments form the whole reply, the bridge supplies the standard choice heading.
75
- - A button click creates a new user request; it does not bypass authority or confirmation.
76
- - Labels stay short and distinct. Prompts name the exact target, intended operation, and safety exclusions.
68
+ Proactively use `generated-control-surface` whenever controls can materially shorten likely feedback; once active, it must emit useful buttons rather than prose alone. That Skill owns action composition; this Skill owns Telegram serialization and delivery. If buttons form the whole reply, the bridge supplies the standard choice heading.
69
+
70
+ ### Voice
77
71
 
78
- Voice forms:
72
+ One `telegram_voice` comment creates one voice artifact; voice does not use matrix composition.
73
+
74
+ - `{text}` supplies speech.
75
+ - `{text|lang}` adds a language hint.
76
+ - `{text|lang|rate}` also adds a speech-rate hint.
79
77
 
80
78
  ```html
81
- <!-- telegram_voice {"text":"Short spoken message","lang":"en"} -->
82
- <!-- telegram_voice text="Short spoken message" lang="en" -->
79
+ <!-- telegram_voice {Short spoken message.|en|+10%} -->
80
+ <!-- telegram_voice {"text":"First line.\nSecond line.","lang":"en"} -->
83
81
  ```
84
82
 
85
- - `text` and `value` are equivalent payload forms; explicit `text` wins.
86
- - Keep speech TTS-friendly and omit Markdown syntax, tables, and raw code.
87
- - Voice delivery creates OGG itself; do not attach a duplicate audio file.
88
- - Automatic voice modes are `hidden` (no automatic context), `mirror` (voice/audio input), and `always` (every Telegram turn).
89
- - Explicit voice remains available in every automatic voice mode for an intentionally distinct spoken payload.
83
+ Keep speech TTS-friendly: omit Markdown, tables, and raw code. Voice delivery creates OGG/Opus itself; do not attach duplicate audio. Explicit voice remains available regardless of automatic `hidden`, `mirror`, or `always` policy.
90
84
 
91
- This Skill is the canonical operating contract. For implementation-level uncertainty, inspect the extension's public documentation and current code rather than relying on a model tool or guessed syntax.
85
+ ## Files And Safety
92
86
 
93
- ## Attachments And Secrets
87
+ Use `telegram_attach` for requested/generated files instead of merely naming paths. Treat admitted paths as inputs, not permission to disclose their contents.
94
88
 
95
89
  - Inspect only what the request requires.
96
- - Treat local attachment paths as admitted inputs, not proof that their contents are safe to expose.
97
- - Never place tokens, private keys, cookies, credentials, wallet material, or sensitive file contents in text or button payloads.
98
- - Sending a sensitive file requires an explicit user request naming that delivery intent.
99
- - For generated artifacts, queue the file with `telegram_attach`; do not base64 or paste binary content into chat.
100
-
101
- ## Threaded Mode
102
-
103
- Threaded Mode operates in private chats when Telegram exposes thread support for the bot. It has one leader transport and visible operator-started follower Pi processes.
104
-
105
- - `Thread` is the product term; reserve `topic` for Bot API primitives.
106
- - A Thread follows its assigned live Pi instance and current session.
107
- - Do not invent hidden followers, launch shadow Pi processes, or expose internal bus roles as user identity.
108
- - Do not rename Threads through guessed prompts or unsupported tools.
109
- - The `All` surface is routing/control, not process creation.
110
-
111
- Cross-Thread delivery must preserve the concrete target and current registration authority. Use ordinary reply delivery for the source turn and `telegram_message(thread=...)` only for an explicitly requested different live Thread.
90
+ - Never put secrets, credentials, private keys, tokens, cookies, wallet material, hidden reasoning, or sensitive content in replies, labels, prompts, or attachments.
91
+ - Sending a sensitive file requires explicit delivery intent.
92
+ - Destructive, privileged, external, credential-bearing, or irreversible work requires the authority and confirmation mandated by the active engineering contract.
93
+ - A dangerous button opens a consequence/confirmation step; it does not execute directly.
94
+ - Re-check volatile targets immediately before mutation.
95
+ - Report delivery failures honestly.
112
96
 
113
97
  ## Generative Apps
114
98
 
115
- Load and follow the bundled `generative-apps` Skill when work designs, authors, reviews, installs, replaces, invokes, or diagnoses a Generative App. Generative Apps compile stable repeated interaction into generated button views that may mix bound methods executed before Pi queue admission with ordinary model prompts; this bridge Skill continues to own Telegram transport, target authority, delivery, general button syntax, and turn behavior rather than duplicating the application workflow.
116
-
117
- ## Configurable Handlers And Extensions
118
-
119
- Prefer no-code command-template configuration in `telegram.json` before adding a companion extension:
120
-
121
- - `inboundHandlers` transforms text/media before queueing.
122
- - `outboundHandlers` transforms final replies.
123
- - Voice transcription handlers can match `type: "voice"` or `mime: "audio/*"`; stdout becomes `[outputs]`.
124
-
125
- When asked to configure voice rather than merely operate it, follow the provider-neutral contracts in `docs/voice.md`, `docs/inbound.md`, `docs/outbound.md`, and `docs/command-templates.md` from the pi-telegram package or repository. Inspect the available Skill catalog and trusted local executables for STT, TTS, and media conversion capabilities; check only whether required environment variables exist, never reveal their values. Preserve unrelated `telegram.json` fields, order multiple matching inbound handlers as fallbacks, require OGG/Opus output for native voice delivery, and validate each stage before a live Telegram smoke test. Keep `voice.replyMode` at its existing value unless the user requests a policy change: the default `manual` mode is fully functional because explicit top-level `telegram_voice` actions still use the configured synthesis pipeline.
126
-
127
- When configuration is insufficient, use documented `@llblab/pi-telegram/*` public API subpaths. Never import package-private `lib/*`, start another polling loop, or bypass bridge ownership with raw Bot API access.
128
-
129
- ## Safety
130
-
131
- - Read-only inspection may proceed when requested.
132
- - Destructive, privileged, external, credential-bearing, or irreversible operations require explicit authorization under the active engineering contract.
133
- - A button offering a dangerous action should open a consequence/confirmation screen before execution.
134
- - Re-check volatile targets immediately before mutation.
135
- - Report Telegram delivery failures honestly; do not claim a send from a queued comment or failed tool call.
136
-
137
- ## Diagnosis
99
+ When maintained capability guidance advertises an existing Generative App for the requested repeated interaction, follow `generative-apps` and prefer that owner over one-shot prompt buttons. Keep one-off, interpretive controls as ordinary prompt buttons. The bridge owns transport and general action syntax, not application state or methods.
138
100
 
139
- Prefer:
101
+ ## Conditional References
140
102
 
141
- 1. `telegram-status` for compact health.
142
- 2. `telegram-status --debug` for bounded human-readable diagnostics.
143
- 3. `~/.pi/agent/tmp/telegram/state.json` and `logs.jsonl` for default-profile redacted evidence.
144
- 4. `state.<profile>.json` and `logs.<profile>.jsonl` in the same directory for a named profile.
103
+ Read only when the current task needs the capability:
145
104
 
146
- When `PI_CODING_AGENT_DIR` selects another compatible runtime, resolve the equivalent `tmp/telegram` directory under that agent root. Do not mutate bridge state, ownership files, journals, bindings, or locks to force recovery. Use supported commands and exact current authority.
105
+ - Explicit local, cross-target, or Thread delivery: [`references/delivery-and-threads.md`](./references/delivery-and-threads.md)
106
+ - Voice/media handler configuration or public extension APIs: [`references/configuration.md`](./references/configuration.md)
107
+ - Bridge health or failure diagnosis: [`references/diagnosis.md`](./references/diagnosis.md)
147
108
 
148
109
  ## Completion Check
149
110
 
150
- Before sending a Telegram response, verify:
111
+ Before replying:
151
112
 
152
- - The reply goes through the correct current or explicit target path.
153
- - Requested files are attached rather than only mentioned.
154
- - Action comments are top-level and syntactically complete.
155
- - Buttons carry self-contained prompts and dangerous actions retain confirmation.
156
- - No secret or hidden reasoning appears in text, actions, or attachments without explicit authorization.
157
- - Direct delivery is not duplicating the ordinary current-turn reply.
113
+ - Use the ordinary path for the current target and direct tools only for explicit other delivery.
114
+ - Attach requested files rather than only mentioning them.
115
+ - Keep action comments top-level, complete, and canonical: CML first, JSON when necessary.
116
+ - Give every button a self-contained prompt; preserve confirmation for dangerous actions.
117
+ - Expose no secret or hidden reasoning.
@@ -0,0 +1,15 @@
1
+ # Configuration And Extension APIs
2
+
3
+ Read this reference only when configuring voice/media handlers or developing against pi-telegram extension APIs.
4
+
5
+ Prefer shell-free command templates in `telegram.json` before adding a companion extension:
6
+
7
+ - `inboundHandlers` transforms text/media before queueing.
8
+ - `outboundHandlers` transforms final replies.
9
+ - Voice transcription handlers may match `type: "voice"` or `mime: "audio/*"`; stdout becomes `[outputs]`.
10
+
11
+ Follow `docs/voice.md`, `docs/inbound.md`, `docs/outbound.md`, and `docs/command-templates.md` from the pi-telegram package or repository. Inspect available Skills and trusted local executables for STT, TTS, or conversion capability. Check only whether required environment variables exist; never reveal their values.
12
+
13
+ Preserve unrelated `telegram.json` fields. Order matching handlers as fallbacks, require OGG/Opus for native voice, validate every stage before a live smoke test, and keep `voice.replyMode` unchanged unless the user requests a policy change. Explicit `telegram_voice` works in the default `manual` mode.
14
+
15
+ When configuration is insufficient, use documented `@llblab/pi-telegram/*` package subpaths. Never import package-private `lib/*`, start another polling loop, bypass bridge ownership with raw Bot API access, or capture stale runtime state.
@@ -0,0 +1,27 @@
1
+ # Direct Delivery And Threads
2
+
3
+ Read this reference only for explicit local/TUI Telegram delivery, cross-target delivery, or Thread routing.
4
+
5
+ ## Direct Delivery
6
+
7
+ Use `telegram_message` only when the user explicitly requests Telegram delivery from local/TUI or names a concrete different Telegram target.
8
+
9
+ - Omitted target selects the paired/default target only outside an active Telegram turn.
10
+ - `chat_id` plus optional `thread_id` selects an explicit Bot API target.
11
+ - `thread` selects another live Pi Thread by case-insensitive name or numeric id and admits one attributed turn there.
12
+ - During an active Telegram turn, answer the current target normally; direct delivery to that same target is rejected.
13
+ - Direct delivery requires this Pi instance to own transport or hold a live Threaded Mode registration.
14
+ - Unknown, ambiguous, same, offline, unauthorized, or cross-chat targets fail closed.
15
+
16
+ Use `telegram_attach` outside Telegram turns only for an explicit file-delivery request. Registered followers default to their assigned Thread; explicit targets must preserve both `chat_id` and `thread_id`.
17
+
18
+ ## Threaded Mode
19
+
20
+ Threaded Mode uses one leader transport and visible operator-started follower Pi processes.
21
+
22
+ - `Thread` is the product term; reserve `topic` for Bot API primitives.
23
+ - A Thread follows its assigned live Pi instance and current session.
24
+ - The `All` surface controls routing; it does not create processes.
25
+ - Never invent hidden followers, launch shadow Pi processes, expose internal bus roles as user identity, or rename Threads through guessed prompts or unsupported tools.
26
+
27
+ Cross-Thread delivery must preserve the concrete target and current registration authority. Keep the source turn on its ordinary reply path and use `telegram_message(thread=...)` only for an explicitly requested different live Thread.
@@ -0,0 +1,14 @@
1
+ # Bridge Diagnosis
2
+
3
+ Read this reference only when diagnosing Telegram bridge health or delivery failure.
4
+
5
+ Inspect in this order:
6
+
7
+ 1. `telegram-status` for compact health.
8
+ 2. `telegram-status --debug` for bounded human-readable diagnostics.
9
+ 3. `~/.pi/agent/tmp/telegram/state.json` and `logs.jsonl` for default-profile redacted evidence.
10
+ 4. `state.<profile>.json` and `logs.<profile>.jsonl` for a named profile.
11
+
12
+ When `PI_CODING_AGENT_DIR` selects another compatible runtime, resolve its equivalent `tmp/telegram` directory.
13
+
14
+ Do not mutate ownership files, bridge state, journals, bindings, or locks to force recovery. Use supported commands and preserve exact profile, target, transport, and session authority. Never claim successful delivery without transport evidence.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llblab/pi-kit",
3
- "version": "0.1.13",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -40,10 +40,10 @@
40
40
  "LICENSE"
41
41
  ],
42
42
  "dependencies": {
43
- "@llblab/pi-actors": "0.50.0",
43
+ "@llblab/pi-actors": "0.52.0",
44
44
  "@llblab/pi-codex-usage": "0.9.4",
45
45
  "@llblab/pi-grow-loop": "0.7.3",
46
- "@llblab/pi-telegram": "0.40.0"
46
+ "@llblab/pi-telegram": "0.42.0"
47
47
  },
48
48
  "bundledDependencies": [
49
49
  "@llblab/pi-actors",