@tangle-network/agent-app 0.60.178 → 0.60.180

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 (60) hide show
  1. package/dist/agent-profiles/d1.js +3 -3
  2. package/dist/agent-profiles/index.js +3 -3
  3. package/dist/assistant/index.js +7 -5
  4. package/dist/assistant/index.js.map +1 -1
  5. package/dist/channels/index.js +1 -1
  6. package/dist/chat-routes/index.js +4 -4
  7. package/dist/{chunk-GIJY3YCH.js → chunk-3RHAF2P5.js} +11 -13
  8. package/dist/chunk-3RHAF2P5.js.map +1 -0
  9. package/dist/{chunk-IAFPBYQQ.js → chunk-6ZUVYAKB.js} +506 -315
  10. package/dist/chunk-6ZUVYAKB.js.map +1 -0
  11. package/dist/{chunk-ER3KSBA4.js → chunk-75ZIWV4U.js} +4 -4
  12. package/dist/{chunk-7PSYT35Z.js → chunk-7BYY7QKC.js} +5 -5
  13. package/dist/{chunk-7PSYT35Z.js.map → chunk-7BYY7QKC.js.map} +1 -1
  14. package/dist/chunk-A2GG4D4A.js +43 -0
  15. package/dist/chunk-A2GG4D4A.js.map +1 -0
  16. package/dist/{chunk-6CKNC32J.js → chunk-AJZ3EJB5.js} +2 -2
  17. package/dist/chunk-ATQQCG4I.js +194 -0
  18. package/dist/chunk-ATQQCG4I.js.map +1 -0
  19. package/dist/{chunk-4WEUWCA4.js → chunk-EQRVOMMS.js} +2 -2
  20. package/dist/{chunk-ARBBJWZA.js → chunk-KOTNMTHV.js} +3 -3
  21. package/dist/{chunk-LSUELMHY.js → chunk-LN5RBVGP.js} +6 -33
  22. package/dist/{chunk-LSUELMHY.js.map → chunk-LN5RBVGP.js.map} +1 -1
  23. package/dist/{chunk-CPNJRLPN.js → chunk-WSEXFTN4.js} +46 -7
  24. package/dist/chunk-WSEXFTN4.js.map +1 -0
  25. package/dist/{chunk-NO2YNV5C.js → chunk-YXLN4PXK.js} +2 -2
  26. package/dist/hub-approvals/index.js +1 -1
  27. package/dist/hub-approvals/types.d.ts +16 -1
  28. package/dist/hub-approvals-react/feedback.d.ts +25 -5
  29. package/dist/hub-approvals-react/index.d.ts +1 -0
  30. package/dist/hub-approvals-react/index.js +413 -257
  31. package/dist/hub-approvals-react/index.js.map +1 -1
  32. package/dist/hub-approvals-react/media.d.ts +12 -0
  33. package/dist/integrations-react/index.js +1 -1
  34. package/dist/preset-cloudflare/index.js +2 -2
  35. package/dist/public-consultation/index.d.ts +1 -1
  36. package/dist/sandbox/index.js +4 -4
  37. package/dist/stories/app-shell/interaction-evidence.d.ts +31 -0
  38. package/dist/studio-react/index.js +2 -2
  39. package/dist/theme/tokens.css +158 -0
  40. package/dist/tools/index.js +4 -4
  41. package/dist/web-react/action-dialog.d.ts +2 -2
  42. package/dist/web-react/agent-profile-editor.js +1 -1
  43. package/dist/web-react/agent-profile-form-kit.d.ts +1 -1
  44. package/dist/web-react/async/index.js +1 -1
  45. package/dist/web-react/index.d.ts +2 -0
  46. package/dist/web-react/index.js +12 -5
  47. package/dist/web-react/review-inbox.d.ts +33 -0
  48. package/dist/work-product/index.js +2 -2
  49. package/dist/workspace-react/index.js +1 -1
  50. package/package.json +2 -2
  51. package/dist/chunk-CPNJRLPN.js.map +0 -1
  52. package/dist/chunk-GIJY3YCH.js.map +0 -1
  53. package/dist/chunk-IAFPBYQQ.js.map +0 -1
  54. package/dist/chunk-QJYJOMMO.js +0 -78
  55. package/dist/chunk-QJYJOMMO.js.map +0 -1
  56. /package/dist/{chunk-ER3KSBA4.js.map → chunk-75ZIWV4U.js.map} +0 -0
  57. /package/dist/{chunk-6CKNC32J.js.map → chunk-AJZ3EJB5.js.map} +0 -0
  58. /package/dist/{chunk-4WEUWCA4.js.map → chunk-EQRVOMMS.js.map} +0 -0
  59. /package/dist/{chunk-ARBBJWZA.js.map → chunk-KOTNMTHV.js.map} +0 -0
  60. /package/dist/{chunk-NO2YNV5C.js.map → chunk-YXLN4PXK.js.map} +0 -0
