@crouton-kit/humanloop 0.4.10 → 0.4.11
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/dist/api.d.ts +1 -1
- package/dist/api.js +4 -4
- package/dist/cli.js +5 -3
- package/dist/inbox/controller.js +6 -7
- package/dist/inbox/deck-factories.d.ts +3 -1
- package/dist/inbox/deck-factories.js +2 -1
- package/dist/inbox/deck-schema.d.ts +2 -1
- package/dist/inbox/deck-schema.js +3 -2
- package/dist/inbox/scan.js +1 -1
- package/dist/inbox/tickets.js +1 -1
- package/dist/inbox/tui.js +2 -5
- package/dist/inbox/visual.js +3 -3
- package/dist/types.d.ts +5 -5
- package/dist/web/assets/{abnfDiagram-VRR7QNED-By5eg834.js → abnfDiagram-VRR7QNED-C3G7ucis.js} +1 -1
- package/dist/web/assets/{arc-vdkyOWe2.js → arc-CfHbBVfI.js} +1 -1
- package/dist/web/assets/architecture-TIHT7OUA-XeXU8J5n.js +1 -0
- package/dist/web/assets/{architectureDiagram-ZJ3FMSHR-CKy_ZE5N.js → architectureDiagram-ZJ3FMSHR-BCs4FMRj.js} +1 -1
- package/dist/web/assets/{blockDiagram-677ZJIJ3-5LiBO7Io.js → blockDiagram-677ZJIJ3-Ddt1PlNC.js} +1 -1
- package/dist/web/assets/{c4Diagram-LMCZKHZV-D79itWPb.js → c4Diagram-LMCZKHZV-BWwkKdPZ.js} +1 -1
- package/dist/web/assets/channel-BfMifkFv.js +1 -0
- package/dist/web/assets/{chunk-32BRIVSS-4LnkfHUo.js → chunk-32BRIVSS-BjyMBLnt.js} +1 -1
- package/dist/web/assets/{chunk-52WLFC77-2raU4D63.js → chunk-52WLFC77-DwnRc5bP.js} +1 -1
- package/dist/web/assets/{chunk-C7G6YPKG-Cq1co5_N.js → chunk-C7G6YPKG-Cv5J31rb.js} +1 -1
- package/dist/web/assets/{chunk-EX3LRPZG-5pgwNnOC.js → chunk-EX3LRPZG-Ds-y37uL.js} +1 -1
- package/dist/web/assets/{chunk-FWX5IMBZ-DLBDSAUG.js → chunk-FWX5IMBZ-BzgaWqkI.js} +2 -2
- package/dist/web/assets/{chunk-HOUHSVGY-7q8piy7F.js → chunk-HOUHSVGY-CB_Rjcvz.js} +1 -1
- package/dist/web/assets/{chunk-ICXQ74PX-B8V7Hf73.js → chunk-ICXQ74PX-a8BpKR5q.js} +1 -1
- package/dist/web/assets/{chunk-MOJQB5TN-CvpfWs-s.js → chunk-MOJQB5TN-b09YHDGP.js} +1 -1
- package/dist/web/assets/{chunk-OGEWGWER-BIcVy_-w.js → chunk-OGEWGWER-CK9U88Zp.js} +1 -1
- package/dist/web/assets/{chunk-PUDLZKDR-HzobduhR.js → chunk-PUDLZKDR-DBp4NxwM.js} +1 -1
- package/dist/web/assets/{chunk-Q4XR5HBZ-BVzkZDMe.js → chunk-Q4XR5HBZ-Cn7tHzZm.js} +1 -1
- package/dist/web/assets/{chunk-RYQCIY6F-BXvuzyNS.js → chunk-RYQCIY6F-DS8RMCZK.js} +1 -1
- package/dist/web/assets/{chunk-V7JOEXUC-BGmVQ8Gl.js → chunk-V7JOEXUC-BCTcSsiS.js} +1 -1
- package/dist/web/assets/{chunk-VAUOI2AC-Dr7gTfE6.js → chunk-VAUOI2AC-DQVUYSsu.js} +1 -1
- package/dist/web/assets/{chunk-VR4S4FIN-T9cDy9xC.js → chunk-VR4S4FIN-D5E0Nzn2.js} +1 -1
- package/dist/web/assets/{chunk-WYO6CB5R-DCmNxnM8.js → chunk-WYO6CB5R-reDXIQan.js} +1 -1
- package/dist/web/assets/{chunk-XXDRQBXY-D3CBQrix.js → chunk-XXDRQBXY-BFea61gW.js} +1 -1
- package/dist/web/assets/{chunk-ZGVPDNZ5-az9vUYuT.js → chunk-ZGVPDNZ5-BbVer9LG.js} +1 -1
- package/dist/web/assets/classDiagram-OUVF2IWQ-B3fMukMS.js +1 -0
- package/dist/web/assets/classDiagram-v2-EOCWNBFH-B3fMukMS.js +1 -0
- package/dist/web/assets/{cose-bilkent-JH36ORCC-BA_JeicW.js → cose-bilkent-JH36ORCC-Do23kUxV.js} +1 -1
- package/dist/web/assets/{cynefin-VYW2F7L2-CctiGrrW.js → cynefin-VYW2F7L2-B51RrEfW.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-TSTJHNR4-CUy0zmIT.js → cynefinDiagram-TSTJHNR4-BMRRvJi_.js} +1 -1
- package/dist/web/assets/{dagre-VKFMJZFB-Ds3jP1MK.js → dagre-VKFMJZFB-Cq3oNHAr.js} +1 -1
- package/dist/web/assets/{diagram-FQU43EPY-EwA9l88S.js → diagram-FQU43EPY-B_OlWSFb.js} +1 -1
- package/dist/web/assets/{diagram-G47NLZAW-DABQWhEl.js → diagram-G47NLZAW-CinfsHac.js} +1 -1
- package/dist/web/assets/{diagram-NH7WQ7WH-ghhVWX8i.js → diagram-NH7WQ7WH-B1z5z_xR.js} +1 -1
- package/dist/web/assets/{diagram-OA4YK3LP-DQqZ5_Hn.js → diagram-OA4YK3LP-CaXxWKyb.js} +1 -1
- package/dist/web/assets/{diagram-WEI45ONY-B7MqXpzX.js → diagram-WEI45ONY-DJ_ofe0i.js} +1 -1
- package/dist/web/assets/{dist-CccYnoy2.js → dist-D6gNQP9S.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-CCIWWBDH-BNbGnz6Y.js → ebnfDiagram-CCIWWBDH-CKdV58eP.js} +1 -1
- package/dist/web/assets/{erDiagram-Q63AITRT-C9FlumCQ.js → erDiagram-Q63AITRT-DCTuIs_r.js} +1 -1
- package/dist/web/assets/eventmodeling-45OFAUF4-BW_ZjAEZ.js +1 -0
- package/dist/web/assets/flowDiagram-23GEKE2U-kuTegDJX.js +1 -0
- package/dist/web/assets/{ganttDiagram-NO4QXBWP-CH9MCvIC.js → ganttDiagram-NO4QXBWP-a2WUc8wp.js} +1 -1
- package/dist/web/assets/{gitGraph-TEB2WS4Q-78WIeQv4.js → gitGraph-TEB2WS4Q-DMKf1qeU.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-IHSO6WYX-DhpBgjPK.js → gitGraphDiagram-IHSO6WYX-DW54jWiu.js} +1 -1
- package/dist/web/assets/{index-CubZRCZd.js → index-BteexwNd.js} +3 -3
- package/dist/web/assets/{info-DKCQHKI2-C92zll-G.js → info-DKCQHKI2-BeOi6-NO.js} +1 -1
- package/dist/web/assets/{infoDiagram-FWYZ7A6U-SJzTsCEQ.js → infoDiagram-FWYZ7A6U-DnmfPppA.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-FXEZZL3T-uPFBPNUE.js → ishikawaDiagram-FXEZZL3T-CPNmCU4V.js} +1 -1
- package/dist/web/assets/{journeyDiagram-5HDEW3XC-Yp2LdPKb.js → journeyDiagram-5HDEW3XC-BJ1dpMIR.js} +1 -1
- package/dist/web/assets/{kanban-definition-HUTT4EX6-CkkJLiTZ.js → kanban-definition-HUTT4EX6-CTUMFpnW.js} +1 -1
- package/dist/web/assets/{line-UR1QpiGL.js → line-BxjdmOYH.js} +1 -1
- package/dist/web/assets/{linear-Dv1BPDYH.js → linear-BTFwxw2k.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-CZSrtYeZ.js → mermaid-parser.core-xq_aCbXg.js} +3 -3
- package/dist/web/assets/{mermaid.core-3IhLnwHU.js → mermaid.core-CJ7BhoQw.js} +3 -3
- package/dist/web/assets/{mindmap-definition-LN4V7U3C-D1TtVuKI.js → mindmap-definition-LN4V7U3C-CGKOonoC.js} +1 -1
- package/dist/web/assets/{packet-7NZHBO7P-CJ2IWX3g.js → packet-7NZHBO7P-DcZTUk_n.js} +1 -1
- package/dist/web/assets/{pegDiagram-2B236MQR-BHoRQXZg.js → pegDiagram-2B236MQR-BQhasiHR.js} +1 -1
- package/dist/web/assets/{pie-RZYD4A2V-oA5BEo9n.js → pie-RZYD4A2V-CoNqq_hi.js} +1 -1
- package/dist/web/assets/{pieDiagram-ENE6RG2P-CQHUvgRQ.js → pieDiagram-ENE6RG2P-DjXgajVD.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-ABIIQ3AL-Cns6Us8l.js → quadrantDiagram-ABIIQ3AL-DnMCZ8Lo.js} +1 -1
- package/dist/web/assets/{radar-I7S5WNFK-D5BbXMdK.js → radar-I7S5WNFK-DNuRmGvt.js} +1 -1
- package/dist/web/assets/{railroad-3IZDKUUU-DFBa68pp.js → railroad-3IZDKUUU-BWCSIZRZ.js} +1 -1
- package/dist/web/assets/railroad-abnf-AHOZXSZD-CUq87fi8.js +1 -0
- package/dist/web/assets/railroad-ebnf-EBAXGLYW-Bx6VqkgS.js +1 -0
- package/dist/web/assets/railroad-peg-LSFZ7HO6-DkT6zLYM.js +1 -0
- package/dist/web/assets/{railroadDiagram-RFXS5EU6-BhjRkGS_.js → railroadDiagram-RFXS5EU6-COtqBRRI.js} +1 -1
- package/dist/web/assets/{requirementDiagram-TGXJPOKE-B3Vrz4dg.js → requirementDiagram-TGXJPOKE-Cgm9XId4.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-HTMAVEWB-IguzjAYn.js → sankeyDiagram-HTMAVEWB-CCOMrkbd.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-DBY2YBRQ-uvBF9oJI.js → sequenceDiagram-DBY2YBRQ-CL0wy8uA.js} +1 -1
- package/dist/web/assets/{src-C1GaCc7i.js → src-CvIIQCAG.js} +1 -1
- package/dist/web/assets/{stateDiagram-2N3HPSRC-D55Ia0GX.js → stateDiagram-2N3HPSRC-C5b_pAiI.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-6OUMAXLB-CbW-xCPn.js +1 -0
- package/dist/web/assets/{swimlanes-5IMT3BWC-CxH58sKc.js → swimlanes-5IMT3BWC-J11uWvqa.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-G3AALYLV-DpbNWekf.js +8 -0
- package/dist/web/assets/{timeline-definition-FHXFAJF6-BOpGS8lX.js → timeline-definition-FHXFAJF6-Dsvj6fbD.js} +1 -1
- package/dist/web/assets/{treeView-QDETBFTQ-BLLCYqFV.js → treeView-QDETBFTQ-FH3Xeeef.js} +1 -1
- package/dist/web/assets/{treemap-6X3UGDF4-Cs2rTjAs.js → treemap-6X3UGDF4-D1TKNacZ.js} +1 -1
- package/dist/web/assets/{vennDiagram-L72KCM5P-JEEkwytf.js → vennDiagram-L72KCM5P-D4zm__Fz.js} +1 -1
- package/dist/web/assets/{wardley-OPB4EBWU-CCQlq4PR.js → wardley-OPB4EBWU-BRLeItQR.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-EHGQE667-BiZiwurx.js → wardleyDiagram-EHGQE667-B7j5UliQ.js} +1 -1
- package/dist/web/assets/{xychartDiagram-FW5EYKEG-DKg63gko.js → xychartDiagram-FW5EYKEG-Bi0MfuVK.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/architecture-TIHT7OUA-BjaTawyn.js +0 -1
- package/dist/web/assets/channel-HnF1q1Mh.js +0 -1
- package/dist/web/assets/classDiagram-OUVF2IWQ-eVXwjNrO.js +0 -1
- package/dist/web/assets/classDiagram-v2-EOCWNBFH-eVXwjNrO.js +0 -1
- package/dist/web/assets/eventmodeling-45OFAUF4-BIuBn_KP.js +0 -1
- package/dist/web/assets/flowDiagram-23GEKE2U-D38IdS7U.js +0 -1
- package/dist/web/assets/railroad-abnf-AHOZXSZD-BZJp7hTI.js +0 -1
- package/dist/web/assets/railroad-ebnf-EBAXGLYW-B7zfPT86.js +0 -1
- package/dist/web/assets/railroad-peg-LSFZ7HO6-DGmY03r8.js +0 -1
- package/dist/web/assets/stateDiagram-v2-6OUMAXLB-D9CZKnmk.js +0 -1
- 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;
|
|
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;
|
|
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);
|
package/dist/inbox/controller.js
CHANGED
|
@@ -774,7 +774,8 @@ 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
|
|
777
|
+
const source = sourceLabel(selected.source);
|
|
778
|
+
const lines = [` ${BOLD}${CYAN}${selected.title}${RESET}`, '', ` ${DIM}${selected.kind}${source === undefined ? '' : ` · ${source}`}${RESET}`];
|
|
778
779
|
if (selected.kind === 'review') {
|
|
779
780
|
lines.push('', ` ${DIM}${selected.file}${RESET}`);
|
|
780
781
|
const draft = readJson(progressPath(selected.dir))?.comments;
|
|
@@ -798,9 +799,8 @@ export class InboxController {
|
|
|
798
799
|
if (deck !== null) {
|
|
799
800
|
for (const interaction of deck.interactions) {
|
|
800
801
|
lines.push('', ` ${BOLD}${interaction.title}${RESET}`);
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
lines.push(` ${rendered}`);
|
|
802
|
+
for (const rendered of renderMarkdown(interaction.subtitle, Math.max(1, width - 2)))
|
|
803
|
+
lines.push(` ${rendered}`);
|
|
804
804
|
if (interaction.body)
|
|
805
805
|
for (const rendered of renderMarkdown(interaction.body, Math.max(1, width - 2)))
|
|
806
806
|
lines.push(` ${rendered}`);
|
|
@@ -911,6 +911,5 @@ function isToggleCloseChord(input) { return input === '\x1bi' || input === '\x1b
|
|
|
911
911
|
function isAnswerBearingDeck(deck) {
|
|
912
912
|
return deck.interactions.some((interaction) => interaction.kind !== 'notify');
|
|
913
913
|
}
|
|
914
|
-
/**
|
|
915
|
-
|
|
916
|
-
function sourceLabel(source) { return source.sessionName ?? source.askedBy ?? source.nodeId ?? 'unknown source'; }
|
|
914
|
+
/** Machine node IDs remain stored for routing, but passive detail shows only authored labels. */
|
|
915
|
+
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
|
|
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.
|
|
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().
|
|
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();
|
package/dist/inbox/scan.js
CHANGED
|
@@ -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) {
|
package/dist/inbox/tickets.js
CHANGED
|
@@ -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
|
-
|
|
47
|
-
|
|
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) {
|
package/dist/inbox/visual.js
CHANGED
|
@@ -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().
|
|
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().
|
|
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
|
-
|
|
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
|
-
/**
|
|
35
|
-
|
|
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
|
|
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
|
|
284
|
+
subtitle: string;
|
|
285
285
|
body?: string;
|
|
286
286
|
options: CanonicalInteractionOption[];
|
|
287
287
|
multiSelect?: boolean;
|
package/dist/web/assets/{abnfDiagram-VRR7QNED-By5eg834.js → abnfDiagram-VRR7QNED-C3G7ucis.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as e,t}from"./mermaid-parser.core-
|
|
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-
|
|
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};
|