dunstan 0.0.0-stage → 0.1.7
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/LICENSE +661 -0
- package/NOTICE +7 -0
- package/README.md +213 -2
- package/THIRD_PARTY_NOTICES +216 -0
- package/dist/dunstan.mjs +43289 -0
- package/package.json +67 -4
- package/spec/LICENSE +201 -0
package/README.md
CHANGED
|
@@ -1,3 +1,214 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Dunstan
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Dunstan holds a coding agent's completion report to the record.
|
|
4
|
+
|
|
5
|
+
An agent finishes and writes a handback: files changed, tests run, references closed, head commit,
|
|
6
|
+
merged at. Dunstan reads a declared block in that handback and checks each claim against the
|
|
7
|
+
repository's own record (pull request state, changed files, commits, CI runs) with deterministic
|
|
8
|
+
checks. It writes a record anyone can re-run on their own machine and get the same verdict.
|
|
9
|
+
|
|
10
|
+
- No model decides pass or fail.
|
|
11
|
+
- Fail closed: a claim the record cannot answer is `unverifiable`, never a pass by absence.
|
|
12
|
+
- Evidence, not a gate: Dunstan returns a record; your branch protection decides what blocks.
|
|
13
|
+
|
|
14
|
+
The claim format, the block an agent declares and the record Dunstan writes, is an open
|
|
15
|
+
specification: [`spec/claim-format.md`](spec/claim-format.md), with JSON Schemas in `spec/schema/`
|
|
16
|
+
and examples in `spec/examples/`.
|
|
17
|
+
|
|
18
|
+
## Use with Claude
|
|
19
|
+
|
|
20
|
+
Dunstan ships as a Claude Code plugin: two MCP tools and a skill that has Claude declare, check and
|
|
21
|
+
report a pull request's handback before it says done ([`plugins/dunstan/`](plugins/dunstan/)).
|
|
22
|
+
|
|
23
|
+
**Install.** In Claude Code:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
/plugin marketplace add BargLabs/dunstan
|
|
27
|
+
/plugin install dunstan@barglabs
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The plugin runs the MCP server with `npx -y dunstan@0.1.7 mcp`, the `dunstan` npm package at that
|
|
31
|
+
exact version: one self-contained file, no dependencies.
|
|
32
|
+
|
|
33
|
+
**The token.** When you enable the plugin, Claude Code asks for an optional GitHub token and keeps it
|
|
34
|
+
in your system's secure credential store. Use a fine-grained personal access token with read-only
|
|
35
|
+
permissions, limited to the repositories you check, with an expiry; the permissions are in
|
|
36
|
+
[`docs/mcp.md`](docs/mcp.md#a-read-only-github-token). Leave it empty to read public repositories
|
|
37
|
+
anonymously. GitHub's GraphQL API refuses anonymous calls, so without a token a `closes` reference is
|
|
38
|
+
`unverifiable`, never `fail`. The plugin never reads a token from your environment.
|
|
39
|
+
|
|
40
|
+
**What it reads, and from where.** The server runs on your machine and calls GitHub's API directly
|
|
41
|
+
from it: the pull request, its changed files, commits, check runs, workflow runs and test artifacts,
|
|
42
|
+
deployments, and the issues the block references. Every request is a read. Nothing is written to
|
|
43
|
+
GitHub or to the repository, and nothing is sent to Barg Labs.
|
|
44
|
+
|
|
45
|
+
**Try it.** Three prompts on a public Barg Labs pull request:
|
|
46
|
+
|
|
47
|
+
1. `Use Dunstan to check this handback for BargLabs/cejel#408: head commit
|
|
48
|
+
35d6201d00cf926f9af10df61bfec05b6624ee12, files changed
|
|
49
|
+
.github/workflows/verify-published-windows-binary.yml and
|
|
50
|
+
scripts/validate-distribution-metadata.mjs, merged at 2026-10-04T13:30:48Z.` Every claim holds,
|
|
51
|
+
so the verdict is `pass`.
|
|
52
|
+
2. `Before I report BargLabs/cejel#408 as done, use Dunstan to list the claims in this report that my
|
|
53
|
+
handback block does not declare:` followed by the report and its `dunstan-handback` block. Dunstan
|
|
54
|
+
lists each prose claim the block leaves out, such as a test count or a `closes`, with the field
|
|
55
|
+
that would declare it. It is never a verdict.
|
|
56
|
+
3. `Use Dunstan to check whether BargLabs/cejel#408 closes #407, with head commit
|
|
57
|
+
35d6201d00cf926f9af10df61bfec05b6624ee12 and the same two files.` Without a token the `closes`
|
|
58
|
+
row is `unverifiable` (`source_unreadable:closing_references`): the record could not settle it,
|
|
59
|
+
which is not the same as false. With a token it is `pass`.
|
|
60
|
+
|
|
61
|
+
**Support.** [GitHub issues](https://github.com/BargLabs/dunstan/issues) or team@barglabs.ai.
|
|
62
|
+
[Privacy](https://barglabs.ai/privacy) and [terms](https://barglabs.ai/terms).
|
|
63
|
+
|
|
64
|
+
## The checker
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
pnpm install && pnpm build # writes dist/dunstan.mjs and prints its SHA-256
|
|
68
|
+
|
|
69
|
+
# Check a pull request against the report it names (exactly one report source).
|
|
70
|
+
GITHUB_TOKEN=... dist/dunstan.mjs check --repo <owner/name> --pr <n> --report-pr-body --out record.json
|
|
71
|
+
# or --report-file <path|->, or --report-comment-author <login> (that author's latest comment)
|
|
72
|
+
|
|
73
|
+
dist/dunstan.mjs verify record.json # offline: recompute claims, verdict and digests
|
|
74
|
+
dist/dunstan.mjs rerun record.json # online: re-read the sources, report evidence_changed
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Exit codes: 0 pass, 1 fail, 2 unverifiable, 3 usage or internal error (`verify`: 0 verified, 1 not).
|
|
78
|
+
`--sign-key <path> --signer <principal>` writes the record as its JCS bytes with a detached SSH
|
|
79
|
+
signature; `verify --sig <file> --allowed-signers <file>` checks it.
|
|
80
|
+
|
|
81
|
+
`dist/dunstan.mjs mcp` serves the same checker as an MCP tool, `dunstan_check_handback`, which an
|
|
82
|
+
agent calls with its block before it says done, beside `dunstan_suggest_declarations` (below):
|
|
83
|
+
[`docs/mcp.md`](docs/mcp.md).
|
|
84
|
+
|
|
85
|
+
`checker.digest` in a record is the SHA-256 of `dist/dunstan.mjs`, the single-file bundle that ran:
|
|
86
|
+
the checker code, its dependencies and both schemas from `spec/schema/`, inlined at build time.
|
|
87
|
+
|
|
88
|
+
## Declare before done
|
|
89
|
+
|
|
90
|
+
Checking a declared claim is exact. Finding the claims in prose is where readers fail: a hosted
|
|
91
|
+
model judge clears far fewer false reports once it is handed the right paragraph, and Dunstan's own
|
|
92
|
+
extractor missed the planted false claims it was tested on. Both fail at the reading, not at the
|
|
93
|
+
checking. The agent that wrote the report is its best reader, and it is still there before
|
|
94
|
+
handback. So Dunstan makes the block nearly free to write, then asks the author about the
|
|
95
|
+
prose the block does not cover:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
dist/dunstan.mjs template # the block for HEAD, filled from local git
|
|
99
|
+
dist/dunstan.mjs suggest --report-file report.md # prose claims the block does not declare
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`template` fills `headCommit` and `filesChanged` (HEAD against its merge base with the remote's
|
|
103
|
+
default branch, or `--base`), and `tests` only from a JUnit file and the CI record named with it. It
|
|
104
|
+
never fills `references` or `mergedAt`, and when git cannot answer it prints no block. `suggest`
|
|
105
|
+
runs the advisory extractor over the prose outside the fence and lists each claim it proposes that
|
|
106
|
+
the block does not declare, to declare or reword. It is never a verdict, writes nothing to a record
|
|
107
|
+
and always exits 0; the MCP server offers it as `dunstan_suggest_declarations`. The loop, an
|
|
108
|
+
instruction block to copy into `AGENTS.md` or `CLAUDE.md`, and example output:
|
|
109
|
+
[`docs/agents.md`](docs/agents.md).
|
|
110
|
+
|
|
111
|
+
## The GitHub Action
|
|
112
|
+
|
|
113
|
+
One step in a workflow, one required check in branch protection:
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
permissions: { contents: read, pull-requests: read, issues: read, deployments: read, checks: write, actions: read }
|
|
117
|
+
steps:
|
|
118
|
+
- uses: BargLabs/dunstan@<full commit SHA>
|
|
119
|
+
with:
|
|
120
|
+
report-source: pr-body # or comment:<author-login>, or file:<path>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
It writes a `dunstan` check run on the head commit whose summary is the claims table, the record as
|
|
124
|
+
the artifact `dunstan-record`, and the same table in the job summary. Only `pass` concludes
|
|
125
|
+
`success`; `fail`, `unverifiable` (unless you set `unverifiable-conclusion: neutral`) and any error
|
|
126
|
+
conclude `failure`. It never comments, labels, reviews or merges. Setup, the branch-protection setting
|
|
127
|
+
and what each conclusion means: [`docs/action.md`](docs/action.md).
|
|
128
|
+
|
|
129
|
+
## The hosted tier
|
|
130
|
+
|
|
131
|
+
Optional, beside the local tools, which never use it. `POST /v0.1/check` with a report or block and
|
|
132
|
+
a pull request; Barg Labs' read-only GitHub App reads that pull request's metadata (never file
|
|
133
|
+
contents); the same checker returns a record signed with SSHSIG, which `dunstan verify` re-runs
|
|
134
|
+
offline for the same verdict. Records are kept 90 days by default, report text never. What is read
|
|
135
|
+
and kept, the Contents: read caveat and the API: [`docs/hosted.md`](docs/hosted.md). The Worker is in
|
|
136
|
+
`hosted/`; provisioning and deploys are the operator's
|
|
137
|
+
([`docs/runbooks/hosted-provisioning.md`](docs/runbooks/hosted-provisioning.md)).
|
|
138
|
+
|
|
139
|
+
## Retrieval for reader claims (DRAFT)
|
|
140
|
+
|
|
141
|
+
For a prose report, a reader turns the text into typed claims, and Dunstan has to find which
|
|
142
|
+
record items each claim is about. `src/retrieval/` does that without a model: exact identifiers
|
|
143
|
+
first, then BM25, with a stated floor. Retrieval only proposes candidates. The check decides from
|
|
144
|
+
the candidates the record keeps, so `dunstan verify` reproduces the verdict without retrieving
|
|
145
|
+
again. `dunstan-eval retrieval` measures recall at k = 5. The record format is DRAFT 0.2.0 and is
|
|
146
|
+
not yet ruled. Details: [`docs/retrieval.md`](docs/retrieval.md).
|
|
147
|
+
|
|
148
|
+
## Advisories from prose (DRAFT)
|
|
149
|
+
|
|
150
|
+
`dunstan check --advisory`, or `advisory: true` in the Action, also reads the report's prose. The
|
|
151
|
+
extractor in `src/advisory/` binds each path, `#N`, SHA, count or timestamp to a clause with an
|
|
152
|
+
asserting verb, using a written grammar and no model, and drops every token it cannot bind. It
|
|
153
|
+
compares what remains with the evidence using the gate's own checks. Each result is recorded as an
|
|
154
|
+
advisory: `agrees`, `differs:<reason>` or `unanswered:<reason>`, or `agrees_by_name` for a file
|
|
155
|
+
named only by its name or a partial path. Advisories never change the verdict
|
|
156
|
+
and are never `fail`. The record carries the measured figures beside them, each only for the exact
|
|
157
|
+
extractor and comparison it was measured on, or "unmeasured" otherwise ("Measured figures",
|
|
158
|
+
below). Details: [`docs/advisory.md`](docs/advisory.md).
|
|
159
|
+
|
|
160
|
+
A `differs` note is shown as **"possible disagreement, unverified"**, never as an accusation. A
|
|
161
|
+
decision rule preregistered before the measurement said a `differs` note would be labelled this way
|
|
162
|
+
if its measured accuracy fell below 0.50. The rule fired. The CLI, the
|
|
163
|
+
Action's summaries and the MCP tool's text use the new wording, followed by what the record shows,
|
|
164
|
+
and print one fixed line beside the advisories. With the published figures it reads: *"Advisories
|
|
165
|
+
never affect the verdict. Extraction precision 0.80 (24/30, 95% CI 0.63–0.90). A possible
|
|
166
|
+
disagreement is unverified: on 170 of our own agent PRs, 0 of 20 marked a false claim, and of the 44
|
|
167
|
+
advisories the record could check there, none was a false claim (0 of 44)."* For a later extractor or comparison, not yet
|
|
168
|
+
measured, it states no figure. The record still says `differs:<reason>`
|
|
169
|
+
([`docs/advisory.md`](docs/advisory.md), "How a `differs` note is shown").
|
|
170
|
+
|
|
171
|
+
### Measured figures
|
|
172
|
+
|
|
173
|
+
Published 2026-10-05: value, n and method only, never the reports, their clauses or the
|
|
174
|
+
adjudication labels.
|
|
175
|
+
|
|
176
|
+
| Figure | Value | n | Wilson 95% interval | Bound to |
|
|
177
|
+
| --- | --- | --- | --- | --- |
|
|
178
|
+
| Extraction precision | 0.80 (24 real claims) | 30 advisories | [0.627, 0.905] | extractor 0.1.1, digest `ab77ce47…c360` |
|
|
179
|
+
| `differs` notes that marked a genuinely false claim | 0 | 20 `differs` advisories | [0, 0.161] | extractor 0.1.1 and comparison 0.2.0 |
|
|
180
|
+
| Base rate: genuine false completion claims | 0 | 44 checkable advisories (of 149) | [0, 0.080] | extractor 0.1.1 and comparison 0.2.0 |
|
|
181
|
+
|
|
182
|
+
Method: extractor 0.1.1 proposed 149 advisories on 170 of Barg Labs' own merged agent pull requests.
|
|
183
|
+
The operator adjudicated a seeded held-out sample of 30 of them for extraction precision, every
|
|
184
|
+
`differs` advisory (a census of 20) for whether it marked a genuinely false claim. For the base rate,
|
|
185
|
+
the record could check 44 of the 149 (24 agreed with it, 20 differed) and none was a false claim; the
|
|
186
|
+
other 105 could not be compared with the record and were not judged. Each figure is bound to the extractor digest, and the `differs`
|
|
187
|
+
figure and base rate to the comparison version too. Any later extractor or comparison is
|
|
188
|
+
"unmeasured" until it is measured anew; it never inherits a figure. The extractor that runs now is
|
|
189
|
+
0.1.3. Since 0.1.2 it stops reading statements about another pull request, an undone change, a
|
|
190
|
+
baseline, a negated list or a deliberate test failure as claims, and since 0.1.3 it reads a file
|
|
191
|
+
list or a merge time after a colon ([`docs/advisory.md`](docs/advisory.md), "Attribution" and
|
|
192
|
+
"Lists, merge times and own references"). Extractor 0.1.4's rules did not generalise to held-out
|
|
193
|
+
pull requests and were reverted ("Labels, used names and descriptions"). No figure is published
|
|
194
|
+
for 0.1.3, so a record it writes says "unmeasured". The comparison that runs is 0.4.0: a file claim
|
|
195
|
+
not among the changed files is a possible disagreement only when its path is a file at the head,
|
|
196
|
+
and is unanswered when nothing or a directory is there ("Paths that are not at the head"), and a
|
|
197
|
+
`closes` claim is settled by who closed the target, as the gate's is ("Closes read by who closed
|
|
198
|
+
the target"). It is unmeasured too: the `differs` figure stays bound to comparison 0.2.0.
|
|
199
|
+
|
|
200
|
+
The base rate is always shown next to the `differs` figure: among the 44 advisories the record
|
|
201
|
+
could check, none was a false claim (0 of 44), so 0 of 20 means there was little to find, not that
|
|
202
|
+
the check failed to find it. The 105 advisories the record could not check were not judged, so a
|
|
203
|
+
false claim among them would not have been seen. Wording that
|
|
204
|
+
calls a `differs` note a mismatch is earned only past a preregistered bar measured on a corpus that
|
|
205
|
+
contains false claims (decided 2026-10-05). That has not yet happened. Details:
|
|
206
|
+
[`docs/advisory.md`](docs/advisory.md), "Measured figures".
|
|
207
|
+
|
|
208
|
+
Acceptance criteria and their preregistered fixtures: `docs/acceptance/preregistration-0.1.md`,
|
|
209
|
+
`fixtures/`.
|
|
210
|
+
|
|
211
|
+
Status: under construction. The claim format specification is a draft under review.
|
|
212
|
+
|
|
213
|
+
Licence: the checker and tools under AGPL-3.0-only (`LICENSE`); the claim format specification in
|
|
214
|
+
`spec/` under Apache-2.0 (`spec/LICENSE`). Contributions require the CLA (`CLA.md`).
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
Third-party notices for the distributed bundles of Dunstan
|
|
2
|
+
|
|
3
|
+
dist/dunstan.mjs (the npm package dunstan) and action/dist/index.mjs (the GitHub Action) bundle
|
|
4
|
+
the packages below. Each package's licence text follows, as the package ships it. Dunstan's own
|
|
5
|
+
licences are in LICENSE and NOTICE. Generated by scripts/build.mjs; do not edit.
|
|
6
|
+
|
|
7
|
+
================================================================================
|
|
8
|
+
@modelcontextprotocol/sdk@1.32.0 (MIT), in dist/dunstan.mjs
|
|
9
|
+
================================================================================
|
|
10
|
+
|
|
11
|
+
MIT License
|
|
12
|
+
|
|
13
|
+
Copyright (c) 2024 Anthropic, PBC
|
|
14
|
+
|
|
15
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
16
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
17
|
+
in the Software without restriction, including without limitation the rights
|
|
18
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
19
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
20
|
+
furnished to do so, subject to the following conditions:
|
|
21
|
+
|
|
22
|
+
The above copyright notice and this permission notice shall be included in all
|
|
23
|
+
copies or substantial portions of the Software.
|
|
24
|
+
|
|
25
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
26
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
27
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
28
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
29
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
30
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
31
|
+
SOFTWARE.
|
|
32
|
+
|
|
33
|
+
================================================================================
|
|
34
|
+
ajv-formats@3.0.1 (MIT), in action/dist/index.mjs and dist/dunstan.mjs
|
|
35
|
+
================================================================================
|
|
36
|
+
|
|
37
|
+
MIT License
|
|
38
|
+
|
|
39
|
+
Copyright (c) 2020 Evgeny Poberezkin
|
|
40
|
+
|
|
41
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
42
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
43
|
+
in the Software without restriction, including without limitation the rights
|
|
44
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
45
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
46
|
+
furnished to do so, subject to the following conditions:
|
|
47
|
+
|
|
48
|
+
The above copyright notice and this permission notice shall be included in all
|
|
49
|
+
copies or substantial portions of the Software.
|
|
50
|
+
|
|
51
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
52
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
53
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
54
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
55
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
56
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
57
|
+
SOFTWARE.
|
|
58
|
+
|
|
59
|
+
================================================================================
|
|
60
|
+
ajv@8.20.0 (MIT), in action/dist/index.mjs and dist/dunstan.mjs
|
|
61
|
+
================================================================================
|
|
62
|
+
|
|
63
|
+
The MIT License (MIT)
|
|
64
|
+
|
|
65
|
+
Copyright (c) 2015-2021 Evgeny Poberezkin
|
|
66
|
+
|
|
67
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
68
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
69
|
+
in the Software without restriction, including without limitation the rights
|
|
70
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
71
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
72
|
+
furnished to do so, subject to the following conditions:
|
|
73
|
+
|
|
74
|
+
The above copyright notice and this permission notice shall be included in all
|
|
75
|
+
copies or substantial portions of the Software.
|
|
76
|
+
|
|
77
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
78
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
79
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
80
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
81
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
82
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
83
|
+
SOFTWARE.
|
|
84
|
+
|
|
85
|
+
================================================================================
|
|
86
|
+
fast-deep-equal@3.1.3 (MIT), in action/dist/index.mjs and dist/dunstan.mjs
|
|
87
|
+
================================================================================
|
|
88
|
+
|
|
89
|
+
MIT License
|
|
90
|
+
|
|
91
|
+
Copyright (c) 2017 Evgeny Poberezkin
|
|
92
|
+
|
|
93
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
94
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
95
|
+
in the Software without restriction, including without limitation the rights
|
|
96
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
97
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
98
|
+
furnished to do so, subject to the following conditions:
|
|
99
|
+
|
|
100
|
+
The above copyright notice and this permission notice shall be included in all
|
|
101
|
+
copies or substantial portions of the Software.
|
|
102
|
+
|
|
103
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
104
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
105
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
106
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
107
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
108
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
109
|
+
SOFTWARE.
|
|
110
|
+
|
|
111
|
+
================================================================================
|
|
112
|
+
fast-uri@3.1.8 (BSD-3-Clause), in action/dist/index.mjs and dist/dunstan.mjs
|
|
113
|
+
================================================================================
|
|
114
|
+
|
|
115
|
+
Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae
|
|
116
|
+
Copyright (c) 2021-present The Fastify team <https://github.com/fastify/fastify#team>
|
|
117
|
+
All rights reserved.
|
|
118
|
+
|
|
119
|
+
Redistribution and use in source and binary forms, with or without
|
|
120
|
+
modification, are permitted provided that the following conditions are met:
|
|
121
|
+
* Redistributions of source code must retain the above copyright
|
|
122
|
+
notice, this list of conditions and the following disclaimer.
|
|
123
|
+
* Redistributions in binary form must reproduce the above copyright
|
|
124
|
+
notice, this list of conditions and the following disclaimer in the
|
|
125
|
+
documentation and/or other materials provided with the distribution.
|
|
126
|
+
* The names of any contributors may not be used to endorse or promote
|
|
127
|
+
products derived from this software without specific prior written
|
|
128
|
+
permission.
|
|
129
|
+
|
|
130
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
131
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
132
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
133
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
|
|
134
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
135
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
136
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
137
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
138
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
139
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
140
|
+
|
|
141
|
+
* * *
|
|
142
|
+
|
|
143
|
+
The complete list of contributors can be found at:
|
|
144
|
+
- https://github.com/garycourt/uri-js/graphs/contributors
|
|
145
|
+
|
|
146
|
+
================================================================================
|
|
147
|
+
json-schema-traverse@1.0.0 (MIT), in action/dist/index.mjs and dist/dunstan.mjs
|
|
148
|
+
================================================================================
|
|
149
|
+
|
|
150
|
+
MIT License
|
|
151
|
+
|
|
152
|
+
Copyright (c) 2017 Evgeny Poberezkin
|
|
153
|
+
|
|
154
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
155
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
156
|
+
in the Software without restriction, including without limitation the rights
|
|
157
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
158
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
159
|
+
furnished to do so, subject to the following conditions:
|
|
160
|
+
|
|
161
|
+
The above copyright notice and this permission notice shall be included in all
|
|
162
|
+
copies or substantial portions of the Software.
|
|
163
|
+
|
|
164
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
165
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
166
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
167
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
168
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
169
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
170
|
+
SOFTWARE.
|
|
171
|
+
|
|
172
|
+
================================================================================
|
|
173
|
+
zod-to-json-schema@3.25.2 (ISC), in dist/dunstan.mjs
|
|
174
|
+
================================================================================
|
|
175
|
+
|
|
176
|
+
ISC License
|
|
177
|
+
|
|
178
|
+
Copyright (c) 2020, Stefan Terdell
|
|
179
|
+
|
|
180
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
181
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
182
|
+
copyright notice and this permission notice appear in all copies.
|
|
183
|
+
|
|
184
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
185
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
186
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
187
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
188
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
189
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
190
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
191
|
+
|
|
192
|
+
================================================================================
|
|
193
|
+
zod@4.6.5 (MIT), in dist/dunstan.mjs
|
|
194
|
+
================================================================================
|
|
195
|
+
|
|
196
|
+
MIT License
|
|
197
|
+
|
|
198
|
+
Copyright (c) 2025 Colin McDonnell
|
|
199
|
+
|
|
200
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
201
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
202
|
+
in the Software without restriction, including without limitation the rights
|
|
203
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
204
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
205
|
+
furnished to do so, subject to the following conditions:
|
|
206
|
+
|
|
207
|
+
The above copyright notice and this permission notice shall be included in all
|
|
208
|
+
copies or substantial portions of the Software.
|
|
209
|
+
|
|
210
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
211
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
212
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
213
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
214
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
215
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
216
|
+
SOFTWARE.
|