@tangle-network/agent-app 0.45.47 → 0.45.49
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/{DesignCanvas-P2ZVK6FM.js → DesignCanvas-JRBCAWHW.js} +2 -2
- package/dist/{DesignCanvasEditor-DGNCA54P.js → DesignCanvasEditor-J2OLS22G.js} +4 -4
- package/dist/{IntakeInterview-3ZIQMZS6.js → IntakeInterview-OKT6DCBN.js} +2 -2
- package/dist/InvitationsPanel-OFCYVSAE.js +9 -0
- package/dist/InviteAcceptPage-BDOO4JSE.js +7 -0
- package/dist/MembersPanel-3ZK2GCMC.js +9 -0
- package/dist/{TimelineEditor-OTNPJ3SN.js → TimelineEditor-52YEPDX5.js} +2 -2
- package/dist/VaultPane-IGJKB6CX.js +7 -0
- package/dist/assistant/index.d.ts +36 -11
- package/dist/assistant/index.js +235 -90
- package/dist/assistant/index.js.map +1 -1
- package/dist/{billing-BibxgALe.d.ts → billing-BuNlaKlE.d.ts} +15 -23
- package/dist/chat-react/index.js +2 -1
- package/dist/chat-react/index.js.map +1 -1
- package/dist/{chunk-TL37E5YY.js → chunk-33BN7P57.js} +6 -6
- package/dist/chunk-33BN7P57.js.map +1 -0
- package/dist/{chunk-IUSO2XRE.js → chunk-5MI2SKQH.js} +14 -15
- package/dist/chunk-5MI2SKQH.js.map +1 -0
- package/dist/{chunk-65OZT566.js → chunk-7LJYCHXK.js} +29 -27
- package/dist/chunk-7LJYCHXK.js.map +1 -0
- package/dist/chunk-AULM4X7U.js +77 -0
- package/dist/chunk-AULM4X7U.js.map +1 -0
- package/dist/{chunk-GNPN6ED4.js → chunk-CJHIAZKK.js} +128 -166
- package/dist/chunk-CJHIAZKK.js.map +1 -0
- package/dist/{chunk-54FYYXAX.js → chunk-ENLRJYVW.js} +21 -18
- package/dist/chunk-ENLRJYVW.js.map +1 -0
- package/dist/{chunk-F4XLTVQ3.js → chunk-GRDLGQ6A.js} +19 -18
- package/dist/chunk-GRDLGQ6A.js.map +1 -0
- package/dist/{chunk-BT4QFCTB.js → chunk-HSBJB46C.js} +13 -1
- package/dist/chunk-HSBJB46C.js.map +1 -0
- package/dist/{chunk-VOJB7MVG.js → chunk-I2CA5N7V.js} +70 -28
- package/dist/chunk-I2CA5N7V.js.map +1 -0
- package/dist/chunk-MLG6XKPV.js +44 -0
- package/dist/chunk-MLG6XKPV.js.map +1 -0
- package/dist/{chunk-IN6LNZ7O.js → chunk-Q2QKEV6J.js} +7 -7
- package/dist/{chunk-IN6LNZ7O.js.map → chunk-Q2QKEV6J.js.map} +1 -1
- package/dist/{chunk-B62EZF52.js → chunk-UMV45ZDF.js} +3 -3
- package/dist/{chunk-JJJEO4ND.js → chunk-VWTODXRW.js} +2 -2
- package/dist/{chunk-JJJEO4ND.js.map → chunk-VWTODXRW.js.map} +1 -1
- package/dist/{chunk-VCPZ3HTN.js → chunk-W7P5KV6O.js} +51 -27
- package/dist/chunk-W7P5KV6O.js.map +1 -0
- package/dist/{chunk-ZX5UT4HF.js → chunk-ZAKKG6WI.js} +354 -273
- package/dist/chunk-ZAKKG6WI.js.map +1 -0
- package/dist/{chunk-PE67O2LH.js → chunk-ZGY6QB4F.js} +21 -16
- package/dist/chunk-ZGY6QB4F.js.map +1 -0
- package/dist/design-canvas-react/index.js +18 -16
- package/dist/design-canvas-react/index.js.map +1 -1
- package/dist/design-canvas-react/lazy.js +1 -1
- package/dist/intakes-react/index.js +1 -1
- package/dist/intakes-react/lazy.js +1 -1
- package/dist/platform/index.d.ts +1 -1
- package/dist/platform/index.js +16 -16
- package/dist/platform/index.js.map +1 -1
- package/dist/sequences-react/index.js +2 -2
- package/dist/studio/index.d.ts +13 -1
- package/dist/studio/index.js +13 -1
- package/dist/studio-react/index.js +115 -78
- package/dist/studio-react/index.js.map +1 -1
- package/dist/studio-react/studio.css +0 -56
- package/dist/teams-react/index.js +4 -3
- package/dist/teams-react/lazy.js +3 -3
- package/dist/theme/index.js +1 -1
- package/dist/theme/tokens.css +15 -13
- package/dist/vault/index.js +1 -1
- package/dist/vault/lazy.js +1 -1
- package/dist/web-react/index.d.ts +16 -12
- package/dist/web-react/index.js +6 -4
- package/dist/work-product-react/index.js +9 -27
- package/dist/work-product-react/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/InvitationsPanel-F56UOQXA.js +0 -8
- package/dist/InviteAcceptPage-P3QJC3C6.js +0 -7
- package/dist/MembersPanel-XNLF3SA4.js +0 -8
- package/dist/VaultPane-MUWGYVJ7.js +0 -7
- package/dist/chunk-54FYYXAX.js.map +0 -1
- package/dist/chunk-65OZT566.js.map +0 -1
- package/dist/chunk-BT4QFCTB.js.map +0 -1
- package/dist/chunk-F4XLTVQ3.js.map +0 -1
- package/dist/chunk-GNPN6ED4.js.map +0 -1
- package/dist/chunk-IUSO2XRE.js.map +0 -1
- package/dist/chunk-PE67O2LH.js.map +0 -1
- package/dist/chunk-TL37E5YY.js.map +0 -1
- package/dist/chunk-VCPZ3HTN.js.map +0 -1
- package/dist/chunk-VOJB7MVG.js.map +0 -1
- package/dist/chunk-ZX5UT4HF.js.map +0 -1
- /package/dist/{DesignCanvas-P2ZVK6FM.js.map → DesignCanvas-JRBCAWHW.js.map} +0 -0
- /package/dist/{DesignCanvasEditor-DGNCA54P.js.map → DesignCanvasEditor-J2OLS22G.js.map} +0 -0
- /package/dist/{IntakeInterview-3ZIQMZS6.js.map → IntakeInterview-OKT6DCBN.js.map} +0 -0
- /package/dist/{InvitationsPanel-F56UOQXA.js.map → InvitationsPanel-OFCYVSAE.js.map} +0 -0
- /package/dist/{InviteAcceptPage-P3QJC3C6.js.map → InviteAcceptPage-BDOO4JSE.js.map} +0 -0
- /package/dist/{MembersPanel-XNLF3SA4.js.map → MembersPanel-3ZK2GCMC.js.map} +0 -0
- /package/dist/{TimelineEditor-OTNPJ3SN.js.map → TimelineEditor-52YEPDX5.js.map} +0 -0
- /package/dist/{VaultPane-MUWGYVJ7.js.map → VaultPane-IGJKB6CX.js.map} +0 -0
- /package/dist/{chunk-B62EZF52.js.map → chunk-UMV45ZDF.js.map} +0 -0
|
@@ -61,62 +61,6 @@
|
|
|
61
61
|
}
|
|
62
62
|
.animate-row-in { animation: studio-row-in 0.25s ease-out both; }
|
|
63
63
|
|
|
64
|
-
/* ── Studio: inline split shell (composer ⇆ gallery) ──
|
|
65
|
-
The composer is the same card in both states. Toggling the parent's
|
|
66
|
-
data-library-open grows the gallery in from the right (flex-grow 0→1) and
|
|
67
|
-
narrows the composer from centered to a left rail. max-width:1400px caps the
|
|
68
|
-
whole cluster on wide screens so extra width becomes neutral gutter. */
|
|
69
|
-
.studio-shell {
|
|
70
|
-
display: flex;
|
|
71
|
-
align-items: flex-start;
|
|
72
|
-
justify-content: center;
|
|
73
|
-
width: 100%;
|
|
74
|
-
max-width: 1400px;
|
|
75
|
-
margin: 0 auto;
|
|
76
|
-
}
|
|
77
|
-
.studio-shell[data-library-open='true'] { gap: 24px; }
|
|
78
|
-
|
|
79
|
-
.studio-composer {
|
|
80
|
-
flex: none;
|
|
81
|
-
width: 620px;
|
|
82
|
-
max-width: 100%;
|
|
83
|
-
transition: width 0.32s cubic-bezier(0.32, 0.72, 0, 1);
|
|
84
|
-
}
|
|
85
|
-
.studio-shell[data-library-open='true'] .studio-composer {
|
|
86
|
-
width: 50%;
|
|
87
|
-
max-width: 560px;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/* max-height:0 while closed hard-clamps the gallery out of layout — the card
|
|
91
|
-
grid's own min track width otherwise generates real height and leaks it into
|
|
92
|
-
the page scroll even at opacity:0. */
|
|
93
|
-
.studio-gallery {
|
|
94
|
-
flex-grow: 0;
|
|
95
|
-
flex-basis: 0;
|
|
96
|
-
min-width: 0;
|
|
97
|
-
max-height: 0;
|
|
98
|
-
overflow: hidden;
|
|
99
|
-
opacity: 0;
|
|
100
|
-
transform: translateX(20px);
|
|
101
|
-
pointer-events: none;
|
|
102
|
-
transition:
|
|
103
|
-
flex-grow 0.32s cubic-bezier(0.32, 0.72, 0, 1),
|
|
104
|
-
opacity 0.24s ease,
|
|
105
|
-
transform 0.32s cubic-bezier(0.32, 0.72, 0, 1);
|
|
106
|
-
}
|
|
107
|
-
.studio-shell[data-library-open='true'] .studio-gallery {
|
|
108
|
-
flex-grow: 1;
|
|
109
|
-
max-height: none;
|
|
110
|
-
opacity: 1;
|
|
111
|
-
transform: none;
|
|
112
|
-
pointer-events: auto;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
@media (prefers-reduced-motion: reduce) {
|
|
116
|
-
.studio-composer,
|
|
117
|
-
.studio-gallery { transition: none; }
|
|
118
|
-
}
|
|
119
|
-
|
|
120
64
|
@media (prefers-reduced-motion: reduce) {
|
|
121
65
|
.studio-sheet-content[data-state='open'],
|
|
122
66
|
.studio-sheet-content[data-state='closed'],
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MembersPanel
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-GRDLGQ6A.js";
|
|
4
4
|
import {
|
|
5
5
|
InvitationsPanel
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-5MI2SKQH.js";
|
|
7
|
+
import "../chunk-AULM4X7U.js";
|
|
7
8
|
import {
|
|
8
9
|
InviteAcceptPage
|
|
9
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-W7P5KV6O.js";
|
|
10
11
|
import "../chunk-6XIAPIW6.js";
|
|
11
12
|
export {
|
|
12
13
|
InvitationsPanel,
|
package/dist/teams-react/lazy.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// src/teams-react/lazy.tsx
|
|
2
2
|
import { lazy } from "react";
|
|
3
3
|
var MembersPanelLazy = lazy(
|
|
4
|
-
() => import("../MembersPanel-
|
|
4
|
+
() => import("../MembersPanel-3ZK2GCMC.js").then((m) => ({ default: m.MembersPanel }))
|
|
5
5
|
);
|
|
6
6
|
var InvitationsPanelLazy = lazy(
|
|
7
|
-
() => import("../InvitationsPanel-
|
|
7
|
+
() => import("../InvitationsPanel-OFCYVSAE.js").then((m) => ({ default: m.InvitationsPanel }))
|
|
8
8
|
);
|
|
9
9
|
var InviteAcceptPageLazy = lazy(
|
|
10
|
-
() => import("../InviteAcceptPage-
|
|
10
|
+
() => import("../InviteAcceptPage-BDOO4JSE.js").then((m) => ({ default: m.InviteAcceptPage }))
|
|
11
11
|
);
|
|
12
12
|
export {
|
|
13
13
|
InvitationsPanelLazy,
|
package/dist/theme/index.js
CHANGED
package/dist/theme/tokens.css
CHANGED
|
@@ -61,19 +61,21 @@
|
|
|
61
61
|
/* dark band — the dark theme's surface ladder, bottom up: canvas-backdrop,
|
|
62
62
|
background, input (recessed), card, secondary/muted/accent, popover,
|
|
63
63
|
border. The first three RETUNE the stops the light theme's ink also reads;
|
|
64
|
-
the top four are new rungs.
|
|
64
|
+
the top four are new rungs. Steps bg→card→secondary→popover measure
|
|
65
|
+
1.19/1.14/1.09 (card→popover 1.24) — ChatGPT-class steps at brand chroma:
|
|
66
|
+
visible on real displays, not just on the reference monitor. */
|
|
65
67
|
--neutral-16: oklch(0.16 0.018 280);
|
|
66
68
|
--neutral-16-hsl: 234.9 28.5% 6.4%;
|
|
67
69
|
--neutral-19: oklch(0.19 0.018 280);
|
|
68
70
|
--neutral-19-hsl: 234.5 21.2% 9%;
|
|
69
71
|
--neutral-22: oklch(0.215 0.018 280);
|
|
70
72
|
--neutral-22-hsl: 234.2 17.6% 11.3%;
|
|
71
|
-
--neutral-
|
|
72
|
-
--neutral-
|
|
73
|
-
--neutral-
|
|
74
|
-
--neutral-
|
|
75
|
-
--neutral-
|
|
76
|
-
--neutral-
|
|
73
|
+
--neutral-26: oklch(0.26 0.017 280);
|
|
74
|
+
--neutral-26-hsl: 233.8 12.9% 15.4%;
|
|
75
|
+
--neutral-30: oklch(0.3 0.017 280);
|
|
76
|
+
--neutral-30-hsl: 233.7 10.7% 19.3%;
|
|
77
|
+
--neutral-32: oklch(0.32 0.016 280);
|
|
78
|
+
--neutral-32-hsl: 233.6 9.3% 21.2%;
|
|
77
79
|
--neutral-36: oklch(0.365 0.014 280);
|
|
78
80
|
--neutral-36-hsl: 233.4 7% 25.6%;
|
|
79
81
|
/* mid stops — text, both themes */
|
|
@@ -376,9 +378,9 @@
|
|
|
376
378
|
and is therefore absent, not omitted: the cascade already carries it. */
|
|
377
379
|
--background: var(--neutral-19-hsl);
|
|
378
380
|
--foreground: var(--neutral-94-hsl);
|
|
379
|
-
--card: var(--neutral-
|
|
381
|
+
--card: var(--neutral-26-hsl);
|
|
380
382
|
--card-foreground: var(--neutral-94-hsl);
|
|
381
|
-
--popover: var(--neutral-
|
|
383
|
+
--popover: var(--neutral-32-hsl);
|
|
382
384
|
--popover-foreground: var(--neutral-94-hsl);
|
|
383
385
|
/* 74% L (brand's #818CF8 intent) so primary clears AA as TEXT on a primary/10
|
|
384
386
|
tint in dark. That lightness is also why the foreground has to INVERT here:
|
|
@@ -388,14 +390,14 @@
|
|
|
388
390
|
the solid button reads in both themes and the tint keeps its AA as text. */
|
|
389
391
|
--primary: 239 84% 74%;
|
|
390
392
|
--primary-foreground: var(--neutral-16-hsl);
|
|
391
|
-
--secondary: var(--neutral-
|
|
393
|
+
--secondary: var(--neutral-30-hsl);
|
|
392
394
|
--secondary-foreground: var(--neutral-94-hsl);
|
|
393
|
-
--muted: var(--neutral-
|
|
395
|
+
--muted: var(--neutral-30-hsl);
|
|
394
396
|
--muted-foreground: var(--neutral-70-hsl);
|
|
395
|
-
--accent: var(--neutral-
|
|
397
|
+
--accent: var(--neutral-30-hsl);
|
|
396
398
|
--accent-foreground: var(--neutral-94-hsl);
|
|
397
399
|
--destructive: 348 90% 68%;
|
|
398
|
-
--destructive-foreground: var(--neutral-
|
|
400
|
+
--destructive-foreground: var(--neutral-22-hsl);
|
|
399
401
|
/* @see the :root declaration — this is the tier that re-themes. */
|
|
400
402
|
--warning-strong: 40 94% 56%;
|
|
401
403
|
--border: var(--neutral-36-hsl);
|
package/dist/vault/index.js
CHANGED
package/dist/vault/lazy.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/vault/lazy.tsx
|
|
2
2
|
import { lazy } from "react";
|
|
3
3
|
var VaultPaneLazy = lazy(
|
|
4
|
-
() => import("../VaultPane-
|
|
4
|
+
() => import("../VaultPane-IGJKB6CX.js").then((m) => ({ default: m.VaultPane }))
|
|
5
5
|
);
|
|
6
6
|
export {
|
|
7
7
|
VaultPaneLazy
|
|
@@ -18,7 +18,7 @@ import { F as FlowTrace } from '../flow-types-CJxEmaRy.js';
|
|
|
18
18
|
import { a as ReviewQueueItem, c as ReviewQueueState } from '../queue-VTBA5ONX.js';
|
|
19
19
|
export { p as parseReviewQueueItem } from '../queue-VTBA5ONX.js';
|
|
20
20
|
export { SandboxTerminalConnection, SandboxTerminalConnectionResponse, UseSandboxTerminalConnectionOptions, UseSandboxTerminalConnectionResult, tabTerminalConnectionId, useSandboxTerminalConnection } from './terminal.js';
|
|
21
|
-
import { i as ProductSeatOffer } from '../billing-
|
|
21
|
+
import { i as ProductSeatOffer } from '../billing-BuNlaKlE.js';
|
|
22
22
|
import { SessionSort, SessionPage, SessionSummary, SessionRailAction } from '../session-shell/index.js';
|
|
23
23
|
import { AsyncResourceState, AsyncEmptySpec } from './async/index.js';
|
|
24
24
|
import { CatalogModel } from '../catalog/index.js';
|
|
@@ -521,11 +521,14 @@ interface QuestionOptionListProps {
|
|
|
521
521
|
selectedValues: string[];
|
|
522
522
|
disabled: boolean;
|
|
523
523
|
onToggle: (value: string) => void;
|
|
524
|
+
/** Terminal answered state: the selected rows highlight (primary edge, tint,
|
|
525
|
+
* trailing check) so the card shows WHAT was answered, not just that it was. */
|
|
526
|
+
answered?: boolean;
|
|
524
527
|
}
|
|
525
528
|
/** The radio/checkbox option rows for a select field. Renders a fragment of
|
|
526
529
|
* option `<label>` rows so a card keeps its own wrapping layout and appends
|
|
527
530
|
* its own write-in input. */
|
|
528
|
-
declare function QuestionOptionList({ groupName, idPrefix, options, multi, selectedValues, disabled, onToggle, }: QuestionOptionListProps): react.JSX.Element;
|
|
531
|
+
declare function QuestionOptionList({ groupName, idPrefix, options, multi, selectedValues, disabled, onToggle, answered, }: QuestionOptionListProps): react.JSX.Element;
|
|
529
532
|
interface InteractionQuestionCardProps {
|
|
530
533
|
interaction: ChatInteraction;
|
|
531
534
|
/** Viewer-vs-editor gate: false renders everything read-only. */
|
|
@@ -542,11 +545,6 @@ interface InteractionQuestionCardProps {
|
|
|
542
545
|
onLateAnswer?: (message: string) => boolean | void | Promise<boolean | void>;
|
|
543
546
|
/** Overrides the kind badge ("Question"). */
|
|
544
547
|
kindLabel?: string;
|
|
545
|
-
/** Overrides the header note ("The agent asked for input"). Set it whenever an
|
|
546
|
-
* agent is not the one asking — a host that parks on a human at the graph
|
|
547
|
-
* level is not an agent's mid-run question, and a card that claims otherwise
|
|
548
|
-
* misreports why the work stopped. */
|
|
549
|
-
sourceNote?: string;
|
|
550
548
|
/** What happens if nobody answers, rendered beside the submit action.
|
|
551
549
|
*
|
|
552
550
|
* The caller owns both the clock and the copy: this card holds no timer, so a
|
|
@@ -570,7 +568,7 @@ interface InteractionQuestionCardProps {
|
|
|
570
568
|
renderMarkdown?: (markdown: string) => ReactNode;
|
|
571
569
|
className?: string;
|
|
572
570
|
}
|
|
573
|
-
declare function InteractionQuestionCard({ interaction, canWrite, submitAnswer, onResolved, onLateAnswer, kindLabel,
|
|
571
|
+
declare function InteractionQuestionCard({ interaction, canWrite, submitAnswer, onResolved, onLateAnswer, kindLabel, timeoutNote, renderMarkdown, className, }: InteractionQuestionCardProps): react.JSX.Element;
|
|
574
572
|
|
|
575
573
|
interface InteractionPlanCardProps {
|
|
576
574
|
interaction: ChatInteraction;
|
|
@@ -1425,7 +1423,7 @@ interface SeatPaywallProps {
|
|
|
1425
1423
|
offer?: ProductSeatOffer;
|
|
1426
1424
|
/** Optional one-line value prop under the headline. */
|
|
1427
1425
|
tagline?: string;
|
|
1428
|
-
/** CTA label. Default "
|
|
1426
|
+
/** CTA label. Default "Continue to checkout". */
|
|
1429
1427
|
ctaLabel?: string;
|
|
1430
1428
|
/** Value-prop bullets. Default = product/usage-derived only; pass your own to
|
|
1431
1429
|
* supply product-specific value props (the shell bakes no GTM copy). */
|
|
@@ -1436,7 +1434,10 @@ interface SeatPaywallProps {
|
|
|
1436
1434
|
/**
|
|
1437
1435
|
* Centered card paywall. The price line reads
|
|
1438
1436
|
* "$100/mo · includes $50/mo of AI usage" so the included allowance anchors the
|
|
1439
|
-
* value without ever exposing the ratio
|
|
1437
|
+
* value without ever exposing the ratio — and says it ONCE: the default
|
|
1438
|
+
* benefits don't restate the usage line the subline already carries, and the
|
|
1439
|
+
* CTA is the next step ("Continue to checkout"), not a third repeat of the
|
|
1440
|
+
* eyebrow + headline's "Unlock {product}".
|
|
1440
1441
|
*/
|
|
1441
1442
|
declare function SeatPaywall({ product, onCheckout, priceUsd, includedUsageUsd, offer, tagline, ctaLabel, benefits, footnote, }: SeatPaywallProps): ReactNode;
|
|
1442
1443
|
|
|
@@ -2034,8 +2035,9 @@ interface ChatUiMessage extends ChatMessageMetrics {
|
|
|
2034
2035
|
/** Define properties for rendering chat messages with optional models, markdown, extras, and durable cards */
|
|
2035
2036
|
interface ChatMessagesProps {
|
|
2036
2037
|
messages: ChatUiMessage[];
|
|
2037
|
-
/** Shared reading scale for both user and assistant prose. Defaults to 16px
|
|
2038
|
-
* `large` uses 17px
|
|
2038
|
+
/** Shared reading scale for both user and assistant prose. Defaults to 16px
|
|
2039
|
+
* at a 1.6 line height; `large` uses 17px at the same leading without
|
|
2040
|
+
* enlarging labels, tool chrome, or metadata. */
|
|
2039
2041
|
messageSize?: 'default' | 'large';
|
|
2040
2042
|
/** Transcript chrome. `labeled` (default) keeps the always-on role label +
|
|
2041
2043
|
* model/tok-s/cost meta line and the primary-tinted user bubble. `quiet`
|
|
@@ -2104,6 +2106,8 @@ interface ChatEmptyDoor {
|
|
|
2104
2106
|
label: string;
|
|
2105
2107
|
description?: string;
|
|
2106
2108
|
onSelect: () => void;
|
|
2109
|
+
/** Optional glyph rendered left of the label. */
|
|
2110
|
+
icon?: ReactNode;
|
|
2107
2111
|
}
|
|
2108
2112
|
/** Define properties for rendering the chat empty state with customizable text and starting doors */
|
|
2109
2113
|
interface ChatEmptyStateProps {
|
package/dist/web-react/index.js
CHANGED
|
@@ -111,7 +111,7 @@ import {
|
|
|
111
111
|
withoutRecordGridCreated,
|
|
112
112
|
withoutRecordGridRemoved,
|
|
113
113
|
withoutRecordGridUpdate
|
|
114
|
-
} from "../chunk-
|
|
114
|
+
} from "../chunk-ZAKKG6WI.js";
|
|
115
115
|
import "../chunk-FBVLEGEG.js";
|
|
116
116
|
import {
|
|
117
117
|
EvidenceLineageTable,
|
|
@@ -124,7 +124,7 @@ import {
|
|
|
124
124
|
reviewQueueStateLabel,
|
|
125
125
|
workProductPartsFromMessageParts,
|
|
126
126
|
workProductStatusLabel
|
|
127
|
-
} from "../chunk-
|
|
127
|
+
} from "../chunk-ENLRJYVW.js";
|
|
128
128
|
import {
|
|
129
129
|
parseReviewQueueItem
|
|
130
130
|
} from "../chunk-GEYACSFW.js";
|
|
@@ -139,7 +139,6 @@ import {
|
|
|
139
139
|
OVERLAY_SHADOW,
|
|
140
140
|
POPOVER_SURFACE_ATTR,
|
|
141
141
|
PopoverSurface,
|
|
142
|
-
ProviderLogo,
|
|
143
142
|
effortLevelLabel,
|
|
144
143
|
effortLevelsFromIds,
|
|
145
144
|
effortMeterFill,
|
|
@@ -147,7 +146,10 @@ import {
|
|
|
147
146
|
useComposerAttachments,
|
|
148
147
|
usePending,
|
|
149
148
|
usePopover
|
|
150
|
-
} from "../chunk-
|
|
149
|
+
} from "../chunk-CJHIAZKK.js";
|
|
150
|
+
import {
|
|
151
|
+
ProviderLogo
|
|
152
|
+
} from "../chunk-MLG6XKPV.js";
|
|
151
153
|
import {
|
|
152
154
|
tabTerminalConnectionId,
|
|
153
155
|
useSandboxTerminalConnection
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
ProvenanceStamp,
|
|
5
5
|
QualityCheckList,
|
|
6
6
|
workProductStatusLabel
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-ENLRJYVW.js";
|
|
8
8
|
import "../chunk-GEYACSFW.js";
|
|
9
9
|
import {
|
|
10
10
|
unresolvedBlockingExceptions
|
|
@@ -16,8 +16,7 @@ import {
|
|
|
16
16
|
CodeSurface,
|
|
17
17
|
DiffView,
|
|
18
18
|
FileBreadcrumb,
|
|
19
|
-
PillTabs
|
|
20
|
-
computeDiffStats
|
|
19
|
+
PillTabs
|
|
21
20
|
} from "@tangle-network/sandbox-ui/workbench";
|
|
22
21
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
23
22
|
function filenameOf(path, fallback) {
|
|
@@ -55,10 +54,6 @@ function WorkProductPane({
|
|
|
55
54
|
const [compare, setCompare] = useState(null);
|
|
56
55
|
const [compareError, setCompareError] = useState(null);
|
|
57
56
|
const diffFilename = filenameOf(artifact?.path, artifact?.title ?? workProduct.scopeKey);
|
|
58
|
-
const diffStats = useMemo(
|
|
59
|
-
() => hasDiff ? computeDiffStats(baseline ?? "", body) : null,
|
|
60
|
-
[hasDiff, baseline, body]
|
|
61
|
-
);
|
|
62
57
|
const loadCompare = useCallback(
|
|
63
58
|
async (from, to) => {
|
|
64
59
|
if (!loadVersionBody || !from.artifactPath || !to.artifactPath) return;
|
|
@@ -84,12 +79,12 @@ function WorkProductPane({
|
|
|
84
79
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
85
80
|
/* @__PURE__ */ jsxs("p", { className: "truncate text-sm font-semibold text-foreground", children: [
|
|
86
81
|
artifact?.title ?? workProduct.scopeKey,
|
|
87
|
-
/* @__PURE__ */ jsxs("span", { className: "ml-1.5 text-
|
|
82
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-1.5 text-xs font-normal text-muted-foreground", children: [
|
|
88
83
|
"v",
|
|
89
84
|
workProduct.version
|
|
90
85
|
] })
|
|
91
86
|
] }),
|
|
92
|
-
/* @__PURE__ */ jsxs("p", { className: "text-
|
|
87
|
+
/* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
93
88
|
artifact?.kind && /* @__PURE__ */ jsxs("span", { className: "font-mono", children: [
|
|
94
89
|
artifact.kind,
|
|
95
90
|
" \xB7 "
|
|
@@ -109,20 +104,7 @@ function WorkProductPane({
|
|
|
109
104
|
artifact?.path && /* @__PURE__ */ jsx(FileBreadcrumb, { path: artifact.path, className: "border-b border-border px-3 py-2" }),
|
|
110
105
|
body ? /* @__PURE__ */ jsx(CodeSurface, { code: body, filename: diffFilename }) : artifact?.fields ? /* @__PURE__ */ jsx(CodeSurface, { code: JSON.stringify(artifact.fields, null, 2), filename: `${diffFilename}.json`, language: "json" }) : /* @__PURE__ */ jsx("p", { className: "px-4 py-6 text-center text-xs text-muted-foreground", children: "No artifact body yet." })
|
|
111
106
|
] }),
|
|
112
|
-
tab === "diff" && hasDiff && /* @__PURE__ */
|
|
113
|
-
diffStats && /* @__PURE__ */ jsxs("p", { className: "border-b border-border px-3 py-2 text-[11px] text-muted-foreground", children: [
|
|
114
|
-
/* @__PURE__ */ jsxs("span", { className: "text-success", children: [
|
|
115
|
-
"+",
|
|
116
|
-
diffStats.added
|
|
117
|
-
] }),
|
|
118
|
-
" ",
|
|
119
|
-
/* @__PURE__ */ jsxs("span", { className: "text-destructive", children: [
|
|
120
|
-
"\u2212",
|
|
121
|
-
diffStats.removed
|
|
122
|
-
] })
|
|
123
|
-
] }),
|
|
124
|
-
/* @__PURE__ */ jsx(DiffView, { filename: diffFilename, baseline: baseline ?? "", current: body })
|
|
125
|
-
] }),
|
|
107
|
+
tab === "diff" && hasDiff && /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto rounded-lg border border-border", children: /* @__PURE__ */ jsx(DiffView, { filename: diffFilename, baseline: baseline ?? "", current: body }) }),
|
|
126
108
|
tab === "lineage" && /* @__PURE__ */ jsx(EvidenceLineageTable, { evidence: workProduct.evidence, resolveSourceUrl }),
|
|
127
109
|
tab === "exceptions" && /* @__PURE__ */ jsx(ExceptionList, { exceptions: workProduct.exceptions }),
|
|
128
110
|
tab === "checks" && /* @__PURE__ */ jsx(QualityCheckList, { checks: workProduct.checks }),
|
|
@@ -136,8 +118,8 @@ function WorkProductPane({
|
|
|
136
118
|
"v",
|
|
137
119
|
entry.version
|
|
138
120
|
] }),
|
|
139
|
-
/* @__PURE__ */ jsx("span", { className: "text-
|
|
140
|
-
entry.reviewedBy && /* @__PURE__ */ jsxs("span", { className: "text-
|
|
121
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: workProductStatusLabel(entry.status) }),
|
|
122
|
+
entry.reviewedBy && /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground", children: [
|
|
141
123
|
"by ",
|
|
142
124
|
entry.reviewedBy
|
|
143
125
|
] }),
|
|
@@ -147,7 +129,7 @@ function WorkProductPane({
|
|
|
147
129
|
{
|
|
148
130
|
type: "button",
|
|
149
131
|
onClick: () => void loadCompare(prior, entry),
|
|
150
|
-
className: "rounded-md border border-border px-2 py-0.5 text-
|
|
132
|
+
className: "rounded-md border border-border px-2 py-0.5 text-xs font-medium text-foreground transition hover:bg-accent",
|
|
151
133
|
children: [
|
|
152
134
|
"Compare v",
|
|
153
135
|
prior.version,
|
|
@@ -163,7 +145,7 @@ function WorkProductPane({
|
|
|
163
145
|
}),
|
|
164
146
|
compareError && /* @__PURE__ */ jsx("p", { className: "rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive", children: compareError }),
|
|
165
147
|
compare && /* @__PURE__ */ jsxs("div", { className: "overflow-auto rounded-lg border border-border", children: [
|
|
166
|
-
/* @__PURE__ */ jsxs("p", { className: "border-b border-border px-3 py-2 text-
|
|
148
|
+
/* @__PURE__ */ jsxs("p", { className: "border-b border-border px-3 py-2 text-xs text-muted-foreground", children: [
|
|
167
149
|
"v",
|
|
168
150
|
compare.fromVersion,
|
|
169
151
|
" \u2192 v",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/work-product-react/index.tsx"],"sourcesContent":["/**\n * `./work-product-react` — the sandbox-ui-composed review pane. It follows the\n * optional-peer rule: this is the ONLY work-product surface\n * that imports `@tangle-network/sandbox-ui` (its `workbench` primitives:\n * `PillTabs`, `CodeSurface`, `DiffView`, `FileBreadcrumb`,\n * `computeDiffStats`). `/web-react`'s queue/card/lineage components stay\n * sandbox-ui-free; importing THIS subpath requires the otherwise optional\n * sandbox-ui peer.\n *\n * The pane never fetches: bodies arrive as resolved strings\n * (`currentContent`/`baselineContent`) and history compares load through the\n * injected `loadVersionBody(ref)` seam. The default tab is a PROP — tax\n * passes `'lineage'` (lineage before diff for tax), legal passes `'diff'`\n * (the redline IS the artifact), gtm passes `'artifact'`.\n */\n\nimport { useCallback, useMemo, useState } from 'react'\nimport {\n CodeSurface,\n DiffView,\n FileBreadcrumb,\n PillTabs,\n computeDiffStats,\n type PillTabItem,\n} from '@tangle-network/sandbox-ui/workbench'\n\nimport {\n EvidenceLineageTable,\n ExceptionList,\n ProvenanceStamp,\n QualityCheckList,\n workProductStatusLabel,\n} from '../web-react/work-product'\nimport type {\n EvidenceEntry,\n ProfileBacktestSummary,\n WorkProductRecord,\n WorkProductVersionEntry,\n} from '../work-product/types'\nimport { unresolvedBlockingExceptions } from '../work-product/types'\n\nexport type WorkProductPaneTab = 'artifact' | 'diff' | 'lineage' | 'exceptions' | 'checks' | 'history'\n\n/** Properties for the tabbed work-product review pane */\nexport interface WorkProductPaneProps {\n workProduct: WorkProductRecord\n /** Which tab opens first — a product choice, not a heuristic: tax passes\n * 'lineage', legal 'diff', gtm 'artifact'. Default 'artifact'. */\n defaultTab?: WorkProductPaneTab\n /** Resolved artifact body when it lives at `artifact.path` rather than\n * inline. Falls back to `artifact.content`. */\n currentContent?: string\n /** Resolved baseline body for diff-first products. Falls back to\n * `artifact.baseline.content`. */\n baselineContent?: string\n /** Load a frozen version body by its `history[].artifactPath` ref for the\n * vN-1 → vN compare. Omit to hide history compares. */\n loadVersionBody?: (ref: string) => Promise<string | null>\n /** Resolve one evidence entry's source to an openable URL (lineage\n * click-through). */\n resolveSourceUrl?: (entry: EvidenceEntry) => string\n /** Backtest summary for the record's profile hash, rendered on the\n * provenance stamp. */\n backtest?: ProfileBacktestSummary\n className?: string\n}\n\ninterface VersionCompare {\n fromVersion: number\n toVersion: number\n baseline: string\n current: string\n}\n\n/** Trailing path segment for a diff header. */\nfunction filenameOf(path: string | undefined, fallback: string): string {\n if (!path) return fallback\n const segments = path.split('/')\n return segments[segments.length - 1] || fallback\n}\n\n/**\n * The tabbed review pane over one work product: Artifact | Diff | Lineage |\n * Exceptions | Checks | History. Diff renders baseline→current for redline\n * artifacts and vN-1→vN for history compares; lineage is the\n * every-value-traceable table; provenance is stamped across the header.\n */\nexport function WorkProductPane({\n workProduct,\n defaultTab = 'artifact',\n currentContent,\n baselineContent,\n loadVersionBody,\n resolveSourceUrl,\n backtest,\n className,\n}: WorkProductPaneProps) {\n const artifact = workProduct.artifact\n const body = currentContent ?? artifact?.content ?? ''\n const baseline = baselineContent ?? artifact?.baseline?.content\n const hasDiff = baseline !== undefined\n\n const tabs = useMemo(() => {\n const items: PillTabItem<WorkProductPaneTab>[] = [{ value: 'artifact', label: 'Artifact' }]\n if (hasDiff) items.push({ value: 'diff', label: 'Diff' })\n items.push(\n { value: 'lineage', label: `Lineage (${workProduct.evidence.length})` },\n { value: 'exceptions', label: `Exceptions (${workProduct.exceptions.length})` },\n { value: 'checks', label: `Checks (${workProduct.checks.length})` },\n { value: 'history', label: `History (${workProduct.history.length})` },\n )\n return items\n }, [hasDiff, workProduct.evidence.length, workProduct.exceptions.length, workProduct.checks.length, workProduct.history.length])\n\n const initialTab = tabs.some((tab) => tab.value === defaultTab) ? defaultTab : 'artifact'\n const [tab, setTab] = useState<WorkProductPaneTab>(initialTab)\n const [compare, setCompare] = useState<VersionCompare | null>(null)\n const [compareError, setCompareError] = useState<string | null>(null)\n\n const diffFilename = filenameOf(artifact?.path, artifact?.title ?? workProduct.scopeKey)\n const diffStats = useMemo(\n () => (hasDiff ? computeDiffStats(baseline ?? '', body) : null),\n [hasDiff, baseline, body],\n )\n\n const loadCompare = useCallback(\n async (from: WorkProductVersionEntry, to: WorkProductVersionEntry) => {\n if (!loadVersionBody || !from.artifactPath || !to.artifactPath) return\n setCompareError(null)\n try {\n const [fromBody, toBody] = await Promise.all([\n loadVersionBody(from.artifactPath),\n loadVersionBody(to.artifactPath),\n ])\n if (fromBody === null || toBody === null) {\n setCompareError('A version snapshot could not be loaded.')\n return\n }\n setCompare({ fromVersion: from.version, toVersion: to.version, baseline: fromBody, current: toBody })\n } catch (error) {\n setCompareError(error instanceof Error ? error.message : String(error))\n }\n },\n [loadVersionBody],\n )\n\n return (\n <div className={`flex min-h-0 flex-col gap-3 ${className ?? ''}`}>\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-foreground\">\n {artifact?.title ?? workProduct.scopeKey}\n <span className=\"ml-1.5 text-[11px] font-normal text-muted-foreground\">v{workProduct.version}</span>\n </p>\n <p className=\"text-[11px] text-muted-foreground\">\n {artifact?.kind && <span className=\"font-mono\">{artifact.kind} · </span>}\n {workProductStatusLabel(workProduct.status)}\n {unresolvedBlockingExceptions(workProduct.exceptions).length > 0 && (\n <span className=\"text-destructive\"> · {unresolvedBlockingExceptions(workProduct.exceptions).length} blocking</span>\n )}\n </p>\n </div>\n <ProvenanceStamp provenance={workProduct.provenance} backtest={backtest} />\n </div>\n\n <PillTabs items={tabs} value={tab} onChange={setTab} aria-label=\"Work product views\" />\n\n {tab === 'artifact' && (\n <div className=\"min-h-0 flex-1 overflow-auto rounded-lg border border-border\">\n {artifact?.path && <FileBreadcrumb path={artifact.path} className=\"border-b border-border px-3 py-2\" />}\n {body ? (\n <CodeSurface code={body} filename={diffFilename} />\n ) : artifact?.fields ? (\n <CodeSurface code={JSON.stringify(artifact.fields, null, 2)} filename={`${diffFilename}.json`} language=\"json\" />\n ) : (\n <p className=\"px-4 py-6 text-center text-xs text-muted-foreground\">No artifact body yet.</p>\n )}\n </div>\n )}\n\n {tab === 'diff' && hasDiff && (\n <div className=\"min-h-0 flex-1 overflow-auto rounded-lg border border-border\">\n {diffStats && (\n <p className=\"border-b border-border px-3 py-2 text-[11px] text-muted-foreground\">\n <span className=\"text-success\">+{diffStats.added}</span>{' '}\n <span className=\"text-destructive\">−{diffStats.removed}</span>\n </p>\n )}\n <DiffView filename={diffFilename} baseline={baseline ?? ''} current={body} />\n </div>\n )}\n\n {tab === 'lineage' && (\n <EvidenceLineageTable evidence={workProduct.evidence} resolveSourceUrl={resolveSourceUrl} />\n )}\n\n {tab === 'exceptions' && <ExceptionList exceptions={workProduct.exceptions} />}\n\n {tab === 'checks' && <QualityCheckList checks={workProduct.checks} />}\n\n {tab === 'history' && (\n <div className=\"space-y-2\">\n {workProduct.history.length === 0 && <p className=\"text-xs text-muted-foreground\">No versions yet.</p>}\n {workProduct.history.map((entry, index) => {\n const prior = workProduct.history\n .slice(0, index)\n .reverse()\n .find((candidate) => candidate.version < entry.version && candidate.artifactPath)\n return (\n <div key={`${entry.version}:${entry.status}:${entry.at}`} className=\"rounded-lg border border-border bg-card px-3 py-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">v{entry.version}</span>\n <span className=\"text-[11px] text-muted-foreground\">{workProductStatusLabel(entry.status)}</span>\n {entry.reviewedBy && <span className=\"text-[11px] text-muted-foreground\">by {entry.reviewedBy}</span>}\n <span className=\"flex-1\" />\n {loadVersionBody && prior?.artifactPath && entry.artifactPath && (\n <button\n type=\"button\"\n onClick={() => void loadCompare(prior, entry)}\n className=\"rounded-md border border-border px-2 py-0.5 text-[11px] font-medium text-foreground transition hover:bg-accent\"\n >\n Compare v{prior.version} → v{entry.version}\n </button>\n )}\n </div>\n {entry.reviewNote && <p className=\"mt-1 text-sm leading-snug text-foreground\">{entry.reviewNote}</p>}\n <ProvenanceStamp provenance={entry.provenance} className=\"mt-1\" />\n </div>\n )\n })}\n {compareError && <p className=\"rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive\">{compareError}</p>}\n {compare && (\n <div className=\"overflow-auto rounded-lg border border-border\">\n <p className=\"border-b border-border px-3 py-2 text-[11px] text-muted-foreground\">\n v{compare.fromVersion} → v{compare.toVersion}\n </p>\n <DiffView filename={diffFilename} baseline={compare.baseline} current={compare.current} />\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["tab"]}
|
|
1
|
+
{"version":3,"sources":["../../src/work-product-react/index.tsx"],"sourcesContent":["/**\n * `./work-product-react` — the sandbox-ui-composed review pane. It follows the\n * optional-peer rule: this is the ONLY work-product surface\n * that imports `@tangle-network/sandbox-ui` (its `workbench` primitives:\n * `PillTabs`, `CodeSurface`, `DiffView`, `FileBreadcrumb`).\n * `/web-react`'s queue/card/lineage components stay\n * sandbox-ui-free; importing THIS subpath requires the otherwise optional\n * sandbox-ui peer.\n *\n * The pane never fetches: bodies arrive as resolved strings\n * (`currentContent`/`baselineContent`) and history compares load through the\n * injected `loadVersionBody(ref)` seam. The default tab is a PROP — tax\n * passes `'lineage'` (lineage before diff for tax), legal passes `'diff'`\n * (the redline IS the artifact), gtm passes `'artifact'`.\n */\n\nimport { useCallback, useMemo, useState } from 'react'\nimport {\n CodeSurface,\n DiffView,\n FileBreadcrumb,\n PillTabs,\n type PillTabItem,\n} from '@tangle-network/sandbox-ui/workbench'\n\nimport {\n EvidenceLineageTable,\n ExceptionList,\n ProvenanceStamp,\n QualityCheckList,\n workProductStatusLabel,\n} from '../web-react/work-product'\nimport type {\n EvidenceEntry,\n ProfileBacktestSummary,\n WorkProductRecord,\n WorkProductVersionEntry,\n} from '../work-product/types'\nimport { unresolvedBlockingExceptions } from '../work-product/types'\n\nexport type WorkProductPaneTab = 'artifact' | 'diff' | 'lineage' | 'exceptions' | 'checks' | 'history'\n\n/** Properties for the tabbed work-product review pane */\nexport interface WorkProductPaneProps {\n workProduct: WorkProductRecord\n /** Which tab opens first — a product choice, not a heuristic: tax passes\n * 'lineage', legal 'diff', gtm 'artifact'. Default 'artifact'. */\n defaultTab?: WorkProductPaneTab\n /** Resolved artifact body when it lives at `artifact.path` rather than\n * inline. Falls back to `artifact.content`. */\n currentContent?: string\n /** Resolved baseline body for diff-first products. Falls back to\n * `artifact.baseline.content`. */\n baselineContent?: string\n /** Load a frozen version body by its `history[].artifactPath` ref for the\n * vN-1 → vN compare. Omit to hide history compares. */\n loadVersionBody?: (ref: string) => Promise<string | null>\n /** Resolve one evidence entry's source to an openable URL (lineage\n * click-through). */\n resolveSourceUrl?: (entry: EvidenceEntry) => string\n /** Backtest summary for the record's profile hash, rendered on the\n * provenance stamp. */\n backtest?: ProfileBacktestSummary\n className?: string\n}\n\ninterface VersionCompare {\n fromVersion: number\n toVersion: number\n baseline: string\n current: string\n}\n\n/** Trailing path segment for a diff header. */\nfunction filenameOf(path: string | undefined, fallback: string): string {\n if (!path) return fallback\n const segments = path.split('/')\n return segments[segments.length - 1] || fallback\n}\n\n/**\n * The tabbed review pane over one work product: Artifact | Diff | Lineage |\n * Exceptions | Checks | History. Diff renders baseline→current for redline\n * artifacts and vN-1→vN for history compares; lineage is the\n * every-value-traceable table; provenance is stamped across the header.\n */\nexport function WorkProductPane({\n workProduct,\n defaultTab = 'artifact',\n currentContent,\n baselineContent,\n loadVersionBody,\n resolveSourceUrl,\n backtest,\n className,\n}: WorkProductPaneProps) {\n const artifact = workProduct.artifact\n const body = currentContent ?? artifact?.content ?? ''\n const baseline = baselineContent ?? artifact?.baseline?.content\n const hasDiff = baseline !== undefined\n\n const tabs = useMemo(() => {\n const items: PillTabItem<WorkProductPaneTab>[] = [{ value: 'artifact', label: 'Artifact' }]\n if (hasDiff) items.push({ value: 'diff', label: 'Diff' })\n items.push(\n { value: 'lineage', label: `Lineage (${workProduct.evidence.length})` },\n { value: 'exceptions', label: `Exceptions (${workProduct.exceptions.length})` },\n { value: 'checks', label: `Checks (${workProduct.checks.length})` },\n { value: 'history', label: `History (${workProduct.history.length})` },\n )\n return items\n }, [hasDiff, workProduct.evidence.length, workProduct.exceptions.length, workProduct.checks.length, workProduct.history.length])\n\n const initialTab = tabs.some((tab) => tab.value === defaultTab) ? defaultTab : 'artifact'\n const [tab, setTab] = useState<WorkProductPaneTab>(initialTab)\n const [compare, setCompare] = useState<VersionCompare | null>(null)\n const [compareError, setCompareError] = useState<string | null>(null)\n\n const diffFilename = filenameOf(artifact?.path, artifact?.title ?? workProduct.scopeKey)\n\n const loadCompare = useCallback(\n async (from: WorkProductVersionEntry, to: WorkProductVersionEntry) => {\n if (!loadVersionBody || !from.artifactPath || !to.artifactPath) return\n setCompareError(null)\n try {\n const [fromBody, toBody] = await Promise.all([\n loadVersionBody(from.artifactPath),\n loadVersionBody(to.artifactPath),\n ])\n if (fromBody === null || toBody === null) {\n setCompareError('A version snapshot could not be loaded.')\n return\n }\n setCompare({ fromVersion: from.version, toVersion: to.version, baseline: fromBody, current: toBody })\n } catch (error) {\n setCompareError(error instanceof Error ? error.message : String(error))\n }\n },\n [loadVersionBody],\n )\n\n return (\n <div className={`flex min-h-0 flex-col gap-3 ${className ?? ''}`}>\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-foreground\">\n {artifact?.title ?? workProduct.scopeKey}\n <span className=\"ml-1.5 text-xs font-normal text-muted-foreground\">v{workProduct.version}</span>\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {artifact?.kind && <span className=\"font-mono\">{artifact.kind} · </span>}\n {workProductStatusLabel(workProduct.status)}\n {unresolvedBlockingExceptions(workProduct.exceptions).length > 0 && (\n <span className=\"text-destructive\"> · {unresolvedBlockingExceptions(workProduct.exceptions).length} blocking</span>\n )}\n </p>\n </div>\n <ProvenanceStamp provenance={workProduct.provenance} backtest={backtest} />\n </div>\n\n <PillTabs items={tabs} value={tab} onChange={setTab} aria-label=\"Work product views\" />\n\n {tab === 'artifact' && (\n <div className=\"min-h-0 flex-1 overflow-auto rounded-lg border border-border\">\n {artifact?.path && <FileBreadcrumb path={artifact.path} className=\"border-b border-border px-3 py-2\" />}\n {body ? (\n <CodeSurface code={body} filename={diffFilename} />\n ) : artifact?.fields ? (\n <CodeSurface code={JSON.stringify(artifact.fields, null, 2)} filename={`${diffFilename}.json`} language=\"json\" />\n ) : (\n <p className=\"px-4 py-6 text-center text-xs text-muted-foreground\">No artifact body yet.</p>\n )}\n </div>\n )}\n\n {tab === 'diff' && hasDiff && (\n <div className=\"min-h-0 flex-1 overflow-auto rounded-lg border border-border\">\n {/* DiffView's own file header already carries the +/− counts. */}\n <DiffView filename={diffFilename} baseline={baseline ?? ''} current={body} />\n </div>\n )}\n\n {tab === 'lineage' && (\n <EvidenceLineageTable evidence={workProduct.evidence} resolveSourceUrl={resolveSourceUrl} />\n )}\n\n {tab === 'exceptions' && <ExceptionList exceptions={workProduct.exceptions} />}\n\n {tab === 'checks' && <QualityCheckList checks={workProduct.checks} />}\n\n {tab === 'history' && (\n <div className=\"space-y-2\">\n {workProduct.history.length === 0 && <p className=\"text-xs text-muted-foreground\">No versions yet.</p>}\n {workProduct.history.map((entry, index) => {\n const prior = workProduct.history\n .slice(0, index)\n .reverse()\n .find((candidate) => candidate.version < entry.version && candidate.artifactPath)\n return (\n <div key={`${entry.version}:${entry.status}:${entry.at}`} className=\"rounded-lg border border-border bg-card px-3 py-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">v{entry.version}</span>\n <span className=\"text-xs text-muted-foreground\">{workProductStatusLabel(entry.status)}</span>\n {entry.reviewedBy && <span className=\"text-xs text-muted-foreground\">by {entry.reviewedBy}</span>}\n <span className=\"flex-1\" />\n {loadVersionBody && prior?.artifactPath && entry.artifactPath && (\n <button\n type=\"button\"\n onClick={() => void loadCompare(prior, entry)}\n className=\"rounded-md border border-border px-2 py-0.5 text-xs font-medium text-foreground transition hover:bg-accent\"\n >\n Compare v{prior.version} → v{entry.version}\n </button>\n )}\n </div>\n {entry.reviewNote && <p className=\"mt-1 text-sm leading-snug text-foreground\">{entry.reviewNote}</p>}\n <ProvenanceStamp provenance={entry.provenance} className=\"mt-1\" />\n </div>\n )\n })}\n {compareError && <p className=\"rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive\">{compareError}</p>}\n {compare && (\n <div className=\"overflow-auto rounded-lg border border-border\">\n <p className=\"border-b border-border px-3 py-2 text-xs text-muted-foreground\">\n v{compare.fromVersion} → v{compare.toVersion}\n </p>\n <DiffView filename={diffFilename} baseline={compare.baseline} current={compare.current} />\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":["tab"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangle-network/agent-app",
|
|
3
|
-
"version": "0.45.
|
|
3
|
+
"version": "0.45.49",
|
|
4
4
|
"packageManager": "pnpm@11.17.0",
|
|
5
5
|
"description": "Build agent applications with typed chat, tools, sandboxes, integrations, billing, and evaluation.",
|
|
6
6
|
"keywords": [
|
|
@@ -526,7 +526,7 @@
|
|
|
526
526
|
"@tangle-network/agent-runtime": "0.126.0",
|
|
527
527
|
"@tangle-network/brand": "1.3.0",
|
|
528
528
|
"@tangle-network/sandbox": "0.17.2",
|
|
529
|
-
"@tangle-network/sandbox-ui": "0.
|
|
529
|
+
"@tangle-network/sandbox-ui": "0.99.2",
|
|
530
530
|
"@tangle-network/ui": "^11.2.2",
|
|
531
531
|
"@testing-library/dom": "^10.4.1",
|
|
532
532
|
"@testing-library/react": "^16.3.2",
|
|
@@ -578,7 +578,7 @@
|
|
|
578
578
|
"@tangle-network/agent-runtime": ">=0.126.0",
|
|
579
579
|
"@tangle-network/brand": ">=1.1.0",
|
|
580
580
|
"@tangle-network/sandbox": ">=0.15.2",
|
|
581
|
-
"@tangle-network/sandbox-ui": ">=0.
|
|
581
|
+
"@tangle-network/sandbox-ui": ">=0.99.2",
|
|
582
582
|
"@tangle-network/ui": ">=11.2.2",
|
|
583
583
|
"@xyflow/react": ">=12.0.0",
|
|
584
584
|
"better-auth": ">=1.6.16",
|