@salsita-ai/sdk 0.50.0-develop.9cf426b400 → 0.50.0-develop.aabb56df09

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 (110) hide show
  1. package/dist/application-spec/generate-application/code/templates/skills/phoenix-feedback-skill.js +1 -1
  2. package/dist/application-spec/generate-application/code/templates/skills/phoenix-skill.js +1 -1
  3. package/dist/application-spec/parse-application-files/spec/sections/assistant/assistant-schema.js +1 -1
  4. package/dist/configurator/application-runtime/extensions/selectors.js +1 -1
  5. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.d.ts +146 -13
  6. package/dist/configurator/application-runtime/extensions/systems/assistant-system/assistant-system.js +1 -1
  7. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.d.ts +85 -0
  8. package/dist/configurator/application-runtime/extensions/systems/assistant-system/change-recorder.js +1 -0
  9. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.d.ts +8 -3
  10. package/dist/configurator/application-runtime/extensions/systems/assistant-system/graphql-tools.js +1 -1
  11. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.d.ts +4 -0
  12. package/dist/configurator/application-runtime/extensions/systems/graphql-system/entity-meta.js +1 -1
  13. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.d.ts +16 -1
  14. package/dist/configurator/application-runtime/extensions/systems/graphql-system/graphql-system.js +1 -1
  15. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.d.ts +9 -0
  16. package/dist/configurator/application-runtime/extensions/systems/graphql-system/side-effects.js +1 -0
  17. package/dist/configurator/application-runtime/extensions/systems/index.d.ts +1 -1
  18. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.d.ts +2 -0
  19. package/dist/configurator/application-runtime/extensions/systems/layout-system/layout-system.js +1 -1
  20. package/dist/configurator/common/frontend-analytics.d.ts +21 -21
  21. package/dist/configurator/index.d.ts +0 -1
  22. package/dist/configurator/index.js +1 -1
  23. package/dist/configurator/pages/LoadedConfiguratorDetailPage.js +1 -1
  24. package/dist/configurator/scene/scene-analytics/scene-analytics.d.ts +2 -2
  25. package/dist/configurator/ui/assistant/AssistantChips.d.ts +11 -0
  26. package/dist/configurator/ui/assistant/AssistantChips.js +1 -0
  27. package/dist/configurator/ui/assistant/AssistantComposer.d.ts +6 -0
  28. package/dist/configurator/ui/assistant/AssistantComposer.js +1 -0
  29. package/dist/configurator/ui/assistant/AssistantMarkdown.d.ts +7 -0
  30. package/dist/configurator/ui/assistant/AssistantMarkdown.js +1 -0
  31. package/dist/configurator/ui/assistant/AssistantPanel.d.ts +11 -0
  32. package/dist/configurator/ui/assistant/AssistantPanel.js +1 -0
  33. package/dist/configurator/ui/assistant/AssistantThread.d.ts +6 -0
  34. package/dist/configurator/ui/assistant/AssistantThread.js +1 -0
  35. package/dist/configurator/ui/assistant/assistant-failure.d.ts +18 -0
  36. package/dist/configurator/ui/assistant/assistant-failure.js +1 -0
  37. package/dist/configurator/ui/assistant/index.d.ts +2 -0
  38. package/dist/configurator/ui/assistant/index.js +1 -0
  39. package/dist/configurator/ui/assistant/streamed-markdown.d.ts +6 -0
  40. package/dist/configurator/ui/assistant/streamed-markdown.js +2 -0
  41. package/dist/configurator/ui/assistant/theme.d.ts +2 -0
  42. package/dist/configurator/ui/assistant/theme.js +1 -0
  43. package/dist/configurator/ui/assistant/thread-items.d.ts +37 -0
  44. package/dist/configurator/ui/assistant/thread-items.js +1 -0
  45. package/dist/configurator/ui/assistant/tool-chip.d.ts +37 -0
  46. package/dist/configurator/ui/assistant/tool-chip.js +1 -0
  47. package/dist/configurator/ui/assistant/use-follow-stream.d.ts +17 -0
  48. package/dist/configurator/ui/assistant/use-follow-stream.js +1 -0
  49. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.d.ts +5 -0
  50. package/dist/configurator/ui/assistant/use-is-assistant-panel-open.js +1 -0
  51. package/dist/configurator/ui/configurator-layout/universal/DesktopLayout.js +5 -5
  52. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.d.ts +2 -0
  53. package/dist/configurator/ui/configurator-layout/universal/MobileLayout.js +4 -4
  54. package/dist/configurator/ui/legacy/mobile-controls/MobileControls.d.ts +1 -1
  55. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.d.ts +10 -0
  56. package/dist/configurator/ui/phoenix-layout-elements/AssistantToolbarButton.js +1 -0
  57. package/dist/configurator/ui/phoenix-layout-elements/index.d.ts +1 -0
  58. package/dist/configurator/ui/phoenix-layout-elements/index.js +1 -1
  59. package/dist/docs/index.json +1 -1
  60. package/dist/docs/layouts/toolbar.mdx +6 -0
  61. package/dist/docs/other-features/side-effects.mdx +26 -0
  62. package/dist/docs/phoenix/phoenix-cli.mdx +1 -1
  63. package/dist/domain/components/updates.d.ts +16 -0
  64. package/dist/domain/domain-context/index.d.ts +1 -1
  65. package/dist/domain/domain-context/store-system/store-system.js +1 -1
  66. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.d.ts +44 -0
  67. package/dist/domain/system-components/phoenix-layout-elements/assistant-toolbar-button.js +1 -0
  68. package/dist/domain/system-components/phoenix-layout-elements/index.d.ts +1 -0
  69. package/dist/domain/system-components/phoenix-layout-elements/index.js +1 -1
  70. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.d.ts +2 -1
  71. package/dist/domain/system-components/phoenix-layout-elements/phoenix-layout-element.js +1 -1
  72. package/dist/editor/graphql/GraphQLPanel.js +1 -1
  73. package/dist/i18n/locales/cs/messages.js +1 -1
  74. package/dist/i18n/locales/da/messages.js +1 -1
  75. package/dist/i18n/locales/de/messages.js +1 -1
  76. package/dist/i18n/locales/de-AT/messages.js +1 -1
  77. package/dist/i18n/locales/en/messages.js +1 -1
  78. package/dist/i18n/locales/en-AU/messages.js +1 -1
  79. package/dist/i18n/locales/en-GB/messages.js +1 -1
  80. package/dist/i18n/locales/es/messages.js +1 -1
  81. package/dist/i18n/locales/fr/messages.js +1 -1
  82. package/dist/i18n/locales/hu/messages.js +1 -1
  83. package/dist/i18n/locales/it/messages.js +1 -1
  84. package/dist/i18n/locales/nl/messages.js +1 -1
  85. package/dist/i18n/locales/pl/messages.js +1 -1
  86. package/dist/i18n/locales/pt/messages.js +1 -1
  87. package/dist/i18n/locales/ro/messages.js +1 -1
  88. package/dist/i18n/locales/sk/messages.js +1 -1
  89. package/dist/i18n/locales/tr/messages.js +1 -1
  90. package/dist/legacy/domain-spec/__generated/domain-schema.d.ts +6 -0
  91. package/dist/phoenix/application-spec/generate-assistant-prompt.d.ts +3 -2
  92. package/dist/phoenix/application-spec/generate-assistant-prompt.js +1 -1
  93. package/dist/phoenix/commands/deploy.js +2 -2
  94. package/dist/react-sdk/application-runtime/common-services/analytics/analytics-service.d.ts +2 -2
  95. package/dist/react-sdk/application-runtime/common-services/analytics/domain-controls-analytics.d.ts +21 -21
  96. package/dist/react-sdk/application-runtime/hooks/data/use-published-data.d.ts +1 -1
  97. package/dist/ui-sdk/common/use-viewport-size.d.ts +4 -1
  98. package/dist/ui-sdk/common/use-viewport-size.js +1 -1
  99. package/dist/ui-sdk/components/mobile-controls/index.d.ts +1 -1
  100. package/dist/ui-sdk/theme/types.d.ts +4 -0
  101. package/package.json +5 -8
  102. package/schema/domain-spec.json +24 -0
  103. package/dist/configurator/assistant/index.d.ts +0 -1
  104. package/dist/configurator/assistant/index.js +0 -1
  105. package/dist/configurator/assistant/use-assistant-chat.d.ts +0 -20
  106. package/dist/configurator/assistant/use-assistant-chat.js +0 -1
  107. package/dist/extras/assistant/AssistantChat.d.ts +0 -6
  108. package/dist/extras/assistant/AssistantChat.js +0 -1
  109. package/dist/extras/assistant/index.d.ts +0 -1
  110. package/dist/extras/assistant/index.js +0 -1