@@ -0,0 +1,12 @@
1
+ import type { HubActionPreview } from '../hub-approvals';
2
+ type Post = Extract<HubActionPreview, {
3
+ kind: 'post';
4
+ }>;
5
+ /** The host resolves frozen, authorized bytes before rendering. No URLs are fetched here. */
6
+ export declare function previewMediaSource(value: string | undefined, kind: 'image' | 'video'): string | undefined;
7
+ /** Source-supplied payload and media inside platform feed frames. No transport or effect callbacks. */
8
+ export declare function HubMediaPreview({ preview, account }: {
9
+ preview: Post;
10
+ account?: string | null;
11
+ }): import("react").JSX.Element;
12
+ export {};
@@ -2,7 +2,7 @@ import {
2
2
  confirmWrite,
3
3
  useAsyncResource,
4
4
  useConfirmedMutation
5
- } from "../chunk-LSUELMHY.js";
5
+ } from "../chunk-LN5RBVGP.js";
6
6
 
7
7
  // src/integrations-react/callback.tsx
8
8
  import { useEffect, useState } from "react";
@@ -12,8 +12,8 @@ import {
12
12
  } from "../chunk-4LBCTFBP.js";
13
13
  import {
14
14
  assertRenderUiSchema
15
- } from "../chunk-NO2YNV5C.js";
16
- import "../chunk-7PSYT35Z.js";
15
+ } from "../chunk-YXLN4PXK.js";
16
+ import "../chunk-7BYY7QKC.js";
17
17
 
18
18
  // src/preset-cloudflare/workflow-instance.ts
