ltcai 7.7.0 → 7.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +38 -26
  2. package/docs/CHANGELOG.md +37 -0
  3. package/docs/DEVELOPMENT.md +1 -2
  4. package/docs/MULTI_AGENT_RUNTIME.md +6 -5
  5. package/docs/V2_ARCHITECTURE.md +3 -2
  6. package/frontend/src/App.tsx +3 -1
  7. package/frontend/src/components/ProductFlow.tsx +19 -23
  8. package/frontend/src/components/onboarding/RecommendationScreen.tsx +11 -12
  9. package/frontend/src/features/brain/BrainConversation.tsx +107 -108
  10. package/frontend/src/features/brain/BrainHome.tsx +32 -33
  11. package/frontend/src/i18n.ts +53 -19
  12. package/frontend/src/pages/Ask.tsx +11 -2
  13. package/frontend/src/pages/Brain.tsx +12 -2
  14. package/frontend/src/styles.css +390 -65
  15. package/lattice_brain/__init__.py +1 -1
  16. package/lattice_brain/runtime/__init__.py +8 -2
  17. package/lattice_brain/runtime/agent_runtime.py +17 -1
  18. package/lattice_brain/runtime/contracts.py +64 -1
  19. package/lattice_brain/runtime/multi_agent.py +1 -1
  20. package/latticeai/__init__.py +1 -1
  21. package/latticeai/core/agent.py +39 -12
  22. package/latticeai/core/marketplace.py +1 -1
  23. package/latticeai/core/workspace_os.py +1 -1
  24. package/latticeai/services/architecture_readiness.py +1 -1
  25. package/latticeai/services/product_readiness.py +22 -15
  26. package/latticeai/services/tool_dispatch.py +15 -3
  27. package/package.json +1 -1
  28. package/scripts/product_readiness.py +1 -1
  29. package/src-tauri/Cargo.lock +1 -1
  30. package/src-tauri/Cargo.toml +1 -1
  31. package/src-tauri/tauri.conf.json +1 -1
  32. package/static/app/asset-manifest.json +28 -28
  33. package/static/app/assets/Act-DOvf59ru.js +2 -0
  34. package/static/app/assets/{Act-CX5hL0Z3.js.map → Act-DOvf59ru.js.map} +1 -1
  35. package/static/app/assets/Brain-C7_0mEiI.js +322 -0
  36. package/static/app/assets/Brain-C7_0mEiI.js.map +1 -0
  37. package/static/app/assets/Capture-B9Tlhzqr.js +2 -0
  38. package/static/app/assets/{Capture-CdFSrZnA.js.map → Capture-B9Tlhzqr.js.map} +1 -1
  39. package/static/app/assets/{Library-CZFVGSmG.js → Library-BJPEEm5O.js} +2 -2
  40. package/static/app/assets/{Library-CZFVGSmG.js.map → Library-BJPEEm5O.js.map} +1 -1
  41. package/static/app/assets/System-D6t9jo9V.js +2 -0
  42. package/static/app/assets/{System-CMoOoUrZ.js.map → System-D6t9jo9V.js.map} +1 -1
  43. package/static/app/assets/index-C7g26IF6.css +2 -0
  44. package/static/app/assets/index-DbcEYJQ2.js +17 -0
  45. package/static/app/assets/{index-B4_drWel.js.map → index-DbcEYJQ2.js.map} +1 -1
  46. package/static/app/assets/primitives-CD38lt4n.js +2 -0
  47. package/static/app/assets/{primitives-CFhU5Rka.js.map → primitives-CD38lt4n.js.map} +1 -1
  48. package/static/app/assets/textarea-BZk6ybp5.js +2 -0
  49. package/static/app/assets/{textarea-uBpGDOJM.js.map → textarea-BZk6ybp5.js.map} +1 -1
  50. package/static/app/index.html +2 -2
  51. package/frontend/src/components/BrainConversation.tsx +0 -533
  52. package/frontend/src/components/FirstRunGuide.tsx +0 -99
  53. package/static/app/assets/Act-CX5hL0Z3.js +0 -2
  54. package/static/app/assets/Brain-m19en5wz.js +0 -322
  55. package/static/app/assets/Brain-m19en5wz.js.map +0 -1
  56. package/static/app/assets/Capture-CdFSrZnA.js +0 -2
  57. package/static/app/assets/System-CMoOoUrZ.js +0 -2
  58. package/static/app/assets/index-B4_drWel.js +0 -17
  59. package/static/app/assets/index-DjpDeE0c.css +0 -2
  60. package/static/app/assets/primitives-CFhU5Rka.js +0 -2
  61. package/static/app/assets/textarea-uBpGDOJM.js +0 -2
