KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ
KretBridge: generacja C# i kontrola wywołań (bez uruchamiania usługi)
Szablon SDK `csharp-bridge`: kontrakt `Bridge/calc.klink`, kod KretS `use Kret.Bridge.demo.calc as calc`. `kret bridge generate` tworzy interfejs C#, a `kret check` sprawdza każde wywołanie `calc.*` względem kontraktu. **Usługa C# nie jest uruchamiana**: KretBridge to PROVISIONAL_VERSIONED, w Core zablokowany (FB-07), a proces usługi nie jest piaskownicą.
Witryna nie wykonuje kodu ani nie prowadzi walidacji SDK. Wyniki poniżej pochodzą z eksportu określonej wersji i przestają opisywać kod po jego zmianie.
Format tego przykładu nie jest obsługiwany przez edytor Playground. Źródła i instrukcje pozostają dostępne.
Kanoniczne pliki projektu
// <auto-generated>
// Kod wygenerowany z kontraktu KretLink „demo.calc” 1.0.0 (sha256 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25).
// Nie edytuj ręcznie: zmień plik .klink i uruchom „kret bridge generate”.
// </auto-generated>
#nullable enable
using System.Runtime.CompilerServices;
using System.Text.Json;
using Kret.Bridge;
using Kret.Common;
using Kret.Link;
namespace Kret.Examples.Bridge;
/// <summary>Usługa demo.calc 1.0.0. Implementacja działa w procesie usługi KretBridge.</summary>
public interface IDemoCalc
{
/// <summary>Suma dwóch liczb całkowitych.</summary>
Task<long> AddAsync(long a, long b, LinkCallContext context, CancellationToken cancellation);
/// <summary>Kończy proces usługi w trakcie wywołania (test awarii).</summary>
Task<long> CrashAsync(LinkCallContext context, CancellationToken cancellation);
/// <summary>Opis złożony z nazwy i posortowanych etykiet.</summary>
Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, LinkCallContext context, CancellationToken cancellation);
/// <summary>Średnia; null dla pustej listy.</summary>
Task<double?> MeanAsync(IReadOnlyList<double> values, LinkCallContext context, CancellationToken cancellation);
/// <summary>Kolejne liczby pierwsze mniejsze od limitu.</summary>
IAsyncEnumerable<long> PrimesAsync(long limit, LinkCallContext context, CancellationToken cancellation);
/// <summary>Operacja wymagająca dodatkowego uprawnienia.</summary>
Task PublishAsync(string text, LinkCallContext context, CancellationToken cancellation);
/// <summary>Czeka podaną liczbę milisekund.</summary>
Task<bool> SlowAsync(long ms, LinkCallContext context, CancellationToken cancellation);
}
/// <summary>Kontrakt usługi osadzony w kodzie — ten sam, z którego wygenerowano interfejs.</summary>
public static class DemoCalcContract
{
public const string Service = "demo.calc";
public const string Version = "1.0.0";
public const string Digest = "0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25";
public const string Json = """"{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}"""";
public static LinkContract Load()
{
var diagnostics = new KcsDiagnostics();
return LinkContract.Read(System.Text.Encoding.UTF8.GetBytes(Json), diagnostics) ?? throw new InvalidOperationException("osadzony kontrakt jest niepoprawny: " + string.Join("; ", diagnostics.Items));
}
}
/// <summary>Rejestracja metod usługi: odczyt argumentów, wywołanie implementacji, zapis wyniku.</summary>
public static class DemoCalcService
{
public static LinkServer Register(LinkServer server, IDemoCalc implementation)
{
server.Handle("add", async (context, arguments, cancellation) =>
{
var result = await implementation.AddAsync(arguments[0].GetInt64(), arguments[1].GetInt64(), context, cancellation).ConfigureAwait(false);
return BridgeJson.Text(writer => writer.WriteNumberValue(result));
});
server.Handle("crash", async (context, arguments, cancellation) =>
{
var result = await implementation.CrashAsync(context, cancellation).ConfigureAwait(false);
return BridgeJson.Text(writer => writer.WriteNumberValue(result));
});
server.Handle("describe", async (context, arguments, cancellation) =>
{
var result = await implementation.DescribeAsync(arguments[0].GetString()!, BridgeJson.Map(arguments[1], e0 => e0.GetString()!), context, cancellation).ConfigureAwait(false);
return BridgeJson.Text(writer => writer.WriteStringValue(result));
});
server.Handle("mean", async (context, arguments, cancellation) =>
{
var result = await implementation.MeanAsync(BridgeJson.List(arguments[0], e0 => e0.GetDouble()), context, cancellation).ConfigureAwait(false);
return BridgeJson.Text(writer => BridgeJson.WriteOptionalValue(writer, result, (w0, v0) => w0.WriteNumberValue(v0)));
});
server.HandleStream("primes", (context, arguments, cancellation) => PrimesItems(implementation, context, arguments, cancellation));
server.Handle("publish", async (context, arguments, cancellation) =>
{
await implementation.PublishAsync(arguments[0].GetString()!, context, cancellation).ConfigureAwait(false);
return "null";
});
server.Handle("slow", async (context, arguments, cancellation) =>
{
var result = await implementation.SlowAsync(arguments[0].GetInt64(), context, cancellation).ConfigureAwait(false);
return BridgeJson.Text(writer => writer.WriteBooleanValue(result));
});
return server;
}
private static async IAsyncEnumerable<string> PrimesItems(IDemoCalc implementation, LinkCallContext context, JsonElement arguments, [EnumeratorCancellation] CancellationToken cancellation)
{
await foreach (var item in implementation.PrimesAsync(arguments[0].GetInt64(), context, cancellation).WithCancellation(cancellation).ConfigureAwait(false))
yield return BridgeJson.Text(writer => writer.WriteNumberValue(item));
}
}
/// <summary>Typowany klient usługi demo.calc dla kodu C#.</summary>
public sealed class DemoCalcClient(LinkClient client)
{
public async Task<long> AddAsync(long a, long b, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
BridgeJson.Parse(await client.CallAsync("add", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(a); writer.WriteNumberValue(b); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());
public async Task<long> CrashAsync(TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
BridgeJson.Parse(await client.CallAsync("crash", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());
public async Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
BridgeJson.Parse(await client.CallAsync("describe", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(name); BridgeJson.WriteMap(writer, tags, (w0, v0) => w0.WriteStringValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetString()!);
public async Task<double?> MeanAsync(IReadOnlyList<double> values, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
BridgeJson.Parse(await client.CallAsync("mean", BridgeJson.Text(writer => { writer.WriteStartArray(); BridgeJson.WriteList(writer, values, (w0, v0) => w0.WriteNumberValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => BridgeJson.OptionalValue(e, e0 => e0.GetDouble()));
public async IAsyncEnumerable<long> PrimesAsync(long limit, int window = 16, [EnumeratorCancellation] CancellationToken cancellation = default)
{
await foreach (var item in client.StreamAsync("primes", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(limit); writer.WriteEndArray(); }), window, cancellation: cancellation).ConfigureAwait(false))
yield return BridgeJson.Parse(item, e => e.GetInt64());
}
public async Task PublishAsync(string text, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
await client.CallAsync("publish", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(text); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false);
public async Task<bool> SlowAsync(long ms, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
BridgeJson.Parse(await client.CallAsync("slow", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(ms); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetBoolean());
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
// <auto-generated>Komentarz autora; nie jest wykonywany.// Kod wygenerowany z kontraktu KretLink „demo.calc” 1.0.0 (sha256 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25).Komentarz autora; nie jest wykonywany.// Nie edytuj ręcznie: zmień plik .klink i uruchom „kret bridge generate”.Komentarz autora; nie jest wykonywany.// </auto-generated>Komentarz autora; nie jest wykonywany.#nullable enableOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.using System.Runtime.CompilerServices;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.using System.Text.Json;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.using Kret.Bridge;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.using Kret.Common;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.using Kret.Link;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.namespace Kret.Examples.Bridge;Pole tożsamości lub wersji w otaczającym bloku; zachowaj jego kontekst.Pusta linia oddziela fragmenty źródła./// <summary>Usługa demo.calc 1.0.0. Implementacja działa w procesie usługi KretBridge.</summary>Komentarz autora; nie jest wykonywany.public interface IDemoCalcOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Suma dwóch liczb całkowitych.</summary>Komentarz autora; nie jest wykonywany.Task<long> AddAsync(long a, long b, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Kończy proces usługi w trakcie wywołania (test awarii).</summary>Komentarz autora; nie jest wykonywany.Task<long> CrashAsync(LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Opis złożony z nazwy i posortowanych etykiet.</summary>Komentarz autora; nie jest wykonywany.Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Średnia; null dla pustej listy.</summary>Komentarz autora; nie jest wykonywany.Task<double?> MeanAsync(IReadOnlyList<double> values, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Kolejne liczby pierwsze mniejsze od limitu.</summary>Komentarz autora; nie jest wykonywany.IAsyncEnumerable<long> PrimesAsync(long limit, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Operacja wymagająca dodatkowego uprawnienia.</summary>Komentarz autora; nie jest wykonywany.Task PublishAsync(string text, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej./// <summary>Czeka podaną liczbę milisekund.</summary>Komentarz autora; nie jest wykonywany.Task<bool> SlowAsync(long ms, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła./// <summary>Kontrakt usługi osadzony w kodzie — ten sam, z którego wygenerowano interfejs.</summary>Komentarz autora; nie jest wykonywany.public static class DemoCalcContractOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.public const string Service = "demo.calc";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.public const string Version = "1.0.0";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.public const string Digest = "0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.public const string Json = """"{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}"""";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.public static LinkContract Load()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var diagnostics = new KcsDiagnostics();Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return LinkContract.Read(System.Text.Encoding.UTF8.GetBytes(Json), diagnostics) ?? throw new InvalidOperationException("osadzony kontrakt jest niepoprawny: " + string.Join("; ", diagnostics.Items));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła./// <summary>Rejestracja metod usługi: odczyt argumentów, wywołanie implementacji, zapis wyniku.</summary>Komentarz autora; nie jest wykonywany.public static class DemoCalcServiceOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.public static LinkServer Register(LinkServer server, IDemoCalc implementation)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.server.Handle("add", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var result = await implementation.AddAsync(arguments[0].GetInt64(), arguments[1].GetInt64(), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return BridgeJson.Text(writer => writer.WriteNumberValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.});Zamknięcie struktury otwartej we wcześniejszych liniach.server.Handle("crash", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var result = await implementation.CrashAsync(context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return BridgeJson.Text(writer => writer.WriteNumberValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.});Zamknięcie struktury otwartej we wcześniejszych liniach.server.Handle("describe", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var result = await implementation.DescribeAsync(arguments[0].GetString()!, BridgeJson.Map(arguments[1], e0 => e0.GetString()!), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return BridgeJson.Text(writer => writer.WriteStringValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.});Zamknięcie struktury otwartej we wcześniejszych liniach.server.Handle("mean", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var result = await implementation.MeanAsync(BridgeJson.List(arguments[0], e0 => e0.GetDouble()), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return BridgeJson.Text(writer => BridgeJson.WriteOptionalValue(writer, result, (w0, v0) => w0.WriteNumberValue(v0)));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.});Zamknięcie struktury otwartej we wcześniejszych liniach.server.HandleStream("primes", (context, arguments, cancellation) => PrimesItems(implementation, context, arguments, cancellation));Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.server.Handle("publish", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.await implementation.PublishAsync(arguments[0].GetString()!, context, cancellation).ConfigureAwait(false);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.return "null";Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.});Zamknięcie struktury otwartej we wcześniejszych liniach.server.Handle("slow", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.var result = await implementation.SlowAsync(arguments[0].GetInt64(), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.return BridgeJson.Text(writer => writer.WriteBooleanValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.});Zamknięcie struktury otwartej we wcześniejszych liniach.return server;Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.private static async IAsyncEnumerable<string> PrimesItems(IDemoCalc implementation, LinkCallContext context, JsonElement arguments, [EnumeratorCancellation] CancellationToken cancellation)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.await foreach (var item in implementation.PrimesAsync(arguments[0].GetInt64(), context, cancellation).WithCancellation(cancellation).ConfigureAwait(false))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.yield return BridgeJson.Text(writer => writer.WriteNumberValue(item));Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła./// <summary>Typowany klient usługi demo.calc dla kodu C#.</summary>Komentarz autora; nie jest wykonywany.public sealed class DemoCalcClient(LinkClient client)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.public async Task<long> AddAsync(long a, long b, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.BridgeJson.Parse(await client.CallAsync("add", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(a); writer.WriteNumberValue(b); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.public async Task<long> CrashAsync(TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.BridgeJson.Parse(await client.CallAsync("crash", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.public async Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.BridgeJson.Parse(await client.CallAsync("describe", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(name); BridgeJson.WriteMap(writer, tags, (w0, v0) => w0.WriteStringValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetString()!);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.public async Task<double?> MeanAsync(IReadOnlyList<double> values, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.BridgeJson.Parse(await client.CallAsync("mean", BridgeJson.Text(writer => { writer.WriteStartArray(); BridgeJson.WriteList(writer, values, (w0, v0) => w0.WriteNumberValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => BridgeJson.OptionalValue(e, e0 => e0.GetDouble()));Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.public async IAsyncEnumerable<long> PrimesAsync(long limit, int window = 16, [EnumeratorCancellation] CancellationToken cancellation = default)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.await foreach (var item in client.StreamAsync("primes", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(limit); writer.WriteEndArray(); }), window, cancellation: cancellation).ConfigureAwait(false))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.yield return BridgeJson.Parse(item, e => e.GetInt64());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.public async Task PublishAsync(string text, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.await client.CallAsync("publish", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(text); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.public async Task<bool> SlowAsync(long ms, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.BridgeJson.Parse(await client.CallAsync("slow", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(ms); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetBoolean());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.
Wynik i typowy błąd
Kod 0 we wszystkich krokach; plik C# ma tę samą treść co `BridgeHost/Calc.g.cs` szablonu (generator deterministyczny).
Uznanie KretBridge za mechanizm izolacji. Usługa C# działa z prawami użytkownika — uruchamiaj tylko zaufane usługi i tylko w trybie deweloperskim SDK (`kret run --bridge`).
Wymagania wersji i procedura lokalna
- sdk
- 1.0.0-rc.3+kret.local.3
- sdkInfoReports
- 1.0.0-rc.3
- core
- 1.0.0-test.6.11-draft.1
- os
- Windows 11 x64
- dotnet
- .NET 10 runtime
Polecenia poniżej są instrukcją do samodzielnego wykonania z właściwym lokalnym SDK. DATA/OUT muszą wskazywać nowe katalogi testowe. Nie ma przycisku uruchamiania na serwerze.
- link-compile
kret link compile Bridge/calc.klinkKatalog: project · Oczekiwany kod wyjścia: 0 - generate
kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.csKatalog: project · Oczekiwany kod wyjścia: 0 - check
kret check . --jsonKatalog: project · Oczekiwany kod wyjścia: 0
Wyniki zapisane w pakiecie źródłowym
To dowód z eksportu, nie wynik bieżącego wykonania w przeglądarce.
# EXPECTED_OUTPUT — KRETBRIDGE-I01-GenerateAndCheck
# Rzeczywisty wynik uruchomienia (SDK 1.0.0-rc.3+kret.local.3, 2026-11-01T12:46:21Z). Ścieżki zastąpione znacznikami <project>, <data>, <out>, <sdk>.
# Actual output of the run. Paths replaced by placeholders.
### 1. link-compile (exit 0, PASS)
> kret link compile Bridge/calc.klink
{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}
[stderr]
Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0
OK: demo.calc 1.0.0, metod: 7, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25
### 2. generate (exit 0, PASS)
> kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.cs
[stderr]
Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0
OK: demo.calc 1.0.0, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25
### 3. check (exit 0, PASS)
> kret check . --json
{
"format": "kret-diagnostics/1",
"project": "<project>",
"succeeded": true,
"plugin": {
"id": "LOCAL-KPL-BRB2GENR",
"name": "BridgeValidation",
"version": "1.0.0",
"profile": "standard",
"database": false
},
"permissions": {
"required": [
"logs.own.write",
"kretlink.connect",
"kretlink.consume"
],
"optional": []
},
"handlers": {
"lifecycle": [
"start",
"shutdown"
],
"events": [],
"commands": [
"bridge.crash",
"bridge.slow",
"bridge.publish"
]
},
"diagnostics": [
{
"file": "<project>\\Bridge\\calc.klink",
"line": 41,
"column": 5,
"endLine": 41,
"endColumn": 11,
"severity": "warning",
"code": "KCS-LNK-0121",
"message": "stream primes: metody strumieniowe s\u0105 eksperymentalne \u2014 transport strumieni nie jest zatwierdzony (D-KCS-13) i nie nale\u017Cy do Stable 1.0"
}
]
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
# EXPECTED_OUTPUT — KRETBRIDGE-I01-GenerateAndCheckOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.# Rzeczywisty wynik uruchomienia (SDK 1.0.0-rc.3+kret.local.3, 2026-11-01T12:46:21Z). Ścieżki zastąpione znacznikami <project>, <data>, <out>, <sdk>.Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.# Actual output of the run. Paths replaced by placeholders.Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.### 1. link-compile (exit 0, PASS)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.> kret link compile Bridge/calc.klinkOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.[stderr]Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.OK: demo.calc 1.0.0, metod: 7, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.### 2. generate (exit 0, PASS)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.> kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.csOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.[stderr]Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.OK: demo.calc 1.0.0, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.Pusta linia oddziela fragmenty źródła.### 3. check (exit 0, PASS)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.> kret check . --jsonOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."format": "kret-diagnostics/1",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."project": "<project>",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."succeeded": true,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."plugin": {Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."id": "LOCAL-KPL-BRB2GENR",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."name": "BridgeValidation",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."version": "1.0.0",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."profile": "standard",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."database": falsePole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.},Zamknięcie struktury otwartej we wcześniejszych liniach."permissions": {Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."required": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."logs.own.write",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."kretlink.connect",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."kretlink.consume"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.],Zamknięcie struktury otwartej we wcześniejszych liniach."optional": []Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.},Zamknięcie struktury otwartej we wcześniejszych liniach."handlers": {Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."lifecycle": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."start",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."shutdown"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.],Zamknięcie struktury otwartej we wcześniejszych liniach."events": [],Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."commands": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."bridge.crash",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."bridge.slow",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."bridge.publish"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.]Zamknięcie struktury otwartej we wcześniejszych liniach.},Zamknięcie struktury otwartej we wcześniejszych liniach."diagnostics": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."file": "<project>\\Bridge\\calc.klink",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."line": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."column": 5,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."endLine": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."endColumn": 11,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."severity": "warning",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."code": "KCS-LNK-0121",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."message": "stream primes: metody strumieniowe s\u0105 eksperymentalne \u2014 transport strumieni nie jest zatwierdzony (D-KCS-13) i nie nale\u017Cy do Stable 1.0"Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.}Zamknięcie struktury otwartej we wcześniejszych liniach.]Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.Pusta linia oddziela fragmenty źródła.Pusta linia oddziela fragmenty źródła.
Diagnostyka i raporty testów
{
"format": "kretos-web-playground-diagnostics/1",
"exampleId": "KRETBRIDGE-I01-GenerateAndCheck",
"sdk": "1.0.0-rc.3+kret.local.3",
"origin": "PRECOMPUTED",
"diagnostics": [
{
"id": "diag.KRETBRIDGE-I01-GenerateAndCheck.3.1",
"exampleId": "KRETBRIDGE-I01-GenerateAndCheck",
"step": 3,
"stepName": "check",
"command": "kret check . --json",
"exitCode": 0,
"file": "Bridge/calc.klink",
"line": 41,
"column": 5,
"endLine": 41,
"endColumn": 11,
"severity": "warning",
"code": "KCS-LNK-0121",
"message": "stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0",
"origin": "PRECOMPUTED (kret check, SDK 1.0.0-rc.3+kret.local.3)"
}
]
}
Czytanie kodu linia po linii
Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.
{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."format": "kretos-web-playground-diagnostics/1",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."exampleId": "KRETBRIDGE-I01-GenerateAndCheck",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."sdk": "1.0.0-rc.3+kret.local.3",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."origin": "PRECOMPUTED",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."diagnostics": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.{Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej."id": "diag.KRETBRIDGE-I01-GenerateAndCheck.3.1",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."exampleId": "KRETBRIDGE-I01-GenerateAndCheck",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."step": 3,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."stepName": "check",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."command": "kret check . --json",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."exitCode": 0,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."file": "Bridge/calc.klink",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."line": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."column": 5,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."endLine": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."endColumn": 11,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."severity": "warning",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."code": "KCS-LNK-0121",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."message": "stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku."origin": "PRECOMPUTED (kret check, SDK 1.0.0-rc.3+kret.local.3)"Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.}Zamknięcie struktury otwartej we wcześniejszych liniach.]Zamknięcie struktury otwartej we wcześniejszych liniach.}Zamknięcie struktury otwartej we wcześniejszych liniach.
Pochodzenie i integralność
KRET_TECH_KRETBRIDGE.zip:KretBridge/Examples/INTERMEDIATE_GenerateAndCheck/example.json
02_PLAYGROUND/EXAMPLES/KRETBRIDGE-I01-GenerateAndCheck.json
SHA-256 73B0662D83D00A9A1D3C3A9CAE7936948DB31FC02EF15B15D7E3C40810CAB240Materiały źródłowe do tego tematu
Przeczytaj powiązane rozdziały. Kod i kontrakty zachowano z importu; historia źródeł jest dostępna przy każdym rozdziale.
KRETBRIDGE-I01-GenerateAndCheck — KretBridge: generacja C# i kontrola wywołań (bez uruchamiania usługi)
KRETBRIDGE-I01-GenerateAndCheck — KretBridge: generacja C# i kontrola wywołań (bez uruchamiania usługi)
🇬🇧 English version below.
| Pole | Wartość |
|---|---|
| Technologia | KretBridge |
| Poziom | INTERMEDIATE |
| Klasyfikacja | VALIDATION_ONLY — Tylko walidacja (bez wykonania) |
| Playground | LOCAL_VALIDATE — lokalnie: walidacja (kret check, lokalny walidator Playground) |
| SDK | 1.0.0-rc.3+kret.local.3 (kandydat lokalny, niepodpisany) |
| Wynik testu | TEST_RESULTS.json, rzeczywisty wynik: EXPECTED_OUTPUT.txt |
Co pokazuje
Szablon SDK csharp-bridge: kontrakt Bridge/calc.klink, kod KretS use Kret.Bridge.demo.calc as calc. kret bridge generate tworzy interfejs C#, a kret check sprawdza każde wywołanie calc.* względem kontraktu. Usługa C# nie jest uruchamiana: KretBridge to PROVISIONAL_VERSIONED, w Core zablokowany (FB-07), a proces usługi nie jest piaskownicą.
Pliki
| Plik |
|---|
Bridge/calc.klink |
BridgeHost/Calc.g.cs |
BridgeHost/CalcBridge.csproj |
BridgeHost/Program.cs |
Script/Main.krs |
host-policy.json |
plugin.kretl |
Jak uruchomić
Katalog roboczy: katalog tego przykładu. kret oznacza <SDK>\Compiler\kret.exe, kretui-host — <SDK>\UiHost\kretui-host.exe. {DATA} / {OUT} to nowe, puste katalogi poza projektem. Wymagania: REQUIREMENTS.md.
kret link compile Bridge/calc.klink— kontrakt (metodastream→ ostrzeżenie)kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.cs— interfejs i klient C#kret check . --json— wywołania KretS ↔ kontrakt
Oczekiwany wynik
Kod 0 we wszystkich krokach; plik C# ma tę samą treść co BridgeHost/Calc.g.cs szablonu (generator deterministyczny).
Najczęstszy błąd
Uznanie KretBridge za mechanizm izolacji. Usługa C# działa z prawami użytkownika — uruchamiaj tylko zaufane usługi i tylko w trybie deweloperskim SDK (kret run --bridge).
Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →