@crouton-kit/humanloop 0.4.10 → 0.4.12

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 (107) hide show
  1. package/dist/api.d.ts +1 -1
  2. package/dist/api.js +4 -4
  3. package/dist/cli.js +5 -3
  4. package/dist/inbox/controller.js +12 -7
  5. package/dist/inbox/deck-factories.d.ts +3 -1
  6. package/dist/inbox/deck-factories.js +2 -1
  7. package/dist/inbox/deck-schema.d.ts +2 -1
  8. package/dist/inbox/deck-schema.js +3 -2
  9. package/dist/inbox/scan.js +1 -1
  10. package/dist/inbox/tickets.js +1 -1
  11. package/dist/inbox/tui.js +2 -5
  12. package/dist/inbox/visual.js +3 -3
  13. package/dist/types.d.ts +5 -5
  14. package/dist/web/assets/{abnfDiagram-VRR7QNED-By5eg834.js → abnfDiagram-VRR7QNED-C3G7ucis.js} +1 -1
  15. package/dist/web/assets/{arc-vdkyOWe2.js → arc-CfHbBVfI.js} +1 -1
  16. package/dist/web/assets/architecture-TIHT7OUA-XeXU8J5n.js +1 -0
  17. package/dist/web/assets/{architectureDiagram-ZJ3FMSHR-CKy_ZE5N.js → architectureDiagram-ZJ3FMSHR-BCs4FMRj.js} +1 -1
  18. package/dist/web/assets/{blockDiagram-677ZJIJ3-5LiBO7Io.js → blockDiagram-677ZJIJ3-Ddt1PlNC.js} +1 -1
  19. package/dist/web/assets/{c4Diagram-LMCZKHZV-D79itWPb.js → c4Diagram-LMCZKHZV-BWwkKdPZ.js} +1 -1
  20. package/dist/web/assets/channel-BfMifkFv.js +1 -0
  21. package/dist/web/assets/{chunk-32BRIVSS-4LnkfHUo.js → chunk-32BRIVSS-BjyMBLnt.js} +1 -1
  22. package/dist/web/assets/{chunk-52WLFC77-2raU4D63.js → chunk-52WLFC77-DwnRc5bP.js} +1 -1
  23. package/dist/web/assets/{chunk-C7G6YPKG-Cq1co5_N.js → chunk-C7G6YPKG-Cv5J31rb.js} +1 -1
  24. package/dist/web/assets/{chunk-EX3LRPZG-5pgwNnOC.js → chunk-EX3LRPZG-Ds-y37uL.js} +1 -1
  25. package/dist/web/assets/{chunk-FWX5IMBZ-DLBDSAUG.js → chunk-FWX5IMBZ-BzgaWqkI.js} +2 -2
  26. package/dist/web/assets/{chunk-HOUHSVGY-7q8piy7F.js → chunk-HOUHSVGY-CB_Rjcvz.js} +1 -1
  27. package/dist/web/assets/{chunk-ICXQ74PX-B8V7Hf73.js → chunk-ICXQ74PX-a8BpKR5q.js} +1 -1
  28. package/dist/web/assets/{chunk-MOJQB5TN-CvpfWs-s.js → chunk-MOJQB5TN-b09YHDGP.js} +1 -1
  29. package/dist/web/assets/{chunk-OGEWGWER-BIcVy_-w.js → chunk-OGEWGWER-CK9U88Zp.js} +1 -1
  30. package/dist/web/assets/{chunk-PUDLZKDR-HzobduhR.js → chunk-PUDLZKDR-DBp4NxwM.js} +1 -1
  31. package/dist/web/assets/{chunk-Q4XR5HBZ-BVzkZDMe.js → chunk-Q4XR5HBZ-Cn7tHzZm.js} +1 -1
  32. package/dist/web/assets/{chunk-RYQCIY6F-BXvuzyNS.js → chunk-RYQCIY6F-DS8RMCZK.js} +1 -1
  33. package/dist/web/assets/{chunk-V7JOEXUC-BGmVQ8Gl.js → chunk-V7JOEXUC-BCTcSsiS.js} +1 -1
  34. package/dist/web/assets/{chunk-VAUOI2AC-Dr7gTfE6.js → chunk-VAUOI2AC-DQVUYSsu.js} +1 -1
  35. package/dist/web/assets/{chunk-VR4S4FIN-T9cDy9xC.js → chunk-VR4S4FIN-D5E0Nzn2.js} +1 -1
  36. package/dist/web/assets/{chunk-WYO6CB5R-DCmNxnM8.js → chunk-WYO6CB5R-reDXIQan.js} +1 -1
  37. package/dist/web/assets/{chunk-XXDRQBXY-D3CBQrix.js → chunk-XXDRQBXY-BFea61gW.js} +1 -1
  38. package/dist/web/assets/{chunk-ZGVPDNZ5-az9vUYuT.js → chunk-ZGVPDNZ5-BbVer9LG.js} +1 -1
  39. package/dist/web/assets/classDiagram-OUVF2IWQ-B3fMukMS.js +1 -0
  40. package/dist/web/assets/classDiagram-v2-EOCWNBFH-B3fMukMS.js +1 -0
  41. package/dist/web/assets/{cose-bilkent-JH36ORCC-BA_JeicW.js → cose-bilkent-JH36ORCC-Do23kUxV.js} +1 -1
  42. package/dist/web/assets/{cynefin-VYW2F7L2-CctiGrrW.js → cynefin-VYW2F7L2-B51RrEfW.js} +1 -1
  43. package/dist/web/assets/{cynefinDiagram-TSTJHNR4-CUy0zmIT.js → cynefinDiagram-TSTJHNR4-BMRRvJi_.js} +1 -1
  44. package/dist/web/assets/{dagre-VKFMJZFB-Ds3jP1MK.js → dagre-VKFMJZFB-Cq3oNHAr.js} +1 -1
  45. package/dist/web/assets/{diagram-FQU43EPY-EwA9l88S.js → diagram-FQU43EPY-B_OlWSFb.js} +1 -1
  46. package/dist/web/assets/{diagram-G47NLZAW-DABQWhEl.js → diagram-G47NLZAW-CinfsHac.js} +1 -1
  47. package/dist/web/assets/{diagram-NH7WQ7WH-ghhVWX8i.js → diagram-NH7WQ7WH-B1z5z_xR.js} +1 -1
  48. package/dist/web/assets/{diagram-OA4YK3LP-DQqZ5_Hn.js → diagram-OA4YK3LP-CaXxWKyb.js} +1 -1
  49. package/dist/web/assets/{diagram-WEI45ONY-B7MqXpzX.js → diagram-WEI45ONY-DJ_ofe0i.js} +1 -1
  50. package/dist/web/assets/{dist-CccYnoy2.js → dist-D6gNQP9S.js} +1 -1
  51. package/dist/web/assets/{ebnfDiagram-CCIWWBDH-BNbGnz6Y.js → ebnfDiagram-CCIWWBDH-CKdV58eP.js} +1 -1
  52. package/dist/web/assets/{erDiagram-Q63AITRT-C9FlumCQ.js → erDiagram-Q63AITRT-DCTuIs_r.js} +1 -1
  53. package/dist/web/assets/eventmodeling-45OFAUF4-BW_ZjAEZ.js +1 -0
  54. package/dist/web/assets/flowDiagram-23GEKE2U-kuTegDJX.js +1 -0
  55. package/dist/web/assets/{ganttDiagram-NO4QXBWP-CH9MCvIC.js → ganttDiagram-NO4QXBWP-a2WUc8wp.js} +1 -1
  56. package/dist/web/assets/{gitGraph-TEB2WS4Q-78WIeQv4.js → gitGraph-TEB2WS4Q-DMKf1qeU.js} +1 -1
  57. package/dist/web/assets/{gitGraphDiagram-IHSO6WYX-DhpBgjPK.js → gitGraphDiagram-IHSO6WYX-DW54jWiu.js} +1 -1
  58. package/dist/web/assets/{index-CubZRCZd.js → index-BteexwNd.js} +3 -3
  59. package/dist/web/assets/{info-DKCQHKI2-C92zll-G.js → info-DKCQHKI2-BeOi6-NO.js} +1 -1
  60. package/dist/web/assets/{infoDiagram-FWYZ7A6U-SJzTsCEQ.js → infoDiagram-FWYZ7A6U-DnmfPppA.js} +1 -1
  61. package/dist/web/assets/{ishikawaDiagram-FXEZZL3T-uPFBPNUE.js → ishikawaDiagram-FXEZZL3T-CPNmCU4V.js} +1 -1
  62. package/dist/web/assets/{journeyDiagram-5HDEW3XC-Yp2LdPKb.js → journeyDiagram-5HDEW3XC-BJ1dpMIR.js} +1 -1
  63. package/dist/web/assets/{kanban-definition-HUTT4EX6-CkkJLiTZ.js → kanban-definition-HUTT4EX6-CTUMFpnW.js} +1 -1
  64. package/dist/web/assets/{line-UR1QpiGL.js → line-BxjdmOYH.js} +1 -1
  65. package/dist/web/assets/{linear-Dv1BPDYH.js → linear-BTFwxw2k.js} +1 -1
  66. package/dist/web/assets/{mermaid-parser.core-CZSrtYeZ.js → mermaid-parser.core-xq_aCbXg.js} +3 -3
  67. package/dist/web/assets/{mermaid.core-3IhLnwHU.js → mermaid.core-CJ7BhoQw.js} +3 -3
  68. package/dist/web/assets/{mindmap-definition-LN4V7U3C-D1TtVuKI.js → mindmap-definition-LN4V7U3C-CGKOonoC.js} +1 -1
  69. package/dist/web/assets/{packet-7NZHBO7P-CJ2IWX3g.js → packet-7NZHBO7P-DcZTUk_n.js} +1 -1
  70. package/dist/web/assets/{pegDiagram-2B236MQR-BHoRQXZg.js → pegDiagram-2B236MQR-BQhasiHR.js} +1 -1
  71. package/dist/web/assets/{pie-RZYD4A2V-oA5BEo9n.js → pie-RZYD4A2V-CoNqq_hi.js} +1 -1
  72. package/dist/web/assets/{pieDiagram-ENE6RG2P-CQHUvgRQ.js → pieDiagram-ENE6RG2P-DjXgajVD.js} +1 -1
  73. package/dist/web/assets/{quadrantDiagram-ABIIQ3AL-Cns6Us8l.js → quadrantDiagram-ABIIQ3AL-DnMCZ8Lo.js} +1 -1
  74. package/dist/web/assets/{radar-I7S5WNFK-D5BbXMdK.js → radar-I7S5WNFK-DNuRmGvt.js} +1 -1
  75. package/dist/web/assets/{railroad-3IZDKUUU-DFBa68pp.js → railroad-3IZDKUUU-BWCSIZRZ.js} +1 -1
  76. package/dist/web/assets/railroad-abnf-AHOZXSZD-CUq87fi8.js +1 -0
  77. package/dist/web/assets/railroad-ebnf-EBAXGLYW-Bx6VqkgS.js +1 -0
  78. package/dist/web/assets/railroad-peg-LSFZ7HO6-DkT6zLYM.js +1 -0
  79. package/dist/web/assets/{railroadDiagram-RFXS5EU6-BhjRkGS_.js → railroadDiagram-RFXS5EU6-COtqBRRI.js} +1 -1
  80. package/dist/web/assets/{requirementDiagram-TGXJPOKE-B3Vrz4dg.js → requirementDiagram-TGXJPOKE-Cgm9XId4.js} +1 -1
  81. package/dist/web/assets/{sankeyDiagram-HTMAVEWB-IguzjAYn.js → sankeyDiagram-HTMAVEWB-CCOMrkbd.js} +1 -1
  82. package/dist/web/assets/{sequenceDiagram-DBY2YBRQ-uvBF9oJI.js → sequenceDiagram-DBY2YBRQ-CL0wy8uA.js} +1 -1
  83. package/dist/web/assets/{src-C1GaCc7i.js → src-CvIIQCAG.js} +1 -1
  84. package/dist/web/assets/{stateDiagram-2N3HPSRC-D55Ia0GX.js → stateDiagram-2N3HPSRC-C5b_pAiI.js} +1 -1
  85. package/dist/web/assets/stateDiagram-v2-6OUMAXLB-CbW-xCPn.js +1 -0
  86. package/dist/web/assets/{swimlanes-5IMT3BWC-CxH58sKc.js → swimlanes-5IMT3BWC-J11uWvqa.js} +1 -1
  87. package/dist/web/assets/swimlanesDiagram-G3AALYLV-DpbNWekf.js +8 -0
  88. package/dist/web/assets/{timeline-definition-FHXFAJF6-BOpGS8lX.js → timeline-definition-FHXFAJF6-Dsvj6fbD.js} +1 -1
  89. package/dist/web/assets/{treeView-QDETBFTQ-BLLCYqFV.js → treeView-QDETBFTQ-FH3Xeeef.js} +1 -1
  90. package/dist/web/assets/{treemap-6X3UGDF4-Cs2rTjAs.js → treemap-6X3UGDF4-D1TKNacZ.js} +1 -1
  91. package/dist/web/assets/{vennDiagram-L72KCM5P-JEEkwytf.js → vennDiagram-L72KCM5P-D4zm__Fz.js} +1 -1
  92. package/dist/web/assets/{wardley-OPB4EBWU-CCQlq4PR.js → wardley-OPB4EBWU-BRLeItQR.js} +1 -1
  93. package/dist/web/assets/{wardleyDiagram-EHGQE667-BiZiwurx.js → wardleyDiagram-EHGQE667-B7j5UliQ.js} +1 -1
  94. package/dist/web/assets/{xychartDiagram-FW5EYKEG-DKg63gko.js → xychartDiagram-FW5EYKEG-Bi0MfuVK.js} +1 -1
  95. package/dist/web/index.html +1 -1
  96. package/package.json +1 -1
  97. package/dist/web/assets/architecture-TIHT7OUA-BjaTawyn.js +0 -1
  98. package/dist/web/assets/channel-HnF1q1Mh.js +0 -1
  99. package/dist/web/assets/classDiagram-OUVF2IWQ-eVXwjNrO.js +0 -1
  100. package/dist/web/assets/classDiagram-v2-EOCWNBFH-eVXwjNrO.js +0 -1
  101. package/dist/web/assets/eventmodeling-45OFAUF4-BIuBn_KP.js +0 -1
  102. package/dist/web/assets/flowDiagram-23GEKE2U-D38IdS7U.js +0 -1
  103. package/dist/web/assets/railroad-abnf-AHOZXSZD-BZJp7hTI.js +0 -1
  104. package/dist/web/assets/railroad-ebnf-EBAXGLYW-B7zfPT86.js +0 -1
  105. package/dist/web/assets/railroad-peg-LSFZ7HO6-DGmY03r8.js +0 -1
  106. package/dist/web/assets/stateDiagram-v2-6OUMAXLB-D9CZKnmk.js +0 -1
  107. package/dist/web/assets/swimlanesDiagram-G3AALYLV-B7yosACx.js +0 -8
