@sjawhar/pi-legion-envoy 5.24.3 → 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('No decision blocks in this spec \u2014 nothing here reaches a human\'s inbox. Want human feedback? See the `dispatch` skill, "Decision blocks".');
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('No decision blocks in this spec \u2014 nothing here reaches a human\'s inbox. Want human feedback? See the `dispatch` skill, "Decision blocks".');
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.3",
33540
+ version: "5.24.5",
33535
33541
  type: "module",
33536
33542
  omp: {
33537
33543
  extensions: [
@@ -34097,7 +34103,8 @@ var LegionGoOperatorClaimResponse = exports_external.strictObject({
34097
34103
  promptRetires: exports_external.number().int().nonnegative()
34098
34104
  }),
34099
34105
  uncertainStreak: exports_external.number().int().nonnegative(),
34100
- pending: legionGoDeliveryView.optional()
34106
+ pending: legionGoDeliveryView.optional(),
34107
+ suspensionHeld: exports_external.literal(true).optional()
34101
34108
  });
34102
34109
  var LegionGoOperatorClaimsResponse = exports_external.strictObject({
34103
34110
  claims: exports_external.array(LegionGoOperatorClaimResponse)
@@ -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 `No decision blocks in this spec …`, read it
120
- as a question, not an error: either no decision is needed and you say nothing, or you forgot to
121
- make the decision a block and must fix the spec.
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: the block id, shown as `:::ask{#<uuid> …}` in the rendered document and taken bare by
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. For
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sjawhar/pi-legion-envoy",
3
- "version": "5.24.3",
3
+ "version": "5.24.5",
4
4
  "type": "module",
5
5
  "omp": {
6
6
  "extensions": [