@tangle-network/agent-app 0.45.48 → 0.45.50

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 (78) hide show
  1. package/dist/{DesignCanvas-QY2CA5GI.js → DesignCanvas-JRBCAWHW.js} +2 -2
  2. package/dist/{DesignCanvasEditor-CJ7PLX7A.js → DesignCanvasEditor-J2OLS22G.js} +4 -4
  3. package/dist/{IntakeInterview-NJXKH35Q.js → IntakeInterview-OKT6DCBN.js} +2 -2
  4. package/dist/{InvitationsPanel-F2VY4TSL.js → InvitationsPanel-OFCYVSAE.js} +2 -2
  5. package/dist/InviteAcceptPage-BDOO4JSE.js +7 -0
  6. package/dist/{MembersPanel-N5CBOUXC.js → MembersPanel-3ZK2GCMC.js} +2 -2
  7. package/dist/{TimelineEditor-IYNKBSUX.js → TimelineEditor-52YEPDX5.js} +2 -2
  8. package/dist/VaultPane-IGJKB6CX.js +7 -0
  9. package/dist/assistant/index.d.ts +18 -2
  10. package/dist/assistant/index.js +45 -14
  11. package/dist/assistant/index.js.map +1 -1
  12. package/dist/{billing-BibxgALe.d.ts → billing-BuNlaKlE.d.ts} +15 -23
  13. package/dist/chat-react/index.js +1 -1
  14. package/dist/{chunk-DS2WE62K.js → chunk-33BN7P57.js} +5 -5
  15. package/dist/chunk-33BN7P57.js.map +1 -0
  16. package/dist/{chunk-5BACNOVR.js → chunk-5MI2SKQH.js} +2 -2
  17. package/dist/chunk-5MI2SKQH.js.map +1 -0
  18. package/dist/{chunk-C7AQW6US.js → chunk-7HY4LX7O.js} +820 -208
  19. package/dist/chunk-7HY4LX7O.js.map +1 -0
  20. package/dist/{chunk-T7XPIBCX.js → chunk-7LJYCHXK.js} +16 -16
  21. package/dist/chunk-7LJYCHXK.js.map +1 -0
  22. package/dist/{chunk-XVRHISF3.js → chunk-CJHIAZKK.js} +5 -5
  23. package/dist/chunk-CJHIAZKK.js.map +1 -0
  24. package/dist/{chunk-J6OJTFNE.js → chunk-ENLRJYVW.js} +13 -13
  25. package/dist/chunk-ENLRJYVW.js.map +1 -0
  26. package/dist/{chunk-R6KGLGEJ.js → chunk-GRDLGQ6A.js} +2 -2
  27. package/dist/{chunk-R6KGLGEJ.js.map → chunk-GRDLGQ6A.js.map} +1 -1
  28. package/dist/{chunk-XPFNEKHS.js → chunk-I2CA5N7V.js} +2 -2
  29. package/dist/chunk-I2CA5N7V.js.map +1 -0
  30. package/dist/{chunk-IN6LNZ7O.js → chunk-Q2QKEV6J.js} +7 -7
  31. package/dist/{chunk-IN6LNZ7O.js.map → chunk-Q2QKEV6J.js.map} +1 -1
  32. package/dist/{chunk-RILGAFEL.js → chunk-UMV45ZDF.js} +3 -3
  33. package/dist/{chunk-JJJEO4ND.js → chunk-VWTODXRW.js} +2 -2
  34. package/dist/{chunk-JJJEO4ND.js.map → chunk-VWTODXRW.js.map} +1 -1
  35. package/dist/{chunk-DB2D2JBQ.js → chunk-W7P5KV6O.js} +2 -2
  36. package/dist/{chunk-DB2D2JBQ.js.map → chunk-W7P5KV6O.js.map} +1 -1
  37. package/dist/{chunk-GT4GTRGQ.js → chunk-ZGY6QB4F.js} +5 -5
  38. package/dist/{chunk-GT4GTRGQ.js.map → chunk-ZGY6QB4F.js.map} +1 -1
  39. package/dist/design-canvas-react/index.js +7 -7
  40. package/dist/design-canvas-react/index.js.map +1 -1
  41. package/dist/design-canvas-react/lazy.js +1 -1
  42. package/dist/intakes-react/index.js +1 -1
  43. package/dist/intakes-react/lazy.js +1 -1
  44. package/dist/platform/index.d.ts +1 -1
  45. package/dist/platform/index.js +16 -16
  46. package/dist/platform/index.js.map +1 -1
  47. package/dist/sequences-react/index.js +2 -2
  48. package/dist/studio-react/index.js +23 -23
  49. package/dist/studio-react/index.js.map +1 -1
  50. package/dist/teams-react/index.js +3 -3
  51. package/dist/teams-react/lazy.js +3 -3
  52. package/dist/theme/index.js +1 -1
  53. package/dist/theme/tokens.css +15 -13
  54. package/dist/vault/index.js +1 -1
  55. package/dist/vault/lazy.js +1 -1
  56. package/dist/web-react/index.d.ts +359 -5
  57. package/dist/web-react/index.js +44 -3
  58. package/dist/work-product-react/index.js +7 -7
  59. package/dist/work-product-react/index.js.map +1 -1
  60. package/package.json +1 -1
  61. package/dist/InviteAcceptPage-UT4452KT.js +0 -7
  62. package/dist/VaultPane-MUWGYVJ7.js +0 -7
  63. package/dist/chunk-5BACNOVR.js.map +0 -1
  64. package/dist/chunk-C7AQW6US.js.map +0 -1
  65. package/dist/chunk-DS2WE62K.js.map +0 -1
  66. package/dist/chunk-J6OJTFNE.js.map +0 -1
  67. package/dist/chunk-T7XPIBCX.js.map +0 -1
  68. package/dist/chunk-XPFNEKHS.js.map +0 -1
  69. package/dist/chunk-XVRHISF3.js.map +0 -1
  70. /package/dist/{DesignCanvas-QY2CA5GI.js.map → DesignCanvas-JRBCAWHW.js.map} +0 -0
  71. /package/dist/{DesignCanvasEditor-CJ7PLX7A.js.map → DesignCanvasEditor-J2OLS22G.js.map} +0 -0
  72. /package/dist/{IntakeInterview-NJXKH35Q.js.map → IntakeInterview-OKT6DCBN.js.map} +0 -0
  73. /package/dist/{InvitationsPanel-F2VY4TSL.js.map → InvitationsPanel-OFCYVSAE.js.map} +0 -0
  74. /package/dist/{InviteAcceptPage-UT4452KT.js.map → InviteAcceptPage-BDOO4JSE.js.map} +0 -0
  75. /package/dist/{MembersPanel-N5CBOUXC.js.map → MembersPanel-3ZK2GCMC.js.map} +0 -0
  76. /package/dist/{TimelineEditor-IYNKBSUX.js.map → TimelineEditor-52YEPDX5.js.map} +0 -0
  77. /package/dist/{VaultPane-MUWGYVJ7.js.map → VaultPane-IGJKB6CX.js.map} +0 -0
  78. /package/dist/{chunk-RILGAFEL.js.map → chunk-UMV45ZDF.js.map} +0 -0
