@erdemtuna/doc-review 0.11.1 → 0.13.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 (52) hide show
  1. package/README.md +23 -25
  2. package/lib/SKILL.md +65 -202
  3. package/lib/agent-handoff.js +24 -0
  4. package/lib/agent-output.js +287 -0
  5. package/lib/anchor-text.js +31 -19
  6. package/lib/chrome-api.js +23 -4
  7. package/lib/chrome.html +3 -25
  8. package/lib/cli.js +282 -104
  9. package/lib/comment-target.js +4 -0
  10. package/lib/contracts/agent.js +122 -0
  11. package/lib/contracts/feedback.js +369 -1
  12. package/lib/contracts/frame.js +87 -0
  13. package/lib/contracts/history.js +189 -1
  14. package/lib/contracts/index.js +7 -2
  15. package/lib/contracts/page-boundary.js +187 -0
  16. package/lib/contracts/validation.js +200 -0
  17. package/lib/conversation-anchor-controller.js +84 -0
  18. package/lib/conversation-capture.js +81 -0
  19. package/lib/conversation-controller.js +798 -0
  20. package/lib/conversation-save.js +175 -0
  21. package/lib/conversation-server.js +184 -0
  22. package/lib/conversation-shell.js +1013 -0
  23. package/lib/conversation-store.js +809 -0
  24. package/lib/frame-controller.js +188 -23
  25. package/lib/frame-host.js +10 -0
  26. package/lib/frame-policy.js +1 -0
  27. package/lib/history-policy.js +4 -15
  28. package/lib/history-server.js +42 -326
  29. package/lib/html-transform.js +19 -4
  30. package/lib/icons.js +323 -0
  31. package/lib/new-message-target.js +27 -0
  32. package/lib/paths.js +4 -4
  33. package/lib/poll-transport.js +109 -26
  34. package/lib/positioning.js +51 -0
  35. package/lib/recovery-controller.js +9 -0
  36. package/lib/references/context-and-recovery.md +130 -0
  37. package/lib/references/response-contract.md +108 -0
  38. package/lib/references/source-edits.md +47 -0
  39. package/lib/review-palette.js +97 -0
  40. package/lib/revision-store.js +1 -1
  41. package/lib/save-controller.js +28 -14
  42. package/lib/sdk.js +568 -92
  43. package/lib/server.js +73 -595
  44. package/lib/setup.js +17 -48
  45. package/lib/state.js +21 -7
  46. package/lib/thread-anchor-controller.js +56 -0
  47. package/lib/toolbar-controller.js +3 -3
  48. package/lib/ui/THIRD_PARTY_NOTICES.md +127 -8
  49. package/lib/ui/chrome.css +1220 -2733
  50. package/lib/ui/chrome.js +81 -17
  51. package/package.json +2 -2
  52. package/lib/chrome-client.js +0 -1700
