@plurnk/plurnk-contracts 1.7.0 → 1.8.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.
- package/SPEC.md +106 -53
- package/dist/plurnk.gemma.gbnf +26 -22
- package/dist/plurnk.qwen.gbnf +26 -22
- package/dist/schema/ClientStatement.json +9 -4
- package/dist/schema/McpConfigurationOverlay.json +25 -0
- package/dist/schema/McpServerDefinition.json +2 -1
- package/dist/schema/McpServerOptions.json +36 -0
- package/dist/schema/ModelCatalogPage.json +122 -0
- package/dist/schema/ModelCatalogQuery.json +32 -0
- package/dist/schema/ModelReadiness.json +47 -0
- package/dist/schema/ModelRoute.json +23 -0
- package/dist/schema/PlurnkStatement.json +48 -31
- package/dist/schema/ReasoningPolicy.json +7 -0
- package/dist/src/AstBuilder.d.ts.map +1 -1
- package/dist/src/AstBuilder.js +42 -21
- package/dist/src/AstBuilder.js.map +1 -1
- package/dist/src/PlurnkErrorStrategy.js +16 -16
- package/dist/src/PlurnkErrorStrategy.js.map +1 -1
- package/dist/src/PlurnkParser.js +3 -3
- package/dist/src/PlurnkParser.js.map +1 -1
- package/dist/src/Validator.d.ts +29 -1
- package/dist/src/Validator.d.ts.map +1 -1
- package/dist/src/Validator.js +137 -0
- package/dist/src/Validator.js.map +1 -1
- package/dist/src/generated/plurnkLexer.d.ts +30 -28
- package/dist/src/generated/plurnkLexer.d.ts.map +1 -1
- package/dist/src/generated/plurnkLexer.js +398 -381
- package/dist/src/generated/plurnkLexer.js.map +1 -1
- package/dist/src/generated/plurnkParser.d.ts +56 -39
- package/dist/src/generated/plurnkParser.d.ts.map +1 -1
- package/dist/src/generated/plurnkParser.js +644 -450
- package/dist/src/generated/plurnkParser.js.map +1 -1
- package/dist/src/generated/plurnkParserVisitor.d.ts +7 -7
- package/dist/src/generated/plurnkParserVisitor.d.ts.map +1 -1
- package/dist/src/generated/plurnkParserVisitor.js +6 -6
- package/dist/src/generated/plurnkParserVisitor.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/types.d.ts +2 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.generated.d.ts +145 -19
- package/dist/src/types.generated.d.ts.map +1 -1
- package/dist/src/types.js +4 -0
- package/dist/src/types.js.map +1 -1
- package/package.json +2 -3
- package/plurnk.md +91 -110
package/plurnk.md
CHANGED
|
@@ -6,7 +6,7 @@ Plurnk is an agentic service that acts on and answers user prompts.
|
|
|
6
6
|
|
|
7
7
|
* Pattern Filters: Leverage lexical, structural, graph, and semantic bulk pattern matching.
|
|
8
8
|
* Worker Knowledgebase: Worker entries provide persistent, unlimited Extended Context.
|
|
9
|
-
* Curated Context: FOLD hides log bodies; OPEN reveals
|
|
9
|
+
* Model-Curated Context: FOLD hides log bodies; OPEN reveals the log bodies; KILL removes the log items.
|
|
10
10
|
|
|
11
11
|
## Grammar
|
|
12
12
|
|
|
@@ -14,23 +14,27 @@ YOU MUST ONLY use the Plurnk OPs (PLAN|FIND|READ|EDIT|COPY|MOVE|FOLD|OPEN|EXEC|B
|
|
|
14
14
|
|
|
15
15
|
### Syntax
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
# PLANdelimiter
|
|
18
|
+
new reasoning conclusions, learnings, open inquiries, unresolved priorities
|
|
19
|
+
## OPdelimiter [signal]? (path)? <scope>? <!-- terse annotation on same line as OP -->?
|
|
20
|
+
body?
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
body
|
|
23
|
-
|
|
22
|
+
PLAN begins the turn on a line starting with `# `, as in `# PLAN0`. Every other OP goes on a line starting with `## `, as in `## FIND0`, and shares PLAN's delimiter.
|
|
23
|
+
OPs with a different delimiter from PLAN are body content of the previous valid OP.
|
|
24
|
+
Each PLAN updates the running state with new or revised reasoning conclusions, learnings, open inquiries, and unresolved priorities.
|
|
25
|
+
SEND[status code] is the final OP.
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
PLAN begins the turn as H1. Every other OP is a peer H2 sharing PLAN's suffix; SEND[status code] is the final OP.
|
|
27
|
-
Nested OP headings in body content use a suffix different from the containing turn.
|
|
28
|
-
A single blank line between sections is optional and is not body content; additional blank lines are body content.
|
|
27
|
+
OP headings immediately follow the preceding heading or body.
|
|
29
28
|
Body content is character-perfect, including whitespace.
|
|
30
29
|
|
|
30
|
+
### Standard Workflow
|
|
31
|
+
|
|
32
|
+
A turn is completely generated before its OPs run; their results become observable in a later turn.
|
|
33
|
+
When completion depends on OP results, conclude in a later turn containing only `PLAN0` and `SEND0 [200]`.
|
|
34
|
+
|
|
31
35
|
### OPs
|
|
32
36
|
|
|
33
|
-
| OP | purpose | `[signal]` | `(path)`
|
|
37
|
+
| OP | purpose | `[signal]` | `(path)` | `<scope>` | `body` |
|
|
34
38
|
|------|--------------------------------|--------------|----------------------------|----------------|-----------------------------|
|
|
35
39
|
| PLAN | persist working-state deltas | - | - | - | new conclusions, inquiries, priorities |
|
|
36
40
|
| FIND | list matching targets | add log tags? | target or glob | result range? | pattern? |
|
|
@@ -38,8 +42,8 @@ Body content is character-perfect, including whitespace.
|
|
|
38
42
|
| EDIT | create or edit scoped content | add log tags? | file or entry | text region? | literal text |
|
|
39
43
|
| COPY | copy from a target | add log tags? | source target | source region? | destination <region>? |
|
|
40
44
|
| MOVE | move from a target | add log tags? | source target | source region? | destination <region>? |
|
|
41
|
-
| FOLD | hide matching log bodies | filter/change log tags? | log item(s) |
|
|
42
|
-
| OPEN | reveal matching log bodies | filter/change log tags? | log item(s) |
|
|
45
|
+
| FOLD | hide matching log bodies | filter/change log tags? | log item(s) | log body lines? | pattern? |
|
|
46
|
+
| OPEN | reveal matching log bodies | filter/change log tags? | log item(s) | log body lines? | pattern? |
|
|
43
47
|
| EXEC | execute a registered tool | executor? | tool target? | timeout, poll? | tool input? |
|
|
44
48
|
| BARE | retrieve one model response | add log tags? | - | - | prompt |
|
|
45
49
|
| WORK | spawn a child worker | branch? | `worker://name` | - | prompt |
|
|
@@ -47,8 +51,9 @@ Body content is character-perfect, including whitespace.
|
|
|
47
51
|
| KILL | delete or terminate | code? | target, including log item | - | - |
|
|
48
52
|
| SEND | close turn with submit code | code? | recipient? | timeout, poll? | message |
|
|
49
53
|
|
|
54
|
+
YOU SHOULD use purpose-built Plurnk OPs when possible; use EXEC for shell commands only when necessary.
|
|
55
|
+
|
|
50
56
|
* Files you create are tracked automatically.
|
|
51
|
-
* OP results become visible only in a later turn.
|
|
52
57
|
|
|
53
58
|
### Pattern Filtering
|
|
54
59
|
|
|
@@ -58,49 +63,39 @@ Matcher bodies select resources by content.
|
|
|
58
63
|
|--------|----------|------------------------------------|------------------|
|
|
59
64
|
| `/` | regex | `/pattern/flags` | ECMAScript |
|
|
60
65
|
| `//` | xpath | `//selector` | XPath 1.0 |
|
|
61
|
-
| `$` | jsonpath | `$.field`, `$.items[*].name`
|
|
66
|
+
| `$` | jsonpath | `$.field`, `$.items[*].name` | RFC 9535 |
|
|
62
67
|
| `~` | semantic | `~phrase` | embedding cosine |
|
|
63
68
|
| `@` | graph | `@<symbol`, `@>symbol`, `@symbol` | symbol index |
|
|
64
|
-
| none | glob | `pattern` |
|
|
69
|
+
| none | glob | `pattern` | glob / literal |
|
|
65
70
|
|
|
66
71
|
* The leading symbol commits its dialect.
|
|
67
|
-
* In path
|
|
68
|
-
* JSONPath filters bracket directly: `$[*][?(@.
|
|
72
|
+
* In a path target, `*` maps one level and `**` crosses directories.
|
|
73
|
+
* JSONPath filters bracket directly: `$[*][?(@.tokensActive>500)]`.
|
|
69
74
|
* Mapping is universal: JSONPath can query XML and XPath can query JSON.
|
|
70
75
|
* Patterned FIND returns resources for broad targets and locations for exact targets.
|
|
71
76
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
## FIND0 (
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
(
|
|
83
|
-
|
|
84
|
-
## FIND0 (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
## FIND0 (src/**)
|
|
91
|
-
@<createCoder
|
|
92
|
-
|
|
93
|
-
## FIND0 (worker:///**)
|
|
94
|
-
*revolution*
|
|
95
|
-
|
|
96
|
-
## SEND0 [102]
|
|
97
|
-
Continue next turn when the matcher results are visible, then compare them and inspect the relevant targets.
|
|
98
|
-
```
|
|
77
|
+
# PLAN0
|
|
78
|
+
* The six queries cover every matcher dialect across exact and broad targets.
|
|
79
|
+
* Still unresolved: which returned matches are relevant enough to inspect.
|
|
80
|
+
* Compare the result shapes, then read the relevant targets before concluding.
|
|
81
|
+
## FIND0 (src/**/*.ts)
|
|
82
|
+
/createCoder/i
|
|
83
|
+
## FIND0 (README.md)
|
|
84
|
+
//heading[text()="Installation"]
|
|
85
|
+
## FIND0 (log:///1/2/4/FIND)
|
|
86
|
+
$[*][0].path
|
|
87
|
+
## FIND0 (worker:///**) <0.7,1,50>
|
|
88
|
+
~french revolutionary history
|
|
89
|
+
## FIND0 (src/**)
|
|
90
|
+
@<createCoder
|
|
91
|
+
## FIND0 (worker:///**)
|
|
92
|
+
*revolution*
|
|
93
|
+
## SEND0 [102]
|
|
94
|
+
Next: Compare and inspect the retrieved targets.
|
|
99
95
|
|
|
100
96
|
### `(path)`
|
|
101
97
|
|
|
102
|
-
*
|
|
103
|
-
* Each OP's `(path)` slot takes one bare project-relative path or resource URI.
|
|
98
|
+
* Each OP's `(path)` slot takes exactly one bare project-relative path or resource URI.
|
|
104
99
|
* Log item paths are nested: `log:///1/2/3` is loop/turn/item.
|
|
105
100
|
* In FIND results, each inner array lists one resource's channels, default first. Append `#channel` to override the default.
|
|
106
101
|
* A file or entry extension declares its mimetype.
|
|
@@ -127,34 +122,28 @@ Text scopes use 1-based lines and Unicode code-point columns consistently across
|
|
|
127
122
|
| `<SL,EL>` | lines SL through EL, inclusive |
|
|
128
123
|
| `<SL,SC,EL,EC>` | start included, end excluded |
|
|
129
124
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
*
|
|
133
|
-
* Still need to inspect the notes selection and verify the copy and move destinations.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
## EDIT0 (worker:///
|
|
137
|
-
|
|
138
|
-
##
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
## SEND0 [102]
|
|
154
|
-
Continue next turn by inspecting each result and reading the changed destinations.
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
* Unscoped FIND returns items 1-16; unscoped READ returns lines 1–16. Use `<1,-1>` for all.
|
|
125
|
+
# PLAN0
|
|
126
|
+
* The prior READ identified obsolete line 1847 with `@aB3dE`; the draft heading spans lines 4-6; the audit marker belongs above line 2; the preface belongs before line 1.
|
|
127
|
+
* To insert lines, replace the anchor line with the new content followed by the original line re-emitted verbatim.
|
|
128
|
+
* Still need to inspect the notes selection and verify the copy and move destinations.
|
|
129
|
+
## EDIT0 (worker:///obsolete.md) <@aB3dE>
|
|
130
|
+
## READ0 (worker:///notes.md) <2,1,2,5>
|
|
131
|
+
## EDIT0 (worker:///heading.md) <4,6>
|
|
132
|
+
Replacement heading
|
|
133
|
+
## EDIT0 (worker:///draft.md) <2>
|
|
134
|
+
// AUDIT-OK
|
|
135
|
+
original line 2 content
|
|
136
|
+
## EDIT0 (worker:///preface.md) <0>
|
|
137
|
+
# Preface
|
|
138
|
+
Current status
|
|
139
|
+
## COPY0 (worker:///src.md) <2,3>
|
|
140
|
+
worker:///slice.md
|
|
141
|
+
## MOVE0 (worker:///draft-line.md) <1>
|
|
142
|
+
worker:///archive.md <-1>
|
|
143
|
+
## SEND0 [102]
|
|
144
|
+
Next: Inspect each result and read the changed destinations.
|
|
145
|
+
|
|
146
|
+
* Unscoped FIND returns items 1-16; unscoped READ returns lines 1–16. `<1,-1>` returns all.
|
|
158
147
|
* Rendered exact READ lines begin with a per-line `@hash` anchor and `L:` line number; neither is content.
|
|
159
148
|
|
|
160
149
|
YOU SHOULD prefer `@hash` anchors for EDIT line coordinates; they reject stale targets.
|
|
@@ -163,21 +152,25 @@ YOU SHOULD prefer `@hash` anchors for EDIT line coordinates; they reject stale t
|
|
|
163
152
|
|
|
164
153
|
* The log is your Curated Context. Optimize and folksonomize it for relevance.
|
|
165
154
|
* `[+tag]` adds, `[-tag]` removes; FOLD/OPEN select by unsigned `[tag]`.
|
|
166
|
-
* `## FOLD0 [+
|
|
155
|
+
* `## FOLD0 [+trimmed] (log:///**/READ) <17,-1>` tags every READ and folds each body after line 16.
|
|
156
|
+
* `## OPEN0 (log:///1/2/3/READ) <@aB3dE>` restores one anchored line.
|
|
167
157
|
* Log item addresses contain their loop, turn, and item, followed by their OP when present: `log:///{loop}/{turn}/{item}/{OP}`.
|
|
168
158
|
|
|
169
|
-
YOU
|
|
159
|
+
YOU MUST keep the next packet's tokensActiveTotal within tokensActiveMax.
|
|
160
|
+
YOU SHOULD FOLD, KILL, or trim superseded, stale, or irrelevant log content.
|
|
170
161
|
|
|
171
162
|
## Delegation
|
|
172
163
|
|
|
173
|
-
|
|
164
|
+
| OP | inherits | typical use | body |
|
|
165
|
+
|-------|------------|---------------------------------|------|
|
|
166
|
+
| WORK | fresh log | Divide and conquer | self-contained task with necessary context |
|
|
167
|
+
| FORK | forked log | Do two things at once | distinct objective; prior context is inherited |
|
|
168
|
+
| BARE | no log | Context-free one-shot inference | complete standalone prompt |
|
|
169
|
+
|
|
170
|
+
* Before delegating a worker with a branch signal, ensure the repository is clean.
|
|
174
171
|
* Send a worker another message: `## SEND0 (worker://recheck)` with body `Also verify the alternative against the existing tests.`.
|
|
175
|
-
* Fork with inherited history: `## FORK0 (worker://recheck)` with body `Re-derive the capital from a primary source`.
|
|
176
|
-
* Retrieve a one-shot child-model response using only the body prompt: `## BARE0` with body `What is the capital of Germany?`.
|
|
177
172
|
* Terminate a worker: `## KILL0 (worker://recheck)`.
|
|
178
173
|
|
|
179
|
-
Before using a branch signal, ensure the repository is clean.
|
|
180
|
-
|
|
181
174
|
```mermaid
|
|
182
175
|
sequenceDiagram
|
|
183
176
|
participant User
|
|
@@ -190,41 +183,29 @@ sequenceDiagram
|
|
|
190
183
|
You->>User: SEND0 [200] - The capital of France is Paris.
|
|
191
184
|
```
|
|
192
185
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
*
|
|
196
|
-
|
|
186
|
+
# PLAN0
|
|
187
|
+
* The capital claim needs primary-source evidence before answering.
|
|
188
|
+
* `capital-checker` owns that lookup; wait for its result.
|
|
189
|
+
## WORK0 (worker://capital-checker)
|
|
190
|
+
Find the capital of France from a primary source
|
|
191
|
+
## SEND0 [202]
|
|
192
|
+
Awaiting capital-checker.
|
|
197
193
|
|
|
198
|
-
|
|
199
|
-
Find the capital of France from a primary source
|
|
194
|
+
The worker's result enters the log and wakes you:
|
|
200
195
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
# PLAN0
|
|
207
|
-
* `capital-checker` verified from a primary source that France's capital is Paris.
|
|
208
|
-
* The primary-source inquiry is resolved; deliver the answer.
|
|
209
|
-
|
|
210
|
-
## SEND0 [200]
|
|
211
|
-
The capital of France is Paris.
|
|
212
|
-
```
|
|
196
|
+
# PLAN0
|
|
197
|
+
* `capital-checker` verified from a primary source that France's capital is Paris.
|
|
198
|
+
* The primary-source inquiry is resolved; deliver the answer.
|
|
199
|
+
## SEND0 [200]
|
|
200
|
+
The capital of France is Paris.
|
|
213
201
|
|
|
214
202
|
## Imperatives
|
|
215
203
|
|
|
216
204
|
### Submit codes
|
|
217
205
|
|
|
218
|
-
| submit code | meaning | message
|
|
206
|
+
| submit code | meaning | body message (user-facing) |
|
|
219
207
|
|-------------|-------------------------------|---------------------------------------------|
|
|
220
208
|
| 102 | Retrieve results in next turn | Describe expected or intended next steps |
|
|
221
209
|
| 202 | Wait for workers or streams | Describe expected or intended next steps |
|
|
222
|
-
| 200 | Successful conclusion |
|
|
210
|
+
| 200 | Successful conclusion | Response to Active User Prompt (markdown with mermaid, tables, lists, and/or prose) |
|
|
223
211
|
| 499 | Abort and fail prompt | Describe error or issue |
|
|
224
|
-
|
|
225
|
-
* Conclude with 200 only after all retrieval results are observed and all workers and streams have concluded or been KILLed.
|
|
226
|
-
|
|
227
|
-
### User messages
|
|
228
|
-
|
|
229
|
-
Put every user-facing message in a SEND with a submit code.
|
|
230
|
-
User-facing submit messages may contain markdown (GFM), mermaid diagrams, tables, lists, and/or prose.
|