package/dist/api.d.ts CHANGED
@@ -13,7 +13,7 @@ export interface AskOpts {
13
13
  */
14
14
  export declare function ask(deck: Deck, opts?: AskOpts): Promise<ResolutionEnvelope>;
15
15
  /** Sugar: a single `kind:'notify'` acknowledgement. */
16
- export declare function notify(title: string, body?: string): Promise<void>;
16
+ export declare function notify(title: string, subtitle: string, body?: string): Promise<void>;
17
17
  export interface InboxOpts {
18
18
  cols?: number;
19
19
  rows?: number;
package/dist/api.js CHANGED
@@ -4,7 +4,7 @@ import { join } from 'node:path';
4
4
  import { resolveInteractionDir } from './tui/app.js';
5
5
  import { InboxController } from './inbox/controller.js';
6
6
  import { deckPath, atomicWriteJson, stampCanvasNode } from './inbox/convention.js';
7
- import { resolveDeckBodyPaths } from './inbox/deck-schema.js';
7
+ import { resolveDeckBodyPaths, validateDeck } from './inbox/deck-schema.js';
8
8
  import { notifyDeck } from './inbox/deck-factories.js';
9
9
  import { buildSummary } from './summary.js';
10
10
  const RESPONSE_SCHEMA_ID = 'humanloop.response/v2';
@@ -23,7 +23,7 @@ export async function ask(deck, opts = {}) {
23
23
  // resolved BEFORE the deck is ever written to disk, so every reader
24
24
  // downstream (terminal render, the live-reload poller, the browser server)
25
25
  // only ever sees a plain `body`.
26
- deck = resolveDeckBodyPaths(deck, dir);
26
+ deck = validateDeck(resolveDeckBodyPaths(deck, dir));
27
27
  stampCanvasNode(deck);
28
28
  atomicWriteJson(deckPath(dir), deck);
29
29
  const { responses, completedAt, responsePath, deck: answeredDeck } = await resolveInteractionDir(dir, deck, {
@@ -42,8 +42,8 @@ export async function ask(deck, opts = {}) {
42
42
  };
43
43
  }
44
44
  /** Sugar: a single `kind:'notify'` acknowledgement. */
45
- export async function notify(title, body) {
46
- const deck = notifyDeck(title, body !== undefined ? { body } : {});
45
+ export async function notify(title, subtitle, body) {
46
+ const deck = notifyDeck(title, { subtitle, ...(body !== undefined ? { body } : {}) });
47
47
  await ask(deck, {});
48
48
  }
49
49
  /** Open the centralized inbox controller in the current human terminal. */
package/dist/cli.js CHANGED
@@ -85,7 +85,7 @@ root.command('register').description('Register a root owned by a host.').require
85
85
  });
86
86
  root.command('unregister').description('Remove a matching root registration without deleting tickets.').requiredOption('--root <path>').requiredOption('--owner <owner>').action((options) => emit({ removed: unregisterInboxRoot(resolve(options.root), options.owner) }));
87
87
  root.command('list').description('List registered roots and availability.').action(() => emit(listInboxRoots()));
88
- program.command('deck').command('ask').description('Submit a durable deck ticket; it never changes tmux. --inline blocks in this terminal instead.').option('--root <path>').option('--inline', 'present the deck in this terminal and block until it is answered').action(async (options) => {
88
+ program.command('deck').command('ask').description('Submit a durable deck ticket; every interaction needs a one-sentence subtitle stating the decision, recommendation/status, and stakes. --inline blocks in this terminal instead.').option('--root <path>').option('--inline', 'present the deck in this terminal and block until it is answered').action(async (options) => {
89
89
  try {
90
90
  const body = objectInput();
91
91
  const deck = validateDeck(body.deck);
@@ -102,11 +102,13 @@ program.command('deck').command('ask').description('Submit a durable deck ticket
102
102
  fail(error);
103
103
  }
104
104
  });
105
- program.command('review').command('open').description('Submit a durable anchored review; it never changes tmux. --inline blocks in this terminal instead.').option('--root <path>').option('--inline', 'run the review in this terminal and block until submitted').action(async (options) => {
105
+ program.command('review').command('open').description('Submit a durable anchored review; subtitle is a required one-sentence recommendation/status and stakes. --inline blocks in this terminal instead.').option('--root <path>').option('--inline', 'run the review in this terminal and block until submitted').action(async (options) => {
106
106
  try {
107
107
  const body = objectInput();
108
108
  if (typeof body.file !== 'string' || !existsSync(resolve(body.file)))
109
109
  throw new Error('file must be an existing markdown path');
110
+ if (typeof body.subtitle !== 'string' || body.subtitle.trim() === '')
111
+ throw new Error('subtitle is required and must be a non-empty plain-English sentence stating the recommendation/status and stakes');
110
112
  const absFile = resolve(body.file);
111
113
  const output = typeof body.output === 'string' ? resolve(body.output) : `${absFile}.feedback.json`;
112
114
  if (options.inline) {
@@ -118,7 +120,7 @@ program.command('review').command('open').description('Submit a durable anchored
118
120
  if (typeof body.title !== 'string' || !body.title)
119
121
  throw new Error('title is required');
120
122
  const registration = options.root === undefined ? managedInboxRoot() : requireRegisteredRoot(options.root);
121
- emit({ ...submitReview({ root: registration.root, id: typeof body.id === 'string' ? body.id : randomUUID(), review: { file: absFile, output, title: body.title, source: typeof body.source === 'object' && body.source !== null ? body.source : {} } }), queued: true });
123
+ emit({ ...submitReview({ root: registration.root, id: typeof body.id === 'string' ? body.id : randomUUID(), review: { file: absFile, output, title: body.title, subtitle: body.subtitle, source: typeof body.source === 'object' && body.source !== null ? body.source : {} } }), queued: true });
122
124
  }
123
125
  catch (error) {
124
126
  fail(error);
@@ -774,7 +774,14 @@ export class InboxController {
774
774
  const selected = this.items[this.selectedIndex];
775
775
  if (selected === undefined)
776
776
  return [` ${DIM}Select a pending interaction.${RESET}`];
777
- const lines = [` ${BOLD}${CYAN}${selected.title}${RESET}`, '', ` ${DIM}${selected.kind} · ${sourceLabel(selected.source)}${RESET}`];
777
+ const source = sourceLabel(selected.source);
778
+ const lines = [` ${BOLD}${CYAN}${selected.title}${RESET}`, ''];
779
+ if (selected.kind === 'review') {
780
+ for (const rendered of renderMarkdown(selected.subtitle, Math.max(1, width - 2)))
781
+ lines.push(` ${rendered}`);
782
+ lines.push('');
783
+ }
784
+ lines.push(` ${DIM}${selected.kind}${source === undefined ? '' : ` · ${source}`}${RESET}`);
778
785
  if (selected.kind === 'review') {
779
786
  lines.push('', ` ${DIM}${selected.file}${RESET}`);
780
787
  const draft = readJson(progressPath(selected.dir))?.comments;
@@ -798,9 +805,8 @@ export class InboxController {
798
805
  if (deck !== null) {
799
806
  for (const interaction of deck.interactions) {
800
807
  lines.push('', ` ${BOLD}${interaction.title}${RESET}`);
801
- if (interaction.subtitle)
802
- for (const rendered of renderMarkdown(interaction.subtitle, Math.max(1, width - 2)))
803
- lines.push(` ${rendered}`);
808
+ for (const rendered of renderMarkdown(interaction.subtitle, Math.max(1, width - 2)))
809
+ lines.push(` ${rendered}`);
804
810
  if (interaction.body)
805
811
  for (const rendered of renderMarkdown(interaction.body, Math.max(1, width - 2)))
806
812
  lines.push(` ${rendered}`);
@@ -911,6 +917,5 @@ function isToggleCloseChord(input) { return input === '\x1bi' || input === '\x1b
911
917
  function isAnswerBearingDeck(deck) {
912
918
  return deck.interactions.some((interaction) => interaction.kind !== 'notify');
913
919
  }
914
- /** Prefer a human-meaningful source label, falling back to the raw node id
915
- * before an opaque "unknown source" a crouter ticket always carries nodeId. */
916
- function sourceLabel(source) { return source.sessionName ?? source.askedBy ?? source.nodeId ?? 'unknown source'; }
920
+ /** Machine node IDs remain stored for routing, but passive detail shows only authored labels. */
921
+ function sourceLabel(source) { return source.sessionName?.trim() || source.askedBy?.trim() || undefined; }
@@ -1,6 +1,8 @@
1
1
  import type { Deck } from '../types.js';
2
2
  export interface NotifyDeckOpts {
3
+ /** One plain-English sentence stating the notification's status and stakes. */
4
+ subtitle: string;
3
5
  body?: string;
4
6
  }
5
7
  /** Build a validated single-option notify deck. id: 'notify', kind: 'notify'. */
6
- export declare function notifyDeck(title: string, opts?: NotifyDeckOpts): Deck;
8
+ export declare function notifyDeck(title: string, opts: NotifyDeckOpts): Deck;
@@ -1,11 +1,12 @@
1
1
  import { validateDeck } from './deck-schema.js';
2
2
  /** Build a validated single-option notify deck. id: 'notify', kind: 'notify'. */
3
- export function notifyDeck(title, opts = {}) {
3
+ export function notifyDeck(title, opts) {
4
4
  return validateDeck({
5
5
  title,
6
6
  interactions: [{
7
7
  id: 'notify',
8
8
  title,
9
+ subtitle: opts.subtitle,
9
10
  ...(opts.body !== undefined ? { body: opts.body } : {}),
10
11
  kind: 'notify',
11
12
  options: [{ id: 'ok', label: 'OK' }],
@@ -23,7 +23,7 @@ export declare const deckSchema: z.ZodObject<{
23
23
  interactions: z.ZodArray<z.ZodObject<{
24
24
  id: z.ZodString;
25
25
  title: z.ZodString;
26
- subtitle: z.ZodOptional<z.ZodString>;
26
+ subtitle: z.ZodString;
27
27
  body: z.ZodOptional<z.ZodString>;
28
28
  bodyPath: z.ZodOptional<z.ZodString>;
29
29
  options: z.ZodArray<z.ZodObject<{
@@ -54,6 +54,7 @@ export declare const reviewDescriptorSchema: z.ZodObject<{
54
54
  file: z.ZodString;
55
55
  output: z.ZodString;
56
56
  title: z.ZodString;
57
+ subtitle: z.ZodString;
57
58
  source: z.ZodObject<{
58
59
  sessionName: z.ZodOptional<z.ZodString>;
59
60
  askedBy: z.ZodOptional<z.ZodString>;
@@ -8,7 +8,7 @@ export const interactionOptionSchema = z.object({ id: z.string().min(1), label:
8
8
  export const preAnswerSchema = z.object({ selectedOptionId: z.string().optional(), selectedOptionIds: z.array(z.string()).optional(), freetext: z.string().optional(), label: z.string().optional() });
9
9
  const interactionSchema = z.object({
10
10
  id: z.string().regex(/^[A-Za-z0-9_-]+$/, { error: 'interaction id must match /^[A-Za-z0-9_-]+$/' }).min(1).max(64),
11
- title: z.string().trim().min(1), subtitle: z.string().min(1).optional(), body: z.string().optional(), bodyPath: z.string().optional(),
11
+ title: z.string().trim().min(1), subtitle: z.string().trim().min(1), body: z.string().optional(), bodyPath: z.string().optional(),
12
12
  options: z.array(interactionOptionSchema), multiSelect: z.boolean().optional(), allowFreetext: z.boolean().optional(), freetextLabel: z.string().optional(), kind: z.enum(INTERACTION_KINDS).optional(), preAnswered: preAnswerSchema.optional(),
13
13
  });
14
14
  const deckSourceSchema = z.object({ sessionName: z.string().optional(), askedBy: z.string().optional(), blockedSince: z.string().optional(), nodeId: z.string().optional(), visual: z.literal('humanloop.visual/v1').optional() });
@@ -27,7 +27,8 @@ export const reviewDescriptorSchema = z.object({
27
27
  schema: z.literal('humanloop.review/v1'),
28
28
  file: z.string().min(1).refine(isAbsolute, 'file must be absolute'),
29
29
  output: z.string().min(1).refine(isAbsolute, 'output must be absolute'),
30
- title: z.string().min(1),
30
+ title: z.string().trim().min(1),
31
+ subtitle: z.string().trim().min(1),
31
32
  source: reviewSourceSchema,
32
33
  blockedSince: z.string().datetime({ offset: true }),
33
34
  }).strict();
@@ -45,7 +45,7 @@ function reviewSummary(dir, id) {
45
45
  catch {
46
46
  return null;
47
47
  }
48
- return { dir, id, kind: 'review', title: review.title, file: review.file, output: review.output, source: review.source, blockedSince: review.blockedSince, claim: claimSummary(dir) };
48
+ return { dir, id, kind: 'review', title: review.title, subtitle: review.subtitle, file: review.file, output: review.output, source: review.source, blockedSince: review.blockedSince, claim: claimSummary(dir) };
49
49
  }
50
50
  /** Read all unresolved deck/review tickets, newest first. Progress never affects visibility. */
51
51
  export function scanInbox(roots) {
@@ -124,7 +124,7 @@ export function submitReview(opts) {
124
124
  try {
125
125
  if (hasTicketProtocolState(dir))
126
126
  throw new Error(`ticket protocol state already exists: ${dir}`);
127
- const descriptor = validateReviewProjection(dir, { schema: 'humanloop.review/v1', file: source, output: resolve(opts.review.output ?? `${dir}/feedback.json`), title: opts.review.title, source: opts.review.source, blockedSince: opts.review.blockedSince ?? new Date().toISOString() });
127
+ const descriptor = validateReviewProjection(dir, { schema: 'humanloop.review/v1', file: source, output: resolve(opts.review.output ?? `${dir}/feedback.json`), title: opts.review.title, subtitle: opts.review.subtitle, source: opts.review.source, blockedSince: opts.review.blockedSince ?? new Date().toISOString() });
128
128
  publishRequest(reviewPath(dir), descriptor);
129
129
  signalInboxActivity();
130
130
  return { id: opts.id, dir, kind: 'review' };
package/dist/inbox/tui.js CHANGED
@@ -43,11 +43,8 @@ function buildItemLines(item, index, selectedIndex, contentWidth) {
43
43
  const cursor = index === selectedIndex ? `${CYAN}▸${RESET} ` : ' ';
44
44
  const titleWidth = Math.max(1, contentWidth - age.length - 6);
45
45
  const row = `${cursor}${ansiColor(icon, KIND_COLOR[kind] ?? 'cyan')} ${BOLD}${truncateRow(item.title || `(${item.id.slice(0, 8)})`, titleWidth)}${RESET} ${DIM}${age}${RESET}`;
46
- if (item.claim)
47
- return [row, ` ${DIM}${truncateRow(`claimed by ${item.claim.owner}`, contentWidth - 6)}${RESET}`];
48
- if (item.subtitle)
49
- return [row, ` ${DIM}${truncateRow(item.subtitle, contentWidth - 6)}${RESET}`];
50
- return [row];
46
+ const subtitle = item.claim ? `claimed by ${item.claim.owner} · ${item.subtitle}` : item.subtitle;
47
+ return [row, ` ${DIM}${truncateRow(subtitle, contentWidth - 6)}${RESET}`];
51
48
  }
52
49
  /** Select a contiguous row window that always contains the selected ticket. */
53
50
  function visibleWindow(rows, selectedIndex, capacity) {
@@ -21,7 +21,7 @@ const preAnsweredSchema = z.object({ selectedOptionId: z.string().optional(), se
21
21
  const interactionInputSchema = z.object({
22
22
  id: z.string().regex(/^[A-Za-z0-9_-]+$/).min(1).max(64),
23
23
  title: z.string().min(1),
24
- subtitle: z.string().min(1).optional(),
24
+ subtitle: z.string().trim().min(1),
25
25
  body: z.string().optional(),
26
26
  bodyPath: z.string().optional(),
27
27
  options: z.array(optionInputSchema),
@@ -34,7 +34,7 @@ const interactionInputSchema = z.object({
34
34
  const canonicalInteractionSchema = z.object({
35
35
  id: z.string().regex(/^[A-Za-z0-9_-]+$/).min(1).max(64),
36
36
  title: z.string().min(1),
37
- subtitle: z.string().min(1).optional(),
37
+ subtitle: z.string().trim().min(1),
38
38
  body: z.string().optional(),
39
39
  options: z.array(optionSchema),
40
40
  multiSelect: z.boolean().optional(),
@@ -125,7 +125,7 @@ export function canonicalizeInteraction(raw) {
125
125
  const canonical = {
126
126
  id: parsed.id,
127
127
  title: parsed.title,
128
- ...(parsed.subtitle === undefined ? {} : { subtitle: parsed.subtitle }),
128
+ subtitle: parsed.subtitle,
129
129
  ...(parsed.body === undefined ? {} : { body: parsed.body }),
130
130
  options: parsed.options.map((option) => ({ id: option.id, label: option.label, ...(option.description === undefined ? {} : { description: option.description }) })),
131
131
  ...(parsed.multiSelect === undefined ? {} : { multiSelect: parsed.multiSelect }),
package/dist/types.d.ts CHANGED
@@ -31,9 +31,8 @@ export interface Interaction {
31
31
  id: string;
32
32
  /** Short topic — the thing being decided, not the decision. */
33
33
  title: string;
34
- /** ONE-sentence TL;DR of the choice/stakes. Renders as markdown in the
35
- * scrollable region; keep it a single line — long prose belongs in `body`. */
36
- subtitle?: string;
34
+ /** One plain-English sentence stating the decision, recommendation/status, and stakes. */
35
+ subtitle: string;
37
36
  /** The full explanation: directive-flavored markdown rendered by termrender.
38
37
  * This is where long or rich content goes (never the wall of detail in
39
38
  * `subtitle`). `bodyPath` is the same content sourced from a file. */
@@ -197,7 +196,7 @@ interface TicketSummaryBase {
197
196
  dir: string;
198
197
  id: string;
199
198
  title: string;
200
- subtitle?: string;
199
+ subtitle: string;
201
200
  blockedSince: string;
202
201
  source: DeckSource;
203
202
  claim?: ClaimSummary;
@@ -220,6 +219,7 @@ export interface ReviewDescriptor {
220
219
  file: string;
221
220
  output: string;
222
221
  title: string;
222
+ subtitle: string;
223
223
  source: DeckSource;
224
224
  blockedSince: string;
225
225
  }
@@ -281,7 +281,7 @@ export interface CanonicalInteractionOption {
281
281
  export interface CanonicalInteraction {
282
282
  id: string;
283
283
  title: string;
284
- subtitle?: string;
284
+ subtitle: string;
285
285
  body?: string;
286
286
  options: CanonicalInteractionOption[];
287
287
  multiSelect?: boolean;
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-CZSrtYeZ.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-C1GaCc7i.js";import"./chunk-WYO6CB5R-DCmNxnM8.js";import"./chunk-VAUOI2AC-Dr7gTfE6.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CvpfWs-s.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
1
+ import{m as e,t}from"./mermaid-parser.core-xq_aCbXg.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-CvIIQCAG.js";import"./chunk-WYO6CB5R-reDXIQan.js";import"./chunk-VAUOI2AC-DQVUYSsu.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-b09YHDGP.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -1 +1 @@
1
- import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-CccYnoy2.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-D6gNQP9S.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -0,0 +1 @@
1
+ import"./chunk-KEIR6QF5-BfrZ3jm6.js";import{M as e}from"./mermaid-parser.core-xq_aCbXg.js";export{e as createArchitectureServices};