@sjawhar/pi-legion-envoy 5.24.4 → 5.24.5
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/dist/envoy.js
CHANGED
|
@@ -32805,8 +32805,14 @@ function renderAdvice(tool, key, advice, opts) {
|
|
|
32805
32805
|
const openAsks = advice.your_open_asks;
|
|
32806
32806
|
const writesSinceHuman = advice.session_writes_since_human;
|
|
32807
32807
|
const lines = [];
|
|
32808
|
+
const unparsed = advice.unparsed_openers;
|
|
32809
|
+
if (unparsed !== undefined && unparsed.count > 0 && (tool === "dispatch_issue" || tool === "dispatch_artifact")) {
|
|
32810
|
+
const quoted = unparsed.examples.map((example) => JSON.stringify(example)).join(", ");
|
|
32811
|
+
const subject2 = unparsed.count === 1 ? "1 typed-block opening in this document is text, not a block" : `${unparsed.count} typed-block openings in this document are text, not blocks`;
|
|
32812
|
+
lines.push(`${subject2}: ${quoted}. An opening like \`:::ask{\u2026}\` makes a block only as a line of its own, so as text it asks nobody. Mentioning the syntax on purpose? Put it in code. See the \`dispatch\` skill, "Decision blocks".`);
|
|
32813
|
+
}
|
|
32808
32814
|
if (advice.decision_blocks === 0 && opts.isPrimarySpec === true && (tool === "dispatch_issue" || tool === "dispatch_artifact")) {
|
|
32809
|
-
lines.push('
|
|
32815
|
+
lines.push('This spec holds no ask blocks, so nothing here reaches a human\'s inbox. Want human feedback? See the `dispatch` skill, "Decision blocks".');
|
|
32810
32816
|
}
|
|
32811
32817
|
if (hasIssueAdvice && writesSinceHuman !== undefined && writesSinceHuman >= 3 && (tool === "dispatch_message" || tool === "dispatch_ask" || tool === "dispatch_comment" && opts.isAskReply !== true)) {
|
|
32812
32818
|
const middle = writesSinceHuman >= 6 ? "Stop posting here until a human replies." : "Progress ledger or scratchpad? If so, stop.";
|
package/dist/legion.js
CHANGED
|
@@ -31744,8 +31744,14 @@ function renderAdvice(tool, key, advice, opts) {
|
|
|
31744
31744
|
const openAsks = advice.your_open_asks;
|
|
31745
31745
|
const writesSinceHuman = advice.session_writes_since_human;
|
|
31746
31746
|
const lines = [];
|
|
31747
|
+
const unparsed = advice.unparsed_openers;
|
|
31748
|
+
if (unparsed !== undefined && unparsed.count > 0 && (tool === "dispatch_issue" || tool === "dispatch_artifact")) {
|
|
31749
|
+
const quoted = unparsed.examples.map((example) => JSON.stringify(example)).join(", ");
|
|
31750
|
+
const subject2 = unparsed.count === 1 ? "1 typed-block opening in this document is text, not a block" : `${unparsed.count} typed-block openings in this document are text, not blocks`;
|
|
31751
|
+
lines.push(`${subject2}: ${quoted}. An opening like \`:::ask{\u2026}\` makes a block only as a line of its own, so as text it asks nobody. Mentioning the syntax on purpose? Put it in code. See the \`dispatch\` skill, "Decision blocks".`);
|
|
31752
|
+
}
|
|
31747
31753
|
if (advice.decision_blocks === 0 && opts.isPrimarySpec === true && (tool === "dispatch_issue" || tool === "dispatch_artifact")) {
|
|
31748
|
-
lines.push('
|
|
31754
|
+
lines.push('This spec holds no ask blocks, so nothing here reaches a human\'s inbox. Want human feedback? See the `dispatch` skill, "Decision blocks".');
|
|
31749
31755
|
}
|
|
31750
31756
|
if (hasIssueAdvice && writesSinceHuman !== undefined && writesSinceHuman >= 3 && (tool === "dispatch_message" || tool === "dispatch_ask" || tool === "dispatch_comment" && opts.isAskReply !== true)) {
|
|
31751
31757
|
const middle = writesSinceHuman >= 6 ? "Stop posting here until a human replies." : "Progress ledger or scratchpad? If so, stop.";
|
|
@@ -33531,7 +33537,7 @@ import { logger } from "@oh-my-pi/pi-utils";
|
|
|
33531
33537
|
// package.json
|
|
33532
33538
|
var package_default = {
|
|
33533
33539
|
name: "@sjawhar/pi-legion-envoy",
|
|
33534
|
-
version: "5.24.
|
|
33540
|
+
version: "5.24.5",
|
|
33535
33541
|
type: "module",
|
|
33536
33542
|
omp: {
|
|
33537
33543
|
extensions: [
|
|
@@ -116,9 +116,14 @@ terrible!! Decisions should be in context in the spec".
|
|
|
116
116
|
|
|
117
117
|
The block is what reaches the human's Inbox. A question phrased as prose in the spec reaches
|
|
118
118
|
nobody. A spec with no ask blocks is fine only when the issue genuinely needs no human decision.
|
|
119
|
-
When `dispatch_issue` or `dispatch_artifact` answers `
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
When `dispatch_issue` or `dispatch_artifact` answers `This spec holds no ask blocks …`, read it as a
|
|
120
|
+
question: either no decision is needed and you say nothing, or you forgot to make it a block. When
|
|
121
|
+
it answers `… typed-block openings in this document are text, not blocks`, the quoted openings are
|
|
122
|
+
blocks stored as prose (inside a line, or a paste with something before every line): fix the markdown
|
|
123
|
+
and upload again; a mention on purpose belongs in code. Neither answer sees a spec wrapped whole in a
|
|
124
|
+
code fence (take the fence off), a malformed opening inside a line (`::ask{`, `:::ask {`: an ask opens
|
|
125
|
+
only as `:::ask{…}` on a line of its own), or any `dispatch_doc_edit`: after an edit that writes an
|
|
126
|
+
ask, `dispatch_doc_read` the section and check it renders as `:::ask{#<id> …}` on its own line.
|
|
122
127
|
|
|
123
128
|
**Wrong:** a **Decisions needed** list at the top of the spec with three bullets.
|
|
124
129
|
**Right:** put each decision in the design section it belongs to as an `:::ask{#slug}` block, with
|
|
@@ -130,11 +135,7 @@ the block and keeps its ask, its answer and its followers; the context paragraph
|
|
|
130
135
|
out of Design move the same way, and the emptied section is deleted (the same repair, made on
|
|
131
136
|
AGENTC-397 after Sami's 2026-09-20 request: "move the decisions items to be in context of their
|
|
132
137
|
discussion in the spec, not just all piled up at the start with no context"). An ask block has two
|
|
133
|
-
ids
|
|
134
|
-
`move`/`delete` in `block` (the `block:<uuid>` form is only for `before`/`after` anchors), and the
|
|
135
|
-
ask id, which `dispatch_open_asks`, the dashboard's `?ask=` link, `dispatch_read` and
|
|
136
|
-
`dispatch_comment({ reply_to_ask })` use. They differ; `dispatch://KEY/ask/<block-id>` answers
|
|
137
|
-
`not found`.
|
|
138
|
+
ids that differ; [Editing a document](skill://dispatch/references/document-edits.md) says which.
|
|
138
139
|
|
|
139
140
|
See [Typed blocks](#typed-blocks) for the syntax and [Before you ask](#before-you-ask) under
|
|
140
141
|
[Asking](#asking) to decide whether the question is a real decision at all.
|
|
@@ -182,3 +182,9 @@ deletion cannot undo a removal.
|
|
|
182
182
|
`retype` turns the paragraph or typed block with `block` into the named typed `type` in place. It keeps the
|
|
183
183
|
block id, keeps a typed block's body, and uses `attributes` for client-owned typed attributes. Use it when
|
|
184
184
|
an existing paragraph is the question that should become a decision.
|
|
185
|
+
|
|
186
|
+
An ask block has two ids: the block id, shown as `:::ask{#<id> …}` in the rendered document and
|
|
187
|
+
taken bare by `move`/`delete` in `block` (the `block:<id>` form is only for `before`/`after`
|
|
188
|
+
anchors), and the ask id, which `dispatch_open_asks`, the dashboard's `?ask=` link, `dispatch_read`
|
|
189
|
+
and `dispatch_comment({ reply_to_ask })` use. They differ; `dispatch://KEY/ask/<block-id>` answers
|
|
190
|
+
`not found`.
|
|
@@ -11,7 +11,12 @@ The server declares typed document blocks at `GET /api/v1/schema/blocks`. Write
|
|
|
11
11
|
container-directive form `:::name{#block-id key="value"}` on its own line, ordinary block children,
|
|
12
12
|
and a closing line of as many colons at the same nesting. A typed block directly inside another needs the outer
|
|
13
13
|
one's fence a colon longer (`::::callout{…}` around a `:::callout{…}`), and so does one whose code holds a `:::` line;
|
|
14
|
-
Dispatch writes its fences that way. An unclosed typed block at document level is rejected.
|
|
14
|
+
Dispatch writes its fences that way. An unclosed typed block at document level is rejected. An
|
|
15
|
+
opening line that continues a paragraph instead of standing on its own (indented four or more
|
|
16
|
+
columns under the paragraph's text) is refused, naming the line's number and text - `INVALID_OP` on an edit's `markdown` or `with`, `INVALID_MARKDOWN` on any other write - since it
|
|
17
|
+
would be stored as the paragraph's text; start the block on its own line. An opening written inside
|
|
18
|
+
a line is stored as text, and `dispatch_issue` and `dispatch_artifact` quote it back as a
|
|
19
|
+
typed-block opening that is text, not a block. For
|
|
15
20
|
a new typed block, omit `#block-id`; Dispatch mints it. When editing an existing typed block, retain
|
|
16
21
|
its id and every rendered attribute. Never copy an existing block's id into new markdown: an id
|
|
17
22
|
names one block, so an insert, upload or suggestion whose markdown names an id the document holds
|