@@ -1 +1 @@
1
- export const messages=JSON.parse('{"sdk.admin.error.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.admin.error.system.message":["Şu anda teknik zorluklar yaşıyoruz. L\xfctfen birka\xe7 dakika sonra tekrar deneyin. Sabrınız i\xe7in teşekk\xfcrler!"],"sdk.admin.error.system.title":["Sistem hatası"],"sdk.angleDimension.hintMessageTooLarge":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen maksimum değer olan ",["limitWithUnit"]," değerinden b\xfcy\xfckt\xfcr."],"sdk.angleDimension.hintMessageTooSmall":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen minimum değer olan ",["limitWithUnit"]," değerinden k\xfc\xe7\xfckt\xfcr."],"sdk.chat.disclaimer.close.label":["Kapat"],"sdk.chat.disclaimer.dialog.title":["Asistan bildirimi"],"sdk.chat.disclaimer.full.message":["<0>Aşağıdaki sorumluluk reddi, bu web sitesinde bulunan AI chatbot\'un sınırlamaları ve kullanım y\xf6nergeleri hakkında kullanıcıları bilgilendirmek amacıyla hazırlanmıştır. Chatbot ile etkileşime ge\xe7meden \xf6nce l\xfctfen bu sorumluluk reddini dikkatlice okuyun.</0><1><2>Genel Bilgiler:</2> AI chatbot, OpenAI/ChatGPT tarafından desteklenen otomatik bir sistemdir. Bu web sitesinde sunulan \xfcr\xfcnler hakkında mevcut bilgilere dayanarak bilgi ve yardım sağlamak \xfczere tasarlanmıştır. AI chatbot aracılığıyla doğru bilgi sağlamaya \xe7alışsak da, sağlanan bilgilerin doğruluğunu, eksiksizliğini veya g\xfcncelliğini garanti edemeyiz. Yanıtları başlangı\xe7 noktası olarak kullanmanızı ve yanıtları bu bilgilerin sağlayıcısı (bu web sitesinin sahibi) veya mevcut \xfcr\xfcn belgelerinde doğrulamanızı \xf6neririz.</1><3><4>Kullanıcı Sorumluluğu:</4> AI chatbot kullanıcıları, etkileşimleri ve sağlanan bilgilere g\xfcvenmeleri konusunda tam sorumluluk taşırlar. Chatbot\'un yanıtlarını yorumlarken ve bunlara g\xf6re hareket ederken dikkatli olmak ve kendi takdirinizi kullanmak \xf6nemlidir. Bu web sitesinin sahibi veya chatbot teknolojisinin sağlayıcısı, chatbot kullanımından kaynaklanan eylemler, kayıplar veya zararlardan sorumlu tutulamaz.</3><5><6>Veri Gizliliği ve G\xfcvenliği:</6> Kullanıcı bilgilerinin gizliliğini ve g\xfcvenliğini \xf6nceliklendiriyoruz. Chatbot konuşmalarının sonu\xe7ları iyileştirmek i\xe7in bu web sitesinin sahibi ve teknoloji sağlayıcısı tarafından incelenebileceğini unutmayın. OpenAI/ChatGPT bu konuşmaların g\xfcnl\xfcklerini 30 g\xfcn boyunca saklarken, bu veriler AI modellerini eğitmek i\xe7in kullanılmaz. Konuşmalarınızda hassas veya kişisel bilgiler paylaşmayın.</5><7>Bu AI chatbot\'u kullanarak, yukarıdaki sorumluluk reddini kabul ettiğinizi ve anladığınızı belirtirsiniz. Bu sorumluluk reddinin herhangi bir b\xf6l\xfcm\xfcyle aynı fikirde değilseniz, chatbot\'u kullanmamanızı \xf6neririz.</7>"],"sdk.chat.disclaimer.inline.message":["Asistan deneyseldir ve yanlış bilgiler sağlayabilir."],"sdk.chat.disclaimer.seeMore.label":["Daha fazla bilgi"],"sdk.chat.header.desktop.title":["Asistan"],"sdk.chat.input.default.placeholder":["Mesaj yazın..."],"sdk.chat.input.footer.placeholder":["Mesaj yazın..."],"sdk.chat.mobile.assistant.label":["Asistan"],"sdk.chat.send.button.label":["Mesaj g\xf6nder"],"sdk.chat.system.error.message":["Asistanla iletişim kurarken bir hata oluştu. L\xfctfen tekrar deneyin."],"sdk.chat.welcome.greeting.message":["Merhaba! Ben sizin asistanınızım ve \xfcr\xfcn yapılandırması konusunda size yardımcı olacağım. Ne \xf6ğrenmek istersiniz?"],"sdk.collision.warning.tooltip":["\xd6ğeler \xe7ok yakın veya \xe7akışıyor"],"sdk.controls.dimension.angle.error":["Ge\xe7ersiz a\xe7ı"],"sdk.controls.dimension.angle.hint":["A\xe7ı girin"],"sdk.controls.dimension.angle.hintRange":["L\xfctfen ",["0"],["unitLabelWithSpace"]," ile ",["1"],["unitLabelWithSpace"]," arasında bir sayı girin."],"sdk.controls.dimension.angleSlider.error":["Ge\xe7ersiz a\xe7ı"],"sdk.controls.dimension.distance.error":["Ge\xe7ersiz mesafe"],"sdk.controls.dimension.distance.hint":["Mesafe girin"],"sdk.controls.dimension.distance.hintRange":["Mesafe ",["0"]," ile ",["1"]," arasında olmalıdır"],"sdk.controls.dimension.distanceSlider.error":["Ge\xe7ersiz mesafe"],"sdk.controls.dimension.generic.error":["Ge\xe7ersiz değer"],"sdk.controls.dimension.generic.hint":["Değer girin"],"sdk.controls.dimension.generic.hintRange":["Değer ",["min"]," ile ",["max"]," arasında olmalıdır"],"sdk.controls.dimension.genericSlider.error":["Ge\xe7ersiz değer"],"sdk.controls.dimension.indicator.apply":["Uygula"],"sdk.controls.dimension.indicator.cancel":["İptal"],"sdk.controls.dimension.offset.hint":["Ofset girin"],"sdk.controls.dimension.size.hint":["Boyut girin"],"sdk.controls.entity.add.close.label":["Kapat"],"sdk.controls.entity.add.nothingMessage":["Eklenecek bir şey yok"],"sdk.controls.entity.childDelete.label":["Sil"],"sdk.controls.entity.childSelect.label":["Se\xe7"],"sdk.controls.entity.delete.label":["Sil"],"sdk.controls.entity.replace.label":["Değiştir"],"sdk.controls.property.back.label":["Geri"],"sdk.controls.recipeGroup.notFound.message":["Bulunamadı"],"sdk.controls.recipeGroup.notFound.title":["Aradığınız grup artık mevcut değil. L\xfctfen başka bir grup se\xe7in."],"sdk.controls.tool.close.label":["Kapat"],"sdk.controls.units.feet.label":["ayak"],"sdk.controls.units.inch.label":["in\xe7"],"sdk.controls.upload.dragDrop.hint":["Dosyaları buraya s\xfcr\xfckleyin veya se\xe7mek i\xe7in tıklayın"],"sdk.controls.upload.failed.error":["Y\xfckleme başarısız"],"sdk.controls.upload.link.label":["Veya bir bağlantı yapıştırın"],"sdk.controls.upload.size.error":["Dosya \xe7ok b\xfcy\xfck"],"sdk.distanceDimension.hintMessageTooLarge":["Mevcut değer ",["0"]," olup, izin verilen maksimum değer olan ",["1"]," değerinden b\xfcy\xfckt\xfcr."],"sdk.distanceDimension.hintMessageTooSmall":["Mevcut değer ",["0"]," olup, izin verilen minimum değer olan ",["1"]," değerinden k\xfc\xe7\xfckt\xfcr."],"sdk.finalize.notConfigured.tooltip":["Tamamlama \xf6zelliği yapılandırılmamış."],"sdk.finalize.outOfSync.hint":["Yapılandırma senkronize değil. Bazı değişiklikler d\xfczg\xfcn şekilde kaydedilmedi."],"sdk.genericDimension.hintMessageTooLarge":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen maksimum değer olan ",["limitWithUnit"]," değerinden b\xfcy\xfckt\xfcr."],"sdk.genericDimension.hintMessageTooSmall":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen minimum değer olan ",["limitWithUnit"]," değerinden k\xfc\xe7\xfckt\xfcr."],"sdk.layout.banner.readonly.cancel.label":["İptal"],"sdk.layout.banner.readonly.clone.label":["D\xfczenlemek i\xe7in klonla"],"sdk.layout.banner.readonly.clone.message":["Bu yapılandırmanın d\xfczenleme i\xe7in bir kopyasını oluşturmak ister misiniz?"],"sdk.layout.banner.readonly.clone.title":["Yapılandırmayı klonla"],"sdk.layout.banner.readonly.editConfig.label":["Yapılandırmayı d\xfczenle"],"sdk.layout.banner.readonly.editMobile.label":["D\xfczenle"],"sdk.layout.banner.readonly.info.message":["Bu yapılandırma salt okunurdur. D\xfczenlemek i\xe7in bir kopya oluşturun."],"sdk.layout.button.closeConfigurator.label":["Yapılandırıcıyı kapat"],"sdk.layout.button.closePresetPreview.label":["\xd6nceden ayarlanmış \xf6nizlemeyi kapat"],"sdk.layout.button.desktopBack.label":["Geri"],"sdk.layout.button.desktopSidebarBack.label":["Geri"],"sdk.layout.button.mobileBack.label":["Geri"],"sdk.layout.button.mobileSidebarBack.label":["Geri"],"sdk.layout.button.presetBack.label":["Geri"],"sdk.layout.button.saveRecipe.label":["Tarifi kaydet"],"sdk.layout.button.saveTemplate.label":["Şablonu kaydet"],"sdk.layout.button.setTemplate.label":["Şablon olarak ayarla"],"sdk.layout.controls.mobile.view3d.label":["3D g\xf6r\xfcn\xfcm"],"sdk.layout.controls.mobile.viewOnly.message":["<0>Sadece g\xf6r\xfcnt\xfcleme modu.</0> Konfig\xfcrasyonu değiştirmek i\xe7in daha b\xfcy\xfck ekranlı bir cihaz kullanın."],"sdk.layout.controls.tablet.viewOnly.message":["<0>Sadece g\xf6r\xfcnt\xfcleme modu.</0> Konfig\xfcrasyonu değiştirmek i\xe7in daha b\xfcy\xfck ekranlı bir cihaz kullanın veya cihazınızın y\xf6n\xfcn\xfc değiştirmeyi deneyin."],"sdk.layout.finalize.moreActions":["More finalization options"],"sdk.layout.footer.price.label":["Toplam fiyat"],"sdk.layout.hamburgerMenu.language.dialogTitle":["Dil se\xe7in"],"sdk.layout.hamburgerMenu.language.label":["Dil"],"sdk.layout.menu.hamburger.close.label":["Kapat"],"sdk.layout.menu.hamburger.help.label":["Yardım"],"sdk.layout.menu.hamburger.help.label.closeButtonLabel":["Yardımı kapat"],"sdk.layout.menu.hamburger.share.label":["Paylaş"],"sdk.layout.menu.hamburger.title":["Men\xfc"],"sdk.layout.menu.hamburger.tooltip":["Men\xfcy\xfc a\xe7"],"sdk.layout.menu.language.close.label":["Kapat"],"sdk.layout.menu.measurements.close.label":["Kapat"],"sdk.layout.menu.measurements.label":["\xd6l\xe7\xfcmler"],"sdk.layout.navigation.common.product.label":["\xdcr\xfcn"],"sdk.layout.navigation.mobile.product.label":["\xdcr\xfcn"],"sdk.layout.navigation.steps.first.label":["İlk"],"sdk.layout.sidebar.disabledFinalizeButton.label":["Sonlandır"],"sdk.layout.sidebar.finalize.label":["Tamamla"],"sdk.layout.sidebar.finalizePage.label":["Tamamla"],"sdk.layout.sidebar.nextStep.label":["Sonraki adım"],"sdk.layout.sidebar.nextStepShort.label":["Sonraki"],"sdk.layout.sidebar.previousStep.label":["\xd6nceki adım"],"sdk.layout.sidebar.price.label":["Fiyat"],"sdk.layout.sidebar.totalPrice.label":["Toplam fiyat"],"sdk.layout.summary.button.label":["\xd6zet"],"sdk.layout.toolbar.mobile.tools.title":["Ara\xe7lar"],"sdk.layout.toolbar.mobile.units.label":["Birimler"],"sdk.measurements":["\xd6l\xe7\xfcmler"],"sdk.messages.error.configNotFound.message":["Yapılandırma bulunamadı. Silinmiş olabilir veya yanlış bir bağlantı girmiş olabilirsiniz."],"sdk.messages.error.configNotFound.title":["Yapılandırma bulunamadı"],"sdk.messages.error.configurator.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.messages.error.configurator.message":["Hay aksi, bir şeyler ters gitti! L\xfctfen tekrar deneyin veya destek ile iletişime ge\xe7in."],"sdk.messages.error.configurator.title":["Yapılandırıcı hatası"],"sdk.messages.error.configuratorRoot.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.messages.error.configuratorRoot.message":["Yapılandırıcı kullanılamıyor. L\xfctfen daha sonra tekrar deneyin."],"sdk.messages.error.configuratorRoot.title":["Yapılandırıcı kullanılamıyor"],"sdk.messages.error.gpuDisabled.message":["GPU hızlandırması devre dışı. Performans azalabilir. Daha iyi performans i\xe7in tarayıcı ayarlarınızda donanım hızlandırmasını etkinleştirin."],"sdk.messages.error.gpuDisabled.title":["GPU hızlandırması devre dışı"],"sdk.messages.error.notFound.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.messages.error.webglNotSupported.message":["Tarayıcınız 3D render i\xe7in gerekli olan WebGL\'yi desteklemiyor. L\xfctfen farklı bir tarayıcı kullanmayı deneyin veya mevcut olanı g\xfcncelleyin."],"sdk.messages.error.webglNotSupported.title":["WebGL desteklenmiyor"],"sdk.messages.finalize.error":["Oops, bir hata oluştu"],"sdk.messages.navigation.goToHomepage.label":["Ana sayfaya git"],"sdk.messages.otherAction.error":["Oops, bir hata oluştu"],"sdk.messages.system.invalidDeployment.close.label":["Kapat"],"sdk.messages.system.invalidDeployment.message":["Bu dağıtım ge\xe7ersiz veya silinmiş."],"sdk.messages.system.invalidDeployment.title":["Ge\xe7ersiz dağıtım"],"sdk.messages.validation.uncaughtError.message":["Beklenmeyen bir hata oluştu. L\xfctfen tekrar deneyin."],"sdk.persist.system.error.dismiss":["Kapat"],"sdk.persist.system.error.message":["Bir yapılandırmayı g\xfcncellemeye \xe7alışırken bir hata oluştu"],"sdk.persist.system.error.recovered":["Yapılandırma g\xfcncellendi"],"sdk.presets.category.count.message":[["count"]," \xf6nceden ayarlanmış"],"sdk.presets.category.heading.title":["Kategoriler"],"sdk.presets.create.error.dismiss.label":["Kapat"],"sdk.presets.create.error.message":["Bu hazır ayardan yapılandırma başlatılamadı. L\xfctfen tekrar deneyin."],"sdk.presets.detail.close.label":["Kapat"],"sdk.presets.detail.learnMore.label":["Daha fazla bilgi"],"sdk.presets.detail.select.label":["Se\xe7"],"sdk.presets.preview.title":["\xd6nizleme"],"sdk.presets.select.button.label":["Se\xe7"],"sdk.presets.start.button.label":["Başla"],"sdk.preview.customize.title":["\xd6zelleştir"],"sdk.preview.start.button.label":["Başla"],"sdk.sketching.angle.apply.label":["Uygula"],"sdk.sketching.angle.cancel.label":["İptal"],"sdk.sketching.angle.control.label":["A\xe7ı"],"sdk.sketching.angle.control.text":["A\xe7ıyı ayarla"],"sdk.sketching.angle.control.title":["A\xe7ı belirle"],"sdk.sketching.angle.input.error":["L\xfctfen ge\xe7erli bir sayı girin!"],"sdk.sketching.dimension.apply.label":["Uygula"],"sdk.sketching.dimension.cancel.label":["İptal"],"sdk.sketching.dimension.depth.label":["Derinlik"],"sdk.sketching.dimension.depth.text":["Derinliği ayarla"],"sdk.sketching.dimension.depth.title":["Derinlik belirle"],"sdk.sketching.dimension.input.error":["L\xfctfen ge\xe7erli bir sayı girin!"],"sdk.sketching.dimension.length.label":["Uzunluk"],"sdk.sketching.dimension.length.text":["Uzunluğu ayarla"],"sdk.sketching.dimension.length.title":["Uzunluk belirle"],"sdk.sketching.dimension.width.label":["Genişlik"],"sdk.sketching.dimension.width.text":["Genişliği ayarla"],"sdk.sketching.dimension.width.title":["Genişlik belirle"],"sdk.sketching.draw.done.label":["Tamam"],"sdk.sketching.spotlight.label":["\xc7izime başlamak i\xe7in tıklayın"],"sdk.toolbar.actions.undoRedo.label":["Geri Al/Yinele"],"sdk.toolbar.camera.reset.label":["Kamerayı sıfırla"],"sdk.toolbar.camera.reset.labelAriaLabel":["Kamerayı varsayılan konuma sıfırla"],"sdk.toolbar.fullscreen.enter.label":["Tam ekran"],"sdk.toolbar.fullscreen.exit.label":["Tam ekrandan \xe7ık"],"sdk.toolbar.help.close.label":["Yardımı kapat"],"sdk.toolbar.help.label":["Yardım"],"sdk.toolbar.language.title":["Dil"],"sdk.toolbar.measurements.change.aria":["\xd6l\xe7\xfcmleri değiştir"],"sdk.toolbar.measurements.indicators.label":["\xd6l\xe7\xfcm g\xf6stergeleri"],"sdk.toolbar.measurements.input.aria":["\xd6l\xe7\xfcm girişini değiştir"],"sdk.toolbar.measurements.units.aria":["\xd6l\xe7\xfcm birimlerini değiştir"],"sdk.toolbar.mobile.fullscreen.enter.label":["Tam ekran"],"sdk.toolbar.mobile.fullscreen.exit.label":["Tam ekrandan \xe7ık"],"sdk.toolbar.mobile.fullscreen.title":["Tam ekran"],"sdk.toolbar.mobile.open.aria":["Mobil ara\xe7ları a\xe7"],"sdk.toolbar.mobile.viewControls.label":["G\xf6r\xfcn\xfcm kontrolleri"],"sdk.toolbar.share.allowEdit.label":["D\xfczenlemeye izin ver"],"sdk.toolbar.share.allowEditShort.label":["D\xfczenleme"],"sdk.toolbar.share.close.label":["Kapat"],"sdk.toolbar.share.copiedLinkButtonTitle":["Bağlantı kopyalandı"],"sdk.toolbar.share.copyLink.label":["Bağlantıyı kopyala"],"sdk.toolbar.share.copyLinkButtonTitle":["Bağlantıyı kopyala"],"sdk.toolbar.share.input.aria":["Paylaşım bağlantısı girişi"],"sdk.toolbar.share.label":["Paylaş"],"sdk.toolbar.share.linkCopied.label":["Bağlantı kopyalandı"],"sdk.toolbar.share.loading.label":["Y\xfckleniyor..."],"sdk.toolbar.share.open.label":["A\xe7"],"sdk.toolbar.share.section.label":["Paylaş"],"sdk.toolbar.undoRedo.redo.label":["Yinele"],"sdk.toolbar.undoRedo.undo.label":["Geri Al"],"sdk.toolbar.viewControls.title":["G\xf6r\xfcn\xfcm kontrolleri"],"sdk.totalPrice":["Toplam fiyat"]}');
1
+ export const messages=JSON.parse('{"sdk.admin.error.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.admin.error.system.message":["Şu anda teknik zorluklar yaşıyoruz. L\xfctfen birka\xe7 dakika sonra tekrar deneyin. Sabrınız i\xe7in teşekk\xfcrler!"],"sdk.admin.error.system.title":["Sistem hatası"],"sdk.angleDimension.hintMessageTooLarge":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen maksimum değer olan ",["limitWithUnit"]," değerinden b\xfcy\xfckt\xfcr."],"sdk.angleDimension.hintMessageTooSmall":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen minimum değer olan ",["limitWithUnit"]," değerinden k\xfc\xe7\xfckt\xfcr."],"sdk.assistant.composer.disclaimer":["Yapay zek\xe2 yanılabilir. Sonucu kontrol edin."],"sdk.assistant.composer.notContinuable":["Bu konuşma burada okunabilir, ancak artık s\xfcrd\xfcr\xfclemez."],"sdk.assistant.composer.placeholder":["Sorun veya neyi değiştireceğimi s\xf6yleyin…"],"sdk.assistant.composer.send.label":["G\xf6nder"],"sdk.assistant.composer.stop.label":["Durdur"],"sdk.assistant.failure.busy":["Asistan h\xe2l\xe2 \xf6nceki bir mesaj \xfczerinde \xe7alışıyor."],"sdk.assistant.failure.notAvailable":["Asistan burada kullanılamıyor."],"sdk.assistant.failure.retry.label":["Tekrar dene"],"sdk.assistant.failure.unavailable":["Asistan şu anda kullanılamıyor."],"sdk.assistant.panel.close.label":["Asistanı kapat"],"sdk.assistant.panel.title":["Asistan"],"sdk.assistant.thread.greeting":["Merhaba. Bu tasarımla ilgili soruları yanıtlayabilir ve onu sizinle birlikte değiştirebilirim. Neye ihtiyacınız olduğunu s\xf6yleyin."],"sdk.assistant.thread.newReply.label":["Yeni yanıt"],"sdk.assistant.thread.thinking":["D\xfcş\xfcn\xfcyor…"],"sdk.assistant.tool.mistake.hint":["Asistan bir hata yaptı."],"sdk.assistant.tool.readDesign.label":["Tasarımı oku"],"sdk.assistant.tool.updateDesign.label":["Tasarımı g\xfcncelle"],"sdk.assistant.toolbarButton.label":["Asistan"],"sdk.chat.disclaimer.close.label":["Kapat"],"sdk.chat.disclaimer.dialog.title":["Asistan bildirimi"],"sdk.chat.disclaimer.full.message":["<0>Aşağıdaki sorumluluk reddi, bu web sitesinde bulunan AI chatbot\'un sınırlamaları ve kullanım y\xf6nergeleri hakkında kullanıcıları bilgilendirmek amacıyla hazırlanmıştır. Chatbot ile etkileşime ge\xe7meden \xf6nce l\xfctfen bu sorumluluk reddini dikkatlice okuyun.</0><1><2>Genel Bilgiler:</2> AI chatbot, OpenAI/ChatGPT tarafından desteklenen otomatik bir sistemdir. Bu web sitesinde sunulan \xfcr\xfcnler hakkında mevcut bilgilere dayanarak bilgi ve yardım sağlamak \xfczere tasarlanmıştır. AI chatbot aracılığıyla doğru bilgi sağlamaya \xe7alışsak da, sağlanan bilgilerin doğruluğunu, eksiksizliğini veya g\xfcncelliğini garanti edemeyiz. Yanıtları başlangı\xe7 noktası olarak kullanmanızı ve yanıtları bu bilgilerin sağlayıcısı (bu web sitesinin sahibi) veya mevcut \xfcr\xfcn belgelerinde doğrulamanızı \xf6neririz.</1><3><4>Kullanıcı Sorumluluğu:</4> AI chatbot kullanıcıları, etkileşimleri ve sağlanan bilgilere g\xfcvenmeleri konusunda tam sorumluluk taşırlar. Chatbot\'un yanıtlarını yorumlarken ve bunlara g\xf6re hareket ederken dikkatli olmak ve kendi takdirinizi kullanmak \xf6nemlidir. Bu web sitesinin sahibi veya chatbot teknolojisinin sağlayıcısı, chatbot kullanımından kaynaklanan eylemler, kayıplar veya zararlardan sorumlu tutulamaz.</3><5><6>Veri Gizliliği ve G\xfcvenliği:</6> Kullanıcı bilgilerinin gizliliğini ve g\xfcvenliğini \xf6nceliklendiriyoruz. Chatbot konuşmalarının sonu\xe7ları iyileştirmek i\xe7in bu web sitesinin sahibi ve teknoloji sağlayıcısı tarafından incelenebileceğini unutmayın. OpenAI/ChatGPT bu konuşmaların g\xfcnl\xfcklerini 30 g\xfcn boyunca saklarken, bu veriler AI modellerini eğitmek i\xe7in kullanılmaz. Konuşmalarınızda hassas veya kişisel bilgiler paylaşmayın.</5><7>Bu AI chatbot\'u kullanarak, yukarıdaki sorumluluk reddini kabul ettiğinizi ve anladığınızı belirtirsiniz. Bu sorumluluk reddinin herhangi bir b\xf6l\xfcm\xfcyle aynı fikirde değilseniz, chatbot\'u kullanmamanızı \xf6neririz.</7>"],"sdk.chat.disclaimer.inline.message":["Asistan deneyseldir ve yanlış bilgiler sağlayabilir."],"sdk.chat.disclaimer.seeMore.label":["Daha fazla bilgi"],"sdk.chat.header.desktop.title":["Asistan"],"sdk.chat.input.default.placeholder":["Mesaj yazın..."],"sdk.chat.input.footer.placeholder":["Mesaj yazın..."],"sdk.chat.mobile.assistant.label":["Asistan"],"sdk.chat.send.button.label":["Mesaj g\xf6nder"],"sdk.chat.system.error.message":["Asistanla iletişim kurarken bir hata oluştu. L\xfctfen tekrar deneyin."],"sdk.chat.welcome.greeting.message":["Merhaba! Ben sizin asistanınızım ve \xfcr\xfcn yapılandırması konusunda size yardımcı olacağım. Ne \xf6ğrenmek istersiniz?"],"sdk.collision.warning.tooltip":["\xd6ğeler \xe7ok yakın veya \xe7akışıyor"],"sdk.controls.dimension.angle.error":["Ge\xe7ersiz a\xe7ı"],"sdk.controls.dimension.angle.hint":["A\xe7ı girin"],"sdk.controls.dimension.angle.hintRange":["L\xfctfen ",["0"],["unitLabelWithSpace"]," ile ",["1"],["unitLabelWithSpace"]," arasında bir sayı girin."],"sdk.controls.dimension.angleSlider.error":["Ge\xe7ersiz a\xe7ı"],"sdk.controls.dimension.distance.error":["Ge\xe7ersiz mesafe"],"sdk.controls.dimension.distance.hint":["Mesafe girin"],"sdk.controls.dimension.distance.hintRange":["Mesafe ",["0"]," ile ",["1"]," arasında olmalıdır"],"sdk.controls.dimension.distanceSlider.error":["Ge\xe7ersiz mesafe"],"sdk.controls.dimension.generic.error":["Ge\xe7ersiz değer"],"sdk.controls.dimension.generic.hint":["Değer girin"],"sdk.controls.dimension.generic.hintRange":["Değer ",["min"]," ile ",["max"]," arasında olmalıdır"],"sdk.controls.dimension.genericSlider.error":["Ge\xe7ersiz değer"],"sdk.controls.dimension.indicator.apply":["Uygula"],"sdk.controls.dimension.indicator.cancel":["İptal"],"sdk.controls.dimension.offset.hint":["Ofset girin"],"sdk.controls.dimension.size.hint":["Boyut girin"],"sdk.controls.entity.add.close.label":["Kapat"],"sdk.controls.entity.add.nothingMessage":["Eklenecek bir şey yok"],"sdk.controls.entity.childDelete.label":["Sil"],"sdk.controls.entity.childSelect.label":["Se\xe7"],"sdk.controls.entity.delete.label":["Sil"],"sdk.controls.entity.replace.label":["Değiştir"],"sdk.controls.property.back.label":["Geri"],"sdk.controls.recipeGroup.notFound.message":["Bulunamadı"],"sdk.controls.recipeGroup.notFound.title":["Aradığınız grup artık mevcut değil. L\xfctfen başka bir grup se\xe7in."],"sdk.controls.tool.close.label":["Kapat"],"sdk.controls.units.feet.label":["ayak"],"sdk.controls.units.inch.label":["in\xe7"],"sdk.controls.upload.dragDrop.hint":["Dosyaları buraya s\xfcr\xfckleyin veya se\xe7mek i\xe7in tıklayın"],"sdk.controls.upload.failed.error":["Y\xfckleme başarısız"],"sdk.controls.upload.link.label":["Veya bir bağlantı yapıştırın"],"sdk.controls.upload.size.error":["Dosya \xe7ok b\xfcy\xfck"],"sdk.distanceDimension.hintMessageTooLarge":["Mevcut değer ",["0"]," olup, izin verilen maksimum değer olan ",["1"]," değerinden b\xfcy\xfckt\xfcr."],"sdk.distanceDimension.hintMessageTooSmall":["Mevcut değer ",["0"]," olup, izin verilen minimum değer olan ",["1"]," değerinden k\xfc\xe7\xfckt\xfcr."],"sdk.finalize.notConfigured.tooltip":["Tamamlama \xf6zelliği yapılandırılmamış."],"sdk.finalize.outOfSync.hint":["Yapılandırma senkronize değil. Bazı değişiklikler d\xfczg\xfcn şekilde kaydedilmedi."],"sdk.genericDimension.hintMessageTooLarge":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen maksimum değer olan ",["limitWithUnit"]," değerinden b\xfcy\xfckt\xfcr."],"sdk.genericDimension.hintMessageTooSmall":["Mevcut değer ",["currentWithUnit"]," olup, izin verilen minimum değer olan ",["limitWithUnit"]," değerinden k\xfc\xe7\xfckt\xfcr."],"sdk.layout.banner.readonly.cancel.label":["İptal"],"sdk.layout.banner.readonly.clone.label":["D\xfczenlemek i\xe7in klonla"],"sdk.layout.banner.readonly.clone.message":["Bu yapılandırmanın d\xfczenleme i\xe7in bir kopyasını oluşturmak ister misiniz?"],"sdk.layout.banner.readonly.clone.title":["Yapılandırmayı klonla"],"sdk.layout.banner.readonly.editConfig.label":["Yapılandırmayı d\xfczenle"],"sdk.layout.banner.readonly.editMobile.label":["D\xfczenle"],"sdk.layout.banner.readonly.info.message":["Bu yapılandırma salt okunurdur. D\xfczenlemek i\xe7in bir kopya oluşturun."],"sdk.layout.button.closeConfigurator.label":["Yapılandırıcıyı kapat"],"sdk.layout.button.closePresetPreview.label":["\xd6nceden ayarlanmış \xf6nizlemeyi kapat"],"sdk.layout.button.desktopBack.label":["Geri"],"sdk.layout.button.desktopSidebarBack.label":["Geri"],"sdk.layout.button.mobileBack.label":["Geri"],"sdk.layout.button.mobileSidebarBack.label":["Geri"],"sdk.layout.button.presetBack.label":["Geri"],"sdk.layout.button.saveRecipe.label":["Tarifi kaydet"],"sdk.layout.button.saveTemplate.label":["Şablonu kaydet"],"sdk.layout.button.setTemplate.label":["Şablon olarak ayarla"],"sdk.layout.controls.mobile.view3d.label":["3D g\xf6r\xfcn\xfcm"],"sdk.layout.controls.mobile.viewOnly.message":["<0>Sadece g\xf6r\xfcnt\xfcleme modu.</0> Konfig\xfcrasyonu değiştirmek i\xe7in daha b\xfcy\xfck ekranlı bir cihaz kullanın."],"sdk.layout.controls.tablet.viewOnly.message":["<0>Sadece g\xf6r\xfcnt\xfcleme modu.</0> Konfig\xfcrasyonu değiştirmek i\xe7in daha b\xfcy\xfck ekranlı bir cihaz kullanın veya cihazınızın y\xf6n\xfcn\xfc değiştirmeyi deneyin."],"sdk.layout.finalize.moreActions":["More finalization options"],"sdk.layout.footer.price.label":["Toplam fiyat"],"sdk.layout.hamburgerMenu.language.dialogTitle":["Dil se\xe7in"],"sdk.layout.hamburgerMenu.language.label":["Dil"],"sdk.layout.menu.hamburger.close.label":["Kapat"],"sdk.layout.menu.hamburger.help.label":["Yardım"],"sdk.layout.menu.hamburger.help.label.closeButtonLabel":["Yardımı kapat"],"sdk.layout.menu.hamburger.share.label":["Paylaş"],"sdk.layout.menu.hamburger.title":["Men\xfc"],"sdk.layout.menu.hamburger.tooltip":["Men\xfcy\xfc a\xe7"],"sdk.layout.menu.language.close.label":["Kapat"],"sdk.layout.menu.measurements.close.label":["Kapat"],"sdk.layout.menu.measurements.label":["\xd6l\xe7\xfcmler"],"sdk.layout.navigation.common.product.label":["\xdcr\xfcn"],"sdk.layout.navigation.mobile.product.label":["\xdcr\xfcn"],"sdk.layout.navigation.steps.first.label":["İlk"],"sdk.layout.sidebar.disabledFinalizeButton.label":["Sonlandır"],"sdk.layout.sidebar.finalize.label":["Tamamla"],"sdk.layout.sidebar.finalizePage.label":["Tamamla"],"sdk.layout.sidebar.nextStep.label":["Sonraki adım"],"sdk.layout.sidebar.nextStepShort.label":["Sonraki"],"sdk.layout.sidebar.previousStep.label":["\xd6nceki adım"],"sdk.layout.sidebar.price.label":["Fiyat"],"sdk.layout.sidebar.totalPrice.label":["Toplam fiyat"],"sdk.layout.summary.button.label":["\xd6zet"],"sdk.layout.toolbar.mobile.tools.title":["Ara\xe7lar"],"sdk.layout.toolbar.mobile.units.label":["Birimler"],"sdk.measurements":["\xd6l\xe7\xfcmler"],"sdk.messages.error.configNotFound.message":["Yapılandırma bulunamadı. Silinmiş olabilir veya yanlış bir bağlantı girmiş olabilirsiniz."],"sdk.messages.error.configNotFound.title":["Yapılandırma bulunamadı"],"sdk.messages.error.configurator.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.messages.error.configurator.message":["Hay aksi, bir şeyler ters gitti! L\xfctfen tekrar deneyin veya destek ile iletişime ge\xe7in."],"sdk.messages.error.configurator.title":["Yapılandırıcı hatası"],"sdk.messages.error.configuratorRoot.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.messages.error.configuratorRoot.message":["Yapılandırıcı kullanılamıyor. L\xfctfen daha sonra tekrar deneyin."],"sdk.messages.error.configuratorRoot.title":["Yapılandırıcı kullanılamıyor"],"sdk.messages.error.gpuDisabled.message":["GPU hızlandırması devre dışı. Performans azalabilir. Daha iyi performans i\xe7in tarayıcı ayarlarınızda donanım hızlandırmasını etkinleştirin."],"sdk.messages.error.gpuDisabled.title":["GPU hızlandırması devre dışı"],"sdk.messages.error.notFound.backToHome.label":["Ana sayfaya d\xf6n"],"sdk.messages.error.webglNotSupported.message":["Tarayıcınız 3D render i\xe7in gerekli olan WebGL\'yi desteklemiyor. L\xfctfen farklı bir tarayıcı kullanmayı deneyin veya mevcut olanı g\xfcncelleyin."],"sdk.messages.error.webglNotSupported.title":["WebGL desteklenmiyor"],"sdk.messages.finalize.error":["Oops, bir hata oluştu"],"sdk.messages.navigation.goToHomepage.label":["Ana sayfaya git"],"sdk.messages.otherAction.error":["Oops, bir hata oluştu"],"sdk.messages.system.invalidDeployment.close.label":["Kapat"],"sdk.messages.system.invalidDeployment.message":["Bu dağıtım ge\xe7ersiz veya silinmiş."],"sdk.messages.system.invalidDeployment.title":["Ge\xe7ersiz dağıtım"],"sdk.messages.validation.uncaughtError.message":["Beklenmeyen bir hata oluştu. L\xfctfen tekrar deneyin."],"sdk.persist.system.error.dismiss":["Kapat"],"sdk.persist.system.error.message":["Bir yapılandırmayı g\xfcncellemeye \xe7alışırken bir hata oluştu"],"sdk.persist.system.error.recovered":["Yapılandırma g\xfcncellendi"],"sdk.presets.category.count.message":[["count"]," \xf6nceden ayarlanmış"],"sdk.presets.category.heading.title":["Kategoriler"],"sdk.presets.create.error.dismiss.label":["Kapat"],"sdk.presets.create.error.message":["Bu hazır ayardan yapılandırma başlatılamadı. L\xfctfen tekrar deneyin."],"sdk.presets.detail.close.label":["Kapat"],"sdk.presets.detail.learnMore.label":["Daha fazla bilgi"],"sdk.presets.detail.select.label":["Se\xe7"],"sdk.presets.preview.title":["\xd6nizleme"],"sdk.presets.select.button.label":["Se\xe7"],"sdk.presets.start.button.label":["Başla"],"sdk.preview.customize.title":["\xd6zelleştir"],"sdk.preview.start.button.label":["Başla"],"sdk.sketching.angle.apply.label":["Uygula"],"sdk.sketching.angle.cancel.label":["İptal"],"sdk.sketching.angle.control.label":["A\xe7ı"],"sdk.sketching.angle.control.text":["A\xe7ıyı ayarla"],"sdk.sketching.angle.control.title":["A\xe7ı belirle"],"sdk.sketching.angle.input.error":["L\xfctfen ge\xe7erli bir sayı girin!"],"sdk.sketching.dimension.apply.label":["Uygula"],"sdk.sketching.dimension.cancel.label":["İptal"],"sdk.sketching.dimension.depth.label":["Derinlik"],"sdk.sketching.dimension.depth.text":["Derinliği ayarla"],"sdk.sketching.dimension.depth.title":["Derinlik belirle"],"sdk.sketching.dimension.input.error":["L\xfctfen ge\xe7erli bir sayı girin!"],"sdk.sketching.dimension.length.label":["Uzunluk"],"sdk.sketching.dimension.length.text":["Uzunluğu ayarla"],"sdk.sketching.dimension.length.title":["Uzunluk belirle"],"sdk.sketching.dimension.width.label":["Genişlik"],"sdk.sketching.dimension.width.text":["Genişliği ayarla"],"sdk.sketching.dimension.width.title":["Genişlik belirle"],"sdk.sketching.draw.done.label":["Tamam"],"sdk.sketching.spotlight.label":["\xc7izime başlamak i\xe7in tıklayın"],"sdk.toolbar.actions.undoRedo.label":["Geri Al/Yinele"],"sdk.toolbar.camera.reset.label":["Kamerayı sıfırla"],"sdk.toolbar.camera.reset.labelAriaLabel":["Kamerayı varsayılan konuma sıfırla"],"sdk.toolbar.fullscreen.enter.label":["Tam ekran"],"sdk.toolbar.fullscreen.exit.label":["Tam ekrandan \xe7ık"],"sdk.toolbar.help.close.label":["Yardımı kapat"],"sdk.toolbar.help.label":["Yardım"],"sdk.toolbar.language.title":["Dil"],"sdk.toolbar.measurements.change.aria":["\xd6l\xe7\xfcmleri değiştir"],"sdk.toolbar.measurements.indicators.label":["\xd6l\xe7\xfcm g\xf6stergeleri"],"sdk.toolbar.measurements.input.aria":["\xd6l\xe7\xfcm girişini değiştir"],"sdk.toolbar.measurements.units.aria":["\xd6l\xe7\xfcm birimlerini değiştir"],"sdk.toolbar.mobile.fullscreen.enter.label":["Tam ekran"],"sdk.toolbar.mobile.fullscreen.exit.label":["Tam ekrandan \xe7ık"],"sdk.toolbar.mobile.fullscreen.title":["Tam ekran"],"sdk.toolbar.mobile.open.aria":["Mobil ara\xe7ları a\xe7"],"sdk.toolbar.mobile.viewControls.label":["G\xf6r\xfcn\xfcm kontrolleri"],"sdk.toolbar.share.allowEdit.label":["D\xfczenlemeye izin ver"],"sdk.toolbar.share.allowEditShort.label":["D\xfczenleme"],"sdk.toolbar.share.close.label":["Kapat"],"sdk.toolbar.share.copiedLinkButtonTitle":["Bağlantı kopyalandı"],"sdk.toolbar.share.copyLink.label":["Bağlantıyı kopyala"],"sdk.toolbar.share.copyLinkButtonTitle":["Bağlantıyı kopyala"],"sdk.toolbar.share.input.aria":["Paylaşım bağlantısı girişi"],"sdk.toolbar.share.label":["Paylaş"],"sdk.toolbar.share.linkCopied.label":["Bağlantı kopyalandı"],"sdk.toolbar.share.loading.label":["Y\xfckleniyor..."],"sdk.toolbar.share.open.label":["A\xe7"],"sdk.toolbar.share.section.label":["Paylaş"],"sdk.toolbar.undoRedo.redo.label":["Yinele"],"sdk.toolbar.undoRedo.undo.label":["Geri Al"],"sdk.toolbar.viewControls.title":["G\xf6r\xfcn\xfcm kontrolleri"],"sdk.totalPrice":["Toplam fiyat"]}');
@@ -1091,6 +1091,12 @@ export type PhoenixLayoutElement = {
1091
1091
  feet?: string;
1092
1092
  };