19
19
  async function ensureCloudflareWorkflowInstance(binding, input) {
@@ -102,8 +102,8 @@ interface GatewayConsultationContext {
102
102
  /** Compose gateway admission, scoped knowledge and the maintained persisted chat route. */
103
103
  export declare function createPublicConsultation(options: PublicConsultationOptions): {
104
104
  authorizeConsumer(agent: ConsultationAgent, consumer: ConsultationConsumer): Promise<{
105
- allow: true;
106
105
  reason?: undefined;
106
+ allow: true;
107
107
  code?: undefined;
108
108
  } | {
109
109
  allow: false;
@@ -138,13 +138,13 @@ import {
138
138
  } from "../chunk-4LBCTFBP.js";
139
139
  import "../chunk-VBRUG4N5.js";
140
140
  import "../chunk-LWSJK546.js";
141
- import "../chunk-ER3KSBA4.js";
141
+ import "../chunk-75ZIWV4U.js";
142
142
  import "../chunk-6A7MYOUI.js";
143
143
  import "../chunk-S5SRJJQG.js";
144
- import "../chunk-NO2YNV5C.js";
145
- import "../chunk-6CKNC32J.js";
144
+ import "../chunk-YXLN4PXK.js";
145
+ import "../chunk-AJZ3EJB5.js";
146
146
  import "../chunk-UGWQLQDS.js";
147
- import "../chunk-7PSYT35Z.js";
147
+ import "../chunk-7BYY7QKC.js";
148
148
  import "../chunk-D6UJEOZQ.js";
149
149
  export {
150
150
  DEFAULT_ESCALATION_TOOLS,
@@ -0,0 +1,31 @@
1
+ declare const interactionProtocol: {
2
+ readonly batches: 2;
3
+ readonly attemptsPerBatch: 40;
4
+ readonly conditions: readonly ['normal', 'interrupted', 'reduced-motion'];
5
+ readonly cacheStates: readonly ['cold', 'warm'];
6
+ readonly selection: 'Consecutive browser input starts; retain failures and identify capture exclusions before replacement.';
7
+ readonly percentile: 'Sorted nearest rank ceil(p * n); separate action, condition, batch and cold/warm context.';
8
+ readonly cold: 'New browser context without application cache.';
9
+ readonly warm: 'Same loaded workflow after initialization.';
10
+ readonly spacing: 'Reset the workflow and settle its visible state before the next declared attempt.';
11
+ readonly observationWindow: 'Maximum computed interaction role time on the input target; missing or invalid roles retain an unresolved sample without observation.';
12
+ readonly presentation: 'DOM state and frame callbacks are bounds, not a presented-frame measurement. Calibrated trace/recording evidence is required.';
13
+ };
14
+ type Batch = {
15
+ condition: typeof interactionProtocol.conditions[number];
16
+ cache: 'cold' | 'warm';
17
+ batch: number;
18
+ };
19
+ /** The catalog owns these observations; capture scripts only export them. */
20
+ export declare function useInteractionEvidence(): import("react").RefObject<HTMLElement | null>;
21
+ declare global {
22
+ interface Window {
23
+ __agentAppInteractionEvidence?: {
24
+ protocol: typeof interactionProtocol;
25
+ declareBatch(batch: Batch): void;
26
+ snapshot(): unknown;
27
+ calibrate(): Promise<unknown>;
28
+ };
29
+ }
30
+ }
31
+ export {};
@@ -39,8 +39,8 @@ import {
39
39
  } from "../chunk-6PRQ45QE.js";
40
40
  import {
41
41
  useInfiniteScroll
42
- } from "../chunk-4WEUWCA4.js";
43
- import "../chunk-QJYJOMMO.js";
42
+ } from "../chunk-EQRVOMMS.js";
43
+ import "../chunk-A2GG4D4A.js";
44
44
  import "../chunk-SJWIZT7B.js";
45
45
  import {
46
46
  CheckGlyph,
@@ -1745,6 +1745,164 @@
1745
1745
  --text-dim: #9496bc;
1746
1746
  }
1747
1747
  }
1748
+ /* Framework-neutral opt-in presentation. Load fonts from the application's origin. */
1749
+ [data-typography="expressive"],
1750
+ [data-typography="expressive"] :is([data-theme], [data-sandbox-ui], [data-sandbox-theme], .dark, .light) {
1751
+ --font-display: "Outfit", ui-sans-serif, system-ui, sans-serif;
1752
+ --font-sans: "Geist", ui-sans-serif, system-ui, sans-serif;
1753
+ --font-mono: "Geist Mono", ui-monospace, monospace;
1754
+ font-family: var(--font-sans);
1755
+ }
1756
+ .tangle-intro {
1757
+ position: relative;
1758
+ isolation: isolate;
1759
+ overflow: clip;
1760
+ padding: var(--hero-padding-top) var(--hero-gutter) var(--hero-padding-bottom);
1761
+ text-align: center;
1762
+ color: hsl(var(--foreground));
1763
+ background: hsl(var(--background));
1764
+ }
1765
+ .tangle-intro::before {
1766
+ content: "";
1767
+ position: absolute;
1768
+ inset: 0;
1769
+ z-index: -1;
1770
+ pointer-events: none;
1771
+ opacity: var(--hero-atmosphere-opacity);
1772
+ background: radial-gradient(ellipse at 50% 0%, hsl(var(--primary)), transparent 70%);
1773
+ }
1774
+ .tangle-intro[data-grid]::after {
1775
+ content: "";
1776
+ position: absolute;
1777
+ inset: 0;
1778
+ z-index: -1;
1779
+ pointer-events: none;
1780
+ background-image: linear-gradient(var(--border-subtle) 1px, transparent 1px), linear-gradient(90deg, var(--border-subtle) 1px, transparent 1px);
1781
+ background-size: var(--hero-grid-pitch) var(--hero-grid-pitch);
1782
+ mask-image: radial-gradient(ellipse at top, black, transparent 75%);
1783
+ }
1784
+ .tangle-display {
1785
+ margin: 0 auto;
1786
+ max-width: var(--display-max-width);
1787
+ overflow-wrap: anywhere;
1788
+ font-family: var(--font-display);
1789
+ font-size: var(--font-size-display);
1790
+ line-height: var(--line-height-display);
1791
+ letter-spacing: var(--tracking-display);
1792
+ font-weight: 700;
1793
+ color: hsl(var(--foreground));
1794
+ }
1795
+ .tangle-display[data-gradient] {
1796
+ background-image: var(--display-gradient);
1797
+ background-clip: text;
1798
+ -webkit-background-clip: text;
1799
+ color: transparent;
1800
+ }
1801
+ .tangle-intro-description {
1802
+ margin: var(--hero-content-gap) auto 0;
1803
+ max-width: var(--reading-max-width);
1804
+ color: hsl(var(--muted-foreground));
1805
+ font-size: clamp(1rem, 0.8rem + 1vw, 1.25rem);
1806
+ line-height: 1.625;
1807
+ }
1808
+ .tangle-intro-actions {
1809
+ display: flex;
1810
+ flex-wrap: wrap;
1811
+ justify-content: center;
1812
+ gap: var(--hero-action-gap);
1813
+ margin-top: 2.5rem;
1814
+ }
1815
+ .tangle-control-display {
1816
+ display: inline-flex;
1817
+ align-items: center;
1818
+ justify-content: center;
1819
+ gap: var(--hero-action-gap);
1820
+ min-height: var(--display-control-height);
1821
+ padding: 0 1.5rem;
1822
+ border: 1px solid transparent;
1823
+ border-radius: var(--display-control-radius);
1824
+ font: 600 var(--display-control-font-size)/1 var(--font-sans);
1825
+ text-decoration: none;
1826
+ white-space: nowrap;
1827
+ box-shadow: var(--display-control-shadow);
1828
+ cursor: pointer;
1829
+ transition: transform var(--motion-control);
1830
+ }
1831
+ .tangle-control-display:not([data-variant]), .tangle-control-display[data-variant="default"] { background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); }
1832
+ .tangle-control-display[data-variant="outline"] {
1833
+ background: hsl(var(--card));
1834
+ color: hsl(var(--card-foreground));
1835
+ border-color: hsl(var(--border));
1836
+ box-shadow: none;
1837
+ }
1838
+ .tangle-control-display:focus-visible { outline: 2px solid hsl(var(--ring)); outline-offset: 3px; }
1839
+ .tangle-control-display:disabled, .tangle-control-display[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; }
1840
+ @media (hover: hover) and (pointer: fine) {
1841
+ .tangle-control-display:not(:disabled):not([aria-disabled="true"]):hover { transform: translateY(-1px); }
1842
+ }
1843
+ .tangle-control-display:not(:disabled):not([aria-disabled="true"]):active { transform: translateY(1px); }
1844
+ .tangle-intro-knot {
1845
+ position: absolute;
1846
+ z-index: -1;
1847
+ pointer-events: none;
1848
+ width: clamp(30rem, 45vw, 40rem);
1849
+ height: auto;
1850
+ right: -10rem;
1851
+ top: 1.5rem;
1852
+ opacity: var(--hero-knot-opacity);
1853
+ rotate: -14deg;
1854
+ }
1855
+ .tangle-intro-knot > svg { width: 100%; height: auto; }
1856
+ .tangle-intro[data-motion] { animation: tangle-intro-enter var(--motion-arrive) both; }
1857
+ @keyframes tangle-intro-enter { from { opacity: 0; transform: translateY(var(--arrive-distance)); } to { opacity: 1; transform: none; } }
1858
+ @media (prefers-reduced-motion: reduce) {
1859
+ .tangle-intro, .tangle-intro *, .tangle-control-display { animation: none !important; transition: none !important; transform: none !important; }
1860
+ }
1861
+ @media (forced-colors: active) {
1862
+ .tangle-display[data-gradient] { background: none; color: CanvasText; }
1863
+ .tangle-intro::before, .tangle-intro::after { display: none; }
1864
+ }
1865
+ /* Nonvisual presence markers let Radix retain its lifecycle while the shared
1866
+ * surface adapter retargets geometry. Distinct names preserve interrupted exit. */
1867
+ @keyframes tangle-surface-present { from { --tangle-presence: 0; } to { --tangle-presence: 1; } }
1868
+ @keyframes tangle-surface-absent { from { --tangle-presence: 1; } to { --tangle-presence: 0; } }
1869
+ /* Requires Brand styles; the same contracts serve React and Hono. */
1870
+ .tangle-heading { color: hsl(var(--foreground)); font-family: var(--font-display); font-weight: 600; line-height: var(--line-height-heading); letter-spacing: var(--tracking-tight); }
1871
+ .tangle-heading[data-variant="display"] { font-size: var(--font-size-display); line-height: var(--line-height-display); }
1872
+ .tangle-heading[data-variant="hero"] { font-size: var(--font-size-hero); line-height: var(--line-height-display); }
1873
+ .tangle-heading[data-variant="page"] { font-size: var(--font-size-3xl); }
1874
+ .tangle-heading[data-variant="section"] { font-size: var(--font-size-xl); }
1875
+ .tangle-heading[data-variant="subsection"] { font-size: var(--font-size-lg); }
1876
+ .tangle-heading[data-variant="eyebrow"] { font-size: var(--font-size-sm); text-transform: uppercase; letter-spacing: var(--tracking-wide); color: hsl(var(--muted-foreground)); }
1877
+ .tangle-page-header { min-width: 0; margin-bottom: 1.5rem; }
1878
+ .tangle-page-header-main { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 1.5rem; }
1879
+ .tangle-intro .tangle-page-header-main { display: block; }
1880
+ .tangle-reading-shell { display: grid; grid-template-columns: minmax(0,1fr); gap: 2rem; padding: 2rem var(--hero-gutter); max-width: var(--content-max-width); margin: auto; min-width: 0; }
1881
+ .tangle-reading-shell > * { min-width: 0; }
1882
+ .tangle-reading-article { width: 100%; max-width: var(--reading-max-width); overflow-wrap: anywhere; }
1883
+ .tangle-reading-nav a, .tangle-reading-outline a { display: block; padding: 0.5rem 0; color: hsl(var(--muted-foreground)); text-decoration: none; }
1884
+ .tangle-reading-nav a[aria-current]:not([aria-current="false"]), .tangle-reading-outline a[aria-current]:not([aria-current="false"]) { color: var(--accent-text); font-weight: 600; }
1885
+ @media(min-width: 64rem) {
1886
+ .tangle-reading-shell { grid-template-columns: 13rem minmax(0,1fr); }
1887
+ .tangle-reading-outline { display: none; }
1888
+ .tangle-reading-nav { position: sticky; top: var(--shell-header-height); align-self: start; max-height: calc(100dvh - var(--shell-header-height)); overflow: auto; }
1889
+ }
1890
+ @media(min-width: 80rem) {
1891
+ .tangle-reading-shell:has(.tangle-reading-outline) { grid-template-columns: 13rem minmax(0,1fr) 11rem; }
1892
+ .tangle-reading-outline { display: block; position: sticky; top: var(--shell-header-height); align-self: start; }
1893
+ }
1894
+ /* Native dialog has the same solid reading surface as React's Dialog/Sheet. */
1895
+ .tangle-native-dialog { max-width: min(32rem,calc(100% - 2rem)); max-height: calc(100dvh - 2rem); overflow: auto; margin: auto; padding: 1.5rem; border: 1px solid hsl(var(--border)); border-radius: var(--radius-lg); background: hsl(var(--card)); color: hsl(var(--card-foreground)); }
1896
+ .tangle-native-dialog::backdrop { background: var(--scrim); }
1897
+ .tangle-api-meta { font-family: var(--font-mono); font-size: var(--font-size-sm); color: hsl(var(--muted-foreground)); overflow-wrap: anywhere; }
1898
+ .tangle-api-schema { margin: 1rem 0; }
1899
+ .tangle-api-schema > div { padding-block: 0.75rem; border-bottom: 1px solid hsl(var(--border)); overflow-wrap: anywhere; }
1900
+ .tangle-api-schema dt { font-family: var(--font-mono); font-size: var(--font-size-label); }
1901
+ .tangle-api-schema dt span, .tangle-api-schema dd { color: hsl(var(--muted-foreground)); }
1902
+ .tangle-api-schema dd { margin: 0.25rem 0 0; font-size: var(--font-size-label); }
1903
+ .tangle-page-description { margin-top: 0.25rem; max-width: 65ch; color: hsl(var(--muted-foreground)); font-size: var(--font-size-label); overflow-wrap: anywhere; }
1904
+ .tangle-code-tabs { overflow-x: auto; max-width: 100%; }
1905
+ .tangle-code-tabs [role="tab"] { flex: none; min-height: var(--control-height-lg); }
1748
1906
  @layer theme{/* GENERATED from @tangle-network/brand/styles/legacy-light.css
1749
1907
  * SHA-256: 33e13702150c34d3a1350846ce3dae2c6c7ef17e1632fbae5d3479a1b43f55f3
1750
1908
  * Run node src/theme/build.mjs --write; do not edit colors or ratios here. */
@@ -9,7 +9,7 @@ import {
9
9
  restrictTaxonomy,
10
10
  verifyCapabilityToken,
11
11
  verifyExpiringCapabilityToken
12
- } from "../chunk-ER3KSBA4.js";
12
+ } from "../chunk-75ZIWV4U.js";
13
13
  import {
14
14
  DEFAULT_APP_TOOL_PATHS,
15
15
  DEFAULT_HEADER_NAMES,
@@ -23,7 +23,7 @@ import {
23
23
  unresolvableSurfaceCredential
24
24
  } from "../chunk-6A7MYOUI.js";
25
25
  import "../chunk-S5SRJJQG.js";
26
- import "../chunk-NO2YNV5C.js";
26
+ import "../chunk-YXLN4PXK.js";
27
27
  import {
28
28
  APP_TOOL_NAMES,
29
29
  buildAppToolOpenAITools,
@@ -31,11 +31,11 @@ import {
31
31
  defineAppTool,
32
32
  findCustomTool,
33
33
  isAppToolName
34
- } from "../chunk-6CKNC32J.js";
34
+ } from "../chunk-AJZ3EJB5.js";
35
35
  import "../chunk-UGWQLQDS.js";
36
36
  import {
37
37
  ToolInputError
38
- } from "../chunk-7PSYT35Z.js";
38
+ } from "../chunk-7BYY7QKC.js";
39
39
  export {
40
40
  APP_TOOL_NAMES,
41
41
  DEFAULT_APP_TOOL_PATHS,
@@ -1,11 +1,11 @@
1
1
  import { type ReactNode } from 'react';
2
- export declare function ActionDialogButton({ children, onClick, disabled, variant, }: {
2
+ export declare function ActionDialogButton({ children, onClick, disabled, variant }: {
3
3
  children: ReactNode;
4
4
  onClick: () => void;
5
5
  disabled?: boolean;
6
6
  variant?: 'primary' | 'ghost' | 'destructive';
7
7
  }): import("react").JSX.Element;
8
- export declare function ActionDialog({ title, children, footer, onClose, busy, error, }: {
8
+ export declare function ActionDialog({ title, children, footer, onClose, busy, error }: {
9
9
  title: string;
10
10
  children: ReactNode;
11
11
  footer: ReactNode;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  AGENT_PROFILE_EDITOR_SECTIONS,
3
3
  AgentProfileEditor
4
- } from "../chunk-GIJY3YCH.js";
4
+ } from "../chunk-3RHAF2P5.js";
5
5
  import "../chunk-YESFGM56.js";
6
6
  import "../chunk-YGBEGBJY.js";
7
7
  import "../chunk-TJ4DYKF2.js";
@@ -57,7 +57,7 @@ export interface SectionProps {
57
57
  collapsible?: boolean;
58
58
  children: ReactNode;
59
59
  }
60
- /** A bordered section. Collapsible sections use a native disclosure so they work without script. */
60
+ /** Profile copy and spacing compose the shared card and disclosure. */
61
61
  export declare function Section({ title, description, summary, defaultOpen, collapsible, children }: SectionProps): import("react").JSX.Element;
62
62
  export type StatusTone = 'neutral' | 'pending' | 'success' | 'warning' | 'error';
63
63
  /** An inline status with an icon: a check in progress, a passed check, or a failure. */
@@ -16,7 +16,7 @@ import {
16
16
  resolveAsyncValue,
17
17
  useAsyncResource,
18
18
  useConfirmedMutation
19
- } from "../../chunk-LSUELMHY.js";
19
+ } from "../../chunk-LN5RBVGP.js";
20
20
  export {
21
21
  AsyncRequestError,
22
22
  AsyncView,
@@ -71,6 +71,8 @@ export * from './record-grid';
71
71
  export * from './command-palette';
72
72
  export * from './sparkline';
73
73
  export * from './insight-card';
74
+ export { ReviewInbox, type ReviewInboxItem, type ReviewInboxFeedback, type ReviewInboxProps } from './review-inbox';
75
+ export { ReviewFeedbackForm, type ReviewFeedbackFormProps, type ReviewFeedbackFormHandle, type ReviewFeedbackDraft, type ReviewVerdict } from '../hub-approvals-react/feedback';
74
76
  export * from './use-dictation';
75
77
  export { usePopover, usePending, PopoverSurface, POPOVER_SURFACE_ATTR, ModelPicker, formatModelPrice, EffortPicker, EffortMeter, effortMeterFill, effortLevelLabel, effortLevelsFromIds, reconcileEffortLevels, DEFAULT_EFFORT_LEVELS, EFFORT_METER_SEGMENTS, OVERLAY_SHADOW, fieldPickerTriggerClass, type ModelPickerProps, type EffortPickerProps, type EffortLevel, type PickerVariant, type PopoverSurfaceProps, } from './controls';
76
78
  export { AgentSessionControls, HarnessPicker, type AgentSessionControlsProps, type HarnessPickerProps, } from './agent-session-controls';
@@ -39,6 +39,7 @@ import {
39
39
  QuestionOptionList,
40
40
  ReasoningRow,
41
41
  RecordGrid,
42
+ ReviewInbox,
42
43
  RunDrillIn,
43
44
  SeatPaywall,
44
45
  Sparkline,
@@ -142,14 +143,14 @@ import {
142
143
  withoutRecordGridCreated,
143
144
  withoutRecordGridRemoved,
144
145
  withoutRecordGridUpdate
145
- } from "../chunk-IAFPBYQQ.js";
146
+ } from "../chunk-6ZUVYAKB.js";
146
147
  import {
147
148
  SessionHistoryPanel,
148
149
  formatSessionTimestamp,
149
150
  useInfiniteScroll,
150
151
  useSessionActions,
151
152
  useSessionHistory
152
- } from "../chunk-4WEUWCA4.js";
153
+ } from "../chunk-EQRVOMMS.js";
153
154
  import {
154
155
  MENTION_PILL_CLASS
155
156
  } from "../chunk-3HUFJ5LO.js";
@@ -158,7 +159,7 @@ import {
158
159
  WorkspaceInitial,
159
160
  WorkspaceSwitcher
160
161
  } from "../chunk-UDLA3NGY.js";
161
- import "../chunk-QJYJOMMO.js";
162
+ import "../chunk-A2GG4D4A.js";
162
163
  import {
163
164
  tabTerminalConnectionId,
164
165
  useSandboxTerminalConnection
@@ -167,7 +168,7 @@ import {
167
168
  AGENT_PROFILE_EDITOR_SECTIONS,
168
169
  AgentProfileEditor,
169
170
  AgentProfileRegistryError
170
- } from "../chunk-GIJY3YCH.js";
171
+ } from "../chunk-3RHAF2P5.js";
171
172
  import {
172
173
  EvidenceLineageTable,
173
174
  ExceptionList,
@@ -231,7 +232,11 @@ import {
231
232
  import {
232
233
  ProviderLogo
233
234
  } from "../chunk-RASGKEAL.js";
234
- import "../chunk-LSUELMHY.js";
235
+ import "../chunk-LN5RBVGP.js";
236
+ import {
237
+ ReviewFeedbackForm
238
+ } from "../chunk-ATQQCG4I.js";
239
+ import "../chunk-WSEXFTN4.js";
235
240
  import "../chunk-FQYAJYPW.js";
236
241
  import {
237
242
  ATTACHMENT_ACCEPT
@@ -375,6 +380,8 @@ export {
375
380
  QuestionOptionList,
376
381
  ReasoningRow,
377
382
  RecordGrid,
383
+ ReviewFeedbackForm,
384
+ ReviewInbox,
378
385
  ReviewQueuePanel,
379
386
  RouteChunkBoundary,
380
387
  RunDrillIn,
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { HubActionPreview, HubApprovalFeedback } from '../hub-approvals';
3
+ import { type ReviewVerdict } from '../hub-approvals-react/feedback';
4
+ export interface ReviewInboxItem {
5
+ id: string;
6
+ revision: string | number;
7
+ title: string;
8
+ kind: string;
9
+ createdAt: number;
10
+ canReview: boolean;
11
+ input: unknown;
12
+ feedback?: HubApprovalFeedback;
13
+ preview?: HubActionPreview;
14
+ approveLabel?: string;
15
+ allowedVerdicts?: readonly ReviewVerdict[];
16
+ }
17
+ export interface ReviewInboxFeedback extends HubApprovalFeedback {
18
+ verdict: ReviewVerdict;
19
+ }
20
+ export interface ReviewInboxProps {
21
+ items: readonly ReviewInboxItem[];
22
+ /** An existing deep-linked item; selected once when the round begins, without reordering it. */
23
+ initialSelectedId?: string;
24
+ renderItem: (item: ReviewInboxItem) => ReactNode;
25
+ /** Resolves only after the verdict and its learning signal have been stored. */
26
+ onVerdict: (item: ReviewInboxItem, decision: ReviewInboxFeedback) => Promise<void>;
27
+ onFeedback?: (item: ReviewInboxItem, feedback: Omit<ReviewInboxFeedback, 'verdict'>) => Promise<void>;
28
+ loading?: boolean;
29
+ error?: string | null;
30
+ onRefresh?: () => void | Promise<void>;
31
+ }
32
+ /** One oldest-first review round. Domain rendering, storage and authority stay with the host. */
33
+ export declare function ReviewInbox({ items, initialSelectedId, renderItem, onVerdict, onFeedback, loading, error, onRefresh }: ReviewInboxProps): import("react").JSX.Element;
@@ -16,11 +16,11 @@ import {
16
16
  } from "../chunk-3NVVBQ2U.js";
17
17
  import {
18
18
  defineAppTool
19
- } from "../chunk-6CKNC32J.js";
19
+ } from "../chunk-AJZ3EJB5.js";
20
20
  import "../chunk-UGWQLQDS.js";
21
21
  import {
22
22
  ToolInputError
23
- } from "../chunk-7PSYT35Z.js";
23
+ } from "../chunk-7BYY7QKC.js";
24
24
  import {
25
25
  isWorkProductStatus,
26
26
  parseAgentCheckInput,
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  ActionDialog,
7
7
  ActionDialogButton
8
- } from "../chunk-QJYJOMMO.js";
8
+ } from "../chunk-A2GG4D4A.js";
9
9
  import {
10
10
  buildSessionNavItem,
11
11
  composeSidebarSessions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/agent-app",
3
- "version": "0.60.178",
3
+ "version": "0.60.180",
4
4
  "packageManager": "pnpm@11.24.0",
5
5
  "description": "Build agent applications with typed chat, tools, sandboxes, integrations, billing, and evaluation.",
6
6
  "keywords": [
@@ -701,7 +701,7 @@
701
701
  "@tangle-network/hub-sdk": "0.30.2",
702
702
  "@tangle-network/sandbox": "0.60.49",
703
703
  "@tangle-network/sandbox-ui": "0.134.7",
704
- "@tangle-network/ui": "11.35.0",
704
+ "@tangle-network/ui": "11.38.1",
705
705
  "@testing-library/dom": "^10.4.1",
706
706
  "@testing-library/react": "^16.3.3",
707
707
  "@testing-library/user-event": "^14.6.6",