OXYGENHUB

OxygenHub 0.9.17: the TypeScript types gain the dashboard's proposals, the starter and test reports (refs #349) 041a945f55f8

Author
Andy McCall @andymccall <[email protected]>
via
agent agent:claude@andymccall <[email protected]> · keyless, under your grant for changes,refs,seal · key eced9704a8d6
When
· 2026-10-29 18:37 UTC
Signature
◈ sealed by agent:claude@andymccall
Hash
041a945f55f82634df6a9c5f2c75e604185da16f01eb5369b4a2b25b047b8956
Depends on
04f9c984439e 166f6e9bf4f1 27322cd2755a 3f4b0ea6eabf 42a0ba4bac4e 4d2e44d79b03 5c6e92fd8d71 71e65fcf95ab b5668108487f b64e2537d702 bf1ab3458db1 d23464c0ac60 ef20fdc14e8b
Depended on by
a22e4aec2e28 8f1d76f4169a 75491d35c258 ac689cd21adf
In bookmarks
main
In tags
v0.9.19 v0.9.20 v0.9.21 v0.9.22 v0.9.23 v0.9.24
Edits
29 atoms, 0 tree operations, 5 files

Browse the tree at this change

modified CHANGELOG.md +2 −2
…
1 unchanged lines
2 2
3 3
OxygenHub runs at https://oxygenhub.io; each deploy's build is on the About page and at `/api/v1/version`.
4 4
5 -
## Unreleased
5 +
## 0.9.17 (2026-10-29)
6 6
7 -
- **Drops over the API: fork, star and comment (#349).** What a drop's page does, for the VS Code extension and other clients: `POST /api/v1/drops/{id}/fork`, `PUT`/`DELETE /api/v1/drops/{id}/star`, `GET`/`POST /api/v1/drops/{id}/comments` and `DELETE /api/v1/drops/{id}/comments/{n}`, by the web's rules (the owner told of a comment; its author, the owner or an administrator deletes it). A drop over the API now says its stars, whether you starred it, what it was forked from and its embed address. `oh drop fork|star|unstar|comments|comment`.
7 +
- **Drops over the API: fork, star and comment (#349).** What a drop's page does, for the VS Code extension and other clients: `POST /api/v1/drops/{id}/fork`, `PUT`/`DELETE /api/v1/drops/{id}/star`, `GET`/`POST /api/v1/drops/{id}/comments` and `DELETE /api/v1/drops/{id}/comments/{n}`, by the web's rules (the owner told of a comment; its author, the owner or an administrator deletes it). A drop over the API now says its stars, whether you starred it, what it was forked from and its embed address. `oh drop fork|star|unstar|comments|comment`. The API's TypeScript types now include the dashboard's proposals, the starter and test reports.
8 8
9 9
## 0.9.16 (2026-10-29)
10 10
…
421 unchanged lines
modified Cargo.lock +3 −3
…
1459 unchanged lines
1460 1460
1461 1461
[[package]]
1462 1462
name = "hub-api"
1463 -
version = "0.9.16"
1463 +
version = "0.9.17"
1464 1464
dependencies = [
1465 1465
 "schemars",
1466 1466
 "serde",
…
797 unchanged lines
2264 2264
2265 2265
[[package]]
2266 2266
name = "oh"
2267 -
version = "0.9.16"
2267 +
version = "0.9.17"
2268 2268
dependencies = [
2269 2269
 "anyhow",
2270 2270
 "axum",
…
86 unchanged lines
2357 2357
2358 2358
[[package]]
2359 2359
name = "oxygenhub"
2360 -
version = "0.9.16"
2360 +
version = "0.9.17"
2361 2361
dependencies = [
2362 2362
 "ammonia",
2363 2363
 "anyhow",
…
2513 unchanged lines
modified Cargo.toml +1 −1
…
6 unchanged lines
7 7
resolver = "2"
8 8
9 9
[workspace.package]
10 -
version = "0.9.16"
10 +
version = "0.9.17"
11 11
edition = "2021"
12 12
license = "MIT OR Apache-2.0"
13 13
authors = ["Andy McCall <[email protected]>"]
…
60 unchanged lines
modified crates/hub-api/src/lib.rs +7 −0
…
1553 unchanged lines
1554 1554
        ("DropStars", schemars::schema_for!(DropStars)),
1555 1555
        ("NewDrop", schemars::schema_for!(NewDrop)),
1556 1556
        ("DropEdit", schemars::schema_for!(DropEdit)),
1557 +
        ("UserProposals", schemars::schema_for!(UserProposals)),
1558 +
        ("ProposalBrief", schemars::schema_for!(ProposalBrief)),
1559 +
        ("StarterAssistants", schemars::schema_for!(StarterAssistants)),
1560 +
        ("StarterStatus", schemars::schema_for!(StarterStatus)),
1561 +
        ("StarterRequest", schemars::schema_for!(StarterRequest)),
1562 +
        ("TestReport", schemars::schema_for!(TestReport)),
1563 +
        ("TestReportDetail", schemars::schema_for!(TestReportDetail)),
1557 1564
    ]
1558 1565
}
1559 1566
…
295 unchanged lines
modified crates/hub-api/ts/index.d.ts +153 −0
…
226 unchanged lines
227 227
  at_ms: number;
228 228
  id: number;
229 229
  kind: string;
230 +
  label?: string | null;
230 231
  read: boolean;
232 +
  reason?: string;
233 +
  repository?: string | null;
234 +
  thread?: string;
231 235
  title: string;
232 236
  url: string;
233 237
};
…
31 unchanged lines
265 269
  when_ms: number;
266 270
};
267 271
272 +
export type DiffLine = {
273 +
  kind: string;
274 +
  new?: number | null;
275 +
  old?: number | null;
276 +
  text?: string;
277 +
};
278 +
268 279
export type FileChange = {
269 280
  added: number;
270 281
  from?: string | null;
271 282
  kind: string;
283 +
  lines?: DiffLine[];
272 284
  path: string;
273 285
  removed: number;
286 +
  truncated?: boolean;
274 287
};
275 288
276 289
export type ChangeDetail = {
…
140 unchanged lines
417 430
418 431
export type ProposalEdit = {
419 432
  body?: string | null;
433 +
  draft?: boolean | null;
420 434
  labels?: string[] | null;
421 435
  state?: string | null;
422 436
  title?: string | null;
…
21 unchanged lines
444 458
};
445 459
446 460
export type ProjectCard = {
461 +
  archived_ms?: number | null;
462 +
  assignees?: string[];
447 463
  id: number;
448 464
  kind: string;
465 +
  labels?: string[];
449 466
  reference: string;
450 467
  state: string;
451 468
  title: string;
…
110 unchanged lines
562 579
};
563 580
564 581
export type FlowJob = {
582 +
  approval?: string;
565 583
  depends_on: string[];
566 584
  error: string;
567 585
  exit_code?: number | null;
568 586
  finished_ms?: number | null;
569 587
  log_lines: number;
570 588
  name: string;
589 +
  peak_disk_mib?: number | null;
590 +
  peak_memory_mib?: number | null;
591 +
  phases?: FlowPhase[];
571 592
  placed?: string;
593 +
  queued_ms?: number | null;
594 +
  ready_ms?: number | null;
572 595
  runner: string;
573 596
  started_ms?: number | null;
574 597
  status: string;
575 598
  waiting?: string;
576 599
};
577 600
601 +
export type FlowPhase = {
602 +
  ms: number;
603 +
  name: string;
604 +
};
605 +
578 606
export type FlowRun = {
579 607
  actor: string;
580 608
  bookmark: string;
…
16 unchanged lines
597 625
  stream: string;
598 626
  t: number;
599 627
  text: string;
628 +
};
629 +
630 +
export type ReportFile = {
631 +
  path: string;
632 +
  size: number;
633 +
};
634 +
635 +
export type ReportMetric = {
636 +
  better: string;
637 +
  fail_above?: number | null;
638 +
  fail_below?: number | null;
639 +
  key: string;
640 +
  unit: string;
641 +
  value: number;
600 642
};
601 643
644 +
export type Report = {
645 +
  bookmark: string;
646 +
  bytes: number;
647 +
  context: unknown;
648 +
  created_ms: number;
649 +
  files: number;
650 +
  files_expired_ms?: number | null;
651 +
  id: number;
652 +
  job: string;
653 +
  kind: string;
654 +
  manifest?: ReportFile[];
655 +
  metrics: ReportMetric[];
656 +
  name: string;
657 +
  run?: number | null;
658 +
  state: string;
659 +
  summary: string;
660 +
  title: string;
661 +
  url: string;
662 +
};
663 +
602 664
export type NewRelease = {
603 665
  notes?: string | null;
604 666
  prerelease?: boolean;
…
12 unchanged lines
617 679
  clone_url: string;
618 680
  created_ms: number;
619 681
  description: string;
682 +
  embed_url?: string;
620 683
  files: DropFile[];
684 +
  forked_from?: string | null;
621 685
  id: string;
622 686
  owner: string;
687 +
  starred?: boolean;
688 +
  stars?: number;
623 689
  title: string;
624 690
  updated_ms: number;
625 691
  url: string;
626 692
  visibility: string;
693 +
};
694 +
695 +
export type DropComment = {
696 +
  author: string;
697 +
  body: string;
698 +
  created_ms: number;
699 +
  id: number;
700 +
};
701 +
702 +
export type NewDropComment = {
703 +
  body: string;
704 +
};
705 +
706 +
export type DropStars = {
707 +
  starred: boolean;
708 +
  stars: number;
627 709
};
628 710
629 711
export type NewDropFile = {
…
19 unchanged lines
649 731
  message?: string | null;
650 732
  secret?: boolean | null;
651 733
  title?: string | null;
734 +
};
735 +
736 +
export type ProposalBrief = {
737 +
  author: string;
738 +
  conflicted: boolean;
739 +
  number: number;
740 +
  repository: string;
741 +
  state: ProposalState;
742 +
  title: string;
743 +
  updated_ms: number;
744 +
  url: string;
745 +
};
746 +
747 +
export type UserProposals = {
748 +
  authored: ProposalBrief[];
749 +
  landable?: ProposalBrief[];
750 +
  review: ProposalBrief[];
751 +
};
752 +
753 +
export type StarterAssistant = {
754 +
  from: string;
755 +
  model: string;
756 +
  name: string;
757 +
};
758 +
759 +
export type StarterAssistants = {
760 +
  assistants: StarterAssistant[];
761 +
};
762 +
763 +
export type StarterStatus = {
764 +
  assistant?: string;
765 +
  change?: string;
766 +
  error?: string;
767 +
  files?: string[];
768 +
  status: string;
769 +
};
770 +
771 +
export type StarterRequest = {
772 +
  assistant?: string | null;
773 +
  description: string;
774 +
};
775 +
776 +
export type TestReport = {
777 +
  bookmark: string;
778 +
  created_ms: number;
779 +
  errors: number;
780 +
  failed: number;
781 +
  id: number;
782 +
  job: string;
783 +
  passed: number;
784 +
  run: number;
785 +
  skipped: number;
786 +
  state: string;
787 +
  tests: number;
788 +
  time_ms: number;
789 +
  url: string;
790 +
};
791 +
792 +
export type TestCase = {
793 +
  classname: string;
794 +
  message: string;
795 +
  name: string;
796 +
  output: string;
797 +
  status: string;
798 +
  suite: string;
799 +
  time_ms: number;
800 +
};
801 +
802 +
export type TestReportDetail = {
803 +
  cases: TestCase[];
804 +
  report: TestReport;
652 805
};
653 806