@genesislcap/ai-assistant 15.85.1 → 15.86.1
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/ai-assistant.api.json +65 -4
- package/dist/ai-assistant.d.ts +56 -2
- package/dist/chat-driver.cjs +2 -0
- package/dist/chat-driver.cjs.map +2 -2
- package/dist/chat-driver.mjs +2 -0
- package/dist/chat-driver.mjs.map +2 -2
- package/dist/custom-elements.json +1181 -993
- package/dist/dts/autopilot/autopilot-driver.d.ts +46 -2
- package/dist/dts/autopilot/autopilot-driver.d.ts.map +1 -1
- package/dist/dts/components/chat-bubble/chat-bubble.d.ts +9 -2
- package/dist/dts/components/chat-bubble/chat-bubble.d.ts.map +1 -1
- package/dist/dts/components/chat-markdown/chat-markdown.d.ts.map +1 -1
- package/dist/dts/genesis/write-review/write-review.d.ts +23 -0
- package/dist/dts/genesis/write-review/write-review.d.ts.map +1 -1
- package/dist/dts/genesis/write-review/write-review.styles.d.ts.map +1 -1
- package/dist/dts/genesis/write-review/write-review.template.d.ts.map +1 -1
- package/dist/dts/main/main.d.ts +8 -0
- package/dist/dts/main/main.d.ts.map +1 -1
- package/dist/dts/main/main.styles.d.ts.map +1 -1
- package/dist/dts/main/main.template.d.ts.map +1 -1
- package/dist/dts/main/main.types.d.ts +2 -0
- package/dist/dts/main/main.types.d.ts.map +1 -1
- package/dist/dts/react.d.ts +1 -0
- package/dist/dts/state/debug-event-log.d.ts +1 -1
- package/dist/dts/state/debug-event-log.d.ts.map +1 -1
- package/dist/esm/autopilot/autopilot-driver.js +112 -6
- package/dist/esm/components/chat-bubble/chat-bubble.js +18 -21
- package/dist/esm/components/chat-markdown/chat-markdown.js +18 -2
- package/dist/esm/genesis/write-review/write-review.js +48 -0
- package/dist/esm/genesis/write-review/write-review.styles.js +67 -1
- package/dist/esm/genesis/write-review/write-review.template.js +44 -27
- package/dist/esm/main/main.js +13 -0
- package/dist/esm/main/main.styles.js +42 -0
- package/dist/esm/main/main.template.js +11 -1
- package/dist/esm/main/main.types.js +2 -0
- package/dist/esm/state/debug-event-log.js +3 -1
- package/dist/react.cjs +6 -1
- package/dist/react.mjs +6 -1
- package/docs/styling.md +10 -4
- package/package.json +17 -17
|
@@ -1410,265 +1410,75 @@
|
|
|
1410
1410
|
},
|
|
1411
1411
|
{
|
|
1412
1412
|
"kind": "javascript-module",
|
|
1413
|
-
"path": "src/
|
|
1413
|
+
"path": "src/channel/ai-activity-bus.ts",
|
|
1414
1414
|
"declarations": [
|
|
1415
1415
|
{
|
|
1416
1416
|
"kind": "variable",
|
|
1417
|
-
"name": "
|
|
1417
|
+
"name": "NOOP_ACTIVITY_BUS",
|
|
1418
1418
|
"type": {
|
|
1419
|
-
"text": "
|
|
1419
|
+
"text": "ActivityBus"
|
|
1420
1420
|
},
|
|
1421
|
-
"default": "
|
|
1422
|
-
"description": "The
|
|
1421
|
+
"default": "{ publish: () => {} }",
|
|
1422
|
+
"description": "No-op ActivityBus. The default when no bus is injected (Node, tests, headless\nserver use) — publishing goes nowhere and nothing is left open to tear down."
|
|
1423
1423
|
},
|
|
1424
1424
|
{
|
|
1425
1425
|
"kind": "class",
|
|
1426
|
-
"description": "
|
|
1427
|
-
"name": "
|
|
1426
|
+
"description": "Typed in-process event bus for AI assistant activity events.\n\nDispatches events synchronously to all local subscribers in the same JS module instance\n(i.e. the same browser tab). Events listed in `crossTabEvents` are additionally forwarded\nvia a shared `BroadcastChannel` so that other tabs on the same origin receive them.",
|
|
1427
|
+
"name": "AgenticActivityBus",
|
|
1428
1428
|
"members": [
|
|
1429
1429
|
{
|
|
1430
1430
|
"kind": "field",
|
|
1431
|
-
"name": "
|
|
1432
|
-
"type": {
|
|
1433
|
-
"text": "readonly AgentConfig[]"
|
|
1434
|
-
},
|
|
1435
|
-
"privacy": "private",
|
|
1436
|
-
"readonly": true
|
|
1437
|
-
},
|
|
1438
|
-
{
|
|
1439
|
-
"kind": "field",
|
|
1440
|
-
"name": "providerRegistry",
|
|
1441
|
-
"type": {
|
|
1442
|
-
"text": "AIProviderRegistry"
|
|
1443
|
-
},
|
|
1444
|
-
"privacy": "private",
|
|
1445
|
-
"readonly": true
|
|
1446
|
-
},
|
|
1447
|
-
{
|
|
1448
|
-
"kind": "field",
|
|
1449
|
-
"name": "sessionKey",
|
|
1450
|
-
"type": {
|
|
1451
|
-
"text": "string"
|
|
1452
|
-
},
|
|
1453
|
-
"privacy": "private",
|
|
1454
|
-
"readonly": true
|
|
1455
|
-
},
|
|
1456
|
-
{
|
|
1457
|
-
"kind": "field",
|
|
1458
|
-
"name": "activityBus",
|
|
1459
|
-
"type": {
|
|
1460
|
-
"text": "ActivityBus"
|
|
1461
|
-
},
|
|
1462
|
-
"privacy": "private",
|
|
1463
|
-
"readonly": true
|
|
1464
|
-
},
|
|
1465
|
-
{
|
|
1466
|
-
"kind": "field",
|
|
1467
|
-
"name": "listeners",
|
|
1468
|
-
"privacy": "private",
|
|
1469
|
-
"readonly": true,
|
|
1470
|
-
"default": "new Set<() => void>()"
|
|
1471
|
-
},
|
|
1472
|
-
{
|
|
1473
|
-
"kind": "field",
|
|
1474
|
-
"name": "sessions",
|
|
1431
|
+
"name": "subscribers",
|
|
1475
1432
|
"privacy": "private",
|
|
1476
1433
|
"readonly": true,
|
|
1477
|
-
"default": "new Map<string,
|
|
1478
|
-
},
|
|
1479
|
-
{
|
|
1480
|
-
"kind": "field",
|
|
1481
|
-
"name": "onFor",
|
|
1482
|
-
"type": {
|
|
1483
|
-
"text": "string | null"
|
|
1484
|
-
},
|
|
1485
|
-
"privacy": "private",
|
|
1486
|
-
"default": "null",
|
|
1487
|
-
"description": "The flow the mode applies to: set when it is first switched, cleared when that flow ends."
|
|
1488
|
-
},
|
|
1489
|
-
{
|
|
1490
|
-
"kind": "field",
|
|
1491
|
-
"name": "mode",
|
|
1492
|
-
"type": {
|
|
1493
|
-
"text": "'paused' | 'running'"
|
|
1494
|
-
},
|
|
1495
|
-
"privacy": "private",
|
|
1496
|
-
"default": "'paused'"
|
|
1497
|
-
},
|
|
1498
|
-
{
|
|
1499
|
-
"kind": "field",
|
|
1500
|
-
"name": "pauseState",
|
|
1501
|
-
"type": {
|
|
1502
|
-
"text": "AutopilotHostState['pause'] | undefined"
|
|
1503
|
-
},
|
|
1504
|
-
"privacy": "private"
|
|
1505
|
-
},
|
|
1506
|
-
{
|
|
1507
|
-
"kind": "field",
|
|
1508
|
-
"name": "held",
|
|
1509
|
-
"type": {
|
|
1510
|
-
"text": "Held | undefined"
|
|
1511
|
-
},
|
|
1512
|
-
"privacy": "private"
|
|
1513
|
-
},
|
|
1514
|
-
{
|
|
1515
|
-
"kind": "field",
|
|
1516
|
-
"name": "open",
|
|
1517
|
-
"type": {
|
|
1518
|
-
"text": "InteractionOpened | undefined"
|
|
1519
|
-
},
|
|
1520
|
-
"privacy": "private",
|
|
1521
|
-
"description": "The interaction open right now, whoever holds it: claimed or not, it was offered here first.\n`held` covers only what the autopilot claimed, so this is how the status knows that the working\nagent is parked on a question left with the person (see `waitingOnUser`)."
|
|
1522
|
-
},
|
|
1523
|
-
{
|
|
1524
|
-
"kind": "field",
|
|
1525
|
-
"name": "declinedWhilePaused",
|
|
1526
|
-
"type": {
|
|
1527
|
-
"text": "InteractionOpened | undefined"
|
|
1528
|
-
},
|
|
1529
|
-
"privacy": "private",
|
|
1530
|
-
"description": "The open interaction, when the autopilot declined it only for being paused as it opened: a live\nResume may still take it (see `takeOpenOnResume`). Cleared when it is taken or settles."
|
|
1531
|
-
},
|
|
1532
|
-
{
|
|
1533
|
-
"kind": "field",
|
|
1534
|
-
"name": "refinements",
|
|
1535
|
-
"type": {
|
|
1536
|
-
"text": "{ key: string; count: number } | undefined"
|
|
1537
|
-
},
|
|
1538
|
-
"privacy": "private",
|
|
1539
|
-
"description": "Refining actions taken on the current step (written answers among them), for the limit."
|
|
1540
|
-
},
|
|
1541
|
-
{
|
|
1542
|
-
"kind": "field",
|
|
1543
|
-
"name": "watchdog",
|
|
1544
|
-
"type": {
|
|
1545
|
-
"text": "ReturnType<typeof setTimeout> | undefined"
|
|
1546
|
-
},
|
|
1547
|
-
"privacy": "private",
|
|
1548
|
-
"description": "The watchdog's next check, while a claimed interaction is pending."
|
|
1434
|
+
"default": "new Map<string, Set<AnyHandler>>()"
|
|
1549
1435
|
},
|
|
1550
1436
|
{
|
|
1551
1437
|
"kind": "field",
|
|
1552
|
-
"name": "
|
|
1438
|
+
"name": "crossTabEvents",
|
|
1553
1439
|
"type": {
|
|
1554
|
-
"text": "
|
|
1440
|
+
"text": "Set<string>"
|
|
1555
1441
|
},
|
|
1556
1442
|
"privacy": "private",
|
|
1557
1443
|
"readonly": true,
|
|
1558
|
-
"default": "[]"
|
|
1559
|
-
"description": "What sessions that have ended did, kept for the debug log."
|
|
1560
|
-
},
|
|
1561
|
-
{
|
|
1562
|
-
"kind": "field",
|
|
1563
|
-
"name": "consecutiveReplies",
|
|
1564
|
-
"type": {
|
|
1565
|
-
"text": "number"
|
|
1566
|
-
},
|
|
1567
|
-
"privacy": "private",
|
|
1568
|
-
"default": "0",
|
|
1569
|
-
"description": "Written answers sent in a row; see `MAX_CONSECUTIVE_REPLIES`."
|
|
1570
|
-
},
|
|
1571
|
-
{
|
|
1572
|
-
"kind": "field",
|
|
1573
|
-
"name": "turnHandBack",
|
|
1574
|
-
"type": {
|
|
1575
|
-
"text": "{ why: string } | undefined"
|
|
1576
|
-
},
|
|
1577
|
-
"privacy": "private",
|
|
1578
|
-
"description": "Set while the turn-level hand-back waits on the person."
|
|
1579
|
-
},
|
|
1580
|
-
{
|
|
1581
|
-
"kind": "field",
|
|
1582
|
-
"name": "restored",
|
|
1583
|
-
"type": {
|
|
1584
|
-
"text": "PersistedAutopilotMode | undefined"
|
|
1585
|
-
},
|
|
1586
|
-
"privacy": "private",
|
|
1587
|
-
"description": "A mode restored with the session, waiting for its flow to become the owner again."
|
|
1588
|
-
},
|
|
1589
|
-
{
|
|
1590
|
-
"kind": "field",
|
|
1591
|
-
"name": "generation",
|
|
1592
|
-
"type": {
|
|
1593
|
-
"text": "number"
|
|
1594
|
-
},
|
|
1595
|
-
"privacy": "private",
|
|
1596
|
-
"default": "0",
|
|
1597
|
-
"description": "Bumped on every pause and resume, and when its sessions end. A written answer is sent only if\nnone came between asking for it and its landing: one started before a pause is stale after it,\neven once resumed."
|
|
1444
|
+
"default": "new Set(config?.crossTabEvents ?? [])"
|
|
1598
1445
|
},
|
|
1599
1446
|
{
|
|
1600
1447
|
"kind": "field",
|
|
1601
|
-
"name": "
|
|
1448
|
+
"name": "channelNameFactory",
|
|
1602
1449
|
"type": {
|
|
1603
|
-
"text": "
|
|
1450
|
+
"text": "() => string | undefined"
|
|
1604
1451
|
},
|
|
1605
1452
|
"privacy": "private",
|
|
1606
|
-
"
|
|
1607
|
-
"description": "Working turns this driver has started that have not ended yet; see `working`."
|
|
1453
|
+
"readonly": true
|
|
1608
1454
|
},
|
|
1609
1455
|
{
|
|
1610
1456
|
"kind": "field",
|
|
1611
|
-
"name": "
|
|
1457
|
+
"name": "channel",
|
|
1612
1458
|
"type": {
|
|
1613
|
-
"text": "
|
|
1459
|
+
"text": "BroadcastChannel | undefined"
|
|
1614
1460
|
},
|
|
1615
|
-
"privacy": "private"
|
|
1616
|
-
"default": "0",
|
|
1617
|
-
"description": "Written questions being answered right now; see `working`."
|
|
1461
|
+
"privacy": "private"
|
|
1618
1462
|
},
|
|
1619
1463
|
{
|
|
1620
1464
|
"kind": "field",
|
|
1621
|
-
"name": "
|
|
1465
|
+
"name": "channelInitialised",
|
|
1622
1466
|
"type": {
|
|
1623
1467
|
"text": "boolean"
|
|
1624
1468
|
},
|
|
1625
1469
|
"privacy": "private",
|
|
1626
|
-
"default": "false"
|
|
1627
|
-
"description": "Whether the autopilot has been running, and working, since it last stopped or was paused: so\ngoing idle now is a stop to report. Outlives its flow ending, so a turn still running then is\nwaited out. See `watchForStop`."
|
|
1628
|
-
},
|
|
1629
|
-
{
|
|
1630
|
-
"kind": "field",
|
|
1631
|
-
"name": "stopCheck",
|
|
1632
|
-
"type": {
|
|
1633
|
-
"text": "ReturnType<typeof setTimeout> | undefined"
|
|
1634
|
-
},
|
|
1635
|
-
"privacy": "private",
|
|
1636
|
-
"description": "The check that confirms the autopilot stopped, once it looked like it had."
|
|
1637
|
-
},
|
|
1638
|
-
{
|
|
1639
|
-
"kind": "field",
|
|
1640
|
-
"name": "handBackWaits",
|
|
1641
|
-
"privacy": "private",
|
|
1642
|
-
"readonly": true,
|
|
1643
|
-
"default": "new Set<() => void>()",
|
|
1644
|
-
"description": "Stops each wait for a widget left with the person to ask them; see `reportHandBackWhenAsking`."
|
|
1645
|
-
},
|
|
1646
|
-
{
|
|
1647
|
-
"kind": "field",
|
|
1648
|
-
"name": "state",
|
|
1649
|
-
"type": {
|
|
1650
|
-
"text": "AutopilotHostState"
|
|
1651
|
-
},
|
|
1652
|
-
"readonly": true
|
|
1470
|
+
"default": "false"
|
|
1653
1471
|
},
|
|
1654
1472
|
{
|
|
1655
1473
|
"kind": "method",
|
|
1656
|
-
"name": "
|
|
1474
|
+
"name": "ensureChannel",
|
|
1657
1475
|
"privacy": "private",
|
|
1658
1476
|
"return": {
|
|
1659
1477
|
"type": {
|
|
1660
|
-
"text": "
|
|
1478
|
+
"text": "void"
|
|
1661
1479
|
}
|
|
1662
1480
|
},
|
|
1663
|
-
"description": "
|
|
1664
|
-
},
|
|
1665
|
-
{
|
|
1666
|
-
"kind": "field",
|
|
1667
|
-
"name": "copy",
|
|
1668
|
-
"type": {
|
|
1669
|
-
"text": "AutopilotCopy"
|
|
1670
|
-
},
|
|
1671
|
-
"readonly": true
|
|
1481
|
+
"description": "Lazily open the cross-tab `BroadcastChannel` on first use. Deferred (rather than\ncreated in the constructor) so that importing this module, or constructing the bus\noff-browser (Node, tests, headless server), never opens a live channel or reads\n`sessionStorage` — both would keep a Node event loop alive and hang the process.\nCross-tab forwarding is inherently browser-only, so channel creation is gated on a\nbrowser environment; elsewhere the bus stays purely in-process."
|
|
1672
1482
|
},
|
|
1673
1483
|
{
|
|
1674
1484
|
"kind": "method",
|
|
@@ -1680,25 +1490,514 @@
|
|
|
1680
1490
|
},
|
|
1681
1491
|
"parameters": [
|
|
1682
1492
|
{
|
|
1683
|
-
"name": "
|
|
1493
|
+
"name": "type",
|
|
1684
1494
|
"type": {
|
|
1685
|
-
"text": "
|
|
1495
|
+
"text": "K"
|
|
1496
|
+
}
|
|
1497
|
+
},
|
|
1498
|
+
{
|
|
1499
|
+
"name": "handler",
|
|
1500
|
+
"type": {
|
|
1501
|
+
"text": "(detail: AgenticActivityEvents[K]) => void"
|
|
1686
1502
|
}
|
|
1687
1503
|
}
|
|
1688
|
-
]
|
|
1504
|
+
],
|
|
1505
|
+
"description": "Subscribe to an event. Returns an unsubscribe function — call it in\n`disconnectedCallback` to avoid memory leaks."
|
|
1689
1506
|
},
|
|
1690
1507
|
{
|
|
1691
1508
|
"kind": "method",
|
|
1692
|
-
"name": "
|
|
1509
|
+
"name": "publish",
|
|
1693
1510
|
"return": {
|
|
1694
1511
|
"type": {
|
|
1695
1512
|
"text": "void"
|
|
1696
1513
|
}
|
|
1697
|
-
}
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1514
|
+
},
|
|
1515
|
+
"parameters": [
|
|
1516
|
+
{
|
|
1517
|
+
"name": "type",
|
|
1518
|
+
"type": {
|
|
1519
|
+
"text": "K"
|
|
1520
|
+
}
|
|
1521
|
+
},
|
|
1522
|
+
{
|
|
1523
|
+
"name": "detail",
|
|
1524
|
+
"type": {
|
|
1525
|
+
"text": "AgenticActivityEvents[K]"
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
],
|
|
1529
|
+
"description": "Publish an event to all local subscribers and, if configured, to other tabs\nvia BroadcastChannel."
|
|
1530
|
+
},
|
|
1531
|
+
{
|
|
1532
|
+
"kind": "method",
|
|
1533
|
+
"name": "addCrossTabEvent",
|
|
1534
|
+
"return": {
|
|
1535
|
+
"type": {
|
|
1536
|
+
"text": "void"
|
|
1537
|
+
}
|
|
1538
|
+
},
|
|
1539
|
+
"parameters": [
|
|
1540
|
+
{
|
|
1541
|
+
"name": "type",
|
|
1542
|
+
"type": {
|
|
1543
|
+
"text": "keyof AgenticActivityEvents"
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
],
|
|
1547
|
+
"description": "Add an event type to the cross-tab forwarding set at runtime.\nMust be called before the first AgenticActivityBus.publish of that event type."
|
|
1548
|
+
},
|
|
1549
|
+
{
|
|
1550
|
+
"kind": "method",
|
|
1551
|
+
"name": "close",
|
|
1552
|
+
"return": {
|
|
1553
|
+
"type": {
|
|
1554
|
+
"text": "void"
|
|
1555
|
+
}
|
|
1556
|
+
},
|
|
1557
|
+
"description": "Close the underlying BroadcastChannel. Call once on application teardown if needed."
|
|
1558
|
+
},
|
|
1559
|
+
{
|
|
1560
|
+
"kind": "method",
|
|
1561
|
+
"name": "notifyLocal",
|
|
1562
|
+
"privacy": "private",
|
|
1563
|
+
"return": {
|
|
1564
|
+
"type": {
|
|
1565
|
+
"text": "void"
|
|
1566
|
+
}
|
|
1567
|
+
},
|
|
1568
|
+
"parameters": [
|
|
1569
|
+
{
|
|
1570
|
+
"name": "type",
|
|
1571
|
+
"type": {
|
|
1572
|
+
"text": "string"
|
|
1573
|
+
}
|
|
1574
|
+
},
|
|
1575
|
+
{
|
|
1576
|
+
"name": "detail",
|
|
1577
|
+
"type": {
|
|
1578
|
+
"text": "unknown"
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
]
|
|
1582
|
+
}
|
|
1583
|
+
]
|
|
1584
|
+
},
|
|
1585
|
+
{
|
|
1586
|
+
"kind": "variable",
|
|
1587
|
+
"name": "agenticActivityBus",
|
|
1588
|
+
"default": "new AgenticActivityBus({\n crossTabEvents: ['halo-start', 'halo-stop', 'tool-loop-start', 'tool-loop-end'],\n // Lazy: the tab-scoped name (and its `sessionStorage` read) is computed on first\n // cross-tab use in a browser, not at module-eval — so importing this module is\n // side-effect-free and Node/test-safe.\n channelNameFactory: () => getTabScopedChannelName('foundation-ai-activity'),\n})",
|
|
1589
|
+
"description": "Pre-instantiated singleton event bus for AI assistant activity.\n\n- `halo-start` / `halo-stop` are forwarded via a tab-scoped `BroadcastChannel` so that\n popout windows opened from this tab show halo animations, while remaining isolated from\n unrelated tabs on the same origin (tab-scoped channel name).\n- `tool-loop-start` / `tool-loop-end` are cross-tab for the same reason: they describe the\n assistant's lifecycle (a turn beginning / ending), and the most common subscribers\n (workspace transitions, post-turn deferred recomputation, UI gates tied to the assistant\n being idle) need the event regardless of whether the user is interacting with the chat\n in the main tab or a popout window. Tab-local-only telemetry can subscribe and filter.\n- `chat-popout` / `chat-popin` are in-memory only — they must only affect the tab where the\n user clicked."
|
|
1590
|
+
}
|
|
1591
|
+
],
|
|
1592
|
+
"exports": [
|
|
1593
|
+
{
|
|
1594
|
+
"kind": "js",
|
|
1595
|
+
"name": "NOOP_ACTIVITY_BUS",
|
|
1596
|
+
"declaration": {
|
|
1597
|
+
"name": "NOOP_ACTIVITY_BUS",
|
|
1598
|
+
"module": "src/channel/ai-activity-bus.ts"
|
|
1599
|
+
}
|
|
1600
|
+
},
|
|
1601
|
+
{
|
|
1602
|
+
"kind": "js",
|
|
1603
|
+
"name": "AgenticActivityBus",
|
|
1604
|
+
"declaration": {
|
|
1605
|
+
"name": "AgenticActivityBus",
|
|
1606
|
+
"module": "src/channel/ai-activity-bus.ts"
|
|
1607
|
+
}
|
|
1608
|
+
},
|
|
1609
|
+
{
|
|
1610
|
+
"kind": "js",
|
|
1611
|
+
"name": "agenticActivityBus",
|
|
1612
|
+
"declaration": {
|
|
1613
|
+
"name": "agenticActivityBus",
|
|
1614
|
+
"module": "src/channel/ai-activity-bus.ts"
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
]
|
|
1618
|
+
},
|
|
1619
|
+
{
|
|
1620
|
+
"kind": "javascript-module",
|
|
1621
|
+
"path": "src/channel/ai-activity-channel.ts",
|
|
1622
|
+
"declarations": [],
|
|
1623
|
+
"exports": []
|
|
1624
|
+
},
|
|
1625
|
+
{
|
|
1626
|
+
"kind": "javascript-module",
|
|
1627
|
+
"path": "src/channel/autopilot-needs-user.ts",
|
|
1628
|
+
"declarations": [
|
|
1629
|
+
{
|
|
1630
|
+
"kind": "function",
|
|
1631
|
+
"name": "setAutopilotNeedsUser",
|
|
1632
|
+
"return": {
|
|
1633
|
+
"type": {
|
|
1634
|
+
"text": "void"
|
|
1635
|
+
}
|
|
1636
|
+
},
|
|
1637
|
+
"parameters": [
|
|
1638
|
+
{
|
|
1639
|
+
"name": "sessionKey",
|
|
1640
|
+
"type": {
|
|
1641
|
+
"text": "string"
|
|
1642
|
+
}
|
|
1643
|
+
},
|
|
1644
|
+
{
|
|
1645
|
+
"name": "needsUser",
|
|
1646
|
+
"type": {
|
|
1647
|
+
"text": "boolean"
|
|
1648
|
+
}
|
|
1649
|
+
}
|
|
1650
|
+
],
|
|
1651
|
+
"description": "Set it for one session, announcing `autopilot-needs-user` when it changes."
|
|
1652
|
+
},
|
|
1653
|
+
{
|
|
1654
|
+
"kind": "function",
|
|
1655
|
+
"name": "autopilotNeedsUser",
|
|
1656
|
+
"return": {
|
|
1657
|
+
"type": {
|
|
1658
|
+
"text": "boolean"
|
|
1659
|
+
}
|
|
1660
|
+
},
|
|
1661
|
+
"parameters": [
|
|
1662
|
+
{
|
|
1663
|
+
"name": "sessionKey",
|
|
1664
|
+
"optional": true,
|
|
1665
|
+
"type": {
|
|
1666
|
+
"text": "string"
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
],
|
|
1670
|
+
"description": "Whether a session has something waiting on the person — or, without a key (a bubble that cannot\ntell which assistant it holds), whether any session has."
|
|
1671
|
+
}
|
|
1672
|
+
],
|
|
1673
|
+
"exports": [
|
|
1674
|
+
{
|
|
1675
|
+
"kind": "js",
|
|
1676
|
+
"name": "setAutopilotNeedsUser",
|
|
1677
|
+
"declaration": {
|
|
1678
|
+
"name": "setAutopilotNeedsUser",
|
|
1679
|
+
"module": "src/channel/autopilot-needs-user.ts"
|
|
1680
|
+
}
|
|
1681
|
+
},
|
|
1682
|
+
{
|
|
1683
|
+
"kind": "js",
|
|
1684
|
+
"name": "autopilotNeedsUser",
|
|
1685
|
+
"declaration": {
|
|
1686
|
+
"name": "autopilotNeedsUser",
|
|
1687
|
+
"module": "src/channel/autopilot-needs-user.ts"
|
|
1688
|
+
}
|
|
1689
|
+
}
|
|
1690
|
+
]
|
|
1691
|
+
},
|
|
1692
|
+
{
|
|
1693
|
+
"kind": "javascript-module",
|
|
1694
|
+
"path": "src/autopilot/autopilot-driver.ts",
|
|
1695
|
+
"declarations": [
|
|
1696
|
+
{
|
|
1697
|
+
"kind": "variable",
|
|
1698
|
+
"name": "AUTOPILOT_CLAIMANT",
|
|
1699
|
+
"type": {
|
|
1700
|
+
"text": "string"
|
|
1701
|
+
},
|
|
1702
|
+
"default": "'autopilot'",
|
|
1703
|
+
"description": "The holder id the autopilot claims interactions as."
|
|
1704
|
+
},
|
|
1705
|
+
{
|
|
1706
|
+
"kind": "class",
|
|
1707
|
+
"description": "Autopilot (GENC-1660): a driver decorator that answers the questions a working agent asks the\nuser, on their behalf, grounded in the agent's autopilot config (for bootstrap, the brief).\n\nNeither side calls the other. The working agent asks as it always does; this driver claims the\ninteractions its policy allows, while it is running for that flow, and answers each in one short\nturn on the flow's `AutopilotSession`. It plugs in only through the generic extension points\n— an interaction interceptor, a handler capability and the flow lifecycle — so the core knows\nnothing about it, and it wraps any `AiDriver`.",
|
|
1708
|
+
"name": "AutopilotDriver",
|
|
1709
|
+
"members": [
|
|
1710
|
+
{
|
|
1711
|
+
"kind": "field",
|
|
1712
|
+
"name": "agents",
|
|
1713
|
+
"type": {
|
|
1714
|
+
"text": "readonly AgentConfig[]"
|
|
1715
|
+
},
|
|
1716
|
+
"privacy": "private",
|
|
1717
|
+
"readonly": true
|
|
1718
|
+
},
|
|
1719
|
+
{
|
|
1720
|
+
"kind": "field",
|
|
1721
|
+
"name": "providerRegistry",
|
|
1722
|
+
"type": {
|
|
1723
|
+
"text": "AIProviderRegistry"
|
|
1724
|
+
},
|
|
1725
|
+
"privacy": "private",
|
|
1726
|
+
"readonly": true
|
|
1727
|
+
},
|
|
1728
|
+
{
|
|
1729
|
+
"kind": "field",
|
|
1730
|
+
"name": "sessionKey",
|
|
1731
|
+
"type": {
|
|
1732
|
+
"text": "string"
|
|
1733
|
+
},
|
|
1734
|
+
"privacy": "private",
|
|
1735
|
+
"readonly": true
|
|
1736
|
+
},
|
|
1737
|
+
{
|
|
1738
|
+
"kind": "field",
|
|
1739
|
+
"name": "activityBus",
|
|
1740
|
+
"type": {
|
|
1741
|
+
"text": "ActivityBus"
|
|
1742
|
+
},
|
|
1743
|
+
"privacy": "private",
|
|
1744
|
+
"readonly": true
|
|
1745
|
+
},
|
|
1746
|
+
{
|
|
1747
|
+
"kind": "field",
|
|
1748
|
+
"name": "listeners",
|
|
1749
|
+
"privacy": "private",
|
|
1750
|
+
"readonly": true,
|
|
1751
|
+
"default": "new Set<() => void>()"
|
|
1752
|
+
},
|
|
1753
|
+
{
|
|
1754
|
+
"kind": "field",
|
|
1755
|
+
"name": "sessions",
|
|
1756
|
+
"privacy": "private",
|
|
1757
|
+
"readonly": true,
|
|
1758
|
+
"default": "new Map<string, AutopilotSession>()"
|
|
1759
|
+
},
|
|
1760
|
+
{
|
|
1761
|
+
"kind": "field",
|
|
1762
|
+
"name": "onFor",
|
|
1763
|
+
"type": {
|
|
1764
|
+
"text": "string | null"
|
|
1765
|
+
},
|
|
1766
|
+
"privacy": "private",
|
|
1767
|
+
"default": "null",
|
|
1768
|
+
"description": "The flow the mode applies to: set when it is first switched, cleared when that flow ends."
|
|
1769
|
+
},
|
|
1770
|
+
{
|
|
1771
|
+
"kind": "field",
|
|
1772
|
+
"name": "mode",
|
|
1773
|
+
"type": {
|
|
1774
|
+
"text": "'paused' | 'running'"
|
|
1775
|
+
},
|
|
1776
|
+
"privacy": "private",
|
|
1777
|
+
"default": "'paused'"
|
|
1778
|
+
},
|
|
1779
|
+
{
|
|
1780
|
+
"kind": "field",
|
|
1781
|
+
"name": "pauseState",
|
|
1782
|
+
"type": {
|
|
1783
|
+
"text": "AutopilotHostState['pause'] | undefined"
|
|
1784
|
+
},
|
|
1785
|
+
"privacy": "private"
|
|
1786
|
+
},
|
|
1787
|
+
{
|
|
1788
|
+
"kind": "field",
|
|
1789
|
+
"name": "held",
|
|
1790
|
+
"type": {
|
|
1791
|
+
"text": "Held | undefined"
|
|
1792
|
+
},
|
|
1793
|
+
"privacy": "private"
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
"kind": "field",
|
|
1797
|
+
"name": "open",
|
|
1798
|
+
"type": {
|
|
1799
|
+
"text": "InteractionOpened | undefined"
|
|
1800
|
+
},
|
|
1801
|
+
"privacy": "private",
|
|
1802
|
+
"description": "The interaction open right now, whoever holds it: claimed or not, it was offered here first.\n`held` covers only what the autopilot claimed, so this is how the status knows that the working\nagent is parked on a question left with the person (see `waitingOnUser`)."
|
|
1803
|
+
},
|
|
1804
|
+
{
|
|
1805
|
+
"kind": "field",
|
|
1806
|
+
"name": "declinedWhilePaused",
|
|
1807
|
+
"type": {
|
|
1808
|
+
"text": "InteractionOpened | undefined"
|
|
1809
|
+
},
|
|
1810
|
+
"privacy": "private",
|
|
1811
|
+
"description": "The open interaction, when the autopilot declined it only for being paused as it opened: a live\nResume may still take it (see `takeOpenOnResume`). Cleared when it is taken or settles."
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
"kind": "field",
|
|
1815
|
+
"name": "refinements",
|
|
1816
|
+
"type": {
|
|
1817
|
+
"text": "{ key: string; count: number } | undefined"
|
|
1818
|
+
},
|
|
1819
|
+
"privacy": "private",
|
|
1820
|
+
"description": "Refining actions taken on the current step (written answers among them), for the limit."
|
|
1821
|
+
},
|
|
1822
|
+
{
|
|
1823
|
+
"kind": "field",
|
|
1824
|
+
"name": "watchdog",
|
|
1825
|
+
"type": {
|
|
1826
|
+
"text": "ReturnType<typeof setTimeout> | undefined"
|
|
1827
|
+
},
|
|
1828
|
+
"privacy": "private",
|
|
1829
|
+
"description": "The watchdog's next check, while a claimed interaction is pending."
|
|
1830
|
+
},
|
|
1831
|
+
{
|
|
1832
|
+
"kind": "field",
|
|
1833
|
+
"name": "endedDiagnostics",
|
|
1834
|
+
"type": {
|
|
1835
|
+
"text": "DiagnosticEntry[]"
|
|
1836
|
+
},
|
|
1837
|
+
"privacy": "private",
|
|
1838
|
+
"readonly": true,
|
|
1839
|
+
"default": "[]",
|
|
1840
|
+
"description": "What sessions that have ended did, kept for the debug log."
|
|
1841
|
+
},
|
|
1842
|
+
{
|
|
1843
|
+
"kind": "field",
|
|
1844
|
+
"name": "consecutiveReplies",
|
|
1845
|
+
"type": {
|
|
1846
|
+
"text": "number"
|
|
1847
|
+
},
|
|
1848
|
+
"privacy": "private",
|
|
1849
|
+
"default": "0",
|
|
1850
|
+
"description": "Written answers sent in a row; see `MAX_CONSECUTIVE_REPLIES`."
|
|
1851
|
+
},
|
|
1852
|
+
{
|
|
1853
|
+
"kind": "field",
|
|
1854
|
+
"name": "turnHandBack",
|
|
1855
|
+
"type": {
|
|
1856
|
+
"text": "{ why: string } | undefined"
|
|
1857
|
+
},
|
|
1858
|
+
"privacy": "private",
|
|
1859
|
+
"description": "Set while the turn-level hand-back waits on the person."
|
|
1860
|
+
},
|
|
1861
|
+
{
|
|
1862
|
+
"kind": "field",
|
|
1863
|
+
"name": "restored",
|
|
1864
|
+
"type": {
|
|
1865
|
+
"text": "PersistedAutopilotMode | undefined"
|
|
1866
|
+
},
|
|
1867
|
+
"privacy": "private",
|
|
1868
|
+
"description": "A mode restored with the session, waiting for its flow to become the owner again."
|
|
1869
|
+
},
|
|
1870
|
+
{
|
|
1871
|
+
"kind": "field",
|
|
1872
|
+
"name": "handingBack",
|
|
1873
|
+
"type": {
|
|
1874
|
+
"text": "Carried | undefined"
|
|
1875
|
+
},
|
|
1876
|
+
"privacy": "private",
|
|
1877
|
+
"description": "The mode of a hand-off's target that has released, kept for its caller, which has not taken the\nlock back yet (GENC-1751): the flow has no owner in between. See `carriedTo`."
|
|
1878
|
+
},
|
|
1879
|
+
{
|
|
1880
|
+
"kind": "field",
|
|
1881
|
+
"name": "switchedFrom",
|
|
1882
|
+
"type": {
|
|
1883
|
+
"text": "Carried | undefined"
|
|
1884
|
+
},
|
|
1885
|
+
"privacy": "private",
|
|
1886
|
+
"description": "The mode of the flow that just ended, should a one-way hand-off with nobody waiting turn out to\nhave ended it: that switch announces itself only after the owner has changed (GENC-1751)."
|
|
1887
|
+
},
|
|
1888
|
+
{
|
|
1889
|
+
"kind": "field",
|
|
1890
|
+
"name": "generation",
|
|
1891
|
+
"type": {
|
|
1892
|
+
"text": "number"
|
|
1893
|
+
},
|
|
1894
|
+
"privacy": "private",
|
|
1895
|
+
"default": "0",
|
|
1896
|
+
"description": "Bumped on every pause and resume, and when its sessions end. A written answer is sent only if\nnone came between asking for it and its landing: one started before a pause is stale after it,\neven once resumed."
|
|
1897
|
+
},
|
|
1898
|
+
{
|
|
1899
|
+
"kind": "field",
|
|
1900
|
+
"name": "turnsInFlight",
|
|
1901
|
+
"type": {
|
|
1902
|
+
"text": "number"
|
|
1903
|
+
},
|
|
1904
|
+
"privacy": "private",
|
|
1905
|
+
"default": "0",
|
|
1906
|
+
"description": "Working turns this driver has started that have not ended yet; see `working`."
|
|
1907
|
+
},
|
|
1908
|
+
{
|
|
1909
|
+
"kind": "field",
|
|
1910
|
+
"name": "answersInFlight",
|
|
1911
|
+
"type": {
|
|
1912
|
+
"text": "number"
|
|
1913
|
+
},
|
|
1914
|
+
"privacy": "private",
|
|
1915
|
+
"default": "0",
|
|
1916
|
+
"description": "Written questions being answered right now; see `working`."
|
|
1917
|
+
},
|
|
1918
|
+
{
|
|
1919
|
+
"kind": "field",
|
|
1920
|
+
"name": "ranSinceStop",
|
|
1921
|
+
"type": {
|
|
1922
|
+
"text": "boolean"
|
|
1923
|
+
},
|
|
1924
|
+
"privacy": "private",
|
|
1925
|
+
"default": "false",
|
|
1926
|
+
"description": "Whether the autopilot has been running, and working, since it last stopped or was paused: so\ngoing idle now is a stop to report. Outlives its flow ending, so a turn still running then is\nwaited out. See `watchForStop`."
|
|
1927
|
+
},
|
|
1928
|
+
{
|
|
1929
|
+
"kind": "field",
|
|
1930
|
+
"name": "stopCheck",
|
|
1931
|
+
"type": {
|
|
1932
|
+
"text": "ReturnType<typeof setTimeout> | undefined"
|
|
1933
|
+
},
|
|
1934
|
+
"privacy": "private",
|
|
1935
|
+
"description": "The check that confirms the autopilot stopped, once it looked like it had."
|
|
1936
|
+
},
|
|
1937
|
+
{
|
|
1938
|
+
"kind": "field",
|
|
1939
|
+
"name": "handBackWaits",
|
|
1940
|
+
"privacy": "private",
|
|
1941
|
+
"readonly": true,
|
|
1942
|
+
"default": "new Set<() => void>()",
|
|
1943
|
+
"description": "Stops each wait for a widget left with the person to ask them; see `reportHandBackWhenAsking`."
|
|
1944
|
+
},
|
|
1945
|
+
{
|
|
1946
|
+
"kind": "field",
|
|
1947
|
+
"name": "state",
|
|
1948
|
+
"type": {
|
|
1949
|
+
"text": "AutopilotHostState"
|
|
1950
|
+
},
|
|
1951
|
+
"readonly": true
|
|
1952
|
+
},
|
|
1953
|
+
{
|
|
1954
|
+
"kind": "method",
|
|
1955
|
+
"name": "waitingOnUser",
|
|
1956
|
+
"privacy": "private",
|
|
1957
|
+
"return": {
|
|
1958
|
+
"type": {
|
|
1959
|
+
"text": "boolean"
|
|
1960
|
+
}
|
|
1961
|
+
},
|
|
1962
|
+
"description": "Whether the working agent is parked on a question the person holds, with the autopilot deciding\nnothing: one it never took — its policy keeps it for the person, it is `userOnly` (the turn-level\nhand-back among them), it has no controller, or it opened while paused and no Resume has taken\nit since (a restored mode takes nothing) — or one another interceptor took and then gave to the\nperson. One the autopilot handed back reads `selfPaused`, and one a pause handed over reads\n`paused`; `state` settles both before asking this.\n\nNever one that asks them nothing (see `asksThePerson`): the person holds it, but it is work\nrunning, which settles by itself, so \"waiting for your answer\" would be untrue. A hand-back is\nreported by the same rule (see `reportHandBackWhenAsking`)."
|
|
1963
|
+
},
|
|
1964
|
+
{
|
|
1965
|
+
"kind": "field",
|
|
1966
|
+
"name": "copy",
|
|
1967
|
+
"type": {
|
|
1968
|
+
"text": "AutopilotCopy"
|
|
1969
|
+
},
|
|
1970
|
+
"readonly": true
|
|
1971
|
+
},
|
|
1972
|
+
{
|
|
1973
|
+
"kind": "method",
|
|
1974
|
+
"name": "subscribe",
|
|
1975
|
+
"return": {
|
|
1976
|
+
"type": {
|
|
1977
|
+
"text": "() => void"
|
|
1978
|
+
}
|
|
1979
|
+
},
|
|
1980
|
+
"parameters": [
|
|
1981
|
+
{
|
|
1982
|
+
"name": "listener",
|
|
1983
|
+
"type": {
|
|
1984
|
+
"text": "() => void"
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
]
|
|
1988
|
+
},
|
|
1989
|
+
{
|
|
1990
|
+
"kind": "method",
|
|
1991
|
+
"name": "pause",
|
|
1992
|
+
"return": {
|
|
1993
|
+
"type": {
|
|
1994
|
+
"text": "void"
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
},
|
|
1998
|
+
{
|
|
1999
|
+
"kind": "method",
|
|
2000
|
+
"name": "resume",
|
|
1702
2001
|
"return": {
|
|
1703
2002
|
"type": {
|
|
1704
2003
|
"text": "void"
|
|
@@ -1722,7 +2021,7 @@
|
|
|
1722
2021
|
"text": "PersistedAutopilotMode | undefined"
|
|
1723
2022
|
}
|
|
1724
2023
|
},
|
|
1725
|
-
"description": "The mode to save with the session, while it is set for the current flow."
|
|
2024
|
+
"description": "The mode to save with the session, while it is set for the current flow — or kept for a\nhand-off's caller while its target releases, saved for that target, as the stack saves it."
|
|
1726
2025
|
},
|
|
1727
2026
|
{
|
|
1728
2027
|
"kind": "method",
|
|
@@ -2432,72 +2731,164 @@
|
|
|
2432
2731
|
"text": "DecisionOutcome"
|
|
2433
2732
|
}
|
|
2434
2733
|
}
|
|
2435
|
-
]
|
|
2734
|
+
]
|
|
2735
|
+
},
|
|
2736
|
+
{
|
|
2737
|
+
"kind": "method",
|
|
2738
|
+
"name": "handBack",
|
|
2739
|
+
"privacy": "private",
|
|
2740
|
+
"return": {
|
|
2741
|
+
"type": {
|
|
2742
|
+
"text": "void"
|
|
2743
|
+
}
|
|
2744
|
+
},
|
|
2745
|
+
"parameters": [
|
|
2746
|
+
{
|
|
2747
|
+
"name": "held",
|
|
2748
|
+
"type": {
|
|
2749
|
+
"text": "Held"
|
|
2750
|
+
}
|
|
2751
|
+
},
|
|
2752
|
+
{
|
|
2753
|
+
"name": "reason",
|
|
2754
|
+
"type": {
|
|
2755
|
+
"text": "string"
|
|
2756
|
+
}
|
|
2757
|
+
},
|
|
2758
|
+
{
|
|
2759
|
+
"name": "trigger",
|
|
2760
|
+
"type": {
|
|
2761
|
+
"text": "string"
|
|
2762
|
+
}
|
|
2763
|
+
}
|
|
2764
|
+
],
|
|
2765
|
+
"description": "The autopilot's self-pause, for one interaction (§4.10): the person gets it, with the reason as\nthe banner, and the autopilot carries on by itself once they answer. Only while it is still\nthe autopilot's to hand back — not settled, not already with the person — and its decision\nstops with it, so a decision still running spends nothing more on an interaction it no longer\nholds. Every caller (a decision's own hand-back, a failed decision, the watchdog) gets both."
|
|
2766
|
+
},
|
|
2767
|
+
{
|
|
2768
|
+
"kind": "method",
|
|
2769
|
+
"name": "releaseHeld",
|
|
2770
|
+
"privacy": "private",
|
|
2771
|
+
"return": {
|
|
2772
|
+
"type": {
|
|
2773
|
+
"text": "void"
|
|
2774
|
+
}
|
|
2775
|
+
},
|
|
2776
|
+
"description": "On detach: hand a claimed interaction the autopilot still holds to the person, stopping its\ndecision, so the driver it wrapped lives on with nothing held by an autopilot that is gone."
|
|
2777
|
+
},
|
|
2778
|
+
{
|
|
2779
|
+
"kind": "method",
|
|
2780
|
+
"name": "onSettled",
|
|
2781
|
+
"privacy": "private",
|
|
2782
|
+
"return": {
|
|
2783
|
+
"type": {
|
|
2784
|
+
"text": "void"
|
|
2785
|
+
}
|
|
2786
|
+
},
|
|
2787
|
+
"parameters": [
|
|
2788
|
+
{
|
|
2789
|
+
"name": "held",
|
|
2790
|
+
"type": {
|
|
2791
|
+
"text": "Held"
|
|
2792
|
+
}
|
|
2793
|
+
}
|
|
2794
|
+
],
|
|
2795
|
+
"description": "A claimed interaction settled, whoever settled it."
|
|
2796
|
+
},
|
|
2797
|
+
{
|
|
2798
|
+
"kind": "method",
|
|
2799
|
+
"name": "onFlowOwnerChanged",
|
|
2800
|
+
"privacy": "private",
|
|
2801
|
+
"return": {
|
|
2802
|
+
"type": {
|
|
2803
|
+
"text": "void"
|
|
2804
|
+
}
|
|
2805
|
+
},
|
|
2806
|
+
"parameters": [
|
|
2807
|
+
{
|
|
2808
|
+
"name": "owner",
|
|
2809
|
+
"type": {
|
|
2810
|
+
"text": "string | null"
|
|
2811
|
+
}
|
|
2812
|
+
}
|
|
2813
|
+
]
|
|
2814
|
+
},
|
|
2815
|
+
{
|
|
2816
|
+
"kind": "method",
|
|
2817
|
+
"name": "onHandOffStarted",
|
|
2818
|
+
"privacy": "private",
|
|
2819
|
+
"return": {
|
|
2820
|
+
"type": {
|
|
2821
|
+
"text": "void"
|
|
2822
|
+
}
|
|
2823
|
+
},
|
|
2824
|
+
"parameters": [
|
|
2825
|
+
{
|
|
2826
|
+
"name": "frame",
|
|
2827
|
+
"type": {
|
|
2828
|
+
"text": "HandOffFrame"
|
|
2829
|
+
}
|
|
2830
|
+
}
|
|
2831
|
+
],
|
|
2832
|
+
"description": "A one-way hand-off with nobody waiting is a plain switch, the caller deactivated, so nothing on\nthe stack says the owner it changed to took over the same task: its event, raised once the\ntarget is active, does (GENC-1751)."
|
|
2833
|
+
},
|
|
2834
|
+
{
|
|
2835
|
+
"kind": "method",
|
|
2836
|
+
"name": "current",
|
|
2837
|
+
"privacy": "private",
|
|
2838
|
+
"return": {
|
|
2839
|
+
"type": {
|
|
2840
|
+
"text": "Carried | undefined"
|
|
2841
|
+
}
|
|
2842
|
+
},
|
|
2843
|
+
"description": "The mode set for the current flow, or kept for the caller of a hand-back under way."
|
|
2436
2844
|
},
|
|
2437
2845
|
{
|
|
2438
2846
|
"kind": "method",
|
|
2439
|
-
"name": "
|
|
2847
|
+
"name": "carriedTo",
|
|
2440
2848
|
"privacy": "private",
|
|
2441
2849
|
"return": {
|
|
2442
2850
|
"type": {
|
|
2443
|
-
"text": "
|
|
2851
|
+
"text": "Carried | undefined"
|
|
2444
2852
|
}
|
|
2445
2853
|
},
|
|
2446
2854
|
"parameters": [
|
|
2447
2855
|
{
|
|
2448
|
-
"name": "
|
|
2449
|
-
"type": {
|
|
2450
|
-
"text": "Held"
|
|
2451
|
-
}
|
|
2452
|
-
},
|
|
2453
|
-
{
|
|
2454
|
-
"name": "reason",
|
|
2455
|
-
"type": {
|
|
2456
|
-
"text": "string"
|
|
2457
|
-
}
|
|
2458
|
-
},
|
|
2459
|
-
{
|
|
2460
|
-
"name": "trigger",
|
|
2856
|
+
"name": "owner",
|
|
2461
2857
|
"type": {
|
|
2462
|
-
"text": "string"
|
|
2858
|
+
"text": "string | null"
|
|
2463
2859
|
}
|
|
2464
2860
|
}
|
|
2465
2861
|
],
|
|
2466
|
-
"description": "The
|
|
2467
|
-
},
|
|
2468
|
-
{
|
|
2469
|
-
"kind": "method",
|
|
2470
|
-
"name": "releaseHeld",
|
|
2471
|
-
"privacy": "private",
|
|
2472
|
-
"return": {
|
|
2473
|
-
"type": {
|
|
2474
|
-
"text": "void"
|
|
2475
|
-
}
|
|
2476
|
-
},
|
|
2477
|
-
"description": "On detach: hand a claimed interaction the autopilot still holds to the person, stopping its\ndecision, so the driver it wrapped lives on with nothing held by an autopilot that is gone."
|
|
2862
|
+
"description": "The mode that carries to `owner` because the owner changed for a hand-off or its hand-back, as\nthe hand-off stack shows it at that moment (GENC-1751):\n- a hand-off: `owner` is the top frame's target, which has not finished. Its frame is on the\n stack before the target is activated, and so is a waiting caller's passed on by a one-way\n hand-off from a target;\n- a hand-back: the top frame's target, which the mode is set for, has finished, and `owner` is\n its caller, or no one while the target releases. Its frame leaves the stack only after the\n caller is active again.\n\nClear and an agents change empty the stack before the flow ends, so the mode ends with it, as\nit ends with any flow. A turn routed away from the target ends the hand-offs the same way."
|
|
2478
2863
|
},
|
|
2479
2864
|
{
|
|
2480
2865
|
"kind": "method",
|
|
2481
|
-
"name": "
|
|
2866
|
+
"name": "handsBack",
|
|
2482
2867
|
"privacy": "private",
|
|
2483
2868
|
"return": {
|
|
2484
2869
|
"type": {
|
|
2485
|
-
"text": "
|
|
2870
|
+
"text": "boolean"
|
|
2486
2871
|
}
|
|
2487
2872
|
},
|
|
2488
2873
|
"parameters": [
|
|
2489
2874
|
{
|
|
2490
|
-
"name": "
|
|
2875
|
+
"name": "target",
|
|
2491
2876
|
"type": {
|
|
2492
|
-
"text": "
|
|
2877
|
+
"text": "string"
|
|
2878
|
+
}
|
|
2879
|
+
},
|
|
2880
|
+
{
|
|
2881
|
+
"name": "owner",
|
|
2882
|
+
"type": {
|
|
2883
|
+
"text": "string"
|
|
2493
2884
|
}
|
|
2494
2885
|
}
|
|
2495
2886
|
],
|
|
2496
|
-
"description": "
|
|
2887
|
+
"description": "Whether `owner` is the caller the top hand-off hands back to from `target`."
|
|
2497
2888
|
},
|
|
2498
2889
|
{
|
|
2499
2890
|
"kind": "method",
|
|
2500
|
-
"name": "
|
|
2891
|
+
"name": "carry",
|
|
2501
2892
|
"privacy": "private",
|
|
2502
2893
|
"return": {
|
|
2503
2894
|
"type": {
|
|
@@ -2505,13 +2896,20 @@
|
|
|
2505
2896
|
}
|
|
2506
2897
|
},
|
|
2507
2898
|
"parameters": [
|
|
2899
|
+
{
|
|
2900
|
+
"name": "carried",
|
|
2901
|
+
"type": {
|
|
2902
|
+
"text": "Carried"
|
|
2903
|
+
}
|
|
2904
|
+
},
|
|
2508
2905
|
{
|
|
2509
2906
|
"name": "owner",
|
|
2510
2907
|
"type": {
|
|
2511
|
-
"text": "string
|
|
2908
|
+
"text": "string"
|
|
2512
2909
|
}
|
|
2513
2910
|
}
|
|
2514
|
-
]
|
|
2911
|
+
],
|
|
2912
|
+
"description": "Set `carried`'s mode for `owner`, which took the task over in a hand-off or its hand-back. A\npause the person chose carries with it; the autopilot's own hand-back of an interaction does\nnot, since that interaction settled before the hand-off could start."
|
|
2515
2913
|
},
|
|
2516
2914
|
{
|
|
2517
2915
|
"kind": "method",
|
|
@@ -4599,289 +4997,136 @@
|
|
|
4599
4997
|
"kind": "js",
|
|
4600
4998
|
"name": "type",
|
|
4601
4999
|
"declaration": {
|
|
4602
|
-
"name": "type",
|
|
4603
|
-
"module": "./widget-tools"
|
|
4604
|
-
}
|
|
4605
|
-
},
|
|
4606
|
-
{
|
|
4607
|
-
"kind": "js",
|
|
4608
|
-
"name": "WidgetToolSpec",
|
|
4609
|
-
"declaration": {
|
|
4610
|
-
"name": "WidgetToolSpec",
|
|
4611
|
-
"module": "./widget-tools"
|
|
4612
|
-
}
|
|
4613
|
-
},
|
|
4614
|
-
{
|
|
4615
|
-
"kind": "js",
|
|
4616
|
-
"name": "AutopilotHandBack",
|
|
4617
|
-
"declaration": {
|
|
4618
|
-
"name": "AutopilotHandBack",
|
|
4619
|
-
"module": "./hand-back/hand-back"
|
|
4620
|
-
}
|
|
4621
|
-
}
|
|
4622
|
-
]
|
|
4623
|
-
},
|
|
4624
|
-
{
|
|
4625
|
-
"kind": "javascript-module",
|
|
4626
|
-
"path": "src/autopilot/widget-tools.ts",
|
|
4627
|
-
"declarations": [
|
|
4628
|
-
{
|
|
4629
|
-
"kind": "function",
|
|
4630
|
-
"name": "widgetTools",
|
|
4631
|
-
"return": {
|
|
4632
|
-
"type": {
|
|
4633
|
-
"text": "WidgetTools"
|
|
4634
|
-
}
|
|
4635
|
-
},
|
|
4636
|
-
"parameters": [
|
|
4637
|
-
{
|
|
4638
|
-
"name": "componentName",
|
|
4639
|
-
"type": {
|
|
4640
|
-
"text": "string"
|
|
4641
|
-
}
|
|
4642
|
-
},
|
|
4643
|
-
{
|
|
4644
|
-
"name": "tools",
|
|
4645
|
-
"type": {
|
|
4646
|
-
"text": "{ [K in keyof TArgs]: WidgetToolSpec<TController, TArgs[K]> }"
|
|
4647
|
-
}
|
|
4648
|
-
}
|
|
4649
|
-
],
|
|
4650
|
-
"description": "Declare tools that read from one widget type (GENC-1660): parameterised reads that a view cannot\nexpress, such as one table's rows, or a page of them.\n\nPut them on the autopilot (`defineAutopilot({ widgetTools: [...] })`), never discovered from the\nregistration. Its tool list is fixed when its session starts, sorted by name, and identical for\nevery decision, so the cache never breaks. Each call is routed to the interaction of\n`componentName` the autopilot is deciding, and `run` gets its controller; with none open, it is\nrefused with a reason. While one is open, the autopilot's tail says which tools are usable now.\n\nReads only. Their results leave the autopilot's history at the end of the decision, as\n`widget_read`'s do."
|
|
4651
|
-
}
|
|
4652
|
-
],
|
|
4653
|
-
"exports": [
|
|
4654
|
-
{
|
|
4655
|
-
"kind": "js",
|
|
4656
|
-
"name": "widgetTools",
|
|
4657
|
-
"declaration": {
|
|
4658
|
-
"name": "widgetTools",
|
|
4659
|
-
"module": "src/autopilot/widget-tools.ts"
|
|
4660
|
-
}
|
|
4661
|
-
}
|
|
4662
|
-
]
|
|
4663
|
-
},
|
|
4664
|
-
{
|
|
4665
|
-
"kind": "javascript-module",
|
|
4666
|
-
"path": "src/channel/ai-activity-bus.ts",
|
|
4667
|
-
"declarations": [
|
|
4668
|
-
{
|
|
4669
|
-
"kind": "variable",
|
|
4670
|
-
"name": "NOOP_ACTIVITY_BUS",
|
|
4671
|
-
"type": {
|
|
4672
|
-
"text": "ActivityBus"
|
|
4673
|
-
},
|
|
4674
|
-
"default": "{ publish: () => {} }",
|
|
4675
|
-
"description": "No-op ActivityBus. The default when no bus is injected (Node, tests, headless\nserver use) — publishing goes nowhere and nothing is left open to tear down."
|
|
4676
|
-
},
|
|
4677
|
-
{
|
|
4678
|
-
"kind": "class",
|
|
4679
|
-
"description": "Typed in-process event bus for AI assistant activity events.\n\nDispatches events synchronously to all local subscribers in the same JS module instance\n(i.e. the same browser tab). Events listed in `crossTabEvents` are additionally forwarded\nvia a shared `BroadcastChannel` so that other tabs on the same origin receive them.",
|
|
4680
|
-
"name": "AgenticActivityBus",
|
|
4681
|
-
"members": [
|
|
4682
|
-
{
|
|
4683
|
-
"kind": "field",
|
|
4684
|
-
"name": "subscribers",
|
|
4685
|
-
"privacy": "private",
|
|
4686
|
-
"readonly": true,
|
|
4687
|
-
"default": "new Map<string, Set<AnyHandler>>()"
|
|
4688
|
-
},
|
|
4689
|
-
{
|
|
4690
|
-
"kind": "field",
|
|
4691
|
-
"name": "crossTabEvents",
|
|
4692
|
-
"type": {
|
|
4693
|
-
"text": "Set<string>"
|
|
4694
|
-
},
|
|
4695
|
-
"privacy": "private",
|
|
4696
|
-
"readonly": true,
|
|
4697
|
-
"default": "new Set(config?.crossTabEvents ?? [])"
|
|
4698
|
-
},
|
|
4699
|
-
{
|
|
4700
|
-
"kind": "field",
|
|
4701
|
-
"name": "channelNameFactory",
|
|
4702
|
-
"type": {
|
|
4703
|
-
"text": "() => string | undefined"
|
|
4704
|
-
},
|
|
4705
|
-
"privacy": "private",
|
|
4706
|
-
"readonly": true
|
|
4707
|
-
},
|
|
4708
|
-
{
|
|
4709
|
-
"kind": "field",
|
|
4710
|
-
"name": "channel",
|
|
4711
|
-
"type": {
|
|
4712
|
-
"text": "BroadcastChannel | undefined"
|
|
4713
|
-
},
|
|
4714
|
-
"privacy": "private"
|
|
4715
|
-
},
|
|
4716
|
-
{
|
|
4717
|
-
"kind": "field",
|
|
4718
|
-
"name": "channelInitialised",
|
|
4719
|
-
"type": {
|
|
4720
|
-
"text": "boolean"
|
|
4721
|
-
},
|
|
4722
|
-
"privacy": "private",
|
|
4723
|
-
"default": "false"
|
|
4724
|
-
},
|
|
4725
|
-
{
|
|
4726
|
-
"kind": "method",
|
|
4727
|
-
"name": "ensureChannel",
|
|
4728
|
-
"privacy": "private",
|
|
4729
|
-
"return": {
|
|
4730
|
-
"type": {
|
|
4731
|
-
"text": "void"
|
|
4732
|
-
}
|
|
4733
|
-
},
|
|
4734
|
-
"description": "Lazily open the cross-tab `BroadcastChannel` on first use. Deferred (rather than\ncreated in the constructor) so that importing this module, or constructing the bus\noff-browser (Node, tests, headless server), never opens a live channel or reads\n`sessionStorage` — both would keep a Node event loop alive and hang the process.\nCross-tab forwarding is inherently browser-only, so channel creation is gated on a\nbrowser environment; elsewhere the bus stays purely in-process."
|
|
4735
|
-
},
|
|
4736
|
-
{
|
|
4737
|
-
"kind": "method",
|
|
4738
|
-
"name": "subscribe",
|
|
4739
|
-
"return": {
|
|
4740
|
-
"type": {
|
|
4741
|
-
"text": "() => void"
|
|
4742
|
-
}
|
|
4743
|
-
},
|
|
4744
|
-
"parameters": [
|
|
4745
|
-
{
|
|
4746
|
-
"name": "type",
|
|
4747
|
-
"type": {
|
|
4748
|
-
"text": "K"
|
|
4749
|
-
}
|
|
4750
|
-
},
|
|
4751
|
-
{
|
|
4752
|
-
"name": "handler",
|
|
4753
|
-
"type": {
|
|
4754
|
-
"text": "(detail: AgenticActivityEvents[K]) => void"
|
|
4755
|
-
}
|
|
4756
|
-
}
|
|
4757
|
-
],
|
|
4758
|
-
"description": "Subscribe to an event. Returns an unsubscribe function — call it in\n`disconnectedCallback` to avoid memory leaks."
|
|
4759
|
-
},
|
|
4760
|
-
{
|
|
4761
|
-
"kind": "method",
|
|
4762
|
-
"name": "publish",
|
|
4763
|
-
"return": {
|
|
4764
|
-
"type": {
|
|
4765
|
-
"text": "void"
|
|
4766
|
-
}
|
|
4767
|
-
},
|
|
4768
|
-
"parameters": [
|
|
4769
|
-
{
|
|
4770
|
-
"name": "type",
|
|
4771
|
-
"type": {
|
|
4772
|
-
"text": "K"
|
|
4773
|
-
}
|
|
4774
|
-
},
|
|
4775
|
-
{
|
|
4776
|
-
"name": "detail",
|
|
4777
|
-
"type": {
|
|
4778
|
-
"text": "AgenticActivityEvents[K]"
|
|
4779
|
-
}
|
|
4780
|
-
}
|
|
4781
|
-
],
|
|
4782
|
-
"description": "Publish an event to all local subscribers and, if configured, to other tabs\nvia BroadcastChannel."
|
|
4783
|
-
},
|
|
4784
|
-
{
|
|
4785
|
-
"kind": "method",
|
|
4786
|
-
"name": "addCrossTabEvent",
|
|
4787
|
-
"return": {
|
|
4788
|
-
"type": {
|
|
4789
|
-
"text": "void"
|
|
4790
|
-
}
|
|
4791
|
-
},
|
|
4792
|
-
"parameters": [
|
|
4793
|
-
{
|
|
4794
|
-
"name": "type",
|
|
4795
|
-
"type": {
|
|
4796
|
-
"text": "keyof AgenticActivityEvents"
|
|
4797
|
-
}
|
|
4798
|
-
}
|
|
4799
|
-
],
|
|
4800
|
-
"description": "Add an event type to the cross-tab forwarding set at runtime.\nMust be called before the first AgenticActivityBus.publish of that event type."
|
|
4801
|
-
},
|
|
5000
|
+
"name": "type",
|
|
5001
|
+
"module": "./widget-tools"
|
|
5002
|
+
}
|
|
5003
|
+
},
|
|
5004
|
+
{
|
|
5005
|
+
"kind": "js",
|
|
5006
|
+
"name": "WidgetToolSpec",
|
|
5007
|
+
"declaration": {
|
|
5008
|
+
"name": "WidgetToolSpec",
|
|
5009
|
+
"module": "./widget-tools"
|
|
5010
|
+
}
|
|
5011
|
+
},
|
|
5012
|
+
{
|
|
5013
|
+
"kind": "js",
|
|
5014
|
+
"name": "AutopilotHandBack",
|
|
5015
|
+
"declaration": {
|
|
5016
|
+
"name": "AutopilotHandBack",
|
|
5017
|
+
"module": "./hand-back/hand-back"
|
|
5018
|
+
}
|
|
5019
|
+
}
|
|
5020
|
+
]
|
|
5021
|
+
},
|
|
5022
|
+
{
|
|
5023
|
+
"kind": "javascript-module",
|
|
5024
|
+
"path": "src/autopilot/widget-tools.ts",
|
|
5025
|
+
"declarations": [
|
|
5026
|
+
{
|
|
5027
|
+
"kind": "function",
|
|
5028
|
+
"name": "widgetTools",
|
|
5029
|
+
"return": {
|
|
5030
|
+
"type": {
|
|
5031
|
+
"text": "WidgetTools"
|
|
5032
|
+
}
|
|
5033
|
+
},
|
|
5034
|
+
"parameters": [
|
|
4802
5035
|
{
|
|
4803
|
-
"
|
|
4804
|
-
"
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
"text": "void"
|
|
4808
|
-
}
|
|
4809
|
-
},
|
|
4810
|
-
"description": "Close the underlying BroadcastChannel. Call once on application teardown if needed."
|
|
5036
|
+
"name": "componentName",
|
|
5037
|
+
"type": {
|
|
5038
|
+
"text": "string"
|
|
5039
|
+
}
|
|
4811
5040
|
},
|
|
4812
5041
|
{
|
|
4813
|
-
"
|
|
4814
|
-
"
|
|
4815
|
-
|
|
4816
|
-
|
|
4817
|
-
"type": {
|
|
4818
|
-
"text": "void"
|
|
4819
|
-
}
|
|
4820
|
-
},
|
|
4821
|
-
"parameters": [
|
|
4822
|
-
{
|
|
4823
|
-
"name": "type",
|
|
4824
|
-
"type": {
|
|
4825
|
-
"text": "string"
|
|
4826
|
-
}
|
|
4827
|
-
},
|
|
4828
|
-
{
|
|
4829
|
-
"name": "detail",
|
|
4830
|
-
"type": {
|
|
4831
|
-
"text": "unknown"
|
|
4832
|
-
}
|
|
4833
|
-
}
|
|
4834
|
-
]
|
|
5042
|
+
"name": "tools",
|
|
5043
|
+
"type": {
|
|
5044
|
+
"text": "{ [K in keyof TArgs]: WidgetToolSpec<TController, TArgs[K]> }"
|
|
5045
|
+
}
|
|
4835
5046
|
}
|
|
4836
|
-
]
|
|
4837
|
-
|
|
5047
|
+
],
|
|
5048
|
+
"description": "Declare tools that read from one widget type (GENC-1660): parameterised reads that a view cannot\nexpress, such as one table's rows, or a page of them.\n\nPut them on the autopilot (`defineAutopilot({ widgetTools: [...] })`), never discovered from the\nregistration. Its tool list is fixed when its session starts, sorted by name, and identical for\nevery decision, so the cache never breaks. Each call is routed to the interaction of\n`componentName` the autopilot is deciding, and `run` gets its controller; with none open, it is\nrefused with a reason. While one is open, the autopilot's tail says which tools are usable now.\n\nReads only. Their results leave the autopilot's history at the end of the decision, as\n`widget_read`'s do."
|
|
5049
|
+
}
|
|
5050
|
+
],
|
|
5051
|
+
"exports": [
|
|
4838
5052
|
{
|
|
4839
|
-
"kind": "
|
|
4840
|
-
"name": "
|
|
4841
|
-
"
|
|
4842
|
-
|
|
5053
|
+
"kind": "js",
|
|
5054
|
+
"name": "widgetTools",
|
|
5055
|
+
"declaration": {
|
|
5056
|
+
"name": "widgetTools",
|
|
5057
|
+
"module": "src/autopilot/widget-tools.ts"
|
|
5058
|
+
}
|
|
5059
|
+
}
|
|
5060
|
+
]
|
|
5061
|
+
},
|
|
5062
|
+
{
|
|
5063
|
+
"kind": "javascript-module",
|
|
5064
|
+
"path": "src/config/config.ts",
|
|
5065
|
+
"declarations": [
|
|
5066
|
+
{
|
|
5067
|
+
"kind": "function",
|
|
5068
|
+
"name": "defineAgent",
|
|
5069
|
+
"description": "Identity helper that infers the narrowest possible type for an agent config,\npreserving string literal types (including `name`) without requiring `as const`.\n\nUse this when you need `typeof myAgent` to carry the literal `name` type —\nfor example, when wiring `ChatToolHandlers<typeof myAgent>`.\n\n```ts\nconst myAgent = defineAgent({ name: 'my_agent', ... });\ntype Handlers = ChatToolHandlers<typeof myAgent>;\n// requestSubAgent name param is now typed as 'my_agent'\n```"
|
|
4843
5070
|
}
|
|
4844
5071
|
],
|
|
4845
5072
|
"exports": [
|
|
4846
5073
|
{
|
|
4847
5074
|
"kind": "js",
|
|
4848
|
-
"name": "
|
|
5075
|
+
"name": "CachePolicy",
|
|
4849
5076
|
"declaration": {
|
|
4850
|
-
"name": "
|
|
4851
|
-
"module": "src/
|
|
5077
|
+
"name": "CachePolicy",
|
|
5078
|
+
"module": "src/config/config.ts"
|
|
4852
5079
|
}
|
|
4853
5080
|
},
|
|
4854
5081
|
{
|
|
4855
5082
|
"kind": "js",
|
|
4856
|
-
"name": "
|
|
5083
|
+
"name": "ChatFallback",
|
|
4857
5084
|
"declaration": {
|
|
4858
|
-
"name": "
|
|
4859
|
-
"module": "src/
|
|
5085
|
+
"name": "ChatFallback",
|
|
5086
|
+
"module": "src/config/config.ts"
|
|
4860
5087
|
}
|
|
4861
5088
|
},
|
|
4862
5089
|
{
|
|
4863
5090
|
"kind": "js",
|
|
4864
|
-
"name": "
|
|
5091
|
+
"name": "ChatInputDuringExecutionMode",
|
|
4865
5092
|
"declaration": {
|
|
4866
|
-
"name": "
|
|
4867
|
-
"module": "src/
|
|
5093
|
+
"name": "ChatInputDuringExecutionMode",
|
|
5094
|
+
"module": "src/config/config.ts"
|
|
5095
|
+
}
|
|
5096
|
+
},
|
|
5097
|
+
{
|
|
5098
|
+
"kind": "js",
|
|
5099
|
+
"name": "ChatThinkingPolicy",
|
|
5100
|
+
"declaration": {
|
|
5101
|
+
"name": "ChatThinkingPolicy",
|
|
5102
|
+
"module": "src/config/config.ts"
|
|
5103
|
+
}
|
|
5104
|
+
},
|
|
5105
|
+
{
|
|
5106
|
+
"kind": "js",
|
|
5107
|
+
"name": "ChatToolChoice",
|
|
5108
|
+
"declaration": {
|
|
5109
|
+
"name": "ChatToolChoice",
|
|
5110
|
+
"module": "src/config/config.ts"
|
|
5111
|
+
}
|
|
5112
|
+
},
|
|
5113
|
+
{
|
|
5114
|
+
"kind": "js",
|
|
5115
|
+
"name": "defineAgent",
|
|
5116
|
+
"declaration": {
|
|
5117
|
+
"name": "defineAgent",
|
|
5118
|
+
"module": "src/config/config.ts"
|
|
4868
5119
|
}
|
|
4869
5120
|
}
|
|
4870
5121
|
]
|
|
4871
5122
|
},
|
|
4872
5123
|
{
|
|
4873
5124
|
"kind": "javascript-module",
|
|
4874
|
-
"path": "src/
|
|
4875
|
-
"declarations": [],
|
|
4876
|
-
"exports": []
|
|
4877
|
-
},
|
|
4878
|
-
{
|
|
4879
|
-
"kind": "javascript-module",
|
|
4880
|
-
"path": "src/channel/autopilot-needs-user.ts",
|
|
5125
|
+
"path": "src/config/define-stateful-agent.ts",
|
|
4881
5126
|
"declarations": [
|
|
4882
5127
|
{
|
|
4883
5128
|
"kind": "function",
|
|
4884
|
-
"name": "
|
|
5129
|
+
"name": "restoreMachine",
|
|
4885
5130
|
"return": {
|
|
4886
5131
|
"type": {
|
|
4887
5132
|
"text": "void"
|
|
@@ -4889,59 +5134,162 @@
|
|
|
4889
5134
|
},
|
|
4890
5135
|
"parameters": [
|
|
4891
5136
|
{
|
|
4892
|
-
"name": "
|
|
5137
|
+
"name": "machine",
|
|
4893
5138
|
"type": {
|
|
4894
|
-
"text": "
|
|
4895
|
-
}
|
|
5139
|
+
"text": "{ stop: () => void; start: (options?: { state?: unknown }) => void }"
|
|
5140
|
+
},
|
|
5141
|
+
"description": "the machine to restore (already constructed/started)."
|
|
4896
5142
|
},
|
|
4897
5143
|
{
|
|
4898
|
-
"name": "
|
|
5144
|
+
"name": "restored",
|
|
4899
5145
|
"type": {
|
|
4900
|
-
"text": "
|
|
5146
|
+
"text": "unknown"
|
|
5147
|
+
},
|
|
5148
|
+
"description": "the agent's serialized image (`ctx.restored` in `init`)."
|
|
5149
|
+
},
|
|
5150
|
+
{
|
|
5151
|
+
"name": "key",
|
|
5152
|
+
"default": "'machine'",
|
|
5153
|
+
"description": "the property the machine occupies in the snapshot; defaults to\n`'machine'` to match the conventional `{ machine }` state bag."
|
|
5154
|
+
}
|
|
5155
|
+
],
|
|
5156
|
+
"description": "Restore a foundation-state-machine instance from a snapshot produced by the\ndefault serializer (or `machine.getPersistedSnapshot()`). Call inside a\nstateful agent's `init` to resume the machine in its exact prior place:\n\n```ts\ninit: ({ restored }) => {\n const machine = new MyMachine();\n restoreMachine(machine, restored); // resume, or no-op on a fresh start\n return { machine };\n}\n```\n\nNo-ops when there is nothing to restore (a fresh session), leaving the\nfreshly-constructed machine in its initial state."
|
|
5157
|
+
},
|
|
5158
|
+
{
|
|
5159
|
+
"kind": "function",
|
|
5160
|
+
"name": "defineStatefulAgent",
|
|
5161
|
+
"return": {
|
|
5162
|
+
"type": {
|
|
5163
|
+
"text": "AgentConfig"
|
|
5164
|
+
}
|
|
5165
|
+
},
|
|
5166
|
+
"parameters": [
|
|
5167
|
+
{
|
|
5168
|
+
"name": "opts",
|
|
5169
|
+
"type": {
|
|
5170
|
+
"text": "StatefulAgentInit<S>"
|
|
4901
5171
|
}
|
|
4902
5172
|
}
|
|
4903
5173
|
],
|
|
4904
|
-
"description": "
|
|
5174
|
+
"description": "Build an `AgentConfig` whose `systemPrompt`, `toolDefinitions`, and tool\nhandlers all close over a long-lived state object created on activation.\n\nThe framework wires the lifecycle: `init` on `onActivate`, `dispose` on\n`onDeactivate`. State is held inside the helper's closure — never exposed on\nthe resulting `AgentConfig` — so the redux serializer doesn't see it."
|
|
4905
5175
|
},
|
|
4906
5176
|
{
|
|
4907
5177
|
"kind": "function",
|
|
4908
|
-
"name": "
|
|
5178
|
+
"name": "defineAutopilot",
|
|
4909
5179
|
"return": {
|
|
4910
5180
|
"type": {
|
|
4911
|
-
"text": "
|
|
5181
|
+
"text": "AutopilotConfig<S>"
|
|
4912
5182
|
}
|
|
4913
5183
|
},
|
|
4914
5184
|
"parameters": [
|
|
4915
5185
|
{
|
|
4916
|
-
"name": "
|
|
4917
|
-
"optional": true,
|
|
5186
|
+
"name": "config",
|
|
4918
5187
|
"type": {
|
|
4919
|
-
"text": "
|
|
5188
|
+
"text": "AutopilotConfig<S>"
|
|
4920
5189
|
}
|
|
4921
5190
|
}
|
|
4922
5191
|
],
|
|
4923
|
-
"description": "
|
|
5192
|
+
"description": "Define an autopilot for a stateful agent whose state is `S` (GENC-1660). An identity function\nthat exists for its type: the resolvers get `S`, and the result goes on `defineStatefulAgent`'s\n`autopilot` option."
|
|
5193
|
+
}
|
|
5194
|
+
],
|
|
5195
|
+
"exports": [
|
|
5196
|
+
{
|
|
5197
|
+
"kind": "js",
|
|
5198
|
+
"name": "restoreMachine",
|
|
5199
|
+
"declaration": {
|
|
5200
|
+
"name": "restoreMachine",
|
|
5201
|
+
"module": "src/config/define-stateful-agent.ts"
|
|
5202
|
+
}
|
|
5203
|
+
},
|
|
5204
|
+
{
|
|
5205
|
+
"kind": "js",
|
|
5206
|
+
"name": "defineStatefulAgent",
|
|
5207
|
+
"declaration": {
|
|
5208
|
+
"name": "defineStatefulAgent",
|
|
5209
|
+
"module": "src/config/define-stateful-agent.ts"
|
|
5210
|
+
}
|
|
5211
|
+
},
|
|
5212
|
+
{
|
|
5213
|
+
"kind": "js",
|
|
5214
|
+
"name": "defineAutopilot",
|
|
5215
|
+
"declaration": {
|
|
5216
|
+
"name": "defineAutopilot",
|
|
5217
|
+
"module": "src/config/define-stateful-agent.ts"
|
|
5218
|
+
}
|
|
5219
|
+
}
|
|
5220
|
+
]
|
|
5221
|
+
},
|
|
5222
|
+
{
|
|
5223
|
+
"kind": "javascript-module",
|
|
5224
|
+
"path": "src/config/fallback-agents.ts",
|
|
5225
|
+
"declarations": [
|
|
5226
|
+
{
|
|
5227
|
+
"kind": "variable",
|
|
5228
|
+
"name": "friendlyFallbackAgent",
|
|
5229
|
+
"type": {
|
|
5230
|
+
"text": "FallbackAgentConfig"
|
|
5231
|
+
},
|
|
5232
|
+
"default": "{\n name: 'Assistant',\n fallback: true,\n systemPrompt: `You are a warm, friendly assistant. For general conversation like \"Hi\" or \"How are you\", you can have a friendly chat. For anything more complex, you cannot directly help, but you can explain what specialists are available. The available specialists are:\\n\\n{{agents}}\\n\\nPolitely let the user know what you can help with and invite them to rephrase their request if it is outside your scope.`,\n}",
|
|
5233
|
+
"description": "A warm, conversational fallback agent. Acknowledges it can't help directly,\nexplains what the available specialists can do, and invites the user to retry.\n\nThe system prompt is generated at runtime by `OrchestratingDriver` from the\nspecialist list — no manual authoring required."
|
|
5234
|
+
},
|
|
5235
|
+
{
|
|
5236
|
+
"kind": "variable",
|
|
5237
|
+
"name": "strictFallbackAgent",
|
|
5238
|
+
"type": {
|
|
5239
|
+
"text": "FallbackAgentConfig"
|
|
5240
|
+
},
|
|
5241
|
+
"default": "{\n name: 'Assistant',\n fallback: true,\n systemPrompt: `You are a concise assistant. The user's request is outside your scope. The available specialists are: {{agents}}.\n\n{{unroutable}}\n\nAnswer in a single short sentence. Do not elaborate.`,\n}",
|
|
5242
|
+
"description": "A brief, professional fallback agent. States what is available without\nelaboration. The `{{agents}}` placeholder is replaced at runtime by\n`OrchestratingDriver` with the generated specialist list.\n\nThe `{{unroutable}}` placeholder positions `UNROUTABLE_INSTRUCTION` — the framework's\ninstruction for a substantive request no specialist covers, which is otherwise APPENDED to a\nstring-form prompt. Positioned rather than appended for one reason: this preset's whole point is\nbrevity, and appended text would be the last thing the model reads. Putting the block above the\nbrevity rule leaves \"a single short sentence\" with the recency, so the two compose instead of\ncompeting. A prompt whose tone rules matter should do the same."
|
|
5243
|
+
}
|
|
5244
|
+
],
|
|
5245
|
+
"exports": [
|
|
5246
|
+
{
|
|
5247
|
+
"kind": "js",
|
|
5248
|
+
"name": "friendlyFallbackAgent",
|
|
5249
|
+
"declaration": {
|
|
5250
|
+
"name": "friendlyFallbackAgent",
|
|
5251
|
+
"module": "src/config/fallback-agents.ts"
|
|
5252
|
+
}
|
|
5253
|
+
},
|
|
5254
|
+
{
|
|
5255
|
+
"kind": "js",
|
|
5256
|
+
"name": "strictFallbackAgent",
|
|
5257
|
+
"declaration": {
|
|
5258
|
+
"name": "strictFallbackAgent",
|
|
5259
|
+
"module": "src/config/fallback-agents.ts"
|
|
5260
|
+
}
|
|
4924
5261
|
}
|
|
4925
|
-
]
|
|
5262
|
+
]
|
|
5263
|
+
},
|
|
5264
|
+
{
|
|
5265
|
+
"kind": "javascript-module",
|
|
5266
|
+
"path": "src/config/index.ts",
|
|
5267
|
+
"declarations": [],
|
|
4926
5268
|
"exports": [
|
|
4927
5269
|
{
|
|
4928
5270
|
"kind": "js",
|
|
4929
|
-
"name": "
|
|
5271
|
+
"name": "*",
|
|
4930
5272
|
"declaration": {
|
|
4931
|
-
"name": "
|
|
4932
|
-
"
|
|
5273
|
+
"name": "*",
|
|
5274
|
+
"package": "./config"
|
|
4933
5275
|
}
|
|
4934
5276
|
},
|
|
4935
5277
|
{
|
|
4936
5278
|
"kind": "js",
|
|
4937
|
-
"name": "
|
|
5279
|
+
"name": "*",
|
|
4938
5280
|
"declaration": {
|
|
4939
|
-
"name": "
|
|
4940
|
-
"
|
|
5281
|
+
"name": "*",
|
|
5282
|
+
"package": "./fallback-agents"
|
|
4941
5283
|
}
|
|
4942
5284
|
}
|
|
4943
5285
|
]
|
|
4944
5286
|
},
|
|
5287
|
+
{
|
|
5288
|
+
"kind": "javascript-module",
|
|
5289
|
+
"path": "src/config/validate-providers.ts",
|
|
5290
|
+
"declarations": [],
|
|
5291
|
+
"exports": []
|
|
5292
|
+
},
|
|
4945
5293
|
{
|
|
4946
5294
|
"kind": "javascript-module",
|
|
4947
5295
|
"path": "src/components/flowing-waves-indicator.ts",
|
|
@@ -5142,228 +5490,12 @@
|
|
|
5142
5490
|
"name": "lastTime",
|
|
5143
5491
|
"type": {
|
|
5144
5492
|
"text": "number | undefined"
|
|
5145
|
-
},
|
|
5146
|
-
"privacy": "private"
|
|
5147
|
-
},
|
|
5148
|
-
{
|
|
5149
|
-
"kind": "field",
|
|
5150
|
-
"name": "animFrame",
|
|
5151
|
-
"type": {
|
|
5152
|
-
"text": "number | undefined"
|
|
5153
|
-
},
|
|
5154
|
-
"privacy": "private"
|
|
5155
|
-
},
|
|
5156
|
-
{
|
|
5157
|
-
"kind": "field",
|
|
5158
|
-
"name": "stopTimer",
|
|
5159
|
-
"type": {
|
|
5160
|
-
"text": "number | undefined"
|
|
5161
|
-
},
|
|
5162
|
-
"privacy": "private"
|
|
5163
|
-
},
|
|
5164
|
-
{
|
|
5165
|
-
"kind": "field",
|
|
5166
|
-
"name": "running",
|
|
5167
|
-
"type": {
|
|
5168
|
-
"text": "boolean"
|
|
5169
|
-
},
|
|
5170
|
-
"privacy": "private",
|
|
5171
|
-
"default": "false",
|
|
5172
|
-
"description": "Whether the loop should keep rescheduling itself — see AiHaloOverlay.tick."
|
|
5173
|
-
},
|
|
5174
|
-
{
|
|
5175
|
-
"kind": "method",
|
|
5176
|
-
"name": "activeChanged",
|
|
5177
|
-
"description": "Start/stop with `active`, so an idle overlay costs nothing.\n\nGuarded on `isConnected` because FAST invokes attribute-changed callbacks during\ninitialisation, before the element is in the document — `connectedCallback` is what decides\nfor an element that mounts already-active."
|
|
5178
|
-
},
|
|
5179
|
-
{
|
|
5180
|
-
"kind": "method",
|
|
5181
|
-
"name": "startAnimation",
|
|
5182
|
-
"privacy": "private"
|
|
5183
|
-
},
|
|
5184
|
-
{
|
|
5185
|
-
"kind": "method",
|
|
5186
|
-
"name": "scheduleStop",
|
|
5187
|
-
"privacy": "private",
|
|
5188
|
-
"description": "Keep spinning until the host has finished fading out.\n\nDeactivating only drops the host's opacity — the overlay is still on screen for the length of\nthe transition, so stopping the instant `active` flips would freeze the rotation mid-fade.\n\nTimed rather than driven by `transitionend`, which never fires if the host is hidden or an app\noverrides the transition away, and a stop that never arrives is exactly the idle-tick bug this\ngating exists to prevent.\n\nThe timer re-reads `active` rather than trusting that it was cancelled. FAST reflects the\nproperty to the attribute on a queued update, so `activeChanged` can run again, out of order,\nafter a rapid toggle — and a stale stop landing on a re-activated overlay would leave it\nfrozen for good, which is worse than the idle ticking this gate removes."
|
|
5189
|
-
},
|
|
5190
|
-
{
|
|
5191
|
-
"kind": "method",
|
|
5192
|
-
"name": "cancelPendingStop",
|
|
5193
|
-
"privacy": "private"
|
|
5194
|
-
},
|
|
5195
|
-
{
|
|
5196
|
-
"kind": "method",
|
|
5197
|
-
"name": "stopAnimation",
|
|
5198
|
-
"privacy": "private"
|
|
5199
|
-
},
|
|
5200
|
-
{
|
|
5201
|
-
"kind": "method",
|
|
5202
|
-
"name": "tick",
|
|
5203
|
-
"privacy": "private",
|
|
5204
|
-
"parameters": [
|
|
5205
|
-
{
|
|
5206
|
-
"name": "now",
|
|
5207
|
-
"optional": true,
|
|
5208
|
-
"type": {
|
|
5209
|
-
"text": "number"
|
|
5210
|
-
}
|
|
5211
|
-
}
|
|
5212
|
-
]
|
|
5213
|
-
}
|
|
5214
|
-
],
|
|
5215
|
-
"attributes": [
|
|
5216
|
-
{
|
|
5217
|
-
"type": {
|
|
5218
|
-
"text": "boolean"
|
|
5219
|
-
},
|
|
5220
|
-
"default": "false",
|
|
5221
|
-
"fieldName": "active"
|
|
5222
|
-
},
|
|
5223
|
-
{
|
|
5224
|
-
"type": {
|
|
5225
|
-
"text": "number"
|
|
5226
|
-
},
|
|
5227
|
-
"default": "HALO_DEFAULT_SPEED",
|
|
5228
|
-
"description": "Rotation speed in degrees per frame. Default: 1.5 (≈ 4 s per full revolution at 60 fps).",
|
|
5229
|
-
"resolveInitializer": {
|
|
5230
|
-
"module": "src/components/halo-overlay.ts"
|
|
5231
|
-
},
|
|
5232
|
-
"fieldName": "speed"
|
|
5233
|
-
},
|
|
5234
|
-
{
|
|
5235
|
-
"name": "direction",
|
|
5236
|
-
"type": {
|
|
5237
|
-
"text": "'cw' | 'ccw'"
|
|
5238
|
-
},
|
|
5239
|
-
"default": "'cw'",
|
|
5240
|
-
"description": "Rotation direction. Default: 'cw' (clockwise).",
|
|
5241
|
-
"fieldName": "direction"
|
|
5242
|
-
},
|
|
5243
|
-
{
|
|
5244
|
-
"name": "border-size",
|
|
5245
|
-
"type": {
|
|
5246
|
-
"text": "number"
|
|
5247
|
-
},
|
|
5248
|
-
"default": "HALO_DEFAULT_BORDER_SIZE",
|
|
5249
|
-
"description": "Border thickness in px. Default: 3.",
|
|
5250
|
-
"resolveInitializer": {
|
|
5251
|
-
"module": "src/components/halo-overlay.ts"
|
|
5252
|
-
},
|
|
5253
|
-
"fieldName": "borderSize"
|
|
5254
|
-
},
|
|
5255
|
-
{
|
|
5256
|
-
"name": "glow-opacity",
|
|
5257
|
-
"type": {
|
|
5258
|
-
"text": "number"
|
|
5259
|
-
},
|
|
5260
|
-
"default": "HALO_DEFAULT_GLOW_OPACITY",
|
|
5261
|
-
"description": "Glow layer opacity (0–1). Default: 0.35.",
|
|
5262
|
-
"resolveInitializer": {
|
|
5263
|
-
"module": "src/components/halo-overlay.ts"
|
|
5264
|
-
},
|
|
5265
|
-
"fieldName": "glowOpacity"
|
|
5266
|
-
},
|
|
5267
|
-
{
|
|
5268
|
-
"name": "glow-spread",
|
|
5269
|
-
"type": {
|
|
5270
|
-
"text": "number"
|
|
5271
|
-
},
|
|
5272
|
-
"default": "HALO_DEFAULT_GLOW_SPREAD",
|
|
5273
|
-
"description": "Transparent stop of the radial glow mask as a percentage (0–100). Higher = less spread. Default: 70.",
|
|
5274
|
-
"resolveInitializer": {
|
|
5275
|
-
"module": "src/components/halo-overlay.ts"
|
|
5276
|
-
},
|
|
5277
|
-
"fieldName": "glowSpread"
|
|
5278
|
-
}
|
|
5279
|
-
],
|
|
5280
|
-
"superclass": {
|
|
5281
|
-
"name": "GenesisElement",
|
|
5282
|
-
"package": "@genesislcap/web-core"
|
|
5283
|
-
},
|
|
5284
|
-
"tagName": "ai-halo-overlay",
|
|
5285
|
-
"customElement": true
|
|
5286
|
-
}
|
|
5287
|
-
],
|
|
5288
|
-
"exports": [
|
|
5289
|
-
{
|
|
5290
|
-
"kind": "js",
|
|
5291
|
-
"name": "AiHaloOverlay",
|
|
5292
|
-
"declaration": {
|
|
5293
|
-
"name": "AiHaloOverlay",
|
|
5294
|
-
"module": "src/components/halo-overlay.ts"
|
|
5295
|
-
}
|
|
5296
|
-
},
|
|
5297
|
-
{
|
|
5298
|
-
"kind": "custom-element-definition",
|
|
5299
|
-
"name": "ai-halo-overlay",
|
|
5300
|
-
"declaration": {
|
|
5301
|
-
"name": "AiHaloOverlay",
|
|
5302
|
-
"module": "src/components/halo-overlay.ts"
|
|
5303
|
-
}
|
|
5304
|
-
}
|
|
5305
|
-
]
|
|
5306
|
-
},
|
|
5307
|
-
{
|
|
5308
|
-
"kind": "javascript-module",
|
|
5309
|
-
"path": "src/components/plasma-orb-indicator.ts",
|
|
5310
|
-
"declarations": [
|
|
5311
|
-
{
|
|
5312
|
-
"kind": "class",
|
|
5313
|
-
"description": "Animated \"plasma orb\" loading indicator — a fixed glowing energy sphere whose\nluminous filaments and swirls drift and rotate inside it, like a plasma ball.\nThe globe never resizes; only the energy moves.\n\nBrand-coloured: a violet energy core, a slow cyan/pink tint wash, and a warm\namber hot-spot — covering all four brand colours.\n\nVisual sibling of the dots loading indicator; interchangeable with the other\nloading styles for the \"assistant is working\" state.",
|
|
5314
|
-
"name": "AiPlasmaOrbIndicator",
|
|
5315
|
-
"superclass": {
|
|
5316
|
-
"name": "GenesisElement",
|
|
5317
|
-
"package": "@genesislcap/web-core"
|
|
5318
|
-
},
|
|
5319
|
-
"tagName": "ai-plasma-orb-indicator",
|
|
5320
|
-
"customElement": true
|
|
5321
|
-
}
|
|
5322
|
-
],
|
|
5323
|
-
"exports": [
|
|
5324
|
-
{
|
|
5325
|
-
"kind": "js",
|
|
5326
|
-
"name": "AiPlasmaOrbIndicator",
|
|
5327
|
-
"declaration": {
|
|
5328
|
-
"name": "AiPlasmaOrbIndicator",
|
|
5329
|
-
"module": "src/components/plasma-orb-indicator.ts"
|
|
5330
|
-
}
|
|
5331
|
-
},
|
|
5332
|
-
{
|
|
5333
|
-
"kind": "custom-element-definition",
|
|
5334
|
-
"name": "ai-plasma-orb-indicator",
|
|
5335
|
-
"declaration": {
|
|
5336
|
-
"name": "AiPlasmaOrbIndicator",
|
|
5337
|
-
"module": "src/components/plasma-orb-indicator.ts"
|
|
5338
|
-
}
|
|
5339
|
-
}
|
|
5340
|
-
]
|
|
5341
|
-
},
|
|
5342
|
-
{
|
|
5343
|
-
"kind": "javascript-module",
|
|
5344
|
-
"path": "src/components/waves-indicator.ts",
|
|
5345
|
-
"declarations": [
|
|
5346
|
-
{
|
|
5347
|
-
"kind": "class",
|
|
5348
|
-
"description": "Animated \"waves inside a circle\" loading indicator — coloured sine waves that\nslosh like glowing liquid inside a circular window, ringed by a rotating\ngradient halo (the same effect as `<ai-halo-overlay>`).\n\nVisual sibling of the dots loading indicator; the two are interchangeable\nstyles of the same \"assistant is working\" state.",
|
|
5349
|
-
"name": "AiWavesIndicator",
|
|
5350
|
-
"members": [
|
|
5351
|
-
{
|
|
5352
|
-
"kind": "field",
|
|
5353
|
-
"name": "size",
|
|
5354
|
-
"type": {
|
|
5355
|
-
"text": "number"
|
|
5356
|
-
},
|
|
5357
|
-
"default": "56",
|
|
5358
|
-
"description": "Diameter of the circular window in px. Default: 56."
|
|
5359
|
-
},
|
|
5360
|
-
{
|
|
5361
|
-
"kind": "method",
|
|
5362
|
-
"name": "sizeChanged"
|
|
5493
|
+
},
|
|
5494
|
+
"privacy": "private"
|
|
5363
5495
|
},
|
|
5364
5496
|
{
|
|
5365
5497
|
"kind": "field",
|
|
5366
|
-
"name": "
|
|
5498
|
+
"name": "animFrame",
|
|
5367
5499
|
"type": {
|
|
5368
5500
|
"text": "number | undefined"
|
|
5369
5501
|
},
|
|
@@ -5371,7 +5503,7 @@
|
|
|
5371
5503
|
},
|
|
5372
5504
|
{
|
|
5373
5505
|
"kind": "field",
|
|
5374
|
-
"name": "
|
|
5506
|
+
"name": "stopTimer",
|
|
5375
5507
|
"type": {
|
|
5376
5508
|
"text": "number | undefined"
|
|
5377
5509
|
},
|
|
@@ -5379,324 +5511,309 @@
|
|
|
5379
5511
|
},
|
|
5380
5512
|
{
|
|
5381
5513
|
"kind": "field",
|
|
5382
|
-
"name": "
|
|
5514
|
+
"name": "running",
|
|
5383
5515
|
"type": {
|
|
5384
|
-
"text": "
|
|
5516
|
+
"text": "boolean"
|
|
5385
5517
|
},
|
|
5518
|
+
"privacy": "private",
|
|
5519
|
+
"default": "false",
|
|
5520
|
+
"description": "Whether the loop should keep rescheduling itself — see AiHaloOverlay.tick."
|
|
5521
|
+
},
|
|
5522
|
+
{
|
|
5523
|
+
"kind": "method",
|
|
5524
|
+
"name": "activeChanged",
|
|
5525
|
+
"description": "Start/stop with `active`, so an idle overlay costs nothing.\n\nGuarded on `isConnected` because FAST invokes attribute-changed callbacks during\ninitialisation, before the element is in the document — `connectedCallback` is what decides\nfor an element that mounts already-active."
|
|
5526
|
+
},
|
|
5527
|
+
{
|
|
5528
|
+
"kind": "method",
|
|
5529
|
+
"name": "startAnimation",
|
|
5386
5530
|
"privacy": "private"
|
|
5387
5531
|
},
|
|
5388
5532
|
{
|
|
5389
5533
|
"kind": "method",
|
|
5390
|
-
"name": "
|
|
5534
|
+
"name": "scheduleStop",
|
|
5391
5535
|
"privacy": "private",
|
|
5392
|
-
"
|
|
5393
|
-
{
|
|
5394
|
-
"name": "now",
|
|
5395
|
-
"optional": true,
|
|
5396
|
-
"type": {
|
|
5397
|
-
"text": "number"
|
|
5398
|
-
}
|
|
5399
|
-
}
|
|
5400
|
-
]
|
|
5536
|
+
"description": "Keep spinning until the host has finished fading out.\n\nDeactivating only drops the host's opacity — the overlay is still on screen for the length of\nthe transition, so stopping the instant `active` flips would freeze the rotation mid-fade.\n\nTimed rather than driven by `transitionend`, which never fires if the host is hidden or an app\noverrides the transition away, and a stop that never arrives is exactly the idle-tick bug this\ngating exists to prevent.\n\nThe timer re-reads `active` rather than trusting that it was cancelled. FAST reflects the\nproperty to the attribute on a queued update, so `activeChanged` can run again, out of order,\nafter a rapid toggle — and a stale stop landing on a re-activated overlay would leave it\nfrozen for good, which is worse than the idle ticking this gate removes."
|
|
5401
5537
|
},
|
|
5402
5538
|
{
|
|
5403
5539
|
"kind": "method",
|
|
5404
|
-
"name": "
|
|
5540
|
+
"name": "cancelPendingStop",
|
|
5541
|
+
"privacy": "private"
|
|
5542
|
+
},
|
|
5543
|
+
{
|
|
5544
|
+
"kind": "method",
|
|
5545
|
+
"name": "stopAnimation",
|
|
5546
|
+
"privacy": "private"
|
|
5547
|
+
},
|
|
5548
|
+
{
|
|
5549
|
+
"kind": "method",
|
|
5550
|
+
"name": "tick",
|
|
5405
5551
|
"privacy": "private",
|
|
5406
|
-
"static": true,
|
|
5407
|
-
"return": {
|
|
5408
|
-
"type": {
|
|
5409
|
-
"text": "string"
|
|
5410
|
-
}
|
|
5411
|
-
},
|
|
5412
5552
|
"parameters": [
|
|
5413
5553
|
{
|
|
5414
|
-
"name": "
|
|
5415
|
-
"
|
|
5416
|
-
"text": "WaveConfig"
|
|
5417
|
-
}
|
|
5418
|
-
},
|
|
5419
|
-
{
|
|
5420
|
-
"name": "frame",
|
|
5554
|
+
"name": "now",
|
|
5555
|
+
"optional": true,
|
|
5421
5556
|
"type": {
|
|
5422
5557
|
"text": "number"
|
|
5423
5558
|
}
|
|
5424
5559
|
}
|
|
5425
|
-
]
|
|
5426
|
-
"description": "Trace one wave's polyline `d` attribute for the given frame."
|
|
5560
|
+
]
|
|
5427
5561
|
}
|
|
5428
5562
|
],
|
|
5429
5563
|
"attributes": [
|
|
5564
|
+
{
|
|
5565
|
+
"type": {
|
|
5566
|
+
"text": "boolean"
|
|
5567
|
+
},
|
|
5568
|
+
"default": "false",
|
|
5569
|
+
"fieldName": "active"
|
|
5570
|
+
},
|
|
5430
5571
|
{
|
|
5431
5572
|
"type": {
|
|
5432
5573
|
"text": "number"
|
|
5433
5574
|
},
|
|
5434
|
-
"default": "
|
|
5435
|
-
"description": "
|
|
5575
|
+
"default": "HALO_DEFAULT_SPEED",
|
|
5576
|
+
"description": "Rotation speed in degrees per frame. Default: 1.5 (≈ 4 s per full revolution at 60 fps).",
|
|
5436
5577
|
"resolveInitializer": {
|
|
5437
|
-
"module": "src/components/
|
|
5578
|
+
"module": "src/components/halo-overlay.ts"
|
|
5438
5579
|
},
|
|
5439
|
-
"fieldName": "
|
|
5440
|
-
}
|
|
5441
|
-
],
|
|
5442
|
-
"superclass": {
|
|
5443
|
-
"name": "GenesisElement",
|
|
5444
|
-
"package": "@genesislcap/web-core"
|
|
5445
|
-
},
|
|
5446
|
-
"tagName": "ai-waves-indicator",
|
|
5447
|
-
"customElement": true
|
|
5448
|
-
}
|
|
5449
|
-
],
|
|
5450
|
-
"exports": [
|
|
5451
|
-
{
|
|
5452
|
-
"kind": "js",
|
|
5453
|
-
"name": "AiWavesIndicator",
|
|
5454
|
-
"declaration": {
|
|
5455
|
-
"name": "AiWavesIndicator",
|
|
5456
|
-
"module": "src/components/waves-indicator.ts"
|
|
5457
|
-
}
|
|
5458
|
-
},
|
|
5459
|
-
{
|
|
5460
|
-
"kind": "custom-element-definition",
|
|
5461
|
-
"name": "ai-waves-indicator",
|
|
5462
|
-
"declaration": {
|
|
5463
|
-
"name": "AiWavesIndicator",
|
|
5464
|
-
"module": "src/components/waves-indicator.ts"
|
|
5465
|
-
}
|
|
5466
|
-
}
|
|
5467
|
-
]
|
|
5468
|
-
},
|
|
5469
|
-
{
|
|
5470
|
-
"kind": "javascript-module",
|
|
5471
|
-
"path": "src/config/config.ts",
|
|
5472
|
-
"declarations": [
|
|
5473
|
-
{
|
|
5474
|
-
"kind": "function",
|
|
5475
|
-
"name": "defineAgent",
|
|
5476
|
-
"description": "Identity helper that infers the narrowest possible type for an agent config,\npreserving string literal types (including `name`) without requiring `as const`.\n\nUse this when you need `typeof myAgent` to carry the literal `name` type —\nfor example, when wiring `ChatToolHandlers<typeof myAgent>`.\n\n```ts\nconst myAgent = defineAgent({ name: 'my_agent', ... });\ntype Handlers = ChatToolHandlers<typeof myAgent>;\n// requestSubAgent name param is now typed as 'my_agent'\n```"
|
|
5477
|
-
}
|
|
5478
|
-
],
|
|
5479
|
-
"exports": [
|
|
5480
|
-
{
|
|
5481
|
-
"kind": "js",
|
|
5482
|
-
"name": "CachePolicy",
|
|
5483
|
-
"declaration": {
|
|
5484
|
-
"name": "CachePolicy",
|
|
5485
|
-
"module": "src/config/config.ts"
|
|
5486
|
-
}
|
|
5487
|
-
},
|
|
5488
|
-
{
|
|
5489
|
-
"kind": "js",
|
|
5490
|
-
"name": "ChatFallback",
|
|
5491
|
-
"declaration": {
|
|
5492
|
-
"name": "ChatFallback",
|
|
5493
|
-
"module": "src/config/config.ts"
|
|
5494
|
-
}
|
|
5495
|
-
},
|
|
5496
|
-
{
|
|
5497
|
-
"kind": "js",
|
|
5498
|
-
"name": "ChatInputDuringExecutionMode",
|
|
5499
|
-
"declaration": {
|
|
5500
|
-
"name": "ChatInputDuringExecutionMode",
|
|
5501
|
-
"module": "src/config/config.ts"
|
|
5502
|
-
}
|
|
5503
|
-
},
|
|
5504
|
-
{
|
|
5505
|
-
"kind": "js",
|
|
5506
|
-
"name": "ChatThinkingPolicy",
|
|
5507
|
-
"declaration": {
|
|
5508
|
-
"name": "ChatThinkingPolicy",
|
|
5509
|
-
"module": "src/config/config.ts"
|
|
5510
|
-
}
|
|
5511
|
-
},
|
|
5512
|
-
{
|
|
5513
|
-
"kind": "js",
|
|
5514
|
-
"name": "ChatToolChoice",
|
|
5515
|
-
"declaration": {
|
|
5516
|
-
"name": "ChatToolChoice",
|
|
5517
|
-
"module": "src/config/config.ts"
|
|
5518
|
-
}
|
|
5519
|
-
},
|
|
5520
|
-
{
|
|
5521
|
-
"kind": "js",
|
|
5522
|
-
"name": "defineAgent",
|
|
5523
|
-
"declaration": {
|
|
5524
|
-
"name": "defineAgent",
|
|
5525
|
-
"module": "src/config/config.ts"
|
|
5526
|
-
}
|
|
5527
|
-
}
|
|
5528
|
-
]
|
|
5529
|
-
},
|
|
5530
|
-
{
|
|
5531
|
-
"kind": "javascript-module",
|
|
5532
|
-
"path": "src/config/define-stateful-agent.ts",
|
|
5533
|
-
"declarations": [
|
|
5534
|
-
{
|
|
5535
|
-
"kind": "function",
|
|
5536
|
-
"name": "restoreMachine",
|
|
5537
|
-
"return": {
|
|
5538
|
-
"type": {
|
|
5539
|
-
"text": "void"
|
|
5540
|
-
}
|
|
5541
|
-
},
|
|
5542
|
-
"parameters": [
|
|
5580
|
+
"fieldName": "speed"
|
|
5581
|
+
},
|
|
5543
5582
|
{
|
|
5544
|
-
"name": "
|
|
5583
|
+
"name": "direction",
|
|
5545
5584
|
"type": {
|
|
5546
|
-
"text": "
|
|
5585
|
+
"text": "'cw' | 'ccw'"
|
|
5547
5586
|
},
|
|
5548
|
-
"
|
|
5587
|
+
"default": "'cw'",
|
|
5588
|
+
"description": "Rotation direction. Default: 'cw' (clockwise).",
|
|
5589
|
+
"fieldName": "direction"
|
|
5549
5590
|
},
|
|
5550
5591
|
{
|
|
5551
|
-
"name": "
|
|
5592
|
+
"name": "border-size",
|
|
5552
5593
|
"type": {
|
|
5553
|
-
"text": "
|
|
5594
|
+
"text": "number"
|
|
5554
5595
|
},
|
|
5555
|
-
"
|
|
5596
|
+
"default": "HALO_DEFAULT_BORDER_SIZE",
|
|
5597
|
+
"description": "Border thickness in px. Default: 3.",
|
|
5598
|
+
"resolveInitializer": {
|
|
5599
|
+
"module": "src/components/halo-overlay.ts"
|
|
5600
|
+
},
|
|
5601
|
+
"fieldName": "borderSize"
|
|
5556
5602
|
},
|
|
5557
5603
|
{
|
|
5558
|
-
"name": "
|
|
5559
|
-
"default": "'machine'",
|
|
5560
|
-
"description": "the property the machine occupies in the snapshot; defaults to\n`'machine'` to match the conventional `{ machine }` state bag."
|
|
5561
|
-
}
|
|
5562
|
-
],
|
|
5563
|
-
"description": "Restore a foundation-state-machine instance from a snapshot produced by the\ndefault serializer (or `machine.getPersistedSnapshot()`). Call inside a\nstateful agent's `init` to resume the machine in its exact prior place:\n\n```ts\ninit: ({ restored }) => {\n const machine = new MyMachine();\n restoreMachine(machine, restored); // resume, or no-op on a fresh start\n return { machine };\n}\n```\n\nNo-ops when there is nothing to restore (a fresh session), leaving the\nfreshly-constructed machine in its initial state."
|
|
5564
|
-
},
|
|
5565
|
-
{
|
|
5566
|
-
"kind": "function",
|
|
5567
|
-
"name": "defineStatefulAgent",
|
|
5568
|
-
"return": {
|
|
5569
|
-
"type": {
|
|
5570
|
-
"text": "AgentConfig"
|
|
5571
|
-
}
|
|
5572
|
-
},
|
|
5573
|
-
"parameters": [
|
|
5574
|
-
{
|
|
5575
|
-
"name": "opts",
|
|
5604
|
+
"name": "glow-opacity",
|
|
5576
5605
|
"type": {
|
|
5577
|
-
"text": "
|
|
5578
|
-
}
|
|
5579
|
-
|
|
5580
|
-
|
|
5581
|
-
|
|
5582
|
-
|
|
5583
|
-
|
|
5584
|
-
|
|
5585
|
-
|
|
5586
|
-
"return": {
|
|
5587
|
-
"type": {
|
|
5588
|
-
"text": "AutopilotConfig<S>"
|
|
5589
|
-
}
|
|
5590
|
-
},
|
|
5591
|
-
"parameters": [
|
|
5606
|
+
"text": "number"
|
|
5607
|
+
},
|
|
5608
|
+
"default": "HALO_DEFAULT_GLOW_OPACITY",
|
|
5609
|
+
"description": "Glow layer opacity (0–1). Default: 0.35.",
|
|
5610
|
+
"resolveInitializer": {
|
|
5611
|
+
"module": "src/components/halo-overlay.ts"
|
|
5612
|
+
},
|
|
5613
|
+
"fieldName": "glowOpacity"
|
|
5614
|
+
},
|
|
5592
5615
|
{
|
|
5593
|
-
"name": "
|
|
5616
|
+
"name": "glow-spread",
|
|
5594
5617
|
"type": {
|
|
5595
|
-
"text": "
|
|
5596
|
-
}
|
|
5618
|
+
"text": "number"
|
|
5619
|
+
},
|
|
5620
|
+
"default": "HALO_DEFAULT_GLOW_SPREAD",
|
|
5621
|
+
"description": "Transparent stop of the radial glow mask as a percentage (0–100). Higher = less spread. Default: 70.",
|
|
5622
|
+
"resolveInitializer": {
|
|
5623
|
+
"module": "src/components/halo-overlay.ts"
|
|
5624
|
+
},
|
|
5625
|
+
"fieldName": "glowSpread"
|
|
5597
5626
|
}
|
|
5598
5627
|
],
|
|
5599
|
-
"
|
|
5628
|
+
"superclass": {
|
|
5629
|
+
"name": "GenesisElement",
|
|
5630
|
+
"package": "@genesislcap/web-core"
|
|
5631
|
+
},
|
|
5632
|
+
"tagName": "ai-halo-overlay",
|
|
5633
|
+
"customElement": true
|
|
5600
5634
|
}
|
|
5601
5635
|
],
|
|
5602
5636
|
"exports": [
|
|
5603
5637
|
{
|
|
5604
5638
|
"kind": "js",
|
|
5605
|
-
"name": "
|
|
5606
|
-
"declaration": {
|
|
5607
|
-
"name": "restoreMachine",
|
|
5608
|
-
"module": "src/config/define-stateful-agent.ts"
|
|
5609
|
-
}
|
|
5610
|
-
},
|
|
5611
|
-
{
|
|
5612
|
-
"kind": "js",
|
|
5613
|
-
"name": "defineStatefulAgent",
|
|
5639
|
+
"name": "AiHaloOverlay",
|
|
5614
5640
|
"declaration": {
|
|
5615
|
-
"name": "
|
|
5616
|
-
"module": "src/
|
|
5641
|
+
"name": "AiHaloOverlay",
|
|
5642
|
+
"module": "src/components/halo-overlay.ts"
|
|
5617
5643
|
}
|
|
5618
5644
|
},
|
|
5619
5645
|
{
|
|
5620
|
-
"kind": "
|
|
5621
|
-
"name": "
|
|
5646
|
+
"kind": "custom-element-definition",
|
|
5647
|
+
"name": "ai-halo-overlay",
|
|
5622
5648
|
"declaration": {
|
|
5623
|
-
"name": "
|
|
5624
|
-
"module": "src/
|
|
5649
|
+
"name": "AiHaloOverlay",
|
|
5650
|
+
"module": "src/components/halo-overlay.ts"
|
|
5625
5651
|
}
|
|
5626
5652
|
}
|
|
5627
5653
|
]
|
|
5628
5654
|
},
|
|
5629
5655
|
{
|
|
5630
5656
|
"kind": "javascript-module",
|
|
5631
|
-
"path": "src/
|
|
5657
|
+
"path": "src/components/plasma-orb-indicator.ts",
|
|
5632
5658
|
"declarations": [
|
|
5633
5659
|
{
|
|
5634
|
-
"kind": "
|
|
5635
|
-
"
|
|
5636
|
-
"
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
|
|
5640
|
-
"description": "A warm, conversational fallback agent. Acknowledges it can't help directly,\nexplains what the available specialists can do, and invites the user to retry.\n\nThe system prompt is generated at runtime by `OrchestratingDriver` from the\nspecialist list — no manual authoring required."
|
|
5641
|
-
},
|
|
5642
|
-
{
|
|
5643
|
-
"kind": "variable",
|
|
5644
|
-
"name": "strictFallbackAgent",
|
|
5645
|
-
"type": {
|
|
5646
|
-
"text": "FallbackAgentConfig"
|
|
5660
|
+
"kind": "class",
|
|
5661
|
+
"description": "Animated \"plasma orb\" loading indicator — a fixed glowing energy sphere whose\nluminous filaments and swirls drift and rotate inside it, like a plasma ball.\nThe globe never resizes; only the energy moves.\n\nBrand-coloured: a violet energy core, a slow cyan/pink tint wash, and a warm\namber hot-spot — covering all four brand colours.\n\nVisual sibling of the dots loading indicator; interchangeable with the other\nloading styles for the \"assistant is working\" state.",
|
|
5662
|
+
"name": "AiPlasmaOrbIndicator",
|
|
5663
|
+
"superclass": {
|
|
5664
|
+
"name": "GenesisElement",
|
|
5665
|
+
"package": "@genesislcap/web-core"
|
|
5647
5666
|
},
|
|
5648
|
-
"
|
|
5649
|
-
"
|
|
5667
|
+
"tagName": "ai-plasma-orb-indicator",
|
|
5668
|
+
"customElement": true
|
|
5650
5669
|
}
|
|
5651
5670
|
],
|
|
5652
5671
|
"exports": [
|
|
5653
5672
|
{
|
|
5654
5673
|
"kind": "js",
|
|
5655
|
-
"name": "
|
|
5674
|
+
"name": "AiPlasmaOrbIndicator",
|
|
5656
5675
|
"declaration": {
|
|
5657
|
-
"name": "
|
|
5658
|
-
"module": "src/
|
|
5676
|
+
"name": "AiPlasmaOrbIndicator",
|
|
5677
|
+
"module": "src/components/plasma-orb-indicator.ts"
|
|
5659
5678
|
}
|
|
5660
5679
|
},
|
|
5661
5680
|
{
|
|
5662
|
-
"kind": "
|
|
5663
|
-
"name": "
|
|
5681
|
+
"kind": "custom-element-definition",
|
|
5682
|
+
"name": "ai-plasma-orb-indicator",
|
|
5664
5683
|
"declaration": {
|
|
5665
|
-
"name": "
|
|
5666
|
-
"module": "src/
|
|
5684
|
+
"name": "AiPlasmaOrbIndicator",
|
|
5685
|
+
"module": "src/components/plasma-orb-indicator.ts"
|
|
5667
5686
|
}
|
|
5668
5687
|
}
|
|
5669
5688
|
]
|
|
5670
5689
|
},
|
|
5671
5690
|
{
|
|
5672
5691
|
"kind": "javascript-module",
|
|
5673
|
-
"path": "src/
|
|
5674
|
-
"declarations": [
|
|
5692
|
+
"path": "src/components/waves-indicator.ts",
|
|
5693
|
+
"declarations": [
|
|
5694
|
+
{
|
|
5695
|
+
"kind": "class",
|
|
5696
|
+
"description": "Animated \"waves inside a circle\" loading indicator — coloured sine waves that\nslosh like glowing liquid inside a circular window, ringed by a rotating\ngradient halo (the same effect as `<ai-halo-overlay>`).\n\nVisual sibling of the dots loading indicator; the two are interchangeable\nstyles of the same \"assistant is working\" state.",
|
|
5697
|
+
"name": "AiWavesIndicator",
|
|
5698
|
+
"members": [
|
|
5699
|
+
{
|
|
5700
|
+
"kind": "field",
|
|
5701
|
+
"name": "size",
|
|
5702
|
+
"type": {
|
|
5703
|
+
"text": "number"
|
|
5704
|
+
},
|
|
5705
|
+
"default": "56",
|
|
5706
|
+
"description": "Diameter of the circular window in px. Default: 56."
|
|
5707
|
+
},
|
|
5708
|
+
{
|
|
5709
|
+
"kind": "method",
|
|
5710
|
+
"name": "sizeChanged"
|
|
5711
|
+
},
|
|
5712
|
+
{
|
|
5713
|
+
"kind": "field",
|
|
5714
|
+
"name": "startTime",
|
|
5715
|
+
"type": {
|
|
5716
|
+
"text": "number | undefined"
|
|
5717
|
+
},
|
|
5718
|
+
"privacy": "private"
|
|
5719
|
+
},
|
|
5720
|
+
{
|
|
5721
|
+
"kind": "field",
|
|
5722
|
+
"name": "animFrame",
|
|
5723
|
+
"type": {
|
|
5724
|
+
"text": "number | undefined"
|
|
5725
|
+
},
|
|
5726
|
+
"privacy": "private"
|
|
5727
|
+
},
|
|
5728
|
+
{
|
|
5729
|
+
"kind": "field",
|
|
5730
|
+
"name": "wavePaths",
|
|
5731
|
+
"type": {
|
|
5732
|
+
"text": "SVGPathElement[] | undefined"
|
|
5733
|
+
},
|
|
5734
|
+
"privacy": "private"
|
|
5735
|
+
},
|
|
5736
|
+
{
|
|
5737
|
+
"kind": "method",
|
|
5738
|
+
"name": "tick",
|
|
5739
|
+
"privacy": "private",
|
|
5740
|
+
"parameters": [
|
|
5741
|
+
{
|
|
5742
|
+
"name": "now",
|
|
5743
|
+
"optional": true,
|
|
5744
|
+
"type": {
|
|
5745
|
+
"text": "number"
|
|
5746
|
+
}
|
|
5747
|
+
}
|
|
5748
|
+
]
|
|
5749
|
+
},
|
|
5750
|
+
{
|
|
5751
|
+
"kind": "method",
|
|
5752
|
+
"name": "buildWavePath",
|
|
5753
|
+
"privacy": "private",
|
|
5754
|
+
"static": true,
|
|
5755
|
+
"return": {
|
|
5756
|
+
"type": {
|
|
5757
|
+
"text": "string"
|
|
5758
|
+
}
|
|
5759
|
+
},
|
|
5760
|
+
"parameters": [
|
|
5761
|
+
{
|
|
5762
|
+
"name": "cfg",
|
|
5763
|
+
"type": {
|
|
5764
|
+
"text": "WaveConfig"
|
|
5765
|
+
}
|
|
5766
|
+
},
|
|
5767
|
+
{
|
|
5768
|
+
"name": "frame",
|
|
5769
|
+
"type": {
|
|
5770
|
+
"text": "number"
|
|
5771
|
+
}
|
|
5772
|
+
}
|
|
5773
|
+
],
|
|
5774
|
+
"description": "Trace one wave's polyline `d` attribute for the given frame."
|
|
5775
|
+
}
|
|
5776
|
+
],
|
|
5777
|
+
"attributes": [
|
|
5778
|
+
{
|
|
5779
|
+
"type": {
|
|
5780
|
+
"text": "number"
|
|
5781
|
+
},
|
|
5782
|
+
"default": "WAVES_DEFAULT_SIZE",
|
|
5783
|
+
"description": "Diameter of the circular window in px. Default: 56.",
|
|
5784
|
+
"resolveInitializer": {
|
|
5785
|
+
"module": "src/components/waves-indicator.ts"
|
|
5786
|
+
},
|
|
5787
|
+
"fieldName": "size"
|
|
5788
|
+
}
|
|
5789
|
+
],
|
|
5790
|
+
"superclass": {
|
|
5791
|
+
"name": "GenesisElement",
|
|
5792
|
+
"package": "@genesislcap/web-core"
|
|
5793
|
+
},
|
|
5794
|
+
"tagName": "ai-waves-indicator",
|
|
5795
|
+
"customElement": true
|
|
5796
|
+
}
|
|
5797
|
+
],
|
|
5675
5798
|
"exports": [
|
|
5676
5799
|
{
|
|
5677
5800
|
"kind": "js",
|
|
5678
|
-
"name": "
|
|
5801
|
+
"name": "AiWavesIndicator",
|
|
5679
5802
|
"declaration": {
|
|
5680
|
-
"name": "
|
|
5681
|
-
"
|
|
5803
|
+
"name": "AiWavesIndicator",
|
|
5804
|
+
"module": "src/components/waves-indicator.ts"
|
|
5682
5805
|
}
|
|
5683
5806
|
},
|
|
5684
5807
|
{
|
|
5685
|
-
"kind": "
|
|
5686
|
-
"name": "
|
|
5808
|
+
"kind": "custom-element-definition",
|
|
5809
|
+
"name": "ai-waves-indicator",
|
|
5687
5810
|
"declaration": {
|
|
5688
|
-
"name": "
|
|
5689
|
-
"
|
|
5811
|
+
"name": "AiWavesIndicator",
|
|
5812
|
+
"module": "src/components/waves-indicator.ts"
|
|
5690
5813
|
}
|
|
5691
5814
|
}
|
|
5692
5815
|
]
|
|
5693
5816
|
},
|
|
5694
|
-
{
|
|
5695
|
-
"kind": "javascript-module",
|
|
5696
|
-
"path": "src/config/validate-providers.ts",
|
|
5697
|
-
"declarations": [],
|
|
5698
|
-
"exports": []
|
|
5699
|
-
},
|
|
5700
5817
|
{
|
|
5701
5818
|
"kind": "javascript-module",
|
|
5702
5819
|
"path": "src/genesis/calendar.ts",
|
|
@@ -7217,6 +7334,15 @@
|
|
|
7217
7334
|
},
|
|
7218
7335
|
"description": "Controls the pop-out button shown next to the settings cog.\n\"expand\" — in bubble, expands to layout panel (fires chat-popout).\n\"collapse\" — in layout panel, collapses back to bubble (fires chat-popin).\nAbsent — no button (default standalone behaviour, no breaking change)."
|
|
7219
7336
|
},
|
|
7337
|
+
{
|
|
7338
|
+
"kind": "field",
|
|
7339
|
+
"name": "closable",
|
|
7340
|
+
"type": {
|
|
7341
|
+
"text": "boolean"
|
|
7342
|
+
},
|
|
7343
|
+
"default": "false",
|
|
7344
|
+
"description": "Shows a Close button in the header, which fires `close-requested` and leaves the closing to\nwhatever holds the assistant. The chat bubble sets it while the assistant is in its dialog."
|
|
7345
|
+
},
|
|
7220
7346
|
{
|
|
7221
7347
|
"kind": "field",
|
|
7222
7348
|
"name": "agents",
|
|
@@ -10773,6 +10899,16 @@
|
|
|
10773
10899
|
],
|
|
10774
10900
|
"description": "Report a turn that ended with the assistant waiting for the person to type (GENC-1660), for the\nAlways level: `turn-ended` on the activity bus, like every other notification report.\n\nOnly for a turn that ran to its end, failed ones included: not one the person stopped\n(`cancelling`), since they are there. Not while an interaction waits on them, which reports\nitself, so the person is never told twice about one moment. And not while an autopilot runs for\nthe flow: it answers, hands back or reports its own stop. Sub-agents' turns never get here; they\nrun inside one of the parent's."
|
|
10775
10901
|
},
|
|
10902
|
+
{
|
|
10903
|
+
"kind": "method",
|
|
10904
|
+
"name": "handleClose",
|
|
10905
|
+
"return": {
|
|
10906
|
+
"type": {
|
|
10907
|
+
"text": "void"
|
|
10908
|
+
}
|
|
10909
|
+
},
|
|
10910
|
+
"description": "Called when the user clicks the header's Close button."
|
|
10911
|
+
},
|
|
10776
10912
|
{
|
|
10777
10913
|
"kind": "method",
|
|
10778
10914
|
"name": "onChatHeaderMouseDown",
|
|
@@ -10914,6 +11050,10 @@
|
|
|
10914
11050
|
"description": "Fired when the user presses the chat header in `popout-mode=\"expand\"` (for drag-to-popout hosts). Bubbles and composed. detail: `ChatHeaderMouseDownDetail`",
|
|
10915
11051
|
"name": "chat-header-mousedown"
|
|
10916
11052
|
},
|
|
11053
|
+
{
|
|
11054
|
+
"description": "Fired when the user presses the header's Close button, which shows while `closable` is set (the chat bubble sets it while the assistant is in its dialog). Bubbles and composed.",
|
|
11055
|
+
"name": "close-requested"
|
|
11056
|
+
},
|
|
10917
11057
|
{
|
|
10918
11058
|
"description": "Fired after the session is wiped (the lifecycle menu's Clear). The payload is captured before teardown so the host can clean up any external state the active agent was working on. Bubbles and composed. detail: `SessionClearedDetail`",
|
|
10919
11059
|
"name": "session-cleared"
|
|
@@ -10978,6 +11118,14 @@
|
|
|
10978
11118
|
"description": "Controls the pop-out button shown next to the settings cog.\n\"expand\" — in bubble, expands to layout panel (fires chat-popout).\n\"collapse\" — in layout panel, collapses back to bubble (fires chat-popin).\nAbsent — no button (default standalone behaviour, no breaking change).",
|
|
10979
11119
|
"fieldName": "popoutMode"
|
|
10980
11120
|
},
|
|
11121
|
+
{
|
|
11122
|
+
"type": {
|
|
11123
|
+
"text": "boolean"
|
|
11124
|
+
},
|
|
11125
|
+
"default": "false",
|
|
11126
|
+
"description": "Shows a Close button in the header, which fires `close-requested` and leaves the closing to\nwhatever holds the assistant. The chat bubble sets it while the assistant is in its dialog.",
|
|
11127
|
+
"fieldName": "closable"
|
|
11128
|
+
},
|
|
10981
11129
|
{
|
|
10982
11130
|
"name": "debug-redux",
|
|
10983
11131
|
"type": {
|
|
@@ -11063,9 +11211,9 @@
|
|
|
11063
11211
|
"kind": "variable",
|
|
11064
11212
|
"name": "AiAssistantEvent",
|
|
11065
11213
|
"type": {
|
|
11066
|
-
"text": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n}"
|
|
11214
|
+
"text": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n /** The header's Close button pressed, shown while `closable` is set. No `detail`. */\n CloseRequested: 'close-requested',\n}"
|
|
11067
11215
|
},
|
|
11068
|
-
"default": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n}",
|
|
11216
|
+
"default": "{\n /** Session wiped via the lifecycle menu's Clear. `detail`: `SessionClearedDetail`. */\n SessionCleared: 'session-cleared',\n /** Header pressed in `popout-mode=\"expand\"` (drag-to-popout hosts). `detail`: `ChatHeaderMouseDownDetail`. */\n ChatHeaderMouseDown: 'chat-header-mousedown',\n /** An agent's hand-off started (GENC-1737). `detail`: `HandOffFrame`. */\n HandOffStarted: 'handoff-started',\n /** A hand-off ended and its caller is active again. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffReturned: 'handoff-returned',\n /** A hand-off ended with no hand-back. `detail`: `HandOffFrame`, with `outcome`. */\n HandOffUnwound: 'handoff-unwound',\n /** The header's Close button pressed, shown while `closable` is set. No `detail`. */\n CloseRequested: 'close-requested',\n}",
|
|
11069
11217
|
"description": "DOM events the `<foundation-ai-assistant>` element dispatches to its host.\nAll bubble and are `composed` (they cross the shadow boundary), so a host can\nlisten on the element — or any ancestor — to react. Use these constants to\nwire listeners instead of hand-typing event-name strings.\n\nAn `as const` map (not a TS `enum` — this package ships none), so it serves as\nboth the listener-name value and, via the same-named type below, a union."
|
|
11070
11218
|
},
|
|
11071
11219
|
{
|
|
@@ -11638,7 +11786,7 @@
|
|
|
11638
11786
|
"type": {
|
|
11639
11787
|
"text": "Record<MetaEventType, MetaEventImportance>"
|
|
11640
11788
|
},
|
|
11641
|
-
"default": "{\n 'turn.error': 'high',\n 'tool.failed': 'high',\n 'subagent.failed': 'high',\n 'file.read-failed': 'high',\n 'suggestions.failed': 'high',\n 'context.threshold-crossed': 'high',\n 'context.compacted': 'high',\n 'persistence.restore-orphan': 'high',\n // A save that did not land is silent data loss in progress: the transcript on screen\n // is no longer backed by the store, and every later turn widens the gap. GENC-1511.\n 'persistence.save-failed': 'high',\n\n 'assistant.connected': 'normal',\n 'assistant.disconnected': 'normal',\n 'assistant.popout': 'normal',\n 'assistant.popin': 'normal',\n 'driver.created': 'normal',\n 'state.changed': 'normal',\n 'turn.start': 'normal',\n 'turn.end': 'normal',\n 'turn.retry': 'normal',\n 'tool.unresolved': 'normal',\n 'subagent.started': 'normal',\n 'subagent.completed': 'normal',\n // One per routing decision, with what the classifier answered and what the call cost. Same\n // level as the handoff it produces: you read them together to follow how a turn was routed.\n 'routing.decided': 'normal',\n 'agent.handoff': 'normal',\n 'agent.pinned': 'normal',\n 'agent.unpinned': 'normal',\n 'provider.selected': 'normal',\n 'interaction.requested': 'normal',\n 'interaction.resolved': 'normal',\n // Bookkeeping about an already-finished turn; interesting when reconciling a session total.\n 'interaction.external-cost': 'normal',\n // Spend that was billed but could NOT be recorded (the message was trimmed/condensed away, or\n // the value was not real spend). 'high': it is the one way the session total goes quietly\n // wrong, so it must stand out when reconciling.\n 'interaction.external-cost-dropped': 'high',\n // What came of an answer, recorded by the tool that asked (see recordInteractionOutcome).\n 'interaction.outcome': 'normal',\n // An outcome that could not be recorded: the widget goes on showing only the answer.\n 'interaction.outcome-dropped': 'high',\n // A long action's step starting, finishing, or skipped on resume because it was already done.\n 'interaction.step': 'low',\n // A cut checkpoint taken over after a reload, refused (by sameWork, and kept for a later request;\n // or as malformed), or dropped at flow end, as is the live one.\n 'interaction.checkpoint': 'normal',\n // A claimant handing a pending interaction to the person, or taking it back.\n 'interaction.held': 'normal',\n // A claim on a `userOnly` interaction, refused. Expected when an interceptor claims broadly.\n 'interaction.claim-refused': 'low',\n // A claimant ran one of the surface's actions: what it did, and whether that settled it.\n 'interaction.invoked': 'normal',\n 'autopilot.claimed': 'normal',\n // One per interaction the autopilot does not take, so frequent and mostly expected.\n 'autopilot.declined': 'low',\n 'autopilot.decision-sent': 'low',\n 'autopilot.acted': 'normal',\n 'autopilot.handed-back': 'normal',\n 'autopilot.paused': 'normal',\n 'autopilot.resumed': 'normal',\n // The wrapper itself failed: the journey stops being automatic without anyone choosing that.\n 'autopilot.error': 'high',\n // A written answer counted against the step's limit; reaching it withdraws `reply`.\n 'autopilot.refinement': 'normal',\n // The autopilot showed its own widget because a working turn ended needing the person.\n 'autopilot.handback-presented': 'normal',\n // The autopilot was given the whole visible transcript: its first decision, a rebuild, or after\n // a compaction removed the last message it saw.\n 'autopilot.catch-up': 'normal',\n // Autopilot spend that reached no message, so it is missing from the session total.\n 'autopilot.cost-dropped': 'high',\n 'external-diagnostics.folded': 'normal',\n 'session.cleared': 'normal',\n 'session.switched': 'low',\n 'session.switch-deferred': 'low',\n 'persistence.restored': 'normal',\n // Whether a restored flow will be re-activated and resumed (GENC-1662), and how much the trim cut.\n 'persistence.resume-planned': 'normal',\n // A planned resume that did not run, and why (GENC-1662) — the divider was put back to plain.\n 'persistence.resume-withdrawn': 'normal',\n 'persistence.suppressed': 'normal',\n 'persistence.not-resumable': 'normal',\n\n 'driver.wired': 'low',\n 'driver.unwired': 'low',\n 'context.updated': 'low',\n 'context.condensed': 'low',\n 'panel.toggled': 'low',\n 'persistence.toggled': 'low',\n 'persistence.saved': 'low',\n 'attachment.added': 'low',\n}",
|
|
11789
|
+
"default": "{\n 'turn.error': 'high',\n 'tool.failed': 'high',\n 'subagent.failed': 'high',\n 'file.read-failed': 'high',\n 'suggestions.failed': 'high',\n 'context.threshold-crossed': 'high',\n 'context.compacted': 'high',\n 'persistence.restore-orphan': 'high',\n // A save that did not land is silent data loss in progress: the transcript on screen\n // is no longer backed by the store, and every later turn widens the gap. GENC-1511.\n 'persistence.save-failed': 'high',\n\n 'assistant.connected': 'normal',\n 'assistant.disconnected': 'normal',\n 'assistant.popout': 'normal',\n 'assistant.popin': 'normal',\n 'driver.created': 'normal',\n 'state.changed': 'normal',\n 'turn.start': 'normal',\n 'turn.end': 'normal',\n 'turn.retry': 'normal',\n 'tool.unresolved': 'normal',\n 'subagent.started': 'normal',\n 'subagent.completed': 'normal',\n // One per routing decision, with what the classifier answered and what the call cost. Same\n // level as the handoff it produces: you read them together to follow how a turn was routed.\n 'routing.decided': 'normal',\n 'agent.handoff': 'normal',\n 'agent.pinned': 'normal',\n 'agent.unpinned': 'normal',\n 'provider.selected': 'normal',\n 'interaction.requested': 'normal',\n 'interaction.resolved': 'normal',\n // Bookkeeping about an already-finished turn; interesting when reconciling a session total.\n 'interaction.external-cost': 'normal',\n // Spend that was billed but could NOT be recorded (the message was trimmed/condensed away, or\n // the value was not real spend). 'high': it is the one way the session total goes quietly\n // wrong, so it must stand out when reconciling.\n 'interaction.external-cost-dropped': 'high',\n // What came of an answer, recorded by the tool that asked (see recordInteractionOutcome).\n 'interaction.outcome': 'normal',\n // An outcome that could not be recorded: the widget goes on showing only the answer.\n 'interaction.outcome-dropped': 'high',\n // A long action's step starting, finishing, or skipped on resume because it was already done.\n 'interaction.step': 'low',\n // A cut checkpoint taken over after a reload, refused (by sameWork, and kept for a later request;\n // or as malformed), or dropped at flow end, as is the live one.\n 'interaction.checkpoint': 'normal',\n // A claimant handing a pending interaction to the person, or taking it back.\n 'interaction.held': 'normal',\n // A claim on a `userOnly` interaction, refused. Expected when an interceptor claims broadly.\n 'interaction.claim-refused': 'low',\n // A claimant ran one of the surface's actions: what it did, and whether that settled it.\n 'interaction.invoked': 'normal',\n 'autopilot.claimed': 'normal',\n // One per interaction the autopilot does not take, so frequent and mostly expected.\n 'autopilot.declined': 'low',\n 'autopilot.decision-sent': 'low',\n 'autopilot.acted': 'normal',\n 'autopilot.handed-back': 'normal',\n 'autopilot.paused': 'normal',\n 'autopilot.resumed': 'normal',\n // The mode went with the task across a hand-off or its hand-back, rather than ending with the flow.\n 'autopilot.carried': 'normal',\n // The wrapper itself failed: the journey stops being automatic without anyone choosing that.\n 'autopilot.error': 'high',\n // A written answer counted against the step's limit; reaching it withdraws `reply`.\n 'autopilot.refinement': 'normal',\n // The autopilot showed its own widget because a working turn ended needing the person.\n 'autopilot.handback-presented': 'normal',\n // The autopilot was given the whole visible transcript: its first decision, a rebuild, or after\n // a compaction removed the last message it saw.\n 'autopilot.catch-up': 'normal',\n // Autopilot spend that reached no message, so it is missing from the session total.\n 'autopilot.cost-dropped': 'high',\n 'external-diagnostics.folded': 'normal',\n 'session.cleared': 'normal',\n 'session.switched': 'low',\n 'session.switch-deferred': 'low',\n 'persistence.restored': 'normal',\n // Whether a restored flow will be re-activated and resumed (GENC-1662), and how much the trim cut.\n 'persistence.resume-planned': 'normal',\n // A planned resume that did not run, and why (GENC-1662) — the divider was put back to plain.\n 'persistence.resume-withdrawn': 'normal',\n 'persistence.suppressed': 'normal',\n 'persistence.not-resumable': 'normal',\n\n 'driver.wired': 'low',\n 'driver.unwired': 'low',\n 'context.updated': 'low',\n 'context.condensed': 'low',\n 'panel.toggled': 'low',\n 'persistence.toggled': 'low',\n 'persistence.saved': 'low',\n 'attachment.added': 'low',\n}",
|
|
11642
11790
|
"description": "Importance is intrinsic to the event *type*, not the instance, so it's\ndefined once here and stamped automatically by recordMetaEvent — call\nsites never pass it. The `Record` is exhaustive: adding a `MetaEventType`\nwithout a level here is a compile error.\n\n- `high` — failures and hard limits you almost always want to see.\n- `normal` — meaningful session flow you read to follow what happened.\n- `low` — frequent UI / bookkeeping noise, usually safe to skip."
|
|
11643
11791
|
},
|
|
11644
11792
|
{
|
|
@@ -11800,7 +11948,7 @@
|
|
|
11800
11948
|
"type": {
|
|
11801
11949
|
"text": "readonly string[]"
|
|
11802
11950
|
},
|
|
11803
|
-
"default": "[\n 'This is an exported debug log for the Genesis AI assistant. Read it top-to-bottom.',\n \"`sessionUsage` is what this session spent: `costUsd` (USD, provider-reported per request and summed, cache discounts already applied) plus the four TOKEN BUCKETS — `uncachedInputTokens`, `cacheReadTokens`, `cacheWriteTokens`, `outputTokens`. Those four are disjoint and safe to add up for a total-tokens figure; the per-message fields further down are NOT (see kind:'message'). Each bucket bills at a different rate — cache reads a fraction of uncached input, cache writes a premium, output highest — so a big token count against a small cost means the prompt was mostly cache hits, not a missing charge. It covers sub-agent turns and spend a compaction banked, so for the CONVERSATION it is the authoritative total: prefer it over re-summing the timeline, which can be short by whatever the ring buffers evicted. The same figures appear under `meta.context`. It is as current as the snapshot it came from: the assistant's own download stamps a fresh one, but a log stitched by another tool can carry an older one — compare `meta.timestamp` with the last timeline entry, and if it is well behind, read these totals as historical and fall back to summing the timeline. One scope caveat: it is derived from the transcript, so it excludes billed calls that produced no message (a blank or refused attempt that was retried — see kind:'turn'.`usage`). Summing the turns can therefore come out HIGHER than this, and the difference is exactly that discarded spend, not a double-count.\",\n \"What 'session' means for those figures: the CURRENT conversation under this session key (a host-supplied per-project id, or the element id + header title when the host supplies none) — which is not necessarily everything in `timeline`. It is re-derived from the live transcript, so it spans page loads only when the chat is being remembered, and a Clear resets it to zero. `timeline` is append-only regardless: it keeps every page load and the pre-Clear conversation, with the session.cleared event as the boundary. So on a long-lived log, read these totals as the latest conversation's and the earlier sections as history — not as a total of the whole file.\",\n '`timeline` is the entire session as one array, already sorted chronologically by `timestamp` (ISO 8601). Every entry has a `kind`.',\n 'Timestamps are millisecond-resolution; entries that share the same millisecond are ordered by a fixed kind rank (event, then turn, then message), which is a heuristic and may not reflect exact causal order within that millisecond — e.g. a user message and the turn it triggered, or a final assistant message and its turn.end event, can appear in either order depending on whether they landed in the same millisecond. Read the logical structure of a turn rather than over-interpreting the micro-ordering of co-timestamped entries of different kinds.',\n \"kind:'message' — the conversation. `role` is user/assistant/tool/system-event/synthetic-user; `agentName` says which agent produced it; `toolCalls`/`toolResult`/`interaction` carry tool and widget activity; `inputTokens`/`outputTokens`/`cost` are per-message LLM usage, where `inputTokens` is the WHOLE prompt for that request and `cacheReadTokens`/`cacheWriteTokens` BREAK IT DOWN rather than add to it — uncached input is `inputTokens` minus those two, and adding the cache fields to `inputTokens` counts the prompt twice. The cache fields are absent on providers that report no cache split (Gemini reports reads only, since implicit caching bills no write) and on messages persisted before they existed, so read them as 0 when missing. Each bucket bills at a different rate — cache reads a fraction of uncached input, cache writes a premium, output highest — so a large token count at a small cost means the prompt was mostly cache hits. `externalCostUsd` is any non-LLM cost a widget reported for its own external service calls (folded into the session cost total alongside `cost`). On model-produced assistant messages, `model` is the concrete model id that generated it (e.g. 'gemini-2.5-flash-lite') and `providerName` is the registry slot it resolved under (e.g. a tier name like 'high'/'low', or the default); together they attribute the message — and any tool calls it carries — to an exact model even across a mid-session vendor/tier switch, where one slot name can map to different models before and after the switch. Both are undefined on any entry that is NOT an LLM response: non-assistant roles (user/tool/system-event) and 'synthetic-user' echoes; assistant interaction/widget entries (empty content carrying an `interaction` — a rendered widget, not a model turn); driver-authored assistant fallbacks (the timeout, repeated-malformed-call, and empty-response apology messages); and messages restored from a session persisted before these fields existed. One partial case: on a genuine model turn whose provider exposes no `getStatus` (or reports no model), `providerName` is still set but `model` alone is undefined. A 'synthetic-user' message is a display-only echo of an interaction outcome (e.g. the answer a widget reported): it renders on the user's side of the chat and `agentName` is the agent that created it, but it is never sent to the LLM — so it has no matching 'turn' and the model learns the outcome only from the corresponding tool result. An echo of an answer an interceptor (such as an autopilot) gave is NOT synthetic-user: see the delegated-messages paragraph.\",\n 'The autopilot (GENC-1660) runs on a driver of its own, and everything it did is harvested into this log: entries with delegate: autopilot and an agentName ending in › Autopilot are its turns (the decision message it was sent is the user message of its turn, so what it was shown is there verbatim; its systemPrompt is its grounding, such as the brief), its tool calls (widget_read, widget_act, hand_back, any read-only tools of its own, and its widget tools — reads with parameters that a widget type declares, routed to the interaction of that type being decided and refused with a reason when none is, offered on every decision so its tool list never changes; while one is open its tail starts with a line naming them) and their results (a read, view or widget tool, is capped at about 20,000 characters, cut with a note asking for less, and leaves its history at the end of the decision as a one-line note), and its own events. Its cost is already in the session total: it is booked as externalCostUsd on the interaction each decision answered, or, for a written question it answered, on the user message it sent on the user behalf (delegate: autopilot), so do not add its turns to that total. Spend that reached no message is recorded as autopilot.cost-dropped instead.',\n \"Delegated messages (GENC-1660): a message with a `delegate` field was written or sent ON THE USER'S BEHALF by a driver decorator, and `delegate` names it (e.g. autopilot). The platform stamps it; nothing else can. It renders as the assistant whatever its role. A delegated `user` message was NOT typed by the user: it is an answer given on their behalf, and the model read it with `delegateFraming` in brackets in front of the content (the stored `content` is the bare text). A delegated `assistant` message is display-only (`excludeFromProvider`): the decorator's narration note, or, when its answer carried no note, the widget's own echo of the answer (its `userMessage`), shown as the assistant and never as the person. A widget answer a decorator gave with a note is not echoed at all: the note already says what was chosen. To tell what the person decided from what was decided for them, read `interaction.answeredBy` and these fields, never the role alone.\",\n \"Sub-agent messages appear inline. When a tool delegates to a sub-agent (via `requestSubAgent`), the sub-agent's whole conversation — its own assistant/tool messages, each with their own `content`/`thinking`/`toolCalls`/`toolResult` and per-message `model`/`providerName`/`inputTokens`/`outputTokens`/`cacheReadTokens`/`cacheWriteTokens`/`cost` — is hoisted into the timeline as ordinary kind:'message' entries, interleaved by timestamp right after the tool call that spawned them (so you read the delegation top-to-bottom). A hoisted entry is marked: `subAgentDepth` is its delegation depth (1 for a sub-agent, 2 for a sub-agent's sub-agent, …), `subAgentOf` is the id of the parent tool call that spawned it (correlates it back even when two sub-agents run in one parent turn), `subAgentName` is the sub-agent's own name, and `agentName` is rewritten to a `\\\"<parent> › <sub-agent>\\\"` breadcrumb (composing when nested, e.g. `\\\"UI Builder › Planner › Grounding\\\"`). The sub-agent's per-LLM-call snapshots also surface as kind:'turn' entries with an N-M `turnIndex`, and subagent.started/completed (or subagent.failed) events bracket the run. Per-message `cost` on hoisted entries is already part of the session total (it is summed from the un-flattened history), so summing the top-level timeline does NOT double-count.\",\n \"kind:'turn' — one LLM call. `turnIndex` is a string: a top-level turn is the bare counter ('0', '1', …); a sub-agent's turns are numbered under the parent turn that activated them ('3-1', '3-2', …, and a nested sub-agent contributes '3-2-1', …), and `agentName` names the agent that ran the turn. `systemPrompt` and `toolNames` are what the model saw. A systemPrompt of '<repeated — identical to turn N>' was byte-identical to turn N and de-duplicated; the full prompt is shown whenever it changes (often because a stateful agent advanced), so prompt evolution is visible.\",\n \"kind:'turn'.`model`/`providerName`/`provider` — which model ran that call: the concrete model id, the registry slot it resolved under (a tier name like 'high'/'low', or the default), and the vendor. Recorded per CALL, so an agent whose `provider` selector varies by state — a flow that plans on a high tier and executes on a low one — has every step attributed, including calls that produced no message. `model` is the SERVING model where the provider reports one, so a turn answered by a server-side fallback names the model that answered rather than the one requested; it always matches the `model` on the message that call produced. Absent when the provider exposes no `getStatus` and the transport stamped nothing.\",\n \"kind:'turn'.`usage` — what that ONE call cost, in the same four-bucket + `costUsd` shape as `sessionUsage`. Absent while a call is in flight and on providers that report no usage. This is the SAME money as the message the call produced, not extra money: never add turn usage to message usage, and read a turn plus its message as one charge. Its distinct value is the calls that produced NO message — a blank or refused response is billed and then discarded before the retry, so the turn entry is the only record of that spend, and a turn with `usage` but no message after it is exactly that. `costUsd: 0` alongside a nonzero token count means the provider reported no price, not that the call was free.\",\n \"kind:'turn'.`agentSnapshot` — the active agent's own view of its internal state, captured at that turn. An agent opts into this by exposing a `getDebugSnapshot()` that returns JSON-serializable per-state info; stateful/flow agents wire it automatically, so you can watch a flow advance turn-by-turn (e.g. current step, cursor, collected fields, pending changes). Absent for agents that don't expose one.\",\n \"kind:'event' — a meta/lifecycle event. `type` names it (see below); `detail` carries structured data. `detail.placement` is the emitting UI instance: 'bubble' (collapsed), 'panel' (popped-out), or 'standalone'.\",\n \"Each 'event' also has an `importance`: 'high' (failures/limits — turn.error, tool.failed, subagent.failed, file.read-failed, suggestions.failed, context.threshold-crossed), 'normal' (session flow — connects, turns, retries, handoffs, agent/provider changes, interactions, sub-agent start/complete), or 'low' (skippable UI/bookkeeping noise — panel.toggled, attachment.added, driver.wired/unwired, context.updated, context.condensed). To skim, ignore importance:'low'; to triage a failure, filter to importance:'high' then read the nearby messages and turns. A 'high' turn.error is often preceded by one or more 'normal' turn.retry events for the same reason — read them together to see how many attempts were made before bailing. 'message' and 'turn' entries carry no importance — they are the substance, always read them.\",\n 'Event types: assistant.connected/disconnected (mount + placement + whether the session was created or restored), assistant.popout/popin (window placement), driver.created/wired/unwired (which driver is live and why it stops/starts responding across a popout), state.changed (idle↔loading), turn.start/turn.end (turn boundary; turn.end carries durationMs), turn.retry (a recoverable in-turn retry — detail.reason plus attempt/maxAttempts; for malformed calls also finishMessage; for empty responses also the provider finishReason + thoughtsTokens + parts breakdown), turn.error (a turn failed or hit a guardrail — detail.reason is one of exception/malformed-function-call/empty-response/unknown-tool-limit/max-iterations/response-truncated/refusal/budget-exhausted/provider-refused/context-exhausted/ai-service-error, plus reason-specific diagnostics: attempts (for empty-response also finishReason + thoughtsTokens + a parts breakdown, distinguishing a thinking-only STOP from a truly empty turn), finishMessage, for response-truncated the model + maxTokens + outputTokens + tools, unknownTools (split into staleTools — real earlier this activation but retired by the current state or hidden behind an open exclusive fold — and hallucinatedTools — never advertised) + availableTools, iterations + limit, for budget-exhausted the budgetUsd + spentUsd figures reported by the proxy plus the resolved vendor, for provider-refused the kind (spend|auth) plus the upstream status and error type — the vendor refusing the ACCOUNT rather than us refusing to spend, so the remedy is a top-up or a key rotation rather than a raised cap, and the kind is the only place that distinction survives because the user-facing copy is deliberately cause-free, for context-exhausted the estimated contextTokens against the guard that stopped the turn plus the iterations reached — the driver ending a runaway tool loop at the edge of the context window rather than issuing a request the provider would reject, so the transcript survives intact and can still be compacted, for ai-service-error the code (one of AI_SERVICE_ERROR_CODES, e.g. NO_API_KEY) and the status the AI service answered with — its own text goes to the browser console only, or name + message for exceptions), tool.failed (a tool threw), tool.unresolved (the model called a tool that could not be dispatched — detail.kind is folded/fold-hidden/stale/unknown, plus tool + agent and, for the counted kinds, the consecutive streak; the recurring lead-up to an unknown-tool-limit turn.error), subagent.started/completed/failed (the lifecycle of a `requestSubAgent` delegation — detail.agent names the sub-agent; these bracket the sub-agent turns that appear as kind:turn entries with an N-M `turnIndex`; subagent.failed also carries detail.reason, one of max_iterations/malformed_tool_call/empty_response/unknown_tool_limit/timeout/response_truncated/refusal/budget_exhausted/provider_refused/context_exhausted/ai_service_error; budget_exhausted and provider_refused are terminal for the PARENT turn too, and so is ai_service_error when the refusal is about the service rather than the request and came from the vendor the parent calls — the parent stops rather than calling the model again into the same wall; after context_exhausted the parent goes on, but its own next call is likely to stop on the same guard), agent.handoff (routing; from=null is the initial activation), agent.pinned/unpinned (forced routing), routing.decided (ONE PER ROUTING DECISION — see its own paragraph below), provider.selected (the resolved provider for the upcoming turns — detail.provider is the registry SLOT/tier name, detail.model the concrete model behind it and detail.vendor its vendor; emitted only when the slot CHANGES, so read the per-turn `model` for the model of any given call rather than assuming the nearest event still applies), interaction.requested/resolved (blocking user widgets — explain quiet gaps; note that when a sub-agent opens a widget, detail.agent — and the agentName on the interaction message — is the HOST agent that owns the widget, NOT the sub-agent that asked, because widgets render and resolve on the host driver; detail.ownerPath names the agents that actually asked, outermost first, the last being the one whose tool requested it, and detail.heldBy says who held it when it opened: user, or the id of the interceptor that claimed it, such as autopilot; on interaction.resolved, detail.answeredBy is who answered — the claimant id when it settled through its own hold, user for any other answer (a click counts as the person even on a widget a claimant held) — absent when it closed unanswered (a timeout or a stop), and absent too when it settled by itself other than through the hold of a claimant — a widget registered resolvesItself (one that does its work and settles on its own, asking the person nothing, such as a generation run), or one outcome its controller said settled itself (ctx.resolve with resolvedItself, such as a generation phase that failed outright before its review gate ever asked anything) — which then carries detail.resolvedItself: true instead, as the interaction message does — nobody answered it, and the platform cannot tell it finishing from the person interrupting it (a Skip), so only the result of the widget itself can say which; the same value is stamped on the interaction message as answeredBy and on the result the asking tool handler receives (absent there in the same cases), and when it is not user the tool result that interaction returned carries a decidedOnUsersBehalf record, so the model was told the choice was not made by the person; detail.edits, present only when non-zero, counts the editing actions a claimant ran on the widget before it was settled, whoever settled it, and those edits are stamped on the interaction message as edits, each with by, action, choice and args when it had some, in the order they ran, while a decidedOnUsersBehalf record carries their choice texts as edits, and when the person settled it after such edits the tool result carries an editedOnUsersBehalf record instead — the framing and those choice texts — so the model knows the widget was changed on the user behalf before the user answered, and that the user then confirmed it by finishing it), interaction.held (a claimant moved a pending interaction to the person or back to itself — detail.heldBy is the new holder, detail.claimant the interceptor; detail.late: true is an interceptor that declined it when it opened claiming it afterwards, such as the autopilot resumed while it was open; a widget held by anything but user was not answered by the person), interaction.claim-refused (a claim on a userOnly interaction, which stays with the person — detail.claimant + reason), autopilot.* (the autopilot, a decorator that answers interactions on behalf of the user — autopilot.claimed / autopilot.declined say whether it took each interaction and, for a decline, detail.reason: paused, other-flow, no-autopilot, unavailable, userOnly, policy or no-controller; one declined as paused that is still open when the person resumes the autopilot is looked at again, and the autopilot.claimed or autopilot.declined recorded for it then carries detail.onResume: true (a decline then can also be claimed-elsewhere, another interceptor having claimed it first); a restored mode looks at nothing; autopilot.decision-sent is what it was sent (detail.chars; detail.nothingEnabled: true when every action on the widget was unavailable — a gate whose controller said it was asking, such as a failed build the autopilot may not cancel — so it could only hand it back, which it may then do even after the person asked it to decide it itself; a widget whose controller says it is working (ctx.setWorking) is never sent a decision until it says it is asking, even when an action is enabled or the person resumes the autopilot); autopilot.acted is what it did (detail.action, detail.note, detail.finished); autopilot.handed-back is a decision it gave to the person (detail.reason and detail.trigger: model, no-decision or error); autopilot.paused / autopilot.resumed are mode changes (detail.scope, detail.trigger, detail.decideYourself when the person resumed during a hand-back; detail.trigger is restored when the mode came back with the session after a reload, applied once its flow re-activated, which starts nothing by itself); autopilot.error is the wrapper itself failing; autopilot.refinement counts a refining action against its step — a written answer (reply) or a widget action declared refines, such as a regenerate with instructions, counted together (detail.action, detail.stepKey, detail.count, detail.limitReached, after which every refining action is withdrawn for that step: not listed, and refused; the decision and every relisting of its actions say how many are left at the step, as a line Refinements left at this step: N, wherever the widget has a refining action); autopilot.handback-presented is the turn-level hand-back, shown when a working turn ended needing the person with no widget to hand over (detail.why: max-iterations, context-exhausted, failure or question; detail.options; detail.choice once answered); autopilot.catch-up is the autopilot being given the whole visible transcript at once (detail.why: first, for its first decision in a flow or after a reload; size, when its own history passed its budget and was rebuilt short — detail.ownChars; or compacted, when a compaction removed the last message it had seen, so it reads the summary and everything since, short; in each, what it had sent on the user behalf is included and labelled as its own, since its own history does not hold it); autopilot.cost-dropped is autopilot spend that no message carries, so it is NOT in the session total (detail.costUsd and detail.why: handed-back, aborted or stale for a written question it answered that no reply was sent for — stale when a pause, a resume, a new turn or the end of its flow came before the answer landed, which then went nowhere — or no-recorder when the driver had no way to book a decision to its interaction); a hand-back trigger can also be budget (the decision passed its spend cap), watchdog (its work went quiet: no ready surface and no heartbeat, or its own decision stalled with no model call landing, which stops that decision) or detached (the autopilot was removed while it held the interaction, which went to the person with no reason shown). To debug one autopilot decision, follow its interactionId: interaction.requested (heldBy), autopilot.claimed, autopilot.decision-sent, autopilot.acted or autopilot.handed-back, interaction.invoked, interaction.resolved (answeredBy), then the next turn of the working agent), interaction.invoked (a claimant ran one of the actions the widget itself exposes, through its hold, the same code the button runs — detail.claimant, detail.action (an option id, select or reply) and detail.finished, whether that settled the interaction, and when it did not, the run is recorded as an edit; the choice and narration it recorded reach the result of the tool that asked as decidedOnUsersBehalf), interaction.step (a long action run as named steps through runSteps, which survive a reload — detail.step and detail.outcome: started, done, skipped when the step was already done before a reload, or resumed when it started before a reload and runs again with what it saved part-way, such as a job id it re-attaches to), interaction.checkpoint (the checkpoints a conversation keeps for its long actions: the one in flight, and each one a reload cut, held apart until a request of its own widget type takes it over, so a resumed flow that opens other long widgets first, which save their own, loses nothing — detail.action: resumed when a reload cut the work and a request of the same widget type that the registration sameWork agrees is the same work took it over, refused when sameWork said a new request is different work (detail.saved is the identity it kept; detail.kept: true, since it stays for a later request of that type, and is offered to every one until one agrees) or when runSteps found the handed-over checkpoint malformed and started fresh (detail.reason, detail.saved), or cleared when its flow ended, once per checkpoint, with detail.cut: true for one a reload cut that nothing took over), context.updated/threshold-crossed (token + cost), context.condensed (a stale tool payload was collapsed out of the model-bound history by a `condenseWhen` declaration on the tool — detail.tool + toolCallId, target args|response, trigger (superseded:<key> or age:<n>), stubLen, and an estimated tokensSaved; stored history and this log keep the FULL payload, so the model-visible slice at any point is the full history minus the condensations recorded up to then), panel.toggled, attachment.added, file.read-failed, suggestions.failed.',\n 'Sub-agent meta events: a sub-agent\\'s own turn.retry/turn.error/tool.failed/tool.unresolved events are merged into this same timeline, tagged with `detail.subAgent` — a `\"<parent> › <sub-agent>\"` breadcrumb that composes when nested (e.g. `\"UI Builder › Planner › Grounding\"`) — and interleaved by their original timestamps within the subagent.started→completed/failed bracket. These are the per-attempt/per-failure signals that do NOT appear among the sub-agent\\'s (hoisted) messages: a malformed/empty attempt that gets retried produces no message, and the stale-vs-hallucinated split and streak counts live only on the event. A sub-agent\\'s high-volume, message-derivable events (turn.start/turn.end, provider.selected, context.updated) are intentionally NOT merged — read its hoisted messages for model/tokens/cost and turn-by-turn activity, and the bracketing subagent.* events for the run\\'s span.',\n \"`meta` holds context captured at export time: agentSummary (full agent configs), context (active model, contextTokens/contextLimit/contextUsagePercent for the last call, and the session totals — sessionCostUsd, sessionTokensConsumed, and the four-bucket sessionUsage lifted to the top of this log), activeDebugSnapshot (the active agent's `getDebugSnapshot()` taken fresh at export — reflects state NOW, which may have advanced beyond the last turn's agentSnapshot), debug (optional host-supplied debug state), host, and the export timestamp.\",\n 'Note the two different scopes in `meta.context`: `contextTokens` is the prompt size of the LAST call (against `contextLimit`, the model context window), while `sessionUsage`/`sessionTokensConsumed` are cumulative BILLED throughput. Every turn resends the conversation, so the cumulative figure counts each turn’s prompt again in the next turn’s and is expected to dwarf the context size — that is not double-counting.',\n \"kind:'event' type 'routing.decided' — how ONE user turn was routed, emitted by the orchestrating driver before the agent runs. Only a user turn is routed: a hand-off names its target, so the agents a hand-off runs show up as agent.handoff events, not as more routing.decided. `decision` is why that agent was chosen: 'classified' (the classifier ran and picked one), 'no-match' (it ran and answered -1 — nothing listed covers the request), 'pinned' (a user pin, an agent named for that one message by the send's `agent` option, or an active stateful flow owned the turn, so no call was made), 'single-candidate'/'no-specialists' (configuration left nothing to decide), 'provider-unavailable' (the registry default exposes no chat()), 'classifier-failed' (every attempt threw — `error` carries the last one). `to` names the agent and `fallback` says whether that agent is the fallback. `candidates` is what was ON THE BALLOT — every classifier-eligible specialist — in ballot order, so `index` — the classifier's own answer — indexes it directly. `candidates` is absent on the three decisions that put nothing to a vote — 'pinned', 'single-candidate', 'no-specialists'. It IS present on 'provider-unavailable', which is not an exception worth removing: the ballot was built there, it simply never got sent. `attempts` covers the retry ladder. `durationMs` is on EVERY routing.decided, and is the field to read when a decision looks wrong: the decisions that can reach the fallback ('no-match', 'no-specialists', 'provider-unavailable', 'classifier-failed') are told apart by the clock as much as by their name, because a fallback routing that resolved in tens of milliseconds made no network call at all whatever its `decision` says.\",\n \"kind:'event' type 'routing.decided'.`usage` — what that classifier call cost, in the same four-bucket + costUsd shape as `sessionUsage`, plus `model`. Absent on the decisions that make no call (see 'pinned' and the configuration ones). THIS SPEND IS NOT IN `sessionUsage`: a classifier call never enters the transcript and `sessionUsage` is derived from the transcript, so classifier cost is missing from the session total by construction, not by accident. Sum these events to close that gap — it is the one component of a session's real spend that the totals cannot see.\",\n 'To debug a failure: find the last turn.error or tool.failed, then read upward for the user message, the turn(s), and the agent/provider/state events that led into it. For a turn that went to the wrong agent, read its routing.decided first — `decision` says whether anything was actually asked.',\n]",
|
|
11951
|
+
"default": "[\n 'This is an exported debug log for the Genesis AI assistant. Read it top-to-bottom.',\n \"`sessionUsage` is what this session spent: `costUsd` (USD, provider-reported per request and summed, cache discounts already applied) plus the four TOKEN BUCKETS — `uncachedInputTokens`, `cacheReadTokens`, `cacheWriteTokens`, `outputTokens`. Those four are disjoint and safe to add up for a total-tokens figure; the per-message fields further down are NOT (see kind:'message'). Each bucket bills at a different rate — cache reads a fraction of uncached input, cache writes a premium, output highest — so a big token count against a small cost means the prompt was mostly cache hits, not a missing charge. It covers sub-agent turns and spend a compaction banked, so for the CONVERSATION it is the authoritative total: prefer it over re-summing the timeline, which can be short by whatever the ring buffers evicted. The same figures appear under `meta.context`. It is as current as the snapshot it came from: the assistant's own download stamps a fresh one, but a log stitched by another tool can carry an older one — compare `meta.timestamp` with the last timeline entry, and if it is well behind, read these totals as historical and fall back to summing the timeline. One scope caveat: it is derived from the transcript, so it excludes billed calls that produced no message (a blank or refused attempt that was retried — see kind:'turn'.`usage`). Summing the turns can therefore come out HIGHER than this, and the difference is exactly that discarded spend, not a double-count.\",\n \"What 'session' means for those figures: the CURRENT conversation under this session key (a host-supplied per-project id, or the element id + header title when the host supplies none) — which is not necessarily everything in `timeline`. It is re-derived from the live transcript, so it spans page loads only when the chat is being remembered, and a Clear resets it to zero. `timeline` is append-only regardless: it keeps every page load and the pre-Clear conversation, with the session.cleared event as the boundary. So on a long-lived log, read these totals as the latest conversation's and the earlier sections as history — not as a total of the whole file.\",\n '`timeline` is the entire session as one array, already sorted chronologically by `timestamp` (ISO 8601). Every entry has a `kind`.',\n 'Timestamps are millisecond-resolution; entries that share the same millisecond are ordered by a fixed kind rank (event, then turn, then message), which is a heuristic and may not reflect exact causal order within that millisecond — e.g. a user message and the turn it triggered, or a final assistant message and its turn.end event, can appear in either order depending on whether they landed in the same millisecond. Read the logical structure of a turn rather than over-interpreting the micro-ordering of co-timestamped entries of different kinds.',\n \"kind:'message' — the conversation. `role` is user/assistant/tool/system-event/synthetic-user; `agentName` says which agent produced it; `toolCalls`/`toolResult`/`interaction` carry tool and widget activity; `inputTokens`/`outputTokens`/`cost` are per-message LLM usage, where `inputTokens` is the WHOLE prompt for that request and `cacheReadTokens`/`cacheWriteTokens` BREAK IT DOWN rather than add to it — uncached input is `inputTokens` minus those two, and adding the cache fields to `inputTokens` counts the prompt twice. The cache fields are absent on providers that report no cache split (Gemini reports reads only, since implicit caching bills no write) and on messages persisted before they existed, so read them as 0 when missing. Each bucket bills at a different rate — cache reads a fraction of uncached input, cache writes a premium, output highest — so a large token count at a small cost means the prompt was mostly cache hits. `externalCostUsd` is any non-LLM cost a widget reported for its own external service calls (folded into the session cost total alongside `cost`). On model-produced assistant messages, `model` is the concrete model id that generated it (e.g. 'gemini-2.5-flash-lite') and `providerName` is the registry slot it resolved under (e.g. a tier name like 'high'/'low', or the default); together they attribute the message — and any tool calls it carries — to an exact model even across a mid-session vendor/tier switch, where one slot name can map to different models before and after the switch. Both are undefined on any entry that is NOT an LLM response: non-assistant roles (user/tool/system-event) and 'synthetic-user' echoes; assistant interaction/widget entries (empty content carrying an `interaction` — a rendered widget, not a model turn); driver-authored assistant fallbacks (the timeout, repeated-malformed-call, and empty-response apology messages); and messages restored from a session persisted before these fields existed. One partial case: on a genuine model turn whose provider exposes no `getStatus` (or reports no model), `providerName` is still set but `model` alone is undefined. A 'synthetic-user' message is a display-only echo of an interaction outcome (e.g. the answer a widget reported): it renders on the user's side of the chat and `agentName` is the agent that created it, but it is never sent to the LLM — so it has no matching 'turn' and the model learns the outcome only from the corresponding tool result. An echo of an answer an interceptor (such as an autopilot) gave is NOT synthetic-user: see the delegated-messages paragraph.\",\n 'The autopilot (GENC-1660) runs on a driver of its own, and everything it did is harvested into this log: entries with delegate: autopilot and an agentName ending in › Autopilot are its turns (the decision message it was sent is the user message of its turn, so what it was shown is there verbatim; its systemPrompt is its grounding, such as the brief), its tool calls (widget_read, widget_act, hand_back, any read-only tools of its own, and its widget tools — reads with parameters that a widget type declares, routed to the interaction of that type being decided and refused with a reason when none is, offered on every decision so its tool list never changes; while one is open its tail starts with a line naming them) and their results (a read, view or widget tool, is capped at about 20,000 characters, cut with a note asking for less, and leaves its history at the end of the decision as a one-line note), and its own events. Its cost is already in the session total: it is booked as externalCostUsd on the interaction each decision answered, or, for a written question it answered, on the user message it sent on the user behalf (delegate: autopilot), so do not add its turns to that total. Spend that reached no message is recorded as autopilot.cost-dropped instead.',\n \"Delegated messages (GENC-1660): a message with a `delegate` field was written or sent ON THE USER'S BEHALF by a driver decorator, and `delegate` names it (e.g. autopilot). The platform stamps it; nothing else can. It renders as the assistant whatever its role. A delegated `user` message was NOT typed by the user: it is an answer given on their behalf, and the model read it with `delegateFraming` in brackets in front of the content (the stored `content` is the bare text). A delegated `assistant` message is display-only (`excludeFromProvider`): the decorator's narration note, or, when its answer carried no note, the widget's own echo of the answer (its `userMessage`), shown as the assistant and never as the person. A widget answer a decorator gave with a note is not echoed at all: the note already says what was chosen. To tell what the person decided from what was decided for them, read `interaction.answeredBy` and these fields, never the role alone.\",\n \"Sub-agent messages appear inline. When a tool delegates to a sub-agent (via `requestSubAgent`), the sub-agent's whole conversation — its own assistant/tool messages, each with their own `content`/`thinking`/`toolCalls`/`toolResult` and per-message `model`/`providerName`/`inputTokens`/`outputTokens`/`cacheReadTokens`/`cacheWriteTokens`/`cost` — is hoisted into the timeline as ordinary kind:'message' entries, interleaved by timestamp right after the tool call that spawned them (so you read the delegation top-to-bottom). A hoisted entry is marked: `subAgentDepth` is its delegation depth (1 for a sub-agent, 2 for a sub-agent's sub-agent, …), `subAgentOf` is the id of the parent tool call that spawned it (correlates it back even when two sub-agents run in one parent turn), `subAgentName` is the sub-agent's own name, and `agentName` is rewritten to a `\\\"<parent> › <sub-agent>\\\"` breadcrumb (composing when nested, e.g. `\\\"UI Builder › Planner › Grounding\\\"`). The sub-agent's per-LLM-call snapshots also surface as kind:'turn' entries with an N-M `turnIndex`, and subagent.started/completed (or subagent.failed) events bracket the run. Per-message `cost` on hoisted entries is already part of the session total (it is summed from the un-flattened history), so summing the top-level timeline does NOT double-count.\",\n \"kind:'turn' — one LLM call. `turnIndex` is a string: a top-level turn is the bare counter ('0', '1', …); a sub-agent's turns are numbered under the parent turn that activated them ('3-1', '3-2', …, and a nested sub-agent contributes '3-2-1', …), and `agentName` names the agent that ran the turn. `systemPrompt` and `toolNames` are what the model saw. A systemPrompt of '<repeated — identical to turn N>' was byte-identical to turn N and de-duplicated; the full prompt is shown whenever it changes (often because a stateful agent advanced), so prompt evolution is visible.\",\n \"kind:'turn'.`model`/`providerName`/`provider` — which model ran that call: the concrete model id, the registry slot it resolved under (a tier name like 'high'/'low', or the default), and the vendor. Recorded per CALL, so an agent whose `provider` selector varies by state — a flow that plans on a high tier and executes on a low one — has every step attributed, including calls that produced no message. `model` is the SERVING model where the provider reports one, so a turn answered by a server-side fallback names the model that answered rather than the one requested; it always matches the `model` on the message that call produced. Absent when the provider exposes no `getStatus` and the transport stamped nothing.\",\n \"kind:'turn'.`usage` — what that ONE call cost, in the same four-bucket + `costUsd` shape as `sessionUsage`. Absent while a call is in flight and on providers that report no usage. This is the SAME money as the message the call produced, not extra money: never add turn usage to message usage, and read a turn plus its message as one charge. Its distinct value is the calls that produced NO message — a blank or refused response is billed and then discarded before the retry, so the turn entry is the only record of that spend, and a turn with `usage` but no message after it is exactly that. `costUsd: 0` alongside a nonzero token count means the provider reported no price, not that the call was free.\",\n \"kind:'turn'.`agentSnapshot` — the active agent's own view of its internal state, captured at that turn. An agent opts into this by exposing a `getDebugSnapshot()` that returns JSON-serializable per-state info; stateful/flow agents wire it automatically, so you can watch a flow advance turn-by-turn (e.g. current step, cursor, collected fields, pending changes). Absent for agents that don't expose one.\",\n \"kind:'event' — a meta/lifecycle event. `type` names it (see below); `detail` carries structured data. `detail.placement` is the emitting UI instance: 'bubble' (collapsed), 'panel' (popped-out), or 'standalone'.\",\n \"Each 'event' also has an `importance`: 'high' (failures/limits — turn.error, tool.failed, subagent.failed, file.read-failed, suggestions.failed, context.threshold-crossed), 'normal' (session flow — connects, turns, retries, handoffs, agent/provider changes, interactions, sub-agent start/complete), or 'low' (skippable UI/bookkeeping noise — panel.toggled, attachment.added, driver.wired/unwired, context.updated, context.condensed). To skim, ignore importance:'low'; to triage a failure, filter to importance:'high' then read the nearby messages and turns. A 'high' turn.error is often preceded by one or more 'normal' turn.retry events for the same reason — read them together to see how many attempts were made before bailing. 'message' and 'turn' entries carry no importance — they are the substance, always read them.\",\n 'Event types: assistant.connected/disconnected (mount + placement + whether the session was created or restored), assistant.popout/popin (window placement), driver.created/wired/unwired (which driver is live and why it stops/starts responding across a popout), state.changed (idle↔loading), turn.start/turn.end (turn boundary; turn.end carries durationMs), turn.retry (a recoverable in-turn retry — detail.reason plus attempt/maxAttempts; for malformed calls also finishMessage; for empty responses also the provider finishReason + thoughtsTokens + parts breakdown), turn.error (a turn failed or hit a guardrail — detail.reason is one of exception/malformed-function-call/empty-response/unknown-tool-limit/max-iterations/response-truncated/refusal/budget-exhausted/provider-refused/context-exhausted/ai-service-error, plus reason-specific diagnostics: attempts (for empty-response also finishReason + thoughtsTokens + a parts breakdown, distinguishing a thinking-only STOP from a truly empty turn), finishMessage, for response-truncated the model + maxTokens + outputTokens + tools, unknownTools (split into staleTools — real earlier this activation but retired by the current state or hidden behind an open exclusive fold — and hallucinatedTools — never advertised) + availableTools, iterations + limit, for budget-exhausted the budgetUsd + spentUsd figures reported by the proxy plus the resolved vendor, for provider-refused the kind (spend|auth) plus the upstream status and error type — the vendor refusing the ACCOUNT rather than us refusing to spend, so the remedy is a top-up or a key rotation rather than a raised cap, and the kind is the only place that distinction survives because the user-facing copy is deliberately cause-free, for context-exhausted the estimated contextTokens against the guard that stopped the turn plus the iterations reached — the driver ending a runaway tool loop at the edge of the context window rather than issuing a request the provider would reject, so the transcript survives intact and can still be compacted, for ai-service-error the code (one of AI_SERVICE_ERROR_CODES, e.g. NO_API_KEY) and the status the AI service answered with — its own text goes to the browser console only, or name + message for exceptions), tool.failed (a tool threw), tool.unresolved (the model called a tool that could not be dispatched — detail.kind is folded/fold-hidden/stale/unknown, plus tool + agent and, for the counted kinds, the consecutive streak; the recurring lead-up to an unknown-tool-limit turn.error), subagent.started/completed/failed (the lifecycle of a `requestSubAgent` delegation — detail.agent names the sub-agent; these bracket the sub-agent turns that appear as kind:turn entries with an N-M `turnIndex`; subagent.failed also carries detail.reason, one of max_iterations/malformed_tool_call/empty_response/unknown_tool_limit/timeout/response_truncated/refusal/budget_exhausted/provider_refused/context_exhausted/ai_service_error; budget_exhausted and provider_refused are terminal for the PARENT turn too, and so is ai_service_error when the refusal is about the service rather than the request and came from the vendor the parent calls — the parent stops rather than calling the model again into the same wall; after context_exhausted the parent goes on, but its own next call is likely to stop on the same guard), agent.handoff (routing; from=null is the initial activation), agent.pinned/unpinned (forced routing), routing.decided (ONE PER ROUTING DECISION — see its own paragraph below), provider.selected (the resolved provider for the upcoming turns — detail.provider is the registry SLOT/tier name, detail.model the concrete model behind it and detail.vendor its vendor; emitted only when the slot CHANGES, so read the per-turn `model` for the model of any given call rather than assuming the nearest event still applies), interaction.requested/resolved (blocking user widgets — explain quiet gaps; note that when a sub-agent opens a widget, detail.agent — and the agentName on the interaction message — is the HOST agent that owns the widget, NOT the sub-agent that asked, because widgets render and resolve on the host driver; detail.ownerPath names the agents that actually asked, outermost first, the last being the one whose tool requested it, and detail.heldBy says who held it when it opened: user, or the id of the interceptor that claimed it, such as autopilot; on interaction.resolved, detail.answeredBy is who answered — the claimant id when it settled through its own hold, user for any other answer (a click counts as the person even on a widget a claimant held) — absent when it closed unanswered (a timeout or a stop), and absent too when it settled by itself other than through the hold of a claimant — a widget registered resolvesItself (one that does its work and settles on its own, asking the person nothing, such as a generation run), or one outcome its controller said settled itself (ctx.resolve with resolvedItself, such as a generation phase that failed outright before its review gate ever asked anything) — which then carries detail.resolvedItself: true instead, as the interaction message does — nobody answered it, and the platform cannot tell it finishing from the person interrupting it (a Skip), so only the result of the widget itself can say which; the same value is stamped on the interaction message as answeredBy and on the result the asking tool handler receives (absent there in the same cases), and when it is not user the tool result that interaction returned carries a decidedOnUsersBehalf record, so the model was told the choice was not made by the person; detail.edits, present only when non-zero, counts the editing actions a claimant ran on the widget before it was settled, whoever settled it, and those edits are stamped on the interaction message as edits, each with by, action, choice and args when it had some, in the order they ran, while a decidedOnUsersBehalf record carries their choice texts as edits, and when the person settled it after such edits the tool result carries an editedOnUsersBehalf record instead — the framing and those choice texts — so the model knows the widget was changed on the user behalf before the user answered, and that the user then confirmed it by finishing it), interaction.held (a claimant moved a pending interaction to the person or back to itself — detail.heldBy is the new holder, detail.claimant the interceptor; detail.late: true is an interceptor that declined it when it opened claiming it afterwards, such as the autopilot resumed while it was open; a widget held by anything but user was not answered by the person), interaction.claim-refused (a claim on a userOnly interaction, which stays with the person — detail.claimant + reason), autopilot.* (the autopilot, a decorator that answers interactions on behalf of the user — autopilot.claimed / autopilot.declined say whether it took each interaction and, for a decline, detail.reason: paused, other-flow, no-autopilot, unavailable, userOnly, policy or no-controller; one declined as paused that is still open when the person resumes the autopilot is looked at again, and the autopilot.claimed or autopilot.declined recorded for it then carries detail.onResume: true (a decline then can also be claimed-elsewhere, another interceptor having claimed it first); a restored mode looks at nothing; autopilot.decision-sent is what it was sent (detail.chars; detail.nothingEnabled: true when every action on the widget was unavailable — a gate whose controller said it was asking, such as a failed build the autopilot may not cancel — so it could only hand it back, which it may then do even after the person asked it to decide it itself; a widget whose controller says it is working (ctx.setWorking) is never sent a decision until it says it is asking, even when an action is enabled or the person resumes the autopilot); autopilot.acted is what it did (detail.action, detail.note, detail.finished); autopilot.handed-back is a decision it gave to the person (detail.reason and detail.trigger: model, no-decision or error); autopilot.paused / autopilot.resumed are mode changes (detail.scope, detail.trigger, detail.decideYourself when the person resumed during a hand-back; detail.trigger is restored when the mode came back with the session after a reload, applied once its flow re-activated, which starts nothing by itself); autopilot.carried is the mode, running or paused, going with the task to the agent that took it over, rather than ending with the flow as on any other change of flow owner: to the target of a hand-off, or back to its caller on the hand-back (detail.from, detail.to, detail.mode); a pause the person chose goes with it, and Stop and Clear still end it; a mode restored for the target of a hand-off applies to its caller when the reload hands back; autopilot.error is the wrapper itself failing; autopilot.refinement counts a refining action against its step — a written answer (reply) or a widget action declared refines, such as a regenerate with instructions, counted together (detail.action, detail.stepKey, detail.count, detail.limitReached, after which every refining action is withdrawn for that step: not listed, and refused; the decision and every relisting of its actions say how many are left at the step, as a line Refinements left at this step: N, wherever the widget has a refining action); autopilot.handback-presented is the turn-level hand-back, shown when a working turn ended needing the person with no widget to hand over (detail.why: max-iterations, context-exhausted, failure or question; detail.options; detail.choice once answered); autopilot.catch-up is the autopilot being given the whole visible transcript at once (detail.why: first, for its first decision in a flow or after a reload; size, when its own history passed its budget and was rebuilt short — detail.ownChars; or compacted, when a compaction removed the last message it had seen, so it reads the summary and everything since, short; in each, what it had sent on the user behalf is included and labelled as its own, since its own history does not hold it); autopilot.cost-dropped is autopilot spend that no message carries, so it is NOT in the session total (detail.costUsd and detail.why: handed-back, aborted or stale for a written question it answered that no reply was sent for — stale when a pause, a resume, a new turn or the end of its flow came before the answer landed, which then went nowhere — or no-recorder when the driver had no way to book a decision to its interaction); a hand-back trigger can also be budget (the decision passed its spend cap), watchdog (its work went quiet: no ready surface and no heartbeat, or its own decision stalled with no model call landing, which stops that decision) or detached (the autopilot was removed while it held the interaction, which went to the person with no reason shown). To debug one autopilot decision, follow its interactionId: interaction.requested (heldBy), autopilot.claimed, autopilot.decision-sent, autopilot.acted or autopilot.handed-back, interaction.invoked, interaction.resolved (answeredBy), then the next turn of the working agent), interaction.invoked (a claimant ran one of the actions the widget itself exposes, through its hold, the same code the button runs — detail.claimant, detail.action (an option id, select or reply) and detail.finished, whether that settled the interaction, and when it did not, the run is recorded as an edit; the choice and narration it recorded reach the result of the tool that asked as decidedOnUsersBehalf), interaction.step (a long action run as named steps through runSteps, which survive a reload — detail.step and detail.outcome: started, done, skipped when the step was already done before a reload, or resumed when it started before a reload and runs again with what it saved part-way, such as a job id it re-attaches to), interaction.checkpoint (the checkpoints a conversation keeps for its long actions: the one in flight, and each one a reload cut, held apart until a request of its own widget type takes it over, so a resumed flow that opens other long widgets first, which save their own, loses nothing — detail.action: resumed when a reload cut the work and a request of the same widget type that the registration sameWork agrees is the same work took it over, refused when sameWork said a new request is different work (detail.saved is the identity it kept; detail.kept: true, since it stays for a later request of that type, and is offered to every one until one agrees) or when runSteps found the handed-over checkpoint malformed and started fresh (detail.reason, detail.saved), or cleared when its flow ended, once per checkpoint, with detail.cut: true for one a reload cut that nothing took over), context.updated/threshold-crossed (token + cost), context.condensed (a stale tool payload was collapsed out of the model-bound history by a `condenseWhen` declaration on the tool — detail.tool + toolCallId, target args|response, trigger (superseded:<key> or age:<n>), stubLen, and an estimated tokensSaved; stored history and this log keep the FULL payload, so the model-visible slice at any point is the full history minus the condensations recorded up to then), panel.toggled, attachment.added, file.read-failed, suggestions.failed.',\n 'Sub-agent meta events: a sub-agent\\'s own turn.retry/turn.error/tool.failed/tool.unresolved events are merged into this same timeline, tagged with `detail.subAgent` — a `\"<parent> › <sub-agent>\"` breadcrumb that composes when nested (e.g. `\"UI Builder › Planner › Grounding\"`) — and interleaved by their original timestamps within the subagent.started→completed/failed bracket. These are the per-attempt/per-failure signals that do NOT appear among the sub-agent\\'s (hoisted) messages: a malformed/empty attempt that gets retried produces no message, and the stale-vs-hallucinated split and streak counts live only on the event. A sub-agent\\'s high-volume, message-derivable events (turn.start/turn.end, provider.selected, context.updated) are intentionally NOT merged — read its hoisted messages for model/tokens/cost and turn-by-turn activity, and the bracketing subagent.* events for the run\\'s span.',\n \"`meta` holds context captured at export time: agentSummary (full agent configs), context (active model, contextTokens/contextLimit/contextUsagePercent for the last call, and the session totals — sessionCostUsd, sessionTokensConsumed, and the four-bucket sessionUsage lifted to the top of this log), activeDebugSnapshot (the active agent's `getDebugSnapshot()` taken fresh at export — reflects state NOW, which may have advanced beyond the last turn's agentSnapshot), debug (optional host-supplied debug state), host, and the export timestamp.\",\n 'Note the two different scopes in `meta.context`: `contextTokens` is the prompt size of the LAST call (against `contextLimit`, the model context window), while `sessionUsage`/`sessionTokensConsumed` are cumulative BILLED throughput. Every turn resends the conversation, so the cumulative figure counts each turn’s prompt again in the next turn’s and is expected to dwarf the context size — that is not double-counting.',\n \"kind:'event' type 'routing.decided' — how ONE user turn was routed, emitted by the orchestrating driver before the agent runs. Only a user turn is routed: a hand-off names its target, so the agents a hand-off runs show up as agent.handoff events, not as more routing.decided. `decision` is why that agent was chosen: 'classified' (the classifier ran and picked one), 'no-match' (it ran and answered -1 — nothing listed covers the request), 'pinned' (a user pin, an agent named for that one message by the send's `agent` option, or an active stateful flow owned the turn, so no call was made), 'single-candidate'/'no-specialists' (configuration left nothing to decide), 'provider-unavailable' (the registry default exposes no chat()), 'classifier-failed' (every attempt threw — `error` carries the last one). `to` names the agent and `fallback` says whether that agent is the fallback. `candidates` is what was ON THE BALLOT — every classifier-eligible specialist — in ballot order, so `index` — the classifier's own answer — indexes it directly. `candidates` is absent on the three decisions that put nothing to a vote — 'pinned', 'single-candidate', 'no-specialists'. It IS present on 'provider-unavailable', which is not an exception worth removing: the ballot was built there, it simply never got sent. `attempts` covers the retry ladder. `durationMs` is on EVERY routing.decided, and is the field to read when a decision looks wrong: the decisions that can reach the fallback ('no-match', 'no-specialists', 'provider-unavailable', 'classifier-failed') are told apart by the clock as much as by their name, because a fallback routing that resolved in tens of milliseconds made no network call at all whatever its `decision` says.\",\n \"kind:'event' type 'routing.decided'.`usage` — what that classifier call cost, in the same four-bucket + costUsd shape as `sessionUsage`, plus `model`. Absent on the decisions that make no call (see 'pinned' and the configuration ones). THIS SPEND IS NOT IN `sessionUsage`: a classifier call never enters the transcript and `sessionUsage` is derived from the transcript, so classifier cost is missing from the session total by construction, not by accident. Sum these events to close that gap — it is the one component of a session's real spend that the totals cannot see.\",\n 'To debug a failure: find the last turn.error or tool.failed, then read upward for the user message, the turn(s), and the agent/provider/state events that led into it. For a turn that went to the wrong agent, read its routing.decided first — `decision` says whether anything was actually asked.',\n]",
|
|
11804
11952
|
"description": "Human/agent-facing guide emitted as the first key of the exported debug log,\nso whoever opens the JSON (often an AI agent) knows how to read it without\nreverse-engineering the shape. Kept here next to the event catalogue it\ndescribes — but proximity alone demonstrably did NOT keep the two in sync\n(`refusal` was missing from both reason lists for a whole release), so\n`debug-event-log.test.ts` now asserts that every `TurnFailureReason` and every\n`SubAgentFailureReason` is named here, and fails the build when one is added\nwithout a matching sentence. Enumerations below read as exhaustive and WILL be\ntrusted by an agent reading the JSON — keep them so."
|
|
11805
11953
|
}
|
|
11806
11954
|
],
|
|
@@ -17566,11 +17714,12 @@
|
|
|
17566
17714
|
},
|
|
17567
17715
|
{
|
|
17568
17716
|
"kind": "field",
|
|
17569
|
-
"name": "
|
|
17717
|
+
"name": "closableAssistant",
|
|
17570
17718
|
"type": {
|
|
17571
17719
|
"text": "Element | undefined"
|
|
17572
17720
|
},
|
|
17573
|
-
"privacy": "private"
|
|
17721
|
+
"privacy": "private",
|
|
17722
|
+
"description": "The assistant whose header Close button this bubble turned on, and listens to."
|
|
17574
17723
|
},
|
|
17575
17724
|
{
|
|
17576
17725
|
"kind": "field",
|
|
@@ -17786,7 +17935,7 @@
|
|
|
17786
17935
|
},
|
|
17787
17936
|
{
|
|
17788
17937
|
"kind": "method",
|
|
17789
|
-
"name": "
|
|
17938
|
+
"name": "showCloseButton",
|
|
17790
17939
|
"privacy": "private",
|
|
17791
17940
|
"parameters": [
|
|
17792
17941
|
{
|
|
@@ -17795,7 +17944,8 @@
|
|
|
17795
17944
|
"text": "Element"
|
|
17796
17945
|
}
|
|
17797
17946
|
}
|
|
17798
|
-
]
|
|
17947
|
+
],
|
|
17948
|
+
"description": "The Close button is the assistant's own, rendered in its header beside the cog. It used to be\na design-system button injected into the assistant's light DOM, where the assistant's styles\ncould reach its host but not the padded control inside it, so it sat narrower than the cog\nand off its centre line, and every host carried a shim to square it up."
|
|
17799
17949
|
},
|
|
17800
17950
|
{
|
|
17801
17951
|
"kind": "method",
|
|
@@ -25021,7 +25171,7 @@
|
|
|
25021
25171
|
{
|
|
25022
25172
|
"kind": "variable",
|
|
25023
25173
|
"name": "WriteReviewStyles",
|
|
25024
|
-
"default": "css`\n :host {\n display: block;\n font: inherit;\n\n /* The diff tints — see the diff rules below for why they are backgrounds only. */\n --write-review-added: color-mix(in srgb, var(--success-fill-rest, #2da44e) 18%, transparent);\n --write-review-removed: color-mix(in srgb, var(--error-fill-rest, #cf222e) 18%, transparent);\n }\n\n /*\n * The review mounts inside the chat bubble's dialog content, which is overflow: hidden — so a\n * wide event's columns were CLIPPED rather than pushed off screen, with no scrollbar to say\n * anything was missing. A user approving values they cannot see is the failure this whole\n * component exists to prevent, so the table scrolls within itself.\n */\n .scroller {\n overflow-x: auto;\n max-width: 100%;\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n border-bottom: calc(var(--stroke-width, 1) * 1px) solid var(--neutral-stroke-rest);\n padding: calc(var(--design-unit, 4) * 1px) calc(var(--design-unit, 4) * 2px);\n text-align: left;\n }\n\n /* A heading is a column name: kept on one line. */\n th {\n white-space: nowrap;\n }\n\n /*\n * A value is never clipped. Every character stays on screen.\n *\n * Clipping was the first bound, and the wrong one: 24ch with an ellipsis cut the END of every\n * cell, which in a changed cell is the NEW value, so the user approved a value they never saw.\n * No cell is safe to clip either. An insert has no pre-image, so none of its cells is\n * \"changed\", and every one of them is a value being written; a delete's cells are the record\n * being removed; and a title attribute holding the full text reaches nobody on a keyboard or a\n * touch screen.\n *\n * A SHORT value stays whole on one line, and the table scrolls. Wrapping every cell broke a\n * short value mid-token in a squeezed table — \"101.\" over \"2345\" — and the first line could\n * pass for the whole value.\n *\n * A LONG value (review-model marks it) wraps within a bound. With no bound at all, one long\n * value (a NOTE another user wrote) widened its column until the changed one sat out of view,\n * behind a scrollbar an overlay-scrollbar platform does not draw until you scroll.\n */\n td {\n white-space: nowrap;\n }\n\n td.long {\n white-space: normal;\n overflow-wrap: anywhere;\n\n /*\n * A floor as well as a ceiling. With only the ceiling, a squeezed table shrank a long value's\n * column to a sliver (a 100-character note became 22 lines of a few characters each) while\n * the one-line cells kept their width. The table scrolls instead.\n */\n min-width: 20ch;\n max-width: 40ch;\n }\n\n /*\n * The two marks this table carries — \"this field is changing\" and \"this field decides which\n * record disappears\" — were weight, colour and a strike-through only. None of that reaches\n * somebody using a screen reader, who is the one approver with no other way to tell, so each\n * mark has words as well.\n */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n\n /*\n * A delete shows the whole record and sends its key alone, so the fields that actually decide\n * which record disappears are marked. Not colour alone — an underline carries to a user who\n * cannot distinguish it.\n */\n td.identifying {\n font-weight: 600;\n text-decoration: underline;\n }\n\n /*\n * The diff, the way a code review shows one: what goes is tinted as removed and struck through,\n * what comes in is tinted as added and bold. Only the BACKGROUND is tinted, at low alpha, from\n * the theme's own success and error tokens (with fallbacks, as foundation-forms does), and the\n * text keeps the normal foreground colour: coloured text on a coloured ground is where contrast\n * fails, dark mode first. The tint is never the only signal. Strike-through, weight, the visible\n * + and − marks and the spoken \"was\" and \"now\" all carry the same thing without colour.\n */\n\n /* The mark a user's eye needs: this field is being changed. */\n td.changed {\n font-weight: 600;\n }\n\n /* On its own line above the new value, so neither can push the other out of view. */\n td.changed .was {\n display: block;\n font-weight: 400;\n text-decoration: line-through;\n background: var(--write-review-removed);\n }\n\n td.changed .now {\n display: block;\n background: var(--write-review-added);\n }\n\n /* Room inside the tint, so the − and + do not sit on its edge. */\n td.changed .was,\n td.changed .now {\n padding-inline: calc(var(--design-unit, 4) * 1px);\n }\n\n /*\n * A row that will not be written is never tinted, not even inside a cell. For a refused row\n * review-model already gives it no changed cells, and this is the second guard. For a row the\n * resolved review did not approve, the − and + stay as the record of what was proposed, but\n * without the tint that says it will happen.\n */\n tr.refused td.changed .was,\n tr.refused td.changed .now,\n tr.unwritten td.changed .was,\n tr.unwritten td.changed .now {\n background: none;\n }\n\n /* A whole row coming in, or going. A refused row is neither, and keeps its muted look. */\n tr.added td {\n background: var(--write-review-added);\n }\n\n tr.removed td {\n background: var(--write-review-removed);\n }\n\n /*\n * A closed review's row that was not approved says so in words — without them, a denied modify\n * read in greyscale or by a screen reader exactly like an approved one. An approved row says what\n * came of it the same way, once the write tool has recorded that (written, not written\n * because the user stopped, or its own reason).\n */\n .not-written,\n .fate {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n\n /*\n * A row action's input is what its handler is given, not a change to the row, so it is labelled\n * rather than marked as a diff. The label is text, so it reaches a screen reader as well.\n */\n .input-mark {\n font-style: italic;\n color: var(--neutral-foreground-hint);\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n }\n\n .row-action p {\n margin-block: calc(var(--design-unit, 4) * 1px);\n }\n\n /* The empty placeholder: a style no row text can take, so a literal \"(blank)\" cannot pass for it. */\n .blank {\n font-style: italic;\n font-weight: 400;\n color: var(--neutral-foreground-hint);\n }\n\n .mark {\n font-weight: 600;\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n user-select: none;\n }\n\n /* The row's + or − sits beside its checkbox, not on the baseline under it (where − reads as _). */\n td.select {\n white-space: nowrap;\n }\n\n td.select rapid-checkbox,\n td.select .mark {\n vertical-align: middle;\n }\n\n /* A gap from the checkbox, so the mark reads as the row's sign rather than part of the box. */\n td.select .mark {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n }\n\n /* The strike-through belongs to the value, not to its − mark. */\n td.changed .was .mark {\n display: inline-block;\n text-decoration: none;\n }\n\n tr.refused {\n color: var(--neutral-foreground-hint);\n }\n\n /* A refusal is a sentence, and it spans the table: it wraps rather than running off it. */\n .problems {\n color: var(--error-fill-rest, #c00);\n white-space: normal;\n }\n\n .actions {\n display: flex;\n gap: calc(var(--design-unit, 4) * 2px);\n margin-top: calc(var(--design-unit, 4) * 2px);\n }\n\n /* The change request takes the width the buttons leave it. */\n .change-request {\n flex: 1 1 24ch;\n }\n\n /* The outcome's live region is always there; while the review is open it takes no room. */\n .closed:empty {\n margin: 0;\n }\n\n /* The count sits at the foot of the field, beside it rather than in its way. */\n .remaining {\n align-self: flex-end;\n white-space: nowrap;\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n`"
|
|
25174
|
+
"default": "css`\n :host {\n display: block;\n font: inherit;\n\n /* The diff tints — see the diff rules below for why they are backgrounds only. */\n --write-review-added: color-mix(in srgb, var(--success-fill-rest, #2da44e) 18%, transparent);\n --write-review-removed: color-mix(in srgb, var(--error-fill-rest, #cf222e) 18%, transparent);\n }\n\n /*\n * The review mounts inside the chat bubble's dialog content, which is overflow: hidden — so a\n * wide event's columns were CLIPPED rather than pushed off screen, with no scrollbar to say\n * anything was missing. A user approving values they cannot see is the failure this whole\n * component exists to prevent, so the table scrolls within itself.\n */\n .scroller {\n overflow-x: auto;\n max-width: 100%;\n }\n\n table {\n border-collapse: collapse;\n width: 100%;\n }\n\n th,\n td {\n border-bottom: calc(var(--stroke-width, 1) * 1px) solid var(--neutral-stroke-rest);\n padding: calc(var(--design-unit, 4) * 1px) calc(var(--design-unit, 4) * 2px);\n text-align: left;\n }\n\n /* A heading is a column name: kept on one line. */\n th {\n white-space: nowrap;\n }\n\n /*\n * A value is never clipped. Every character stays on screen.\n *\n * Clipping was the first bound, and the wrong one: 24ch with an ellipsis cut the END of every\n * cell, which in a changed cell is the NEW value, so the user approved a value they never saw.\n * No cell is safe to clip either. An insert has no pre-image, so none of its cells is\n * \"changed\", and every one of them is a value being written; a delete's cells are the record\n * being removed; and a title attribute holding the full text reaches nobody on a keyboard or a\n * touch screen.\n *\n * A SHORT value stays whole on one line, and the table scrolls. Wrapping every cell broke a\n * short value mid-token in a squeezed table — \"101.\" over \"2345\" — and the first line could\n * pass for the whole value.\n *\n * A LONG value (review-model marks it) wraps within a bound. With no bound at all, one long\n * value (a NOTE another user wrote) widened its column until the changed one sat out of view,\n * behind a scrollbar an overlay-scrollbar platform does not draw until you scroll.\n */\n td {\n white-space: nowrap;\n }\n\n td.long {\n white-space: normal;\n overflow-wrap: anywhere;\n\n /*\n * A floor as well as a ceiling. With only the ceiling, a squeezed table shrank a long value's\n * column to a sliver (a 100-character note became 22 lines of a few characters each) while\n * the one-line cells kept their width. The table scrolls instead.\n */\n min-width: 20ch;\n max-width: 40ch;\n }\n\n /*\n * Stacked: the table did not fit (see GenesisWriteReview.stacked), so each row becomes a block\n * and each field a line of its own, its label beside its value, and nothing is off to the side.\n * The headings go, as every value now carries its own; the select-all box stays, labelled.\n */\n .stacked table,\n .stacked tbody,\n .stacked tr,\n .stacked td {\n display: block;\n }\n\n .stacked thead tr {\n display: flex;\n }\n\n .stacked thead th:not(.select) {\n display: none;\n }\n\n .stacked thead th.select {\n border-bottom: none;\n font-weight: 400;\n }\n\n /* Without its column of row boxes beneath it, a lone box at the top says nothing on sight. Its\n spoken name is its aria-label, so the words here are for the eye only (the empty alt). */\n .stacked thead th.select::after {\n content: 'Select all' / '';\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n vertical-align: middle;\n }\n\n .stacked tbody tr {\n padding-block: calc(var(--design-unit, 4) * 1px);\n border-top: calc(var(--stroke-width, 1) * 1px) solid var(--neutral-stroke-rest);\n }\n\n .stacked td {\n border-bottom: none;\n }\n\n .stacked td[data-label] {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n gap: calc(var(--design-unit, 4) * 2px);\n white-space: normal;\n overflow-wrap: anywhere;\n }\n\n .stacked td[data-label]::before {\n content: attr(data-label);\n font-weight: 600;\n }\n\n /* No column to bound any more: a long value takes the line's width like any other, and wraps\n within it like any other. */\n .stacked td.long {\n min-width: 0;\n max-width: none;\n white-space: normal;\n overflow-wrap: anywhere;\n }\n\n /*\n * The two marks this table carries — \"this field is changing\" and \"this field decides which\n * record disappears\" — were weight, colour and a strike-through only. None of that reaches\n * somebody using a screen reader, who is the one approver with no other way to tell, so each\n * mark has words as well.\n */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n\n /*\n * A delete shows the whole record and sends its key alone, so the fields that actually decide\n * which record disappears are marked. Not colour alone — an underline carries to a user who\n * cannot distinguish it.\n */\n td.identifying {\n font-weight: 600;\n text-decoration: underline;\n }\n\n /*\n * The diff, the way a code review shows one: what goes is tinted as removed and struck through,\n * what comes in is tinted as added and bold. Only the BACKGROUND is tinted, at low alpha, from\n * the theme's own success and error tokens (with fallbacks, as foundation-forms does), and the\n * text keeps the normal foreground colour: coloured text on a coloured ground is where contrast\n * fails, dark mode first. The tint is never the only signal. Strike-through, weight, the visible\n * + and − marks and the spoken \"was\" and \"now\" all carry the same thing without colour.\n */\n\n /* The mark a user's eye needs: this field is being changed. */\n td.changed {\n font-weight: 600;\n }\n\n /* On its own line above the new value, so neither can push the other out of view. */\n td.changed .was {\n display: block;\n font-weight: 400;\n text-decoration: line-through;\n background: var(--write-review-removed);\n }\n\n td.changed .now {\n display: block;\n background: var(--write-review-added);\n }\n\n /* Room inside the tint, so the − and + do not sit on its edge. */\n td.changed .was,\n td.changed .now {\n padding-inline: calc(var(--design-unit, 4) * 1px);\n }\n\n /*\n * A row that will not be written is never tinted, not even inside a cell. For a refused row\n * review-model already gives it no changed cells, and this is the second guard. For a row the\n * resolved review did not approve, the − and + stay as the record of what was proposed, but\n * without the tint that says it will happen.\n */\n tr.refused td.changed .was,\n tr.refused td.changed .now,\n tr.unwritten td.changed .was,\n tr.unwritten td.changed .now {\n background: none;\n }\n\n /* A whole row coming in, or going. A refused row is neither, and keeps its muted look. */\n tr.added td {\n background: var(--write-review-added);\n }\n\n tr.removed td {\n background: var(--write-review-removed);\n }\n\n /*\n * A closed review's row that was not approved says so in words — without them, a denied modify\n * read in greyscale or by a screen reader exactly like an approved one. An approved row says what\n * came of it the same way, once the write tool has recorded that (written, not written\n * because the user stopped, or its own reason).\n */\n .not-written,\n .fate {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n\n /*\n * A row action's input is what its handler is given, not a change to the row, so it is labelled\n * rather than marked as a diff. The label is text, so it reaches a screen reader as well.\n */\n .input-mark {\n font-style: italic;\n color: var(--neutral-foreground-hint);\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n }\n\n .row-action p {\n margin-block: calc(var(--design-unit, 4) * 1px);\n }\n\n /* The empty placeholder: a style no row text can take, so a literal \"(blank)\" cannot pass for it. */\n .blank {\n font-style: italic;\n font-weight: 400;\n color: var(--neutral-foreground-hint);\n }\n\n .mark {\n font-weight: 600;\n padding-inline-end: calc(var(--design-unit, 4) * 1px);\n user-select: none;\n }\n\n /* The row's + or − sits beside its checkbox, not on the baseline under it (where − reads as _). */\n td.select {\n white-space: nowrap;\n }\n\n .select rapid-checkbox,\n td.select .mark {\n vertical-align: middle;\n }\n\n /* A gap from the checkbox, so the mark reads as the row's sign rather than part of the box. */\n td.select .mark {\n margin-inline-start: calc(var(--design-unit, 4) * 1.5px);\n }\n\n /* The strike-through belongs to the value, not to its − mark. */\n td.changed .was .mark {\n display: inline-block;\n text-decoration: none;\n }\n\n tr.refused {\n color: var(--neutral-foreground-hint);\n }\n\n /* A refusal is a sentence, and it spans the table: it wraps rather than running off it. */\n .problems {\n color: var(--error-fill-rest, #c00);\n white-space: normal;\n }\n\n /* Wraps, so in a narrow bubble the last button drops to a new line rather than off the edge. */\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: calc(var(--design-unit, 4) * 2px);\n margin-top: calc(var(--design-unit, 4) * 2px);\n }\n\n /* The change request takes the width the buttons leave it. */\n .change-request {\n flex: 1 1 24ch;\n }\n\n /* The outcome's live region is always there; while the review is open it takes no room. */\n .closed:empty {\n margin: 0;\n }\n\n /* The count sits at the foot of the field, beside it rather than in its way. */\n .remaining {\n align-self: flex-end;\n white-space: nowrap;\n font-size: var(--type-ramp-minus-1-font-size, 0.875em);\n color: var(--neutral-foreground-hint);\n }\n`"
|
|
25025
25175
|
}
|
|
25026
25176
|
],
|
|
25027
25177
|
"exports": [
|
|
@@ -25045,7 +25195,7 @@
|
|
|
25045
25195
|
"type": {
|
|
25046
25196
|
"text": "ViewTemplate<GenesisWriteReview>"
|
|
25047
25197
|
},
|
|
25048
|
-
"default": "html<GenesisWriteReview>`\n ${when(\n (x) => !!x.model,\n html<GenesisWriteReview>`\n ${when(\n (x) => !x.rowActionHeading,\n html<GenesisWriteReview>`\n <p>\n ${(x) => x.model?.op} ${(x) => x.model?.rows.length} row(s) in\n ${(x) => x.model?.resource}. Nothing is written until you choose rows and select Write.\n </p>\n `,\n )}\n ${when(\n (x) => !!x.rowActionHeading,\n html<GenesisWriteReview>`\n <p class=\"row-action-heading\">${(x) => x.rowActionHeading}</p>\n <div class=\"row-action\" id=\"${ROW_ACTION_LINES_ID}\">\n ${repeat(\n (x) => x.rowActionLines,\n html<string>`\n <p>${(x) => x}</p>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x) => !!x.customCodeLine,\n html<GenesisWriteReview>`\n <p class=\"custom-code\" id=\"${CUSTOM_CODE_LINE_ID}\">${(x) => x.customCodeLine}</p>\n `,\n )}\n <div class=\"scroller\">\n <table\n aria-label=\"${(x) => x.tableLabel}\"\n aria-describedby=\"${(x) =>\n x.customCodeLine\n ? CUSTOM_CODE_LINE_ID\n : x.rowActionHeading\n ? ROW_ACTION_LINES_ID\n : undefined}\"\n >\n <thead>\n <tr>\n <th>\n <rapid-checkbox\n aria-label=\"Select all rows\"\n :checked=\"${(x) => x.allSelected}\"\n ?disabled=\"${(x) => x.settled || !x.model?.selectable.length}\"\n @change=\"${(x, c) => x.setAll(checkedOf(c.event))}\"\n ></rapid-checkbox>\n </th>\n ${repeat(\n (x) => x.model?.columns ?? [],\n html<ReviewColumn>`\n <th>${(c) => c.label}</th>\n `,\n )}\n </tr>\n </thead>\n <tbody>${repeat((x) => x.model?.rows ?? [], row)}</tbody>\n </table>\n </div>\n <div class=\"actions\">\n ${when(\n (x) => !x.asking,\n html<GenesisWriteReview>`\n <rapid-button\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.writable}\"\n @click=\"${(x) => x.write()}\"\n >\n Write ${(x) => (x.rowsSelected ? `${x.rowsSelected} row(s)` : '')}\n </rapid-button>\n <rapid-button\n class=\"ask\"\n ?disabled=\"${(x) => x.settled}\"\n @click=\"${(x) => x.startAsking()}\"\n >\n Ask for changes\n </rapid-button>\n <rapid-button ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.deny()}\">\n Deny\n </rapid-button>\n `,\n )}\n ${when(\n (x) => x.asking,\n html<GenesisWriteReview>`\n <rapid-text-area\n class=\"change-request\"\n :value=\"${(x) => x.changeText}\"\n ?readonly=\"${(x) => x.settled}\"\n maxlength=\"${() => MAX_FEEDBACK_CHARS}\"\n @input=\"${(x, c) => {\n x.setChangeText((c.event.target as HTMLTextAreaElement).value);\n return true;\n }}\"\n >\n What should change?\n </rapid-text-area>\n <span class=\"remaining\">${(x) => x.charactersLeft} characters left</span>\n <rapid-button\n class=\"send\"\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.canSendChanges}\"\n @click=\"${(x) => x.sendChanges()}\"\n >\n Send\n </rapid-button>\n <rapid-button class=\"back\" ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.back()}\">\n Back\n </rapid-button>\n `,\n )}\n </div>\n `,\n )}\n ${\n /* A live region, and there from the start: a screen reader announces a change to one it\n already knows, and a region added with its text already in it was not announced at all.\n Empty while the review is open; filled by sayOutcome, which also decides when. Focusable\n from script only, so focus can land on the outcome after an answer. */ ''\n }\n <p class=\"closed\" role=\"status\" tabindex=\"-1\">${(x) => x.announcement}</p>\n`"
|
|
25198
|
+
"default": "html<GenesisWriteReview>`\n ${when(\n (x) => !!x.model,\n html<GenesisWriteReview>`\n ${when(\n (x) => !x.rowActionHeading,\n html<GenesisWriteReview>`\n <p>\n ${(x) => x.model?.op} ${(x) => x.model?.rows.length} row(s) in\n ${(x) => x.model?.resource}. Nothing is written until you choose rows and select Write.\n </p>\n `,\n )}\n ${when(\n (x) => !!x.rowActionHeading,\n html<GenesisWriteReview>`\n <p class=\"row-action-heading\">${(x) => x.rowActionHeading}</p>\n <div class=\"row-action\" id=\"${ROW_ACTION_LINES_ID}\">\n ${repeat(\n (x) => x.rowActionLines,\n html<string>`\n <p>${(x) => x}</p>\n `,\n )}\n </div>\n `,\n )}\n ${when(\n (x) => !!x.customCodeLine,\n html<GenesisWriteReview>`\n <p class=\"custom-code\" id=\"${CUSTOM_CODE_LINE_ID}\">${(x) => x.customCodeLine}</p>\n `,\n )}\n ${\n /* The table's roles are stated, not left to the tags: the stacked layout sets display: block\n on its parts, and a browser then drops their table semantics, so a screen reader would\n hear a run of values with no row or column to put them in. */ ''\n }\n <div class=\"scroller ${(x) => (x.stacked ? 'stacked' : '')}\">\n <table\n role=\"table\"\n aria-label=\"${(x) => x.tableLabel}\"\n aria-describedby=\"${(x) =>\n x.customCodeLine\n ? CUSTOM_CODE_LINE_ID\n : x.rowActionHeading\n ? ROW_ACTION_LINES_ID\n : undefined}\"\n >\n <thead role=\"rowgroup\">\n <tr role=\"row\">\n <th role=\"columnheader\" class=\"select\">\n <rapid-checkbox\n aria-label=\"Select all rows\"\n :checked=\"${(x) => x.allSelected}\"\n ?disabled=\"${(x) => x.settled || !x.model?.selectable.length}\"\n @change=\"${(x, c) => x.setAll(checkedOf(c.event))}\"\n ></rapid-checkbox>\n </th>\n ${repeat(\n (x) => x.model?.columns ?? [],\n html<ReviewColumn>`\n <th role=\"columnheader\">${(c) => c.label}</th>\n `,\n )}\n </tr>\n </thead>\n <tbody role=\"rowgroup\">${repeat((x) => x.model?.rows ?? [], row)}</tbody>\n </table>\n </div>\n <div class=\"actions\">\n ${when(\n (x) => !x.asking,\n html<GenesisWriteReview>`\n <rapid-button\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.writable}\"\n @click=\"${(x) => x.write()}\"\n >\n Write ${(x) => (x.rowsSelected ? `${x.rowsSelected} row(s)` : '')}\n </rapid-button>\n <rapid-button\n class=\"ask\"\n ?disabled=\"${(x) => x.settled}\"\n @click=\"${(x) => x.startAsking()}\"\n >\n Ask for changes\n </rapid-button>\n <rapid-button ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.deny()}\">\n Deny\n </rapid-button>\n `,\n )}\n ${when(\n (x) => x.asking,\n html<GenesisWriteReview>`\n <rapid-text-area\n class=\"change-request\"\n :value=\"${(x) => x.changeText}\"\n ?readonly=\"${(x) => x.settled}\"\n maxlength=\"${() => MAX_FEEDBACK_CHARS}\"\n @input=\"${(x, c) => {\n x.setChangeText((c.event.target as HTMLTextAreaElement).value);\n return true;\n }}\"\n >\n What should change?\n </rapid-text-area>\n <span class=\"remaining\">${(x) => x.charactersLeft} characters left</span>\n <rapid-button\n class=\"send\"\n appearance=\"accent\"\n ?disabled=\"${(x) => !x.canSendChanges}\"\n @click=\"${(x) => x.sendChanges()}\"\n >\n Send\n </rapid-button>\n <rapid-button class=\"back\" ?disabled=\"${(x) => x.settled}\" @click=\"${(x) => x.back()}\">\n Back\n </rapid-button>\n `,\n )}\n </div>\n `,\n )}\n ${\n /* A live region, and there from the start: a screen reader announces a change to one it\n already knows, and a region added with its text already in it was not announced at all.\n Empty while the review is open; filled by sayOutcome, which also decides when. Focusable\n from script only, so focus can land on the outcome after an answer. */ ''\n }\n <p class=\"closed\" role=\"status\" tabindex=\"-1\">${(x) => x.announcement}</p>\n`"
|
|
25049
25199
|
}
|
|
25050
25200
|
],
|
|
25051
25201
|
"exports": [
|
|
@@ -25129,6 +25279,33 @@
|
|
|
25129
25279
|
"default": "''",
|
|
25130
25280
|
"description": "What the live region says: the outcome once the review has resolved. See `sayOutcome`."
|
|
25131
25281
|
},
|
|
25282
|
+
{
|
|
25283
|
+
"kind": "field",
|
|
25284
|
+
"name": "stacked",
|
|
25285
|
+
"type": {
|
|
25286
|
+
"text": "boolean"
|
|
25287
|
+
},
|
|
25288
|
+
"default": "false",
|
|
25289
|
+
"description": "True when the table would not fit the width it has, and each row is laid out as its fields\nstacked label beside value instead."
|
|
25290
|
+
},
|
|
25291
|
+
{
|
|
25292
|
+
"kind": "field",
|
|
25293
|
+
"name": "resizeObserver",
|
|
25294
|
+
"type": {
|
|
25295
|
+
"text": "ResizeObserver | undefined"
|
|
25296
|
+
},
|
|
25297
|
+
"privacy": "private"
|
|
25298
|
+
},
|
|
25299
|
+
{
|
|
25300
|
+
"kind": "field",
|
|
25301
|
+
"name": "tableWidth",
|
|
25302
|
+
"type": {
|
|
25303
|
+
"text": "number"
|
|
25304
|
+
},
|
|
25305
|
+
"privacy": "private",
|
|
25306
|
+
"default": "0",
|
|
25307
|
+
"description": "The table's width when last laid out as a table: what the review needs to stop stacking."
|
|
25308
|
+
},
|
|
25132
25309
|
{
|
|
25133
25310
|
"kind": "field",
|
|
25134
25311
|
"name": "answeredNow",
|
|
@@ -25147,6 +25324,17 @@
|
|
|
25147
25324
|
"privacy": "private",
|
|
25148
25325
|
"description": "The answer this element shows while its outcome is still to come, whose `focused` it keeps\ncurrent. The rebuild that brings the outcome gives focus back only if this one held it when\nit was removed: a user who has since moved to the chat input keeps their place."
|
|
25149
25326
|
},
|
|
25327
|
+
{
|
|
25328
|
+
"kind": "method",
|
|
25329
|
+
"name": "fitLayout",
|
|
25330
|
+
"privacy": "private",
|
|
25331
|
+
"return": {
|
|
25332
|
+
"type": {
|
|
25333
|
+
"text": "void"
|
|
25334
|
+
}
|
|
25335
|
+
},
|
|
25336
|
+
"description": "Stacks the rows when the table is wider than the review, and goes back to the table once the\nreview is as wide as the table was. While stacked there is no table to measure, so the width it\nhad is kept from the last time it was one."
|
|
25337
|
+
},
|
|
25150
25338
|
{
|
|
25151
25339
|
"kind": "field",
|
|
25152
25340
|
"name": "model",
|