1093
1093
  };
1094
+ } | {
1095
+ kind: 'assistantToolbarButton';
1096
+ props?: {
1097
+ showTitle?: boolean;
1098
+ icon?: string;
1099
+ };
1094
1100
  } | {
1095
1101
  kind: 'helpToolbarButton';
1096
1102
  props?: {
@@ -6,7 +6,8 @@ import type { AssistantSpec } from '#package/application-spec';
6
6
  * about changes is left out when the schema has no `Mutation` type, the part about adding
7
7
  * entities when it has no `addChild` mutation, the part about replacing them when it has no
8
8
  * `replaceEntity` mutation, the part about the choices of a field when it has
9
- * no options edge, and the part about custom changes when the manifest exposes no action. The last section explains the
10
- * `query` and `apply` tools, which every run registers whatever the schema holds.
9
+ * no options edge, and the part about custom changes when the manifest exposes no action. The last two sections explain the
10
+ * `query` and `apply` tools, which every run registers whatever the schema holds, and the change
11
+ * record the `AssistantSystem` attaches to every user message.
11
12
  */
12
13
  export declare const generateAssistantPrompt: (assistant: NonNullable<AssistantSpec>) => string;
@@ -1 +1 @@
1
- let e=["How to read the GraphQL schema of this configurator:","- A configuration is a set of entities. `root` is the root entity, `entities` lists every entity or the ones with the given ids, and `selectedEntity` is the entity the user has selected, or the root entity when nothing is selected.","- Every entity has an `id` of the form `<Type>-<number>`, for example `Table-1`, and a `type` with its entity type name. Ids are assigned by the configurator: read them from the configuration and never make one up.","- A field whose name starts with `_` is computed by the configurator from other values. It can be read like any other field and never written.","- Numbers are in the units the configuration stores them in. A field description names the unit when the product defines one.",'- A text field that only takes fixed values lists them in its description as "One of: ...". Use exactly those values.',"- A field typed as another entity type or as a list of one is a relation: select fields on it to read the related entities.","- Field and type descriptions come from the team that built the configurator and say what a value means for the product."],t=["How changes work:","- Every field of the `Mutation` type is one change. Its description says what it changes and what it returns.","- The configurator checks the whole configuration after each change. A change that would leave it invalid fails with an error that names the entities at fault, and it is not applied. Later changes of the same request are then not run.","- The configurator may adjust other values in response to a change, so read what a mutation returns instead of assuming the values you sent."],a=["How to add entities:","- Entities are added from recipes, the same ones the configurator offers the user. An entity type that can take children has a `meta` field; `meta { childRecipes }` lists its recipe groups and their recipes.","- List the recipes of the group first, pick one by its `key`, then call `addChild` with the id of the parent, the `groupId` and the `key`. Keys change with the configuration and the language, so never reuse one from memory.","- `dryRun` on a recipe shows what adding it would do without adding it: whether it is `ok`, the `changedEntities` it would add or modify, the `deletedEntityIds` it would remove, and the `errors` when it cannot be added. An entity whose id the configuration does not have yet is new. It is costly, so select it only on the recipes you are deciding between.","- Put each `addChild` in its own operation. The recipes of a group and what they add depend on the configuration before them, so after adding something, list the group again before adding from it once more."],n=["How to replace entities:","- An entity is replaced from recipes, the same ones the configurator offers the user. An entity type that can be replaced has a `meta` field; `meta { replaceRecipes }` lists its replace recipe groups and what the entity can be replaced with.","- List the recipes of the group first, pick one by its `key`, then call `replaceEntity` with the id of the entity, the `groupId` and the `key`. `dryRun` on a replace recipe shows what replacing would do without doing it: the replacement and everything else that changes are under `changedEntities`, and the replaced entity is among the `deletedEntityIds`.","- The replacement is a new entity with a new id, and its field values come from the recipe, so they can differ from those of the entity it replaces. Read the ids and values `replaceEntity` returns, and never use the old id again.","- Put each `replaceEntity` in its own operation. The recipes of a group and what they do depend on the configuration before them, so after replacing something, list the group of the replacement again before replacing once more."],i=["How to find the values a field can take:","- Some fields store a key whose choices the configurator holds elsewhere. Such a field has an edge under `meta` named after it: `meta { <field>Options }` lists its choices, each with the `value` to write and the `name` the user sees.","- Read the choices before you write such a field or name a choice to the user, and write the `value`, not the `name`. A value outside the list is rejected unless the edge description says the field is not checked.","- `dryRun` on an option shows what writing its value would do without writing it: whether it is `ok`, the `changedEntities` it would add or modify, the `deletedEntityIds` it would remove, and the `errors` when the value cannot be written. It is costly, so select it only on the options you are deciding between. It is null when the edge description says the options cannot be dry-run.","- The choices can depend on the entity and on its current state. Read them again after a change, unless the edge description says they are the same for all instances or do not change."],o=["How the custom changes of this configurator work:","- Besides the generic changes, the `Mutation` type has fields the team built for this product. Each runs one domain operation the configurator itself uses, so prefer it over composing the same change from generic mutations. Its description says what it does and what its arguments mean.","- Its arguments are checked against what the operation declares; an argument that does not fit, or a change the product does not allow, fails the field with a message that says what to send instead.","- It returns an object whose fields the description names; a field typed as an entity reads that entity after the change."],s=["How to use the `query` and `apply` tools:","- Both take `operations`, a list of GraphQL documents that run in order. Each document holds exactly one operation. To do several things, send several items in one call instead of several calls.","- Write values into the document as literals. Use `variables` only for a value that cannot be written as a literal.","- Select only the fields you need: results are returned whole.","- The result has one GraphQL result per operation, in the order sent. When an operation fails, its `errors` say why and the operations after it are not run.","- `query` reads the configuration the user has open and never changes it. Call it before you say anything about the configuration."],r=["- This configurator exposes no changes, so there is nothing for `apply` to run. Say so when the user asks you to change the configuration."],h=['- Mutations inside `query` answer "what if" questions. Each operation sees the changes of the ones before it, so a mutation followed by a query shows the configuration as it would be. Nothing is kept and the user sees no change.',"- `apply` makes the changes the user asked for. It is all or nothing: when any operation fails, nothing is changed; when all succeed, the user gets them as one undo step.","- `committed` in the result says whether the changes were kept. When it is false although no operation failed, `message` says why: the changes may be waiting for the approval of the user, the user may have changed the configuration meanwhile, or this session may not change the configuration at all. Without a `message`, the operations changed nothing. Never tell the user a change was made unless `committed` is true."];export const generateAssistantPrompt=d=>{let c=/^type Mutation\b/m.test(d.sdl);return[e,...c?[t]:[],.../^\s+addChild\(/m.test(d.sdl)?[a]:[],.../^\s+replaceEntity\(/m.test(d.sdl)?[n]:[],.../^type FieldOption\b/m.test(d.sdl)?[i]:[],...Object.keys(d.actions).length>0?[o]:[],[...s,...c?h:r]].map(e=>e.join("\n")).join("\n\n")};
1
+ let e=["How to read the GraphQL schema of this configurator:","- A configuration is a set of entities. `root` is the root entity, `entities` lists every entity or the ones with the given ids, and `selectedEntity` is the entity the user has selected, or the root entity when nothing is selected.","- Every entity has an `id` of the form `<Type>-<number>`, for example `Table-1`, and a `type` with its entity type name. Ids are assigned by the configurator: read them from the configuration and never make one up.","- A field whose name starts with `_` is computed by the configurator from other values. It can be read like any other field and never written.","- Numbers are in the units the configuration stores them in. A field description names the unit when the product defines one.",'- A text field that only takes fixed values lists them in its description as "One of: ...". Use exactly those values.',"- A field typed as another entity type or as a list of one is a relation: select fields on it to read the related entities.","- Field and type descriptions come from the team that built the configurator and say what a value means for the product."],t=["How changes work:","- Every field of the `Mutation` type is one change. Its description says what it changes and what it returns.","- The configurator checks the whole configuration after each change. A change that would leave it invalid fails with an error that names the entities at fault, and it is not applied. Later changes of the same request are then not run.","- The configurator may adjust other values in response to a change, so read what a mutation returns instead of assuming the values you sent."],a=["How to add entities:","- Entities are added from recipes, the same ones the configurator offers the user. An entity type that can take children has a `meta` field; `meta { childRecipes }` lists its recipe groups and their recipes.","- List the recipes of the group first, pick one by its `key`, then call `addChild` with the id of the parent, the `groupId` and the `key`. Keys change with the configuration and the language, so never reuse one from memory.","- `dryRun` on a recipe shows what adding it would do without adding it: whether it is `ok`, the `changedEntities` it would add or modify, the `deletedEntityIds` it would remove, the `sideEffects` the configurator says it would have, and the `errors` when it cannot be added. An entity whose id the configuration does not have yet is new. It is costly, so select it only on the recipes you are deciding between.","- Put each `addChild` in its own operation. The recipes of a group and what they add depend on the configuration before them, so after adding something, list the group again before adding from it once more."],n=["How to replace entities:","- An entity is replaced from recipes, the same ones the configurator offers the user. An entity type that can be replaced has a `meta` field; `meta { replaceRecipes }` lists its replace recipe groups and what the entity can be replaced with.","- List the recipes of the group first, pick one by its `key`, then call `replaceEntity` with the id of the entity, the `groupId` and the `key`. `dryRun` on a replace recipe shows what replacing would do without doing it: the replacement and everything else that changes are under `changedEntities`, and the replaced entity is among the `deletedEntityIds`.","- The replacement is a new entity with a new id, and its field values come from the recipe, so they can differ from those of the entity it replaces. Read the ids and values `replaceEntity` returns, and never use the old id again.","- Put each `replaceEntity` in its own operation. The recipes of a group and what they do depend on the configuration before them, so after replacing something, list the group of the replacement again before replacing once more."],o=["How to find the values a field can take:","- Some fields store a key whose choices the configurator holds elsewhere. Such a field has an edge under `meta` named after it: `meta { <field>Options }` lists its choices, each with the `value` to write and the `name` the user sees.","- Read the choices before you write such a field or name a choice to the user, and write the `value`, not the `name`. A value outside the list is rejected unless the edge description says the field is not checked.","- `dryRun` on an option shows what writing its value would do without writing it: whether it is `ok`, the `changedEntities` it would add or modify, the `deletedEntityIds` it would remove, the `sideEffects` the configurator says it would have, and the `errors` when the value cannot be written. It is costly, so select it only on the options you are deciding between. It is null when the edge description says the options cannot be dry-run.","- The choices can depend on the entity and on its current state. Read them again after a change, unless the edge description says they are the same for all instances or do not change."],i=["How the custom changes of this configurator work:","- Besides the generic changes, the `Mutation` type has fields the team built for this product. Each runs one domain operation the configurator itself uses, so prefer it over composing the same change from generic mutations. Its description says what it does and what its arguments mean.","- Its arguments are checked against what the operation declares; an argument that does not fit, or a change the product does not allow, fails the field with a message that says what to send instead.","- It returns an object whose fields the description names; a field typed as an entity reads that entity after the change."],s=["How to use the `query` and `apply` tools:","- Both take `operations`, a list of GraphQL documents that run in order. Each document holds exactly one operation. To do several things, send several items in one call instead of several calls.","- Write values into the document as literals. Use `variables` only for a value that cannot be written as a literal.","- Select only the fields you need: results are returned whole.","- The result has one GraphQL result per operation, in the order sent. When an operation fails, its `errors` say why and the operations after it are not run.","- `query` reads the configuration the user has open and never changes it. Call it before you say anything about the configuration."],h=["- This configurator exposes no changes, so there is nothing for `apply` to run. Say so when the user asks you to change the configuration."],r=['- Mutations inside `query` answer "what if" questions. Each operation sees the changes of the ones before it, so a mutation followed by a query shows the configuration as it would be. Nothing is kept and the user sees no change.',"- `apply` makes the changes the user asked for. It is all or nothing: when any operation fails, nothing is changed; when all succeed, the user gets them as one undo step.","- `committed` in the result says whether the changes were kept. When it is false although no operation failed, `message` says why: the changes may be waiting for the approval of the user, the user may have changed the configuration meanwhile, or this session may not change the configuration at all. Without a `message`, the operations changed nothing. Never tell the user a change was made unless `committed` is true.","- `sideEffects` in the result lists what the configurator did beyond what the operations asked for, such as parts it added or replaced to keep the configuration valid, in its own words. Tell the user about them when the changes were kept. When they were not, or in `query`, it lists what the mutations that succeeded would do. `dryRun` has the same list for a single recipe or option."],d=["How to read the change record:","- Every user message starts with a change record of the configuration since your previous action. It is the complete list of the entities that were added or deleted, of the stored fields of this schema that changed, and of the selection and navigation changes, so update your picture from it and do not query those again when it does not mention them.","- Fields whose name starts with `_` are computed and are never listed. Read them again when the record lists a change they may depend on.","- `[changes: none]`: nothing changed. Do not query again what you already know.","- `[changes]` is followed by one line per change. `selected`, `navigationState`, `viewState` and `toolState` lines show `<old> -> <new>` of what `selectedEntity` and `navigation` return, with `none` for an empty value. `A <id>` is an added entity and `D <id>` a deleted one. `M <id>` is a modified entity, followed by one `<field>: <old> -> <new>` line per changed field, under the name the field has in this schema. A `reset: undo/redo` line says the user undid or redid changes.","- The `#` comment at the end of a line names the control, the transformer or the explanation of the last change to that line.","- `[changes: unavailable]`: the page was loaded since your previous action, so earlier values may be stale. `[changes: too many (n)]`: n entities changed and are not listed. In both cases query what you need."],c=["- Changes you applied are not in the record, except those that were waiting for the approval of the user: they appear in it once approved."];export const generateAssistantPrompt=l=>{let u=/^type Mutation\b/m.test(l.sdl);return[e,...u?[t]:[],.../^\s+addChild\(/m.test(l.sdl)?[a]:[],.../^\s+replaceEntity\(/m.test(l.sdl)?[n]:[],.../^type FieldOption\b/m.test(l.sdl)?[o]:[],...Object.keys(l.actions).length>0?[i]:[],[...s,...u?r:h],[...d,...u?c:[]]].map(e=>e.join("\n")).join("\n\n")};
@@ -1,4 +1,4 @@
1
- import{openAsBlob as e}from"node:fs";import{createApiBaseClient as t}from"#package/client";import{resolveApplicationSpecDeploymentData as i}from"../application-spec/index.js";import{createSourceArchive as r,getServerCredentials as a}from"../services/index.js";import{ensureWorkspaceInstallSettings as o}from"../utils/index.js";let s={queued:"Waiting for a build runner",preparing:"Preparing the deployment",building:"Building the project",deploying:"Deploying the frontend, webhooks and assets",live:"Live",failed:"Failed",cancelled:"Cancelled"},l=e=>new Promise(t=>setTimeout(t,e)),n=async(t,i)=>{let r=new FormData;for(let[e,i]of Object.entries(t.fields))r.append(e,i);r.append("file",await e(i,{type:"application/gzip"}),"sources.tgz");let a=await fetch(t.url,{method:"POST",body:r});if(!a.ok)throw Error(`Uploading the sources failed with HTTP ${a.status}: ${await a.text()}`)};export const runDeployCommand=async(e,{logger:d})=>{let u=await a(e.serverUrl),{pollIntervalMs:p}=e;if(!u)throw Error(`You are not signed in to ${e.serverUrl}. Run \`phoenix login <workspace>\` first.`);let c=t(e.serverUrl),m={authorization:`Bearer ${u.token}`};d.step("Validating the application spec");let h=await i({skipUpload:!0,logger:d});d.success(`The spec is valid (application version ${h.applicationVersion})`),d.step(`Packing the project for ${u.customerName}`),o(e.projectDir);let f=await r(e.projectDir);try{let t;d.info(` ${f.fileCount} files, ${(t=f.size)<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}`);let i=await c.POST("/deployments/builds",{body:{sdkVersion:e.sdkVersion,sizeBytes:f.size,configurationSchema:{version:h.schemaVersion,schema:h.schema},adminConfigurationSchema:h.adminSchema?{version:h.adminSchemaVersion,schema:h.adminSchema}:void 0},headers:m});if(i.error||!i.data)throw Error(`The server did not create a build: ${i.error?.message??"no response"}`);let{buildId:r,upload:a}=i.data;d.step("Uploading the sources"),await n(a,f.path);let o=await c.POST("/deployments/builds/{buildId}/start",{params:{path:{buildId:r}},headers:{...m,"content-type":null}});if(o.error)throw Error(`The server did not start the build: ${o.error.message}`);if(o.data?.status==="failed")throw Error(`Build ${r} could not be started: ${o.data.error??"the server gave no reason"}`);if(d.success(`Build ${r} started`),u.studioUrl){let e=new URL(`/builder/deployments/${r}`,u.studioUrl);e.searchParams.set("customer",u.customerSlug),d.info(`Follow the build in Studio: ${e.toString()}`)}if(!e.wait)return;let g=null,w=0;for(;;){let{data:e,error:t}=await c.GET("/deployments/builds/{buildId}",{params:{path:{buildId:r}},headers:m}).catch(e=>({data:void 0,error:{message:String(e)}}));if(t||!e){if((w+=1)>=5)throw Error(`Following build ${r} failed: ${t?.message??"no response"}. The build may still finish; check Deployments in Studio.`);await l(p);continue}if(w=0,e.status!==g&&(g=e.status,d.step(s[e.status])),"live"===e.status)return void d.success(`Your configurator is live at ${e.configuratorUrl}`);if("failed"===e.status||"cancelled"===e.status||e.timedOut){let t=await c.GET("/deployments/builds/{buildId}/log",{params:{path:{buildId:r}},headers:m}).catch(()=>({data:void 0})),i=(t.data?.log??"").trim().split("\n").slice(-40).join("\n");i&&d.info(`
1
+ import{openAsBlob as e}from"node:fs";import{createApiBaseClient as t}from"#package/client";import{resolveApplicationSpecDeploymentData as i}from"../application-spec/index.js";import{createSourceArchive as o,getServerCredentials as r}from"../services/index.js";import{ensureWorkspaceInstallSettings as a}from"../utils/index.js";let s={queued:"Waiting for a build runner",preparing:"Preparing the deployment",building:"Building the project",deploying:"Deploying the frontend, webhooks and assets",live:"Live",failed:"Failed",cancelled:"Cancelled"},n=e=>new Promise(t=>setTimeout(t,e)),l=async(t,i)=>{let o=new FormData;for(let[e,i]of Object.entries(t.fields))o.append(e,i);o.append("file",await e(i,{type:"application/gzip"}),"sources.tgz");let r=await fetch(t.url,{method:"POST",body:o});if(!r.ok)throw Error(`Uploading the sources failed with HTTP ${r.status}: ${await r.text()}`)};export const runDeployCommand=async(e,{logger:d})=>{let u=await r(e.serverUrl),{pollIntervalMs:c}=e;if(!u)throw Error(`You are not signed in to ${e.serverUrl}. Run \`phoenix login <workspace>\` first.`);let p=t(e.serverUrl),h={authorization:`Bearer ${u.token}`};d.step("Validating the application spec");let m=await i({skipUpload:!0,logger:d});d.success(`The spec is valid (application version ${m.applicationVersion})`),d.step(`Packing the project for ${u.customerName}`),a(e.projectDir);let f=await o(e.projectDir);try{let t;d.info(` ${f.fileCount} files, ${(t=f.size)<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1024/1024).toFixed(1)} MB`}`);let i=await p.POST("/deployments/builds",{body:{sdkVersion:e.sdkVersion,sizeBytes:f.size,configurationSchema:{version:m.schemaVersion,schema:m.schema},adminConfigurationSchema:m.adminSchema?{version:m.adminSchemaVersion,schema:m.adminSchema}:void 0},headers:h});if(i.error||!i.data)throw Error(`The server did not create a build: ${i.error?.message??"no response"}`);let{buildId:o,upload:r}=i.data;d.step("Uploading the sources"),await l(r,f.path);let a=await p.POST("/deployments/builds/{buildId}/start",{params:{path:{buildId:o}},headers:{...h,"content-type":null}});if(a.error)throw Error(`The server did not start the build: ${a.error.message}`);if(a.data?.status==="failed")throw Error(`Build ${o} could not be started: ${a.data.error??"the server gave no reason"}`);if(d.success(`Build ${o} started`),u.studioUrl){let e=new URL(`/builder/deployments/${o}`,u.studioUrl);e.searchParams.set("customer",u.customerSlug),d.info(`Follow the build in Studio: ${e.toString()}`)}if(!e.wait)return;let g=null,w=0;for(;;){let{data:e,error:t}=await p.GET("/deployments/builds/{buildId}",{params:{path:{buildId:o}},headers:h}).catch(e=>({data:void 0,error:{message:String(e)}}));if(t||!e){if((w+=1)>=5)throw Error(`Following build ${o} failed: ${t?.message??"no response"}. The build may still finish; check Deployments in Studio.`);await n(c);continue}if(w=0,e.status!==g&&(g=e.status,d.step(s[e.status])),"live"===e.status){d.success(`Your configurator is live at ${e.configuratorUrl}`),d.info("Coding agents: when the user has nothing more to build, offer the run evaluation from the phoenix-feedback skill, once per conversation.");return}if("failed"===e.status||"cancelled"===e.status||e.timedOut){let t=await p.GET("/deployments/builds/{buildId}/log",{params:{path:{buildId:o}},headers:h}).catch(()=>({data:void 0})),i=(t.data?.log??"").trim().split("\n").slice(-40).join("\n");i&&d.info(`
2
2
  Last lines of the build log:
3
3
  ${i}
4
- `);let a=e.timedOut?"it took too long":e.error??"see the build log";throw Error(`Build ${r} did not go live: ${a}`)}await l(p)}}finally{await f.cleanup()}};
4
+ `);let r=e.timedOut?"it took too long":e.error??"see the build log";throw Error(`Build ${o} did not go live: ${r}`)}await n(c)}}finally{await f.cleanup()}};
@@ -11,8 +11,8 @@ export declare class AnalyticsService {
11
11
  constructor(_debug: boolean);
12
12
  push: (event: AnalyticsEvent) => void;
13
13
  }
14
- declare const Initialized: (userId: string, configuratorName: string) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").InitEvent;
15
- declare const ConfigurationLoaded: (configurationId: string, revisionId: string, mode: 'read' | 'owner') => import("../../../../domain/domain-context/analytics-system/analytics-contracts").DataLoadedEvent;
14
+ declare const Initialized: (userId: string, configuratorName: string) => import("#package/domain").InitEvent;
15
+ declare const ConfigurationLoaded: (configurationId: string, revisionId: string, mode: 'read' | 'owner') => import("#package/domain").DataLoadedEvent;
16
16
  export declare const CommonAnalyticsFactory: {
17
17
  Initialized: typeof Initialized;
18
18
  ConfigurationLoaded: typeof ConfigurationLoaded;
@@ -1,26 +1,26 @@
1
1
  import type { MultilingualString } from '@salsita-ai/common/utils';
2
2
  import { type DomainEntity, type DomainEntityId, type EntityId, type EntityRecipe } from '#package/domain';
3
- declare const EntityChildrenListActionButtonClicked: (id: string) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
4
- declare const EntityChildrenListItemClicked: (id: string) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
5
- declare const AngleDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
6
- declare const AngleDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
7
- declare const GenericDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
8
- declare const GenericDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
9
- declare const DistanceDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
10
- declare const DistanceDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
11
- declare const SizeDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
12
- declare const OffsetDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
13
- declare const AttributeSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: string | number | boolean) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
14
- declare const DimensionSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: number) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
15
- declare const SwatchSelected: (instanceName: string, id: EntityId, value: string) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
16
- declare const ColorPickerChanged: (instanceName: string, id: EntityId, value: string) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
17
- declare const TextValueChanged: (instanceName: string, id: EntityId, value: string) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
18
- declare const MultilingualTextValueChanged: (instanceName: string, id: EntityId, value: MultilingualString) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
19
- declare const RecipesSelected: (recipes: ReadonlyArray<DomainEntity<string>>) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
20
- declare const RecipeReplacementSelected: (oldId: DomainEntityId<string>, recipes: ReadonlyArray<DomainEntity<string>>) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
21
- declare const ChildEntitySelected: (selectorType: string) => (id: EntityId, recipes: ReadonlyArray<EntityRecipe<DomainEntity<string>>>) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
22
- declare const EntityChildrenListDeleteButtonClicked: (id: EntityId) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
23
- declare const EntityDeleteButtonClicked: (id: EntityId) => import("../../../../domain/domain-context/analytics-system/analytics-contracts").UserActionEvent;
3
+ declare const EntityChildrenListActionButtonClicked: (id: string) => import("#package/domain").UserActionEvent;
4
+ declare const EntityChildrenListItemClicked: (id: string) => import("#package/domain").UserActionEvent;
5
+ declare const AngleDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
6
+ declare const AngleDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
7
+ declare const GenericDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
8
+ declare const GenericDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
9
+ declare const DistanceDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
10
+ declare const DistanceDimensionSliderDragged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
11
+ declare const SizeDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
12
+ declare const OffsetDimensionInputChanged: (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
13
+ declare const AttributeSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: string | number | boolean) => import("#package/domain").UserActionEvent;
14
+ declare const DimensionSelected: (selectorType: string) => (instanceName: string, id: EntityId, value: number) => import("#package/domain").UserActionEvent;
15
+ declare const SwatchSelected: (instanceName: string, id: EntityId, value: string) => import("#package/domain").UserActionEvent;
16
+ declare const ColorPickerChanged: (instanceName: string, id: EntityId, value: string) => import("#package/domain").UserActionEvent;
17
+ declare const TextValueChanged: (instanceName: string, id: EntityId, value: string) => import("#package/domain").UserActionEvent;
18
+ declare const MultilingualTextValueChanged: (instanceName: string, id: EntityId, value: MultilingualString) => import("#package/domain").UserActionEvent;
19
+ declare const RecipesSelected: (recipes: ReadonlyArray<DomainEntity<string>>) => import("#package/domain").UserActionEvent;
20
+ declare const RecipeReplacementSelected: (oldId: DomainEntityId<string>, recipes: ReadonlyArray<DomainEntity<string>>) => import("#package/domain").UserActionEvent;
21
+ declare const ChildEntitySelected: (selectorType: string) => (id: EntityId, recipes: ReadonlyArray<EntityRecipe<DomainEntity<string>>>) => import("#package/domain").UserActionEvent;
22
+ declare const EntityChildrenListDeleteButtonClicked: (id: EntityId) => import("#package/domain").UserActionEvent;
23
+ declare const EntityDeleteButtonClicked: (id: EntityId) => import("#package/domain").UserActionEvent;
24
24
  export declare const DomainControlsAnalytics: {
25
25
  ColorPickerChanged: typeof ColorPickerChanged;
26
26
  EntityChildrenListActionButtonClicked: typeof EntityChildrenListActionButtonClicked;
@@ -9,6 +9,6 @@ interface PublishedDataValueProviderProps extends PublishedDataValue {
9
9
  }
10
10
  export declare const PublishedDataValueProvider: (props: PublishedDataValueProviderProps) => import("react/jsx-runtime").JSX.Element;
11
11
  export declare const useProvidedPublishedData: () => PublishedDataValue;
12
- export declare const usePublishedData: () => Record<string, unknown> & import("../../../../domain/admin-domain/__generated/application-types").PublishedData;
12
+ export declare const usePublishedData: () => PublishedDataValue['publishedData'];
13
13
  export type UsePublishedData<PUBLISHED_DATA extends CommonAdminPublishedData> = () => PUBLISHED_DATA;
14
14
  export {};
@@ -13,8 +13,11 @@ export declare const getViewportSize: () => Size;
13
13
  * Returns the viewport size. This can also be used as a dependency in a
14
14
  * useEffect to trigger an update when the browser resizes.
15
15
  *
16
+ * @param subscriptionActive if `false`, the viewport is neither measured nor followed, and the size
17
+ * returned is the last one measured, if any (useful for optimization)
18
+ *
16
19
  * @see https://martijnhols.nl/gists/how-to-get-document-height-ios-safari-osk
17
20
  * @todo: investigate if this can use `viewport$`
18
21
  */
19
- export declare const useViewportSize: () => Size | undefined;
22
+ export declare const useViewportSize: (subscriptionActive?: boolean) => Size | undefined;
20
23
  export {};
@@ -1 +1 @@
1
- import{useCallback as e,useEffect as i,useLayoutEffect as t,useState as n}from"react";let o="u">typeof window?t:()=>{};export const getViewportSize=()=>window.visualViewport?[window.visualViewport.width,window.visualViewport.height]:[window.innerWidth,window.innerHeight];export const useViewportSize=()=>{let[t,r]=n(),w=e(()=>{let e=getViewportSize();r(i=>i&&i[0]===e[0]&&i[1]===e[1]?i:e)},[]);return o(w,[w]),i(()=>{let e=()=>{w(),setTimeout(w,1e3)};return window.addEventListener("resize",e),window.addEventListener("orientationchange",e),window.visualViewport?.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),window.removeEventListener("orientationchange",e),window.visualViewport?.removeEventListener("resize",e)}},[w]),t};
1
+ import{useCallback as e,useEffect as i,useLayoutEffect as t,useState as n}from"react";let r="u">typeof window?t:()=>{};export const getViewportSize=()=>window.visualViewport?[window.visualViewport.width,window.visualViewport.height]:[window.innerWidth,window.innerHeight];export const useViewportSize=(t=!0)=>{let[o,w]=n(),d=e(()=>{let e=getViewportSize();w(i=>i&&i[0]===e[0]&&i[1]===e[1]?i:e)},[]);return r(()=>{t&&d()},[t,d]),i(()=>{if(!t)return;let e=()=>{d(),setTimeout(d,1e3)};return window.addEventListener("resize",e),window.addEventListener("orientationchange",e),window.visualViewport?.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),window.removeEventListener("orientationchange",e),window.visualViewport?.removeEventListener("resize",e)}},[t,d]),o};
@@ -1 +1 @@
1
- export { MobileControls, type MobileControlsLayoutProps, type MobileControlsThemeableProps } from './MobileControls.js';
1
+ export { MobileControls, type MobileControlsLayoutProps, type MobileControlsThemeableProps, type ViewOnlyModeProps, } from './MobileControls.js';
@@ -44,6 +44,7 @@ declare module '@mui/material/styles' {
44
44
  PhxChat: 'root';
45
45
  PhxChatFooter: 'root' | 'formLayout' | 'input';
46
46
  PhxChatMessage: 'base' | 'assistant' | 'user' | 'widget' | 'error' | 'helper';
47
+ PhxAssistantPanel: 'root' | 'header' | 'title' | 'closeButton' | 'thread' | 'greeting' | 'messages' | 'userMessage' | 'assistantMessage' | 'chips' | 'activity' | 'activityIcon' | 'chip' | 'status' | 'notice' | 'newReplyButton' | 'composer' | 'inputFrame' | 'input' | 'sendButton' | 'stopButton' | 'hint';
47
48
  PhxTopNavigation: 'root' | 'stepper' | 'step';
48
49
  PhxListSelector: 'root';
49
50
  PhxListSelectorItem: 'root' | 'radio' | 'title' | 'description' | 'formControlLabel';
@@ -109,6 +110,9 @@ declare module '@mui/material/styles' {
109
110
  PhxChatMessage?: {
110
111
  styleOverrides?: ComponentsOverrides<Theme>['PhxChatMessage'];
111
112
  };
113
+ PhxAssistantPanel?: {
114
+ styleOverrides?: ComponentsOverrides<Theme>['PhxAssistantPanel'];
115
+ };
112
116
  PhxPreviewLayout?: {
113
117
  styleOverrides?: ComponentsOverrides<Theme>['PhxPreviewLayout'];
114
118
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salsita-ai/sdk",
3
- "version": "0.50.0-develop.9cf426b400",
3
+ "version": "0.50.0-develop.aabb56df09",
4
4
  "description": "TypeScript SDK and CLI for building, running, and deploying Phoenix configurator applications.",
5
5
  "keywords": [
6
6
  "salsita",
@@ -149,10 +149,6 @@
149
149
  "import": "./dist/extras/ai-preview/index.js",
150
150
  "types": "./dist/extras/ai-preview/index.d.ts"
151
151
  },
152
- "./extras/assistant": {
153
- "import": "./dist/extras/assistant/index.js",
154
- "types": "./dist/extras/assistant/index.d.ts"
155
- },
156
152
  "./common/utils": {
157
153
  "import": "./dist/common/utils.js",
158
154
  "types": "./dist/common/utils.d.ts"
@@ -225,7 +221,7 @@
225
221
  "@swc/core": "1.15.40",
226
222
  "@swc/wasm-web": "1.15.40",
227
223
  "@tanstack/ai": "0.64.0",
228
- "@tanstack/ai-react": "0.29.4",
224
+ "@tanstack/ai-client": "0.36.1",
229
225
  "@trpc/client": "11.17.0",
230
226
  "@trpc/react-query": "11.17.0",
231
227
  "@trpc/server": "11.17.0",
@@ -275,6 +271,7 @@
275
271
  "react-json-tree": "0.20.0",
276
272
  "react-markdown": "9.0.1",
277
273
  "remark": "15.0.1",
274
+ "remark-gfm": "4.0.0",
278
275
  "rxjs": "7.8.2",
279
276
  "semver": "7.6.3",
280
277
  "spark-md5": "3.0.2",
@@ -295,8 +292,8 @@
295
292
  "yaml": "2.9.0",
296
293
  "yargs": "17.7.2",
297
294
  "zod": "3.25.76",
298
- "@salsita-ai/common": "0.50.0-develop.9cf426b400",
299
- "@salsita-ai/contracts": "0.50.0-develop.9cf426b400"
295
+ "@salsita-ai/common": "0.50.0-develop.aabb56df09",
296
+ "@salsita-ai/contracts": "0.50.0-develop.aabb56df09"
300
297
  },
301
298
  "devDependencies": {
302
299
  "@clerk/clerk-react": "5.61.8",
@@ -18586,6 +18586,30 @@
18586
18586
  "required": ["kind"],
18587
18587
  "additionalProperties": false
18588
18588
  },
18589
+ {
18590
+ "type": "object",
18591
+ "properties": {
18592
+ "kind": {
18593
+ "type": "string",
18594
+ "enum": ["assistantToolbarButton"]
18595
+ },
18596
+ "props": {
18597
+ "type": "object",
18598
+ "properties": {
18599
+ "showTitle": {
18600
+ "type": "boolean"
18601
+ },
18602
+ "icon": {
18603
+ "type": "string"
18604
+ }
18605
+ },
18606
+ "required": [],
18607
+ "additionalProperties": false
18608
+ }
18609
+ },
18610
+ "required": ["kind"],
18611
+ "additionalProperties": false
18612
+ },
18589
18613
  {
18590
18614
  "type": "object",
18591
18615
  "properties": {
@@ -1 +0,0 @@
1
- export { useAssistantChat, type AssistantChatState } from './use-assistant-chat.js';
@@ -1 +0,0 @@
1
- export{useAssistantChat}from"./use-assistant-chat.js";
@@ -1,20 +0,0 @@
1
- import { type UIMessage } from '@tanstack/ai-react';
2
- /** Experimental assistant chat state and actions of the current configuration. */
3
- export interface AssistantChatState {
4
- /** The thread as painted: hydrated from the server, then streamed. */
5
- readonly messages: ReadonlyArray<UIMessage>;
6
- /** True while a reply streams or a browser tool runs. */
7
- readonly isLoading: boolean;
8
- readonly error: Error | undefined;
9
- /** Sends a user message stamped with its send time. */
10
- readonly send: (content: string) => Promise<void>;
11
- /** Stops the current reply in the browser and on the server. */
12
- readonly stop: () => Promise<void>;
13
- }
14
- /**
15
- * Experimental: the conversational assistant of the current configuration. The server owns the
16
- * thread — the chat hydrates from it on mount and rejoins a reply still streaming — so the hook
17
- * keeps nothing in browser storage. Each message carries its send time for the model. The model's
18
- * `query` and `apply` calls run here, in the browser, against the configurator this hook is rendered in.
19
- */
20
- export declare const useAssistantChat: () => AssistantChatState;
@@ -1 +0,0 @@
1
- import{fetchServerSentEvents as t,useChat as e}from"@tanstack/ai-react";import{useCallback as a,useMemo as n}from"react";import{useApplicationRuntimeSelector as s,useAuthorizedClient as r,useConfigurationId as o}from"#package/react-sdk";import{useConfigurator as i}from"../application-runtime/index.js";export const useAssistantChat=()=>{let c=o(),p=r(),l=n(()=>p.getAssistantChatConnection(c),[p,c]),u=n(()=>{let e=async()=>({headers:await l.headers()}),a=t(l.url,e),n=t(`${l.url}/runs`,e);return{...a,joinRun:n.joinRun}},[l]),{assistantSystem:d}=i(),{messages:m,isLoading:h,error:f,sendMessage:g,stop:w,runId:y}=e({threadId:`assistant:${c}`,connection:u,persistence:!0,history:{pageSize:50},tools:s(d.getTools)});return{messages:m,isLoading:h,error:f,send:a(async t=>{let e={sentAt:new Date().toISOString()};await g({content:t,metadata:e})},[g]),stop:a(async()=>{w(),null!=y&&await fetch(`${l.url}/runs/${encodeURIComponent(y)}/cancel`,{method:"POST",headers:await l.headers()})},[l,y,w])}};
@@ -1,6 +0,0 @@
1
- /**
2
- * Experimental, unstyled assistant chat for the current configuration: streamed replies, reasoning
3
- * summaries, tool calls with their payloads, a pending indicator and a stop button. It renders
4
- * nothing, and contacts no server, when the application spec has no `assistant` section.
5
- */
6
- export declare const AssistantChat: () => import("react/jsx-runtime").JSX.Element | null;
@@ -1 +0,0 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{Alert as r,Box as a,Button as i,LinearProgress as n,Stack as o,TextField as l,Typography as s}from"@mui/material";import{useState as c}from"react";import{useAssistantChat as p}from"#package/configurator";import{useSpecAssistant as m}from"#package/react-sdk";let d=({part:t})=>{switch(t.type){case"text":return e(s,{sx:{whiteSpace:"pre-wrap"},children:t.content});case"thinking":return e(s,{variant:"body2",color:"text.secondary",sx:{fontStyle:"italic",whiteSpace:"pre-wrap"},children:t.content});case"tool-call":return e(s,{variant:"caption",component:"pre",sx:{m:0,whiteSpace:"pre-wrap"},children:`${t.name}(${JSON.stringify(t.input??t.arguments)}) \xb7 ${t.state}`});case"tool-result":{let r=(e=>{if("string"!=typeof e){for(let t of e)if("image"===t.type&&"data"===t.source.type)return`data:${t.source.mimeType};base64,${t.source.value}`}})(t.content);return r?e(a,{component:"img",src:r,alt:"Tool result",sx:{maxWidth:"100%",border:1}}):e(s,{variant:"caption",children:`Tool result \xb7 ${t.state}`})}default:return null}},u=()=>{let{messages:m,send:u,stop:h,isLoading:f,error:x}=p(),[g,v]=c("");return t(o,{spacing:1.5,sx:{p:2},children:[m.map(r=>t(a,{component:"div",sx:{alignSelf:"user"===r.role?"flex-end":"flex-start",maxWidth:"85%"},children:[e(s,{variant:"overline",children:r.role}),r.parts.map((t,r)=>e(d,{part:t},r))]},r.id)),f&&e(n,{"aria-label":"Assistant is responding"}),x&&e(r,{severity:"warning",children:x.message}),e("form",{onSubmit:e=>{e.preventDefault();let t=g.trim();t&&(v(""),u(t))},children:t(o,{direction:"row",spacing:1,children:[e(l,{size:"small",fullWidth:!0,placeholder:"Ask the assistant…",value:g,onChange:e=>v(e.target.value)}),f?e(i,{onClick:()=>void h(),children:"Stop"}):e(i,{type:"submit",variant:"contained",disabled:!g.trim(),children:"Send"})]})})]})};export const AssistantChat=()=>m()?e(u,{}):null;
@@ -1 +0,0 @@
1
- export { AssistantChat } from './AssistantChat.js';
@@ -1 +0,0 @@
1
- export{AssistantChat}from"./AssistantChat.js";