@@ -1301,7 +1301,7 @@ body {
1301
1301
  flex: 1 1 auto;
1302
1302
  display: flex;
1303
1303
  flex-direction: column;
1304
- max-width: 780px;
1304
+ max-width: 1180px;
1305
1305
  margin: 0 auto;
1306
1306
  width: 100%;
1307
1307
  padding: 0 1.25rem 1.75rem;
@@ -1320,11 +1320,35 @@ body {
1320
1320
  text-transform: uppercase;
1321
1321
  }
1322
1322
 
1323
- .brain-ownership-strip {
1323
+ .brain-conversation-title {
1324
+ min-width: min(100%, 18rem);
1325
+ }
1326
+
1327
+ .brain-conversation-title h1 {
1324
1328
  display: flex;
1325
- flex: 1 1 auto;
1326
- justify-content: center;
1329
+ flex-wrap: wrap;
1330
+ align-items: center;
1327
1331
  gap: 0.45rem;
1332
+ margin: 0;
1333
+ }
1334
+
1335
+ .brain-conversation-title > span {
1336
+ display: block;
1337
+ margin-top: 0.18rem;
1338
+ color: hsl(var(--fg-muted));
1339
+ font-size: 0.72rem;
1340
+ font-weight: 760;
1341
+ letter-spacing: 0;
1342
+ line-height: 1.25;
1343
+ text-transform: none;
1344
+ }
1345
+
1346
+ .brain-header-tools,
1347
+ .brain-ownership-strip {
1348
+ display: flex;
1349
+ align-items: center;
1350
+ justify-content: flex-end;
1351
+ gap: 0.5rem;
1328
1352
  min-width: 0;
1329
1353
  }
1330
1354
 
@@ -1415,12 +1439,174 @@ body {
1415
1439
  flex: 0 0 auto;
1416
1440
  }
1417
1441
 
1442
+ .brain-chat-home-layout {
1443
+ display: grid;
1444
+ grid-template-columns: minmax(0, 1fr);
1445
+ gap: 1rem;
1446
+ align-items: start;
1447
+ max-width: 880px;
1448
+ width: 100%;
1449
+ margin: 0 auto;
1450
+ }
1451
+
1452
+ .brain-chat-home-card {
1453
+ display: grid;
1454
+ min-height: min(70vh, 46rem);
1455
+ border: 1px solid hsl(var(--brain-core) / 0.3);
1456
+ border-radius: 8px;
1457
+ background:
1458
+ linear-gradient(180deg, hsl(var(--surface-glass)), hsl(var(--surface) / 0.74)),
1459
+ radial-gradient(80% 70% at 16% 0%, hsl(var(--brain-core) / 0.12), transparent 70%);
1460
+ box-shadow: 0 18px 44px hsl(200 30% 3% / 0.18);
1461
+ overflow: hidden;
1462
+ backdrop-filter: blur(18px);
1463
+ }
1464
+
1465
+ .brain-chat-home-head {
1466
+ display: flex;
1467
+ justify-content: space-between;
1468
+ gap: 1rem;
1469
+ border-bottom: 1px solid hsl(var(--border) / 0.5);
1470
+ padding: 1rem 1rem 0.85rem;
1471
+ }
1472
+
1473
+ .brain-chat-home-head span {
1474
+ display: inline-flex;
1475
+ color: hsl(var(--fg-muted));
1476
+ font-size: 0.64rem;
1477
+ font-weight: 840;
1478
+ letter-spacing: 0.04em;
1479
+ text-transform: uppercase;
1480
+ }
1481
+
1482
+ .brain-chat-home-head h2 {
1483
+ margin: 0.18rem 0 0.32rem;
1484
+ color: hsl(var(--fg));
1485
+ font-size: clamp(1.35rem, 2vw, 1.8rem);
1486
+ font-weight: 760;
1487
+ line-height: 1.08;
1488
+ letter-spacing: 0;
1489
+ }
1490
+
1491
+ .brain-chat-home-head p {
1492
+ max-width: 42rem;
1493
+ margin: 0;
1494
+ color: hsl(var(--fg-muted));
1495
+ font-size: 0.9rem;
1496
+ line-height: 1.45;
1497
+ }
1498
+
1499
+ .brain-chat-home-proof {
1500
+ display: flex;
1501
+ flex: 0 0 auto;
1502
+ flex-direction: column;
1503
+ align-items: flex-end;
1504
+ gap: 0.4rem;
1505
+ }
1506
+
1507
+ .brain-chat-home-proof span {
1508
+ display: inline-flex;
1509
+ align-items: center;
1510
+ gap: 0.32rem;
1511
+ min-height: 1.8rem;
1512
+ border: 1px solid hsl(var(--border) / 0.54);
1513
+ border-radius: 999px;
1514
+ background: hsl(var(--surface) / 0.65);
1515
+ color: hsl(var(--fg-muted));
1516
+ padding: 0 0.56rem;
1517
+ font-size: 0.68rem;
1518
+ font-weight: 780;
1519
+ letter-spacing: 0;
1520
+ text-transform: none;
1521
+ white-space: nowrap;
1522
+ }
1523
+
1524
+ .brain-chat-home-proof svg {
1525
+ color: hsl(var(--success));
1526
+ }
1527
+
1418
1528
  .brain-stream {
1419
1529
  flex: 1 1 auto;
1530
+ min-height: 19rem;
1531
+ max-height: 32rem;
1420
1532
  overflow-y: auto;
1421
- padding: 1rem 0.25rem 1.5rem;
1533
+ padding: 0.9rem 1rem 1rem;
1422
1534
  scroll-behavior: smooth;
1423
- mask-image: linear-gradient(transparent, black 6%, black 92%, transparent);
1535
+ mask-image: linear-gradient(transparent, black 4%, black 96%, transparent);
1536
+ }
1537
+
1538
+ .brain-context-rail {
1539
+ display: grid;
1540
+ gap: 0.85rem;
1541
+ position: sticky;
1542
+ top: 1rem;
1543
+ min-width: 0;
1544
+ }
1545
+
1546
+ .brain-context-rail .brain-command-center,
1547
+ .brain-context-rail .brain-ingestion-panel,
1548
+ .brain-context-rail .brain-emergence-timeline,
1549
+ .brain-context-rail .brain-model-demo {
1550
+ margin: 0;
1551
+ }
1552
+
1553
+ .brain-context-rail .brain-command-actions,
1554
+ .brain-context-rail .brain-ingestion-grid {
1555
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1556
+ }
1557
+
1558
+ .brain-context-rail .brain-command-actions button,
1559
+ .brain-context-rail .brain-ingest-tile {
1560
+ min-height: 4.6rem;
1561
+ }
1562
+
1563
+ .brain-context-rail .brain-ingest-tile input {
1564
+ min-width: 0;
1565
+ }
1566
+
1567
+ .brain-utility-drawer {
1568
+ border-top: 1px solid hsl(var(--border) / 0.5);
1569
+ background: hsl(var(--bg) / 0.2);
1570
+ }
1571
+
1572
+ .brain-utility-drawer > summary {
1573
+ display: flex;
1574
+ min-height: 2.8rem;
1575
+ cursor: pointer;
1576
+ align-items: center;
1577
+ justify-content: center;
1578
+ color: hsl(var(--fg-muted));
1579
+ font-size: 0.78rem;
1580
+ font-weight: 820;
1581
+ list-style: none;
1582
+ transition: color 150ms ease, background 150ms ease;
1583
+ }
1584
+
1585
+ .brain-utility-drawer > summary::-webkit-details-marker {
1586
+ display: none;
1587
+ }
1588
+
1589
+ .brain-utility-drawer > summary:hover,
1590
+ .brain-utility-drawer > summary:focus-visible {
1591
+ background: hsl(var(--brain-core) / 0.06);
1592
+ color: hsl(var(--fg));
1593
+ outline: none;
1594
+ }
1595
+
1596
+ .brain-utility-grid {
1597
+ display: grid;
1598
+ gap: 0.85rem;
1599
+ border-top: 1px solid hsl(var(--border) / 0.5);
1600
+ padding: 0.85rem;
1601
+ }
1602
+
1603
+ .brain-utility-grid .brain-command-center,
1604
+ .brain-utility-grid .brain-ingestion-panel,
1605
+ .brain-utility-grid .brain-emergence-timeline,
1606
+ .brain-utility-grid .brain-model-demo,
1607
+ .brain-utility-grid .brain-overview-panel,
1608
+ .brain-utility-grid .brain-care-panel {
1609
+ margin: 0;
1424
1610
  }
1425
1611
 
1426
1612
  .brain-edition-badge,
@@ -2529,6 +2715,29 @@ body {
2529
2715
  flex-direction: column;
2530
2716
  }
2531
2717
 
2718
+ .brain-product-intro {
2719
+ width: min(100%, 44rem);
2720
+ margin: 0.9rem auto 0.35rem;
2721
+ padding-inline: 1rem;
2722
+ text-align: center;
2723
+ }
2724
+
2725
+ .brain-product-kicker {
2726
+ color: hsl(var(--brain-core));
2727
+ font-size: 0.72rem;
2728
+ font-weight: 860;
2729
+ letter-spacing: 0.04em;
2730
+ text-transform: uppercase;
2731
+ }
2732
+
2733
+ .brain-product-line {
2734
+ margin-top: 0.22rem;
2735
+ color: hsl(var(--fg));
2736
+ font-size: 1rem;
2737
+ font-weight: 620;
2738
+ line-height: 1.35;
2739
+ }
2740
+
2532
2741
  .brain-organism {
2533
2742
  z-index: 3;
2534
2743
  }
@@ -3903,23 +4112,26 @@ body {
3903
4112
 
3904
4113
  /* Gentle empty / loading for the mind */
3905
4114
  .mind-empty {
3906
- text-align: center;
3907
- padding: 2.4rem 1rem;
4115
+ display: grid;
4116
+ align-content: center;
4117
+ text-align: left;
4118
+ min-height: 18rem;
4119
+ padding: 1.2rem 0.2rem;
3908
4120
  color: hsl(var(--fg-muted));
3909
4121
  }
3910
4122
 
3911
4123
  .mind-empty-title {
3912
4124
  max-width: 34rem;
3913
- margin: 0 auto 0.5rem;
4125
+ margin: 0 0 0.5rem;
3914
4126
  color: hsl(var(--fg));
3915
- font-size: 1.1rem;
3916
- font-weight: 650;
4127
+ font-size: 1.2rem;
4128
+ font-weight: 720;
3917
4129
  line-height: 1.2;
3918
4130
  }
3919
4131
 
3920
4132
  .mind-empty p {
3921
4133
  max-width: 39rem;
3922
- margin: 0 auto;
4134
+ margin: 0;
3923
4135
  font-size: 0.9rem;
3924
4136
  line-height: 1.45;
3925
4137
  }
@@ -3956,9 +4168,8 @@ body {
3956
4168
  }
3957
4169
 
3958
4170
  .mind-empty-prompts {
3959
- display: flex;
3960
- flex-wrap: wrap;
3961
- justify-content: center;
4171
+ display: grid;
4172
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3962
4173
  gap: 0.48rem;
3963
4174
  margin-top: 1rem;
3964
4175
  }
@@ -3966,12 +4177,13 @@ body {
3966
4177
  .mind-empty-prompts button {
3967
4178
  max-width: 100%;
3968
4179
  border: 1px solid hsl(var(--border) / 0.62);
3969
- border-radius: 999px;
4180
+ border-radius: 8px;
3970
4181
  background: hsl(var(--bg) / 0.46);
3971
4182
  color: hsl(var(--fg));
3972
- padding: 0.46rem 0.7rem;
4183
+ padding: 0.62rem 0.7rem;
3973
4184
  font-size: 0.78rem;
3974
4185
  line-height: 1.15;
4186
+ text-align: left;
3975
4187
  transition: border-color 150ms ease, background 150ms ease, transform 150ms ease;
3976
4188
  }
3977
4189
 
@@ -3986,9 +4198,9 @@ body {
3986
4198
  .mind-empty-trail {
3987
4199
  display: flex;
3988
4200
  flex-wrap: wrap;
3989
- justify-content: center;
4201
+ justify-content: flex-start;
3990
4202
  gap: 0.45rem;
3991
- margin: 1rem auto 0;
4203
+ margin: 1rem 0 0;
3992
4204
  max-width: 40rem;
3993
4205
  }
3994
4206
 
@@ -4031,8 +4243,27 @@ body {
4031
4243
  @media (max-width: 720px) {
4032
4244
  .brain-presence { padding-top: 1.4rem; }
4033
4245
  .brain-organism { width: 200px; height: 200px; }
4034
- .brain-conversation { padding-bottom: 5.5rem; }
4035
- .brain-conversation-header { flex-wrap: wrap; }
4246
+ .brain-conversation { padding: 0 0.75rem 5.5rem; }
4247
+ .brain-conversation-header,
4248
+ .brain-chat-home-head,
4249
+ .brain-header-tools {
4250
+ align-items: flex-start;
4251
+ flex-direction: column;
4252
+ }
4253
+ .brain-header-tools {
4254
+ width: 100%;
4255
+ }
4256
+ .brain-chat-home-layout {
4257
+ grid-template-columns: 1fr;
4258
+ }
4259
+ .brain-context-rail {
4260
+ position: static;
4261
+ }
4262
+ .brain-chat-home-proof {
4263
+ align-items: flex-start;
4264
+ flex-direction: row;
4265
+ flex-wrap: wrap;
4266
+ }
4036
4267
  .brain-depth-actions {
4037
4268
  bottom: 3.55rem;
4038
4269
  width: min(100vw - 1rem, 24rem);
@@ -4113,6 +4344,7 @@ body {
4113
4344
  }
4114
4345
  .mind-empty-prompts {
4115
4346
  display: grid;
4347
+ grid-template-columns: 1fr;
4116
4348
  }
4117
4349
  .mind-empty-prompts button {
4118
4350
  width: 100%;
@@ -4121,6 +4353,10 @@ body {
4121
4353
  .ritual-promise {
4122
4354
  grid-template-columns: 1fr;
4123
4355
  }
4356
+ .ritual-value-grid,
4357
+ .ritual-wake-plan {
4358
+ grid-template-columns: 1fr;
4359
+ }
4124
4360
  .brain-ownership-strip { order: 3; flex-basis: 100%; justify-content: flex-start; overflow-x: auto; }
4125
4361
  .depths { bottom: 0.9rem; }
4126
4362
  }
@@ -4188,6 +4424,48 @@ body {
4188
4424
  line-height: 1.22;
4189
4425
  }
4190
4426
 
4427
+ .ritual-value-grid {
4428
+ display: grid;
4429
+ grid-template-columns: repeat(3, minmax(0, 1fr));
4430
+ gap: 0.65rem;
4431
+ width: min(100%, 640px);
4432
+ margin: 0.15rem auto 0.25rem;
4433
+ }
4434
+
4435
+ .ritual-value-card {
4436
+ border: 1px solid hsl(var(--border) / 0.54);
4437
+ border-radius: 8px;
4438
+ background: hsl(var(--surface-glass));
4439
+ padding: 0.78rem 0.82rem;
4440
+ text-align: left;
4441
+ transition: transform 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
4442
+ }
4443
+
4444
+ .ritual-value-card:hover,
4445
+ .ritual-value-card:focus-within {
4446
+ transform: translateY(-1px);
4447
+ border-color: hsl(var(--brain-core) / 0.62);
4448
+ box-shadow: 0 8px 22px hsl(var(--brain-core) / 0.09);
4449
+ }
4450
+
4451
+ .ritual-value-label {
4452
+ display: flex;
4453
+ align-items: center;
4454
+ gap: 0.42rem;
4455
+ color: hsl(var(--brain-core));
4456
+ font-size: 0.72rem;
4457
+ font-weight: 840;
4458
+ letter-spacing: 0;
4459
+ }
4460
+
4461
+ .ritual-value-body {
4462
+ margin-top: 0.24rem;
4463
+ color: hsl(var(--fg));
4464
+ font-size: 0.84rem;
4465
+ font-weight: 620;
4466
+ line-height: 1.28;
4467
+ }
4468
+
4191
4469
  .ritual-secondary-button {
4192
4470
  min-height: 2.75rem;
4193
4471
  border: 1px solid hsl(var(--border) / 0.64);
@@ -4301,7 +4579,41 @@ body {
4301
4579
  }
4302
4580
 
4303
4581
  .ritual-full-button {
4582
+ min-height: 2.75rem;
4583
+ border: 1px solid hsl(var(--brain-core) / 0.62);
4584
+ border-radius: 8px;
4585
+ background: hsl(var(--brain-core));
4586
+ color: hsl(var(--bg));
4587
+ padding: 0 1.2rem;
4588
+ font-weight: 800;
4589
+ cursor: pointer;
4304
4590
  margin-top: 1rem;
4591
+ box-shadow: 0 8px 24px hsl(var(--brain-core) / 0.18);
4592
+ transition: transform 140ms ease, box-shadow 140ms ease, border-color 140ms ease;
4593
+ }
4594
+
4595
+ .ritual-full-button:hover,
4596
+ .ritual-full-button:focus-visible {
4597
+ transform: translateY(-1px);
4598
+ border-color: hsl(var(--brain-halo));
4599
+ box-shadow: 0 12px 30px hsl(var(--brain-core) / 0.24);
4600
+ outline: none;
4601
+ }
4602
+
4603
+ .ritual-full-button-primary,
4604
+ .ritual-primary-model-button {
4605
+ display: inline-flex;
4606
+ align-items: center;
4607
+ justify-content: center;
4608
+ gap: 0.5rem;
4609
+ }
4610
+
4611
+ .ritual-full-button-primary {
4612
+ min-width: min(100%, 18rem);
4613
+ margin-top: 0;
4614
+ padding: 0.85rem 2.15rem;
4615
+ font-size: 1.02rem;
4616
+ font-weight: 820;
4305
4617
  }
4306
4618
 
4307
4619
  .ritual-note,
@@ -4402,6 +4714,12 @@ body {
4402
4714
 
4403
4715
  .ritual-model-card {
4404
4716
  text-align: left;
4717
+ display: flex;
4718
+ flex-direction: column;
4719
+ align-items: flex-start;
4720
+ gap: 0.32rem;
4721
+ position: relative;
4722
+ overflow: hidden;
4405
4723
  padding: 1.15rem 1.35rem;
4406
4724
  margin-bottom: 0.7rem;
4407
4725
  cursor: pointer;
@@ -4411,28 +4729,65 @@ body {
4411
4729
  transition: all 160ms ease;
4412
4730
  }
4413
4731
 
4732
+ .ritual-model-card::after {
4733
+ content: "";
4734
+ position: absolute;
4735
+ top: -55%;
4736
+ left: -115%;
4737
+ width: 40%;
4738
+ height: 210%;
4739
+ background: linear-gradient(120deg, transparent, hsl(var(--brain-core) / 0.1), transparent);
4740
+ transition: left 420ms ease;
4741
+ }
4742
+
4414
4743
  .ritual-model-card:hover {
4415
4744
  border-color: hsl(var(--brain-core) / 0.5);
4416
4745
  background: hsl(var(--surface) / 0.95);
4417
4746
  }
4418
4747
 
4748
+ .ritual-model-card:hover::after,
4749
+ .ritual-model-card:focus-visible::after {
4750
+ left: 240%;
4751
+ }
4752
+
4753
+ .ritual-model-heading {
4754
+ display: flex;
4755
+ align-items: center;
4756
+ gap: 0.42rem;
4757
+ width: 100%;
4758
+ color: hsl(var(--brain-core));
4759
+ }
4760
+
4419
4761
  .ritual-model-card .role {
4420
4762
  font-size: 0.7rem;
4421
4763
  letter-spacing: 1px;
4422
4764
  text-transform: uppercase;
4423
4765
  color: hsl(var(--brain-core));
4424
- margin-bottom: 0.3rem;
4766
+ margin-bottom: 0;
4425
4767
  }
4426
4768
 
4427
4769
  .ritual-model-card .name {
4428
- font-size: 1.25rem;
4770
+ font-size: 1.15rem;
4429
4771
  font-weight: 650;
4430
4772
  }
4431
4773
 
4432
4774
  .ritual-model-card .reason {
4433
- font-size: 0.92rem;
4775
+ font-size: 0.9rem;
4434
4776
  color: hsl(var(--fg-muted));
4435
- margin-top: 0.25rem;
4777
+ margin-top: 0;
4778
+ }
4779
+
4780
+ .ritual-model-stats {
4781
+ margin-top: 0.1rem;
4782
+ }
4783
+
4784
+ .ritual-model-choose {
4785
+ display: inline-flex;
4786
+ align-items: center;
4787
+ gap: 0.25rem;
4788
+ margin-top: 0.2rem;
4789
+ color: hsl(var(--brain-core));
4790
+ font-weight: 780;
4436
4791
  }
4437
4792
 
4438
4793
  .ritual-model-warning {
@@ -4454,10 +4809,20 @@ body {
4454
4809
  margin-top: 1.1rem;
4455
4810
  }
4456
4811
 
4812
+ .ritual-button-row-primary {
4813
+ margin-top: 1.25rem;
4814
+ }
4815
+
4457
4816
  .ritual-muted-hint {
4458
4817
  font-size: 0.82rem;
4459
4818
  }
4460
4819
 
4820
+ .ritual-start-note {
4821
+ margin-top: 0.8rem;
4822
+ color: hsl(var(--fg-muted));
4823
+ font-size: 0.72rem;
4824
+ }
4825
+
4461
4826
  .ritual-install-brain {
4462
4827
  margin: 0.6rem auto 1rem;
4463
4828
  }
@@ -6211,44 +6576,4 @@ body {
6211
6576
  transform: translateX(-50%);
6212
6577
  }
6213
6578
 
6214
- /* Stronger first-impression UX polish for intuitive "want to use" */
6215
- .ritual-value-grid > div {
6216
- transition: transform 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
6217
- }
6218
- .ritual-value-grid > div:hover {
6219
- transform: translateY(-2px);
6220
- border-color: hsl(var(--brain-core) / 0.65);
6221
- box-shadow: 0 4px 14px hsl(var(--brain-core) / 0.08);
6222
- }
6223
- .ritual-full-button {
6224
- background: linear-gradient(90deg, hsl(var(--brain-core)), hsl(var(--accent)));
6225
- color: hsl(var(--bg));
6226
- border: none;
6227
- border-radius: 999px;
6228
- font-weight: 700;
6229
- padding: 0.75rem 1.8rem;
6230
- box-shadow: 0 2px 8px hsl(var(--brain-core) / 0.35);
6231
- transition: transform 120ms ease, box-shadow 120ms ease;
6232
- }
6233
- .ritual-full-button:hover {
6234
- transform: translateY(-1px) scale(1.01);
6235
- box-shadow: 0 6px 18px hsl(var(--brain-core) / 0.45);
6236
- }
6237
- .ritual-model-card {
6238
- position: relative;
6239
- overflow: hidden;
6240
- }
6241
- .ritual-model-card::after {
6242
- content: "";
6243
- position: absolute;
6244
- top: -50%;
6245
- left: -100%;
6246
- width: 40%;
6247
- height: 200%;
6248
- background: linear-gradient(120deg, transparent, hsl(var(--brain-core)/0.12), transparent);
6249
- transition: left 420ms ease;
6250
- }
6251
- .ritual-model-card:hover::after {
6252
- left: 250%;
6253
- }
6254
6579
  }
@@ -26,7 +26,7 @@ from .storage import (
26
26
  storage_from_env,
27
27
  )
28
28
 
29
- __version__ = "7.7.0"
29
+ __version__ = "7.9.0"
30
30
 
31
31
  __all__ = [
32
32
  "AgentRuntime",
@@ -44,9 +44,9 @@ orchestrator, and the agent runtime service. Lazy-loaded so importing
44
44
  /agents/api/runtime/* , POST /agents (start via runtime.start or executor)
45
45
  api/chat.py
46
46
  from latticeai.services.tool_dispatch import build_agent_runtime
47
- -> latticeai/core/agent.py:AgentRuntime (별도 state/plan/transcript 머신, single-agent /agent 경로. dispatch_tool 만 공유)
47
+ -> latticeai/core/agent.py:SingleAgentRuntime (별도 state/plan/transcript 머신, single-agent /agent 경로. dispatch_tool 만 공유)
48
48
  latticeai/services/tool_dispatch.py:14
49
- from latticeai.core.agent import AgentRuntime as CoreAgentRuntime
49
+ from latticeai.core.agent import SingleAgentRuntime
50
50
  (tool governance + core single-agent용)
51
51
  latticeai/services/platform_runtime.py
52
52
  from lattice_brain.runtime.{hooks, multi_agent}
@@ -54,6 +54,7 @@ orchestrator, and the agent runtime service. Lazy-loaded so importing
54
54
 
55
55
  core/tool_registry.py (신규) + services/tool_dispatch.py 가 tool build 주도.
56
56
  lattice_brain/runtime 는 multi-agent + hooks + facade 에 집중. core/agent 는 chat/agent 단일 루프.
57
+ 기존 latticeai.core.agent.AgentRuntime import 는 SingleAgentRuntime 호환 alias 로 유지.
57
58
 
58
59
  이 매핑으로 중복 제거 및 wiring 명확화 완료 (feat(Act, automation) 방향).
59
60
  """
@@ -64,6 +65,7 @@ __all__ = [
64
65
  "AgentRuntime",
65
66
  "AgentRuntimeUnavailable",
66
67
  "MultiAgentOrchestrator",
68
+ "RuntimeBoundaryProtocol",
67
69
  "HooksRegistry",
68
70
  "dispatch_tool",
69
71
  ]
@@ -78,6 +80,10 @@ def __getattr__(name: str):
78
80
  from .multi_agent import MultiAgentOrchestrator
79
81
 
80
82
  return MultiAgentOrchestrator
83
+ if name == "RuntimeBoundaryProtocol":
84
+ from .contracts import RuntimeBoundaryProtocol
85
+
86
+ return RuntimeBoundaryProtocol
81
87
  if name in {"HooksRegistry", "dispatch_tool"}:
82
88
  from . import hooks
83
89
 
@@ -37,7 +37,13 @@ from .multi_agent import (
37
37
  MULTI_AGENT_VERSION,
38
38
  ROLE_AGENT_IDS,
39
39
  )
40
- from .contracts import contract_view, contract_views, extract_contract, multi_agent_contract
40
+ from .contracts import (
41
+ contract_view,
42
+ contract_views,
43
+ extract_contract,
44
+ multi_agent_contract,
45
+ runtime_boundary_contract,
46
+ )
41
47
 
42
48
  ROLE_DESCRIPTIONS = {
43
49
  "researcher": "Gathers workspace context and memory for the goal.",
@@ -91,10 +97,20 @@ class AgentRuntime:
91
97
  def _execution_mode(self) -> str:
92
98
  return "async" if self._run_executor is not None else "synchronous"
93
99
 
100
+ def boundary(self) -> Dict[str, Any]:
101
+ return runtime_boundary_contract(
102
+ name="AgentRuntime",
103
+ runtime="multi_agent",
104
+ entrypoint="lattice_brain.runtime.agent_runtime.AgentRuntime",
105
+ surface="/agents",
106
+ owns="product agent execution, observability, status, health, events, replay, and stop",
107
+ )
108
+
94
109
  # ── configuration ─────────────────────────────────────────────────────
95
110
  def config(self) -> Dict[str, Any]:
96
111
  return {
97
112
  "version": MULTI_AGENT_VERSION,
113
+ "boundary": self.boundary(),
98
114
  "roles": list(AGENT_ROLES),
99
115
  "default_pipeline": list(CORE_PIPELINE),
100
116
  "max_retries_cap": self._max_retries_cap,