package/lib/setup.js CHANGED
@@ -41,55 +41,19 @@ export function shellQuote(arg) {
41
41
  /** The skill lives in its own markdown file so nothing needs escaping. */
42
42
  export const readSkill = () => fs.readFileSync(path.join(here, "SKILL.md"), "utf8");
43
43
  export const skillFor = (cmd) => readSkill().replaceAll(NPX_COMMAND, cmd);
44
- const CODEX_BLOCK = `
45
- ## Reviewing files and localhost pages with doc-review
44
+ const codexBlock = () => `## Interactive reviews with doc-review
46
45
 
47
- Start only when the user explicitly invokes /doc-review or requests an
48
- interactive browser review. Writing, updating, discussing, or generically reviewing
49
- content does not authorize opening a review or polling. Another skill's automatic
50
- review step is not user permission. Otherwise respond normally.
46
+ Start only when the user explicitly invokes /doc-review or requests an interactive
47
+ browser review. Another skill's automatic review step is not user permission.
48
+ Otherwise do not open a review or poll.
51
49
 
52
- After that explicit request, open the requested HTML or Markdown file with
53
- \`${NPX_COMMAND} <file.html>\`. For a locally running web page, open the real
54
- route with \`${NPX_COMMAND} http://localhost:3000/path\` instead of recreating
55
- it as a static file. Then block on
56
- \`${NPX_COMMAND} poll <target> --timeout 600\` until they send feedback.
57
- If it prints \`{"status":"timeout"}\`, no feedback arrived yet — run the same
58
- poll command again to keep waiting. When a \`{"status":"feedback"}\` batch
59
- arrives, handle every item, then run the exact acknowledgement command in its
60
- \`next_step\`, which uses \`--ack <batch_id>\`. Keep that exact batch ID on retries;
61
- never acknowledge an unhandled batch.
50
+ On activation, read [.agents/skills/doc-review/SKILL.md](.agents/skills/doc-review/SKILL.md)
51
+ and load its relative references only when needed. Preserve review/submission
52
+ identity, per-message permissions and exact edit evidence. Use the generated
53
+ commands and complete response template; retry the same response file/requestId,
54
+ never source edits after uncertain acceptance.
62
55
 
63
- Without \`--timeout\`, the CLI defaults to a 12-hour cutoff. An explicit
64
- \`--timeout\` is one end-to-end deadline, including server discovery and reconnect
65
- attempts. Keep using the bounded foreground \`--timeout 600\` loop above;
66
- those polls do not wait 12 hours.
67
-
68
- Keep the poll command in the foreground and do not end the turn while it waits.
69
- If the shell returns a process or session handle, keep waiting on that handle until
70
- the command exits. \`${NPX_COMMAND} status <target>\` reports instantly
71
- whether feedback is already waiting, without blocking.
72
-
73
- The batch groups feedback by page under \`pages\`, so fix every page listed. Items
74
- under \`edits\` are changes the user already made. For non-truncated edits,
75
- \`after\` is their exact wording: carry it across verbatim and never revert it.
76
- If the HTML was generated from MDX or Markdown, apply complete edits to the
77
- source too.
78
-
79
- Edit fields are limited to 200,000 Unicode code points each. An edit with
80
- \`truncated: true\` identifies clipped fields in the \`truncated_fields\` array.
81
- Never apply incomplete text or HTML as a complete replacement or invent missing
82
- text. Recover the full edit only from an authoritative source; otherwise ask the
83
- user for the complete edit. Do not acknowledge the batch until every item,
84
- including truncated edits, has been handled.
85
-
86
- Markdown files open rendered
87
- and are never written by doc-review: apply their comments and edits to the
88
- Markdown source, keeping its syntax. There is no reply channel; the user sees
89
- your work when the page reloads. For a localhost page, direct edits and deletions
90
- arrive with \`kind: "url"\`; find and update the matching MDX, TSX, template, or
91
- component source. Never write the rendered HTTP response over project source.
92
- `;
56
+ The skill and references are installed together by doc-review setup.`;
93
57
  export function installSkills(cwd, { global: isGlobal = false, home = os.homedir(), command } = {}) {
94
58
  const done = [];
95
59
  const cmd = command || invocation();
@@ -102,7 +66,7 @@ export function installSkills(cwd, { global: isGlobal = false, home = os.homedir
102
66
  if (!Buffer.from(existing, "utf8").equals(bytes)) {
103
67
  throw new Error("AGENTS.md is not valid UTF-8; convert it before re-running setup. No setup files were changed.");
104
68
  }
105
- guidance = updateGuidance(existing, CODEX_BLOCK.replaceAll(NPX_COMMAND, cmd));
69
+ guidance = updateGuidance(existing, codexBlock().replaceAll(NPX_COMMAND, cmd));
106
70
  }
107
71
  const skillRoots = isGlobal
108
72
  ? [
@@ -110,11 +74,16 @@ export function installSkills(cwd, { global: isGlobal = false, home = os.homedir
110
74
  ["Codex", path.join(home, ".codex")],
111
75
  ["Shared agents", path.join(home, ".agents")],
112
76
  ]
113
- : [["Claude Code", path.join(cwd, ".claude")]];
77
+ : [["Claude Code", path.join(cwd, ".claude")], ["Shared agents", path.join(cwd, ".agents")]];
114
78
  for (const [agent, base] of skillRoots) {
115
79
  const skillFile = path.join(base, "skills", "doc-review", "SKILL.md");
116
80
  fs.mkdirSync(path.dirname(skillFile), { recursive: true });
117
81
  fs.writeFileSync(skillFile, skillFor(cmd));
82
+ const refs = path.join(path.dirname(skillFile), "references");
83
+ fs.mkdirSync(refs, { recursive: true });
84
+ for (const name of fs.readdirSync(path.join(here, "references"))) {
85
+ fs.writeFileSync(path.join(refs, name), fs.readFileSync(path.join(here, "references", name), "utf8").replaceAll(NPX_COMMAND, cmd));
86
+ }
118
87
  done.push(`${agent} skill ${skillFile}${isGlobal ? " (all projects)" : ""}`);
119
88
  }
120
89
  if (!isGlobal) {
package/lib/state.js CHANGED
@@ -8,12 +8,14 @@ import { atomicWrite } from "./atomic-write.js";
8
8
  import { RevisionStore } from "./revision-store.js";
9
9
  import { CAPTURE_LEASE_MS, HISTORY_SCHEMA_VERSION, normalizeHistoryTargets, revisionError } from "./revision-schema.js";
10
10
  import { historyRevisionReferences, retainHistory } from "./history-policy.js";
11
+ import { Conversations, emptyConversations, validateConversations } from "./conversation-store.js";
12
+ import { ContractError } from "./contracts/validation.js";
11
13
  /** Anything untouched this long is review debris, not work in progress. */
12
14
  const PRUNE_AGE_MS = 30 * 24 * 60 * 60 * 1000;
13
15
  const DELIVERY_STATES = new Set(["queued", "possibly_delivered", "delivered"]);
14
16
  const fresh = (entry, now) => !!entry && now - (entry.updatedAt || 0) < PRUNE_AGE_MS;
15
17
  const batchId = () => `b_${crypto.randomBytes(12).toString("hex")}`;
16
- const emptyState = () => ({ pages: {}, batches: {}, receipts: {}, histories: {} });
18
+ const emptyState = () => ({ schemaVersion: 1, conversations: emptyConversations(), pages: {}, batches: {}, receipts: {}, histories: {} });
17
19
  const historyId = (prefix) => `${prefix}_${crypto.randomBytes(12).toString("hex")}`;
18
20
  function historyRound(data, entryKey, roundId) {
19
21
  return data.histories[entryKey]?.rounds.find((round) => round.roundId === roundId) || null;
@@ -49,7 +51,8 @@ function finishCapture(round) {
49
51
  function pruneData(data, now = Date.now()) {
50
52
  let changed = retainHistory(data);
51
53
  for (const [key, page] of Object.entries(data.pages)) {
52
- const protectedPage = page.comments?.length || page.edits?.length || page.revisionRefs?.length ||
54
+ const protectedPage = Object.values(data.conversations?.reviews || {}).some((record) => Object.hasOwn(record.pages, key)) ||
55
+ page.comments?.length || page.edits?.length || page.revisionRefs?.length ||
53
56
  data.batches[key] || Object.values(data.batches).some((record) => record.cleanup.some((item) => item.key === key)) ||
54
57
  Object.values(data.histories).some((history) => history.rounds.some((round) => round.targets.some((target) => target.key === key)));
55
58
  if (protectedPage)
@@ -72,10 +75,13 @@ function pruneData(data, now = Date.now()) {
72
75
  return changed;
73
76
  }
74
77
  function normalizeState(parsed, makeBatchId) {
78
+ validateConversations(parsed);
75
79
  if (!parsed || typeof parsed !== "object" || !parsed.pages || typeof parsed.pages !== "object") {
76
80
  throw new Error("Invalid doc-review state: expected a pages object.");
77
81
  }
78
82
  const data = {
83
+ schemaVersion: parsed.schemaVersion,
84
+ conversations: parsed.conversations,
79
85
  pages: parsed.pages,
80
86
  batches: parsed.batches && typeof parsed.batches === "object" ? parsed.batches : {},
81
87
  receipts: parsed.receipts && typeof parsed.receipts === "object" ? parsed.receipts : {},
@@ -163,12 +169,13 @@ function normalizeState(parsed, makeBatchId) {
163
169
  * means "your feedback is safe" stays true across server restarts.
164
170
  */
165
171
  export class Store {
166
- constructor({ write = atomicWrite, makeBatchId = batchId, revisions = new RevisionStore() } = {}) {
172
+ constructor({ write = atomicWrite, makeBatchId = batchId, revisions = new RevisionStore(), writeSource = atomicWrite } = {}) {
167
173
  this.data = emptyState();
168
174
  this.write = write;
169
175
  this.makeBatchId = makeBatchId;
170
176
  this.revisions = revisions;
171
177
  this.load();
178
+ this.conversations = new Conversations(this, { writeSource });
172
179
  }
173
180
  load() {
174
181
  let parsed;
@@ -177,8 +184,10 @@ export class Store {
177
184
  parsed = JSON.parse(raw);
178
185
  }
179
186
  catch (err) {
180
- if (err.code === "ENOENT")
187
+ if (err.code === "ENOENT") {
188
+ this.persist(this.data);
181
189
  return this.data;
190
+ }
182
191
  throw err;
183
192
  }
184
193
  const normalized = normalizeState(parsed, this.makeBatchId);
@@ -189,8 +198,13 @@ export class Store {
189
198
  return this.data;
190
199
  }
191
200
  persist(data) {
192
- ensureStateDir();
193
- this.write(statePath(), JSON.stringify(data, null, 2));
201
+ try {
202
+ ensureStateDir();
203
+ this.write(statePath(), JSON.stringify(data, null, 2));
204
+ }
205
+ catch (error) {
206
+ throw new ContractError("STATE_PERSIST_FAILED", `State was not accepted: ${error.message}. Source writes, if any, must be reconciled separately.`);
207
+ }
194
208
  }
195
209
  /** Replace durable state once, then publish the committed draft in memory. */
196
210
  transaction(mutator) {
@@ -202,7 +216,7 @@ export class Store {
202
216
  pruneData(draft);
203
217
  this.persist(draft);
204
218
  this.data = draft;
205
- return result;
219
+ return structuredClone(result);
206
220
  }
207
221
  /** Persist deliberate direct changes used by maintenance and tests. */
208
222
  save() {
@@ -0,0 +1,56 @@
1
+ import { frameAnchorsSchema, sameFrameAnchorProjection, validateFrameAnchorStates, validateFrameThreadAction, } from "./contracts/frame.js";
2
+ import { reject } from "./contracts/validation.js";
3
+ /** Frame-local metadata only. The shell separately validates every report/action. */
4
+ export function createThreadAnchorController(options) {
5
+ let projection = null;
6
+ let signature = "";
7
+ function measure(current) {
8
+ return validateFrameAnchorStates({
9
+ ...current, type: "eh:threadAnchorStates",
10
+ anchors: current.anchors.map(options.resolve),
11
+ }, current);
12
+ }
13
+ function publish(states) {
14
+ options.reconcile?.(projection, states);
15
+ const next = JSON.stringify(states);
16
+ if (signature !== next) {
17
+ options.changed(projection, states);
18
+ signature = next;
19
+ }
20
+ return states;
21
+ }
22
+ function refresh() {
23
+ return projection ? publish(measure(projection)) : null;
24
+ }
25
+ return {
26
+ get projection() { return projection; },
27
+ refresh,
28
+ project(input) {
29
+ const next = frameAnchorsSchema.parse(input);
30
+ if (next.capability !== options.channel.capability || next.generation !== options.channel.generation ||
31
+ next.pageKey !== options.channel.pageKey || (projection &&
32
+ (next.reviewId !== projection.reviewId || next.renderId !== projection.renderId))) {
33
+ reject("SCOPE_MISMATCH", "Projection does not belong to this bound frame.");
34
+ }
35
+ if (projection && (next.projectionRevision < projection.projectionRevision ||
36
+ (next.projectionRevision === projection.projectionRevision && !sameFrameAnchorProjection(next, projection)))) {
37
+ reject("SCOPE_MISMATCH", "Stale or reused anchor projection revision.");
38
+ }
39
+ const states = measure(next);
40
+ projection = next;
41
+ signature = "";
42
+ return publish(states);
43
+ },
44
+ action(input) {
45
+ if (!projection)
46
+ return reject("SCOPE_MISMATCH", "No current thread projection.");
47
+ const action = validateFrameThreadAction(input, projection);
48
+ if (action.action !== "dismiss") {
49
+ const state = refresh().anchors.find((anchor) => anchor.threadId === action.threadId);
50
+ if (state?.state !== "found")
51
+ reject("INVALID_INPUT", "Target is not currently available; use Feedback.");
52
+ }
53
+ return action;
54
+ },
55
+ };
56
+ }
@@ -23,9 +23,9 @@ export function createToolbarController(read, commands) {
23
23
  if (!state.ended && !state.comparing)
24
24
  commands.openComments();
25
25
  },
26
- toggleTheme() {
27
- if (!read().ended)
28
- commands.toggleTheme();
26
+ setTheme(theme) {
27
+ if (!read().ended && read().theme !== theme)
28
+ commands.setTheme(theme);
29
29
  },
30
30
  },
31
31
  };
@@ -142,6 +142,30 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
142
142
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
143
143
  SOFTWARE.
144
144
 
145
+ ## @radix-ui/react-checkbox - 1.3.11 (MIT)
146
+
147
+ MIT License
148
+
149
+ Copyright (c) 2022 WorkOS
150
+
151
+ Permission is hereby granted, free of charge, to any person obtaining a copy
152
+ of this software and associated documentation files (the "Software"), to deal
153
+ in the Software without restriction, including without limitation the rights
154
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
155
+ copies of the Software, and to permit persons to whom the Software is
156
+ furnished to do so, subject to the following conditions:
157
+
158
+ The above copyright notice and this permission notice shall be included in all
159
+ copies or substantial portions of the Software.
160
+
161
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
162
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
163
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
164
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
165
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
166
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
167
+ SOFTWARE.
168
+
145
169
  ## @radix-ui/react-collection - 1.1.15 (MIT)
146
170
 
147
171
  MIT License
@@ -382,7 +406,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
382
406
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
383
407
  SOFTWARE.
384
408
 
385
- ## @radix-ui/react-label - 2.1.15 (MIT)
409
+ ## @radix-ui/react-menu - 2.1.24 (MIT)
386
410
 
387
411
  MIT License
388
412
 
@@ -406,7 +430,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
406
430
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
407
431
  SOFTWARE.
408
432
 
409
- ## @radix-ui/react-menu - 2.1.24 (MIT)
433
+ ## @radix-ui/react-popper - 1.3.7 (MIT)
410
434
 
411
435
  MIT License
412
436
 
@@ -430,7 +454,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
430
454
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
431
455
  SOFTWARE.
432
456
 
433
- ## @radix-ui/react-popper - 1.3.7 (MIT)
457
+ ## @radix-ui/react-portal - 1.1.17 (MIT)
434
458
 
435
459
  MIT License
436
460
 
@@ -454,7 +478,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
454
478
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
455
479
  SOFTWARE.
456
480
 
457
- ## @radix-ui/react-portal - 1.1.17 (MIT)
481
+ ## @radix-ui/react-presence - 1.1.10 (MIT)
458
482
 
459
483
  MIT License
460
484
 
@@ -478,7 +502,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
478
502
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
479
503
  SOFTWARE.
480
504
 
481
- ## @radix-ui/react-presence - 1.1.10 (MIT)
505
+ ## @radix-ui/react-primitive - 2.1.10 (MIT)
482
506
 
483
507
  MIT License
484
508
 
@@ -502,7 +526,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
502
526
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
503
527
  SOFTWARE.
504
528
 
505
- ## @radix-ui/react-primitive - 2.1.10 (MIT)
529
+ ## @radix-ui/react-roving-focus - 1.1.19 (MIT)
506
530
 
507
531
  MIT License
508
532
 
@@ -526,7 +550,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
526
550
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
527
551
  SOFTWARE.
528
552
 
529
- ## @radix-ui/react-roving-focus - 1.1.19 (MIT)
553
+ ## @radix-ui/react-slot - 1.3.3 (MIT)
530
554
 
531
555
  MIT License
532
556
 
@@ -550,7 +574,31 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
550
574
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
551
575
  SOFTWARE.
552
576
 
553
- ## @radix-ui/react-slot - 1.3.3 (MIT)
577
+ ## @radix-ui/react-toast - 1.2.23 (MIT)
578
+
579
+ MIT License
580
+
581
+ Copyright (c) 2022 WorkOS
582
+
583
+ Permission is hereby granted, free of charge, to any person obtaining a copy
584
+ of this software and associated documentation files (the "Software"), to deal
585
+ in the Software without restriction, including without limitation the rights
586
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
587
+ copies of the Software, and to permit persons to whom the Software is
588
+ furnished to do so, subject to the following conditions:
589
+
590
+ The above copyright notice and this permission notice shall be included in all
591
+ copies or substantial portions of the Software.
592
+
593
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
594
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
595
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
596
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
597
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
598
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
599
+ SOFTWARE.
600
+
601
+ ## @radix-ui/react-tooltip - 1.2.16 (MIT)
554
602
 
555
603
  MIT License
556
604
 
@@ -718,6 +766,30 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
718
766
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
719
767
  SOFTWARE.
720
768
 
769
+ ## @radix-ui/react-visually-hidden - 1.2.11 (MIT)
770
+
771
+ MIT License
772
+
773
+ Copyright (c) 2022 WorkOS
774
+
775
+ Permission is hereby granted, free of charge, to any person obtaining a copy
776
+ of this software and associated documentation files (the "Software"), to deal
777
+ in the Software without restriction, including without limitation the rights
778
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
779
+ copies of the Software, and to permit persons to whom the Software is
780
+ furnished to do so, subject to the following conditions:
781
+
782
+ The above copyright notice and this permission notice shall be included in all
783
+ copies or substantial portions of the Software.
784
+
785
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
786
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
787
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
788
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
789
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
790
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
791
+ SOFTWARE.
792
+
721
793
  ## aria-hidden - 1.2.6 (MIT)
722
794
 
723
795
  MIT License
@@ -971,6 +1043,53 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
971
1043
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
972
1044
  SOFTWARE.
973
1045
 
1046
+ ## marked - 18.0.12 (MIT)
1047
+
1048
+ # License information
1049
+
1050
+ ## Contribution License Agreement
1051
+
1052
+ If you contribute code to this project, you are implicitly allowing your code
1053
+ to be distributed under the MIT license. You are also implicitly verifying that
1054
+ all code is your original work. `</legalese>`
1055
+
1056
+ ## Marked
1057
+
1058
+ Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/)
1059
+ Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
1060
+
1061
+ Permission is hereby granted, free of charge, to any person obtaining a copy
1062
+ of this software and associated documentation files (the "Software"), to deal
1063
+ in the Software without restriction, including without limitation the rights
1064
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1065
+ copies of the Software, and to permit persons to whom the Software is
1066
+ furnished to do so, subject to the following conditions:
1067
+
1068
+ The above copyright notice and this permission notice shall be included in
1069
+ all copies or substantial portions of the Software.
1070
+
1071
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1072
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1073
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1074
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1075
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1076
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1077
+ THE SOFTWARE.
1078
+
1079
+ ## Markdown
1080
+
1081
+ Copyright © 2004, John Gruber
1082
+ http://daringfireball.net/
1083
+ All rights reserved.
1084
+
1085
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1086
+
1087
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
1088
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
1089
+ * Neither the name “Markdown” nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
1090
+
1091
+ This software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
1092
+
974
1093
  ## react-dom - 19.3.0 (MIT)
975
1094
 
976
1095
  MIT License