@@ -3,9 +3,15 @@ import {
3
3
  ChatComposer,
4
4
  ChatEmptyState,
5
5
  ChatMessages,
6
+ DEFAULT_INSIGHT_PAGE_SIZE,
6
7
  DEFAULT_MENTION_EMPTY_TEXT,
7
8
  DEFAULT_MENTION_LIMIT,
8
9
  DEFAULT_PROVENANCE_CONFIDENCE_POLICY,
10
+ DEFAULT_SPARKLINE_EMPTY_LABEL,
11
+ DEFAULT_SPARKLINE_HEIGHT,
12
+ DEFAULT_SPARKLINE_LABEL,
13
+ DEFAULT_SPARKLINE_UNAVAILABLE_LABEL,
14
+ DEFAULT_SPARKLINE_WIDTH,
9
15
  DurableChatCards,
10
16
  DurablePlanCard,
11
17
  DurablePlanClientError,
@@ -14,6 +20,8 @@ import {
14
20
  INDEX_REFRESH_AFTER_MS,
15
21
  INTERACTION_SUBMIT_TIMEOUT_MESSAGE,
16
22
  INTERACTION_SUBMIT_TIMEOUT_MS,
23
+ InsightCard,
24
+ InsightDeck,
17
25
  InteractionActionButton,
18
26
  InteractionBadge,
19
27
  InteractionPlanCard,
@@ -28,6 +36,7 @@ import {
28
36
  RunDrillIn,
29
37
  SeatPaywall,
30
38
  SessionHistoryPanel,
39
+ Sparkline,
31
40
  __resetAttachmentFileCacheForTests,
32
41
  activityTone,
33
42
  buildAnswerData,
@@ -47,12 +56,19 @@ import {
47
56
  fieldValuesFromAnswers,
48
57
  formatActivityCost,
49
58
  formatActivityDuration,
59
+ formatInsightDelta,
50
60
  formatModelCost,
51
61
  formatRecordGridValue,
52
62
  formatSessionTimestamp,
63
+ formatSparklineValue,
53
64
  formatTokensPerSecond,
54
65
  hasSecretField,
55
66
  hydrateChatInteractions,
67
+ insightDelta,
68
+ insightDeltaTone,
69
+ insightPageCount,
70
+ insightPageSize,
71
+ insightPageSlice,
56
72
  interactionStatusLabels,
57
73
  interactionSubmissionSignature,
58
74
  interactionTerminalNotes,
@@ -86,6 +102,10 @@ import {
86
102
  sameRecordGridValue,
87
103
  segmentMentionContent,
88
104
  settleInteractionSubmit,
105
+ sparklineGeometry,
106
+ sparklineLabel,
107
+ sparklinePointsAttribute,
108
+ sparklineReadings,
89
109
  standingFromConfidence,
90
110
  streamChatTurn,
91
111
  sumRecordGridColumn,
@@ -111,7 +131,7 @@ import {
111
131
  withoutRecordGridCreated,
112
132
  withoutRecordGridRemoved,
113
133
  withoutRecordGridUpdate
114
- } from "../chunk-C7AQW6US.js";
134
+ } from "../chunk-7HY4LX7O.js";
115
135
  import "../chunk-FBVLEGEG.js";
116
136
  import {
117
137
  EvidenceLineageTable,
@@ -124,7 +144,7 @@ import {
124
144
  reviewQueueStateLabel,
125
145
  workProductPartsFromMessageParts,
126
146
  workProductStatusLabel
127
- } from "../chunk-J6OJTFNE.js";
147
+ } from "../chunk-ENLRJYVW.js";
128
148
  import {
129
149
  parseReviewQueueItem
130
150
  } from "../chunk-GEYACSFW.js";
@@ -146,7 +166,7 @@ import {
146
166
  useComposerAttachments,
147
167
  usePending,
148
168
  usePopover
149
- } from "../chunk-XVRHISF3.js";
169
+ } from "../chunk-CJHIAZKK.js";
150
170
  import {
151
171
  ProviderLogo
152
172
  } from "../chunk-MLG6XKPV.js";
@@ -154,6 +174,7 @@ import {
154
174
  tabTerminalConnectionId,
155
175
  useSandboxTerminalConnection
156
176
  } from "../chunk-BATKJP3P.js";
177
+ import "../chunk-3UBAO3N5.js";
157
178
  import "../chunk-PC2WYTK7.js";
158
179
  import "../chunk-QY4BRKRJ.js";
159
180
  import {
@@ -218,9 +239,15 @@ export {
218
239
  ChatEmptyState,
219
240
  ChatMessages,
220
241
  DEFAULT_EFFORT_LEVELS,
242
+ DEFAULT_INSIGHT_PAGE_SIZE,
221
243
  DEFAULT_MENTION_EMPTY_TEXT,
222
244
  DEFAULT_MENTION_LIMIT,
223
245
  DEFAULT_PROVENANCE_CONFIDENCE_POLICY,
246
+ DEFAULT_SPARKLINE_EMPTY_LABEL,
247
+ DEFAULT_SPARKLINE_HEIGHT,
248
+ DEFAULT_SPARKLINE_LABEL,
249
+ DEFAULT_SPARKLINE_UNAVAILABLE_LABEL,
250
+ DEFAULT_SPARKLINE_WIDTH,
224
251
  DISPATCH_MAX_MEDIA_PARTS,
225
252
  DISPATCH_MAX_PARTS,
226
253
  DISPATCH_REQUEST_MAX_BYTES,
@@ -242,6 +269,8 @@ export {
242
269
  INTERACTION_RESOLVED_EVENT,
243
270
  INTERACTION_SUBMIT_TIMEOUT_MESSAGE,
244
271
  INTERACTION_SUBMIT_TIMEOUT_MS,
272
+ InsightCard,
273
+ InsightDeck,
245
274
  InteractionActionButton,
246
275
  InteractionBadge,
247
276
  InteractionPlanCard,
@@ -264,6 +293,7 @@ export {
264
293
  RunDrillIn,
265
294
  SeatPaywall,
266
295
  SessionHistoryPanel,
296
+ Sparkline,
267
297
  WorkProductCard,
268
298
  __resetAttachmentFileCacheForTests,
269
299
  activityTone,
@@ -301,12 +331,19 @@ export {
301
331
  fileMentionsToParts,
302
332
  formatActivityCost,
303
333
  formatActivityDuration,
334
+ formatInsightDelta,
304
335
  formatModelCost,
305
336
  formatRecordGridValue,
306
337
  formatSessionTimestamp,
338
+ formatSparklineValue,
307
339
  formatTokensPerSecond,
308
340
  hasSecretField,
309
341
  hydrateChatInteractions,
342
+ insightDelta,
343
+ insightDeltaTone,
344
+ insightPageCount,
345
+ insightPageSize,
346
+ insightPageSlice,
310
347
  interactionFromWireRequest,
311
348
  interactionPartKey,
312
349
  interactionStatusLabels,
@@ -362,6 +399,10 @@ export {
362
399
  sameRecordGridValue,
363
400
  segmentMentionContent,
364
401
  settleInteractionSubmit,
402
+ sparklineGeometry,
403
+ sparklineLabel,
404
+ sparklinePointsAttribute,
405
+ sparklineReadings,
365
406
  stampInteractionAnswers,
366
407
  standingFromConfidence,
367
408
  streamChatTurn,
@@ -4,7 +4,7 @@ import {
4
4
  ProvenanceStamp,
5
5
  QualityCheckList,
6
6
  workProductStatusLabel
7
- } from "../chunk-J6OJTFNE.js";
7
+ } from "../chunk-ENLRJYVW.js";
8
8
  import "../chunk-GEYACSFW.js";
9
9
  import {
10
10
  unresolvedBlockingExceptions
@@ -79,12 +79,12 @@ function WorkProductPane({
79
79
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
80
80
  /* @__PURE__ */ jsxs("p", { className: "truncate text-sm font-semibold text-foreground", children: [
81
81
  artifact?.title ?? workProduct.scopeKey,
82
- /* @__PURE__ */ jsxs("span", { className: "ml-1.5 text-[11px] font-normal text-muted-foreground", children: [
82
+ /* @__PURE__ */ jsxs("span", { className: "ml-1.5 text-xs font-normal text-muted-foreground", children: [
83
83
  "v",
84
84
  workProduct.version
85
85
  ] })
86
86
  ] }),
87
- /* @__PURE__ */ jsxs("p", { className: "text-[11px] text-muted-foreground", children: [
87
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
88
88
  artifact?.kind && /* @__PURE__ */ jsxs("span", { className: "font-mono", children: [
89
89
  artifact.kind,
90
90
  " \xB7 "
@@ -118,8 +118,8 @@ function WorkProductPane({
118
118
  "v",
119
119
  entry.version
120
120
  ] }),
121
- /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground", children: workProductStatusLabel(entry.status) }),
122
- entry.reviewedBy && /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
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: [
123
123
  "by ",
124
124
  entry.reviewedBy
125
125
  ] }),
@@ -129,7 +129,7 @@ function WorkProductPane({
129
129
  {
130
130
  type: "button",
131
131
  onClick: () => void loadCompare(prior, entry),
132
- className: "rounded-md border border-border px-2 py-0.5 text-[11px] font-medium text-foreground transition hover:bg-accent",
132
+ className: "rounded-md border border-border px-2 py-0.5 text-xs font-medium text-foreground transition hover:bg-accent",
133
133
  children: [
134
134
  "Compare v",
135
135
  prior.version,
@@ -145,7 +145,7 @@ function WorkProductPane({
145
145
  }),
146
146
  compareError && /* @__PURE__ */ jsx("p", { className: "rounded-md bg-destructive/10 px-3 py-2 text-xs text-destructive", children: compareError }),
147
147
  compare && /* @__PURE__ */ jsxs("div", { className: "overflow-auto rounded-lg border border-border", children: [
148
- /* @__PURE__ */ jsxs("p", { className: "border-b border-border px-3 py-2 text-[11px] text-muted-foreground", children: [
148
+ /* @__PURE__ */ jsxs("p", { className: "border-b border-border px-3 py-2 text-xs text-muted-foreground", children: [
149
149
  "v",
150
150
  compare.fromVersion,
151
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 * `/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-[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 {/* 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-[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.48",
3
+ "version": "0.45.50",
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": [
@@ -1,7 +0,0 @@
1
- import {
2
- InviteAcceptPage
3
- } from "./chunk-DB2D2JBQ.js";
4
- export {
5
- InviteAcceptPage
6
- };
7
- //# sourceMappingURL=InviteAcceptPage-UT4452KT.js.map
@@ -1,7 +0,0 @@
1
- import {
2
- VaultPane
3
- } from "./chunk-JJJEO4ND.js";
4
- export {
5
- VaultPane
6
- };
7
- //# sourceMappingURL=VaultPane-MUWGYVJ7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/teams-react/components/InvitationsPanel.tsx"],"sourcesContent":["/**\n * Email-invitation panel: invite by email + role, and a history of every\n * invitation (pending / accepted / expired / revoked) with its email-delivery\n * status. Pending rows expose copy-link / resend / revoke. Fully callback-driven\n * — the host supplies the data and the async `onInvite` / `onResend` / `onRevoke`\n * callbacks (backed by `./teams/invitations-api`), so this imports no app router,\n * fetch client, or toast. Styled with the shipped Tangle Quiet tokens (`var(--*)`).\n *\n * Mount alongside a list-only `MembersPanel` (`showInviteForm={false}`): the\n * members panel shows accepted members, this owns the invite flow + pending list.\n */\n\nimport { useState } from 'react'\nimport type { WorkspaceRole } from '../../teams/roles'\nimport { hasWorkspaceRole } from '../../teams/roles'\nimport type { InvitationView, InvitationsPanelProps } from '../contracts'\nimport { RoleSelect } from './RoleSelect'\n\nconst BADGE_BASE = 'inline-flex items-center rounded border px-2 py-0.5 text-[11px] font-semibold uppercase tracking-[0.05em]'\n\n// Lifecycle status: green = in, amber = awaiting, red = killed, muted = lapsed.\nconst STATUS_BADGE: Record<InvitationView['status'], string> = {\n accepted: 'border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]',\n pending: 'border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]',\n revoked: 'border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] text-[var(--surface-danger-text)]',\n expired: 'border-[var(--border-default)] text-[var(--text-muted)]',\n}\n\n// Delivery status: red = bounced, amber = not yet attempted, muted = the normal happy path.\nconst EMAIL_BADGE: Record<InvitationView['emailStatus'], string> = {\n sent: 'border-[var(--border-default)] text-[var(--text-muted)]',\n not_sent: 'border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]',\n failed: 'border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] text-[var(--surface-danger-text)]',\n}\n\n/** Uppercase the role's first letter in JS (not CSS `capitalize`, which would\n * also hit the lowercase \"expires\" in the same line). */\nfunction capitalize(text: string): string {\n return text.length === 0 ? text : text[0]!.toUpperCase() + text.slice(1)\n}\n\nexport function InvitationsPanel({\n invitations,\n currentRole,\n onInvite,\n onResend,\n onRevoke,\n onCopy,\n onNotice,\n}: InvitationsPanelProps) {\n const [inviteEmail, setInviteEmail] = useState('')\n const [inviteRole, setInviteRole] = useState<WorkspaceRole>('editor')\n const [inviting, setInviting] = useState(false)\n const [busyId, setBusyId] = useState<string | null>(null)\n\n const canManage = hasWorkspaceRole(currentRole, 'admin')\n\n function notify(kind: 'success' | 'error', message: string) {\n onNotice?.({ kind, message })\n }\n\n async function submitInvite() {\n const email = inviteEmail.trim()\n if (!email || inviting) return\n setInviting(true)\n try {\n await onInvite({ email, role: inviteRole })\n notify('success', `Invitation sent to ${email}`)\n setInviteEmail('')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to invite')\n } finally {\n setInviting(false)\n }\n }\n\n async function copyLink(inviteUrl: string) {\n try {\n if (onCopy) await onCopy({ inviteUrl })\n else await navigator.clipboard.writeText(inviteUrl)\n notify('success', 'Invite link copied')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to copy link')\n }\n }\n\n async function resend(invitationId: string) {\n setBusyId(invitationId)\n try {\n await onResend({ invitationId })\n notify('success', 'Invitation resent')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to resend invitation')\n } finally {\n setBusyId(null)\n }\n }\n\n async function revoke(invitationId: string) {\n setBusyId(invitationId)\n try {\n await onRevoke({ invitationId })\n notify('success', 'Invitation revoked')\n } catch (err) {\n notify('error', err instanceof Error ? err.message : 'Failed to revoke invitation')\n } finally {\n setBusyId(null)\n }\n }\n\n return (\n <section className=\"flex flex-col gap-4\">\n {canManage && (\n <div className=\"flex flex-col gap-1.5\">\n <label className=\"text-xs font-medium text-[var(--text-muted)]\">Invite by email</label>\n <div className=\"flex gap-2\">\n <input\n type=\"email\"\n placeholder=\"colleague@example.com\"\n value={inviteEmail}\n aria-label=\"Invite email address\"\n onChange={(event) => setInviteEmail(event.target.value)}\n onKeyDown={(event) => { if (event.key === 'Enter') void submitInvite() }}\n className=\"flex-1 rounded border border-[var(--border-default)] bg-[var(--bg-input)] px-3 py-1.5 text-sm text-[var(--text-primary)] placeholder:text-[var(--text-muted)]\"\n />\n <RoleSelect\n value={inviteRole}\n ariaLabel=\"Invite role\"\n onChange={setInviteRole}\n />\n <button\n type=\"button\"\n onClick={() => void submitInvite()}\n disabled={inviting || !inviteEmail.trim()}\n className=\"rounded bg-[var(--brand-primary)] px-3 py-1.5 text-sm text-[hsl(var(--primary-foreground))] disabled:opacity-50\"\n >\n {inviting ? 'Inviting…' : 'Invite'}\n </button>\n </div>\n </div>\n )}\n\n <div className=\"flex flex-col gap-2 border-t border-[var(--border-default)] pt-3\">\n <div className=\"flex items-center justify-between\">\n <h4 className=\"text-xs font-semibold text-[var(--text-primary)]\">Invitation history</h4>\n <span className=\"text-xs text-[var(--text-muted)]\">{invitations.length} total</span>\n </div>\n {invitations.length === 0 ? (\n <p className=\"text-sm text-[var(--text-muted)]\">No invitations yet.</p>\n ) : (\n invitations.map((invitation) => (\n <InvitationRow\n key={invitation.id}\n invitation={invitation}\n canManage={canManage}\n busy={busyId === invitation.id}\n onCopy={() => void copyLink(invitation.inviteUrl)}\n onResend={() => void resend(invitation.id)}\n onRevoke={() => void revoke(invitation.id)}\n />\n ))\n )}\n </div>\n </section>\n )\n}\n\ninterface InvitationRowProps {\n invitation: InvitationView\n canManage: boolean\n busy: boolean\n onCopy(): void\n onResend(): void\n onRevoke(): void\n}\n\nfunction InvitationRow({ invitation, canManage, busy, onCopy, onResend, onRevoke }: InvitationRowProps) {\n const isPending = invitation.status === 'pending'\n const emailFailed = invitation.emailStatus === 'failed'\n const expiry = new Date(invitation.expiresAt).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n\n return (\n <div className=\"rounded-lg border border-[var(--border-default)] bg-[var(--bg-input)] p-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-[var(--text-primary)]\">{invitation.email}</p>\n <p className=\"text-xs text-[var(--text-muted)]\">\n {capitalize(invitation.permissions)} · expires {expiry}\n </p>\n {emailFailed && (\n <p className=\"mt-1 text-xs text-[var(--surface-danger-text)]\">Email was not sent — copy the link to share it.</p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <span className={`${BADGE_BASE} ${STATUS_BADGE[invitation.status]}`}>\n {invitation.status}\n </span>\n <span className={`${BADGE_BASE} ${EMAIL_BADGE[invitation.emailStatus]}`}>\n {invitation.emailStatus.replace('_', ' ')}\n </span>\n </div>\n </div>\n {canManage && isPending && (\n <div className=\"mt-3 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCopy}\n disabled={busy}\n className=\"rounded border border-[var(--border-default)] px-2 py-1 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] disabled:opacity-50\"\n >\n Copy link\n </button>\n <button\n type=\"button\"\n onClick={onResend}\n disabled={busy}\n className=\"rounded border border-[var(--border-default)] px-2 py-1 text-xs text-[var(--text-secondary)] hover:text-[var(--text-primary)] disabled:opacity-50\"\n >\n {busy ? 'Working…' : 'Resend'}\n </button>\n <button\n type=\"button\"\n onClick={onRevoke}\n disabled={busy}\n className=\"rounded px-2 py-1 text-xs text-[var(--text-danger)] hover:bg-[var(--border-default)] disabled:opacity-50\"\n >\n Revoke\n </button>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":[]}