@unifyplane/logsdk 0.1.5 → 0.1.6

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.
@@ -1,4 +1,6 @@
1
1
  import type { SinkEntry, StepRecord } from "../sinks/sink_types.js";
2
2
  export type FanoutOutcome = "OK" | "DEGRADED" | "FAILED";
3
- export declare function fanout(record: StepRecord, sinks: ReadonlyArray<SinkEntry>): Promise<FanoutOutcome>;
3
+ export declare function fanout(record: StepRecord, sinks: ReadonlyArray<SinkEntry>, options?: {
4
+ mode?: "authoritative" | "non-authoritative";
5
+ }): Promise<FanoutOutcome>;
4
6
  //# sourceMappingURL=fanout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fanout.d.ts","sourceRoot":"","sources":["../../src/core/fanout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpE,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEzD,wBAAsB,MAAM,CAC1B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC,CA4BxB"}
1
+ {"version":3,"file":"fanout.d.ts","sourceRoot":"","sources":["../../src/core/fanout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpE,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEzD,wBAAsB,MAAM,CAC1B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,EAC/B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAAA;CAAE,GACzD,OAAO,CAAC,aAAa,CAAC,CAgCxB"}
@@ -1,7 +1,10 @@
1
1
  import { assertHasAuthoritativeSink } from "../validate/schema_guard.js";
2
2
  import { writeEmergencySpool } from "./spool.js";
3
- export async function fanout(record, sinks) {
4
- assertHasAuthoritativeSink(sinks);
3
+ export async function fanout(record, sinks, options) {
4
+ const mode = options?.mode ?? "authoritative";
5
+ if (mode === "authoritative") {
6
+ assertHasAuthoritativeSink(sinks);
7
+ }
5
8
  const frozenRecord = Object.isFrozen(record) ? record : Object.freeze(record);
6
9
  let outcome = "OK";
7
10
  let spooled = false;
@@ -10,7 +13,7 @@ export async function fanout(record, sinks) {
10
13
  await entry.sink.emit(frozenRecord);
11
14
  }
12
15
  catch {
13
- if (entry.sinkClass === "authoritative") {
16
+ if (mode === "authoritative" && entry.sinkClass === "authoritative") {
14
17
  if (!spooled) {
15
18
  try {
16
19
  await writeEmergencySpool(frozenRecord);
@@ -1 +1 @@
1
- {"version":3,"file":"fanout.js","sourceRoot":"","sources":["../../src/core/fanout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAAkB,EAClB,KAA+B;IAE/B,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,KAAK,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;gBACxC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,IAAI,CAAC;wBACH,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;wBACxC,OAAO,GAAG,UAAU,CAAC;wBACrB,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,GAAG,QAAQ,CAAC;oBACrB,CAAC;gBACH,CAAC;gBACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACzB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"fanout.js","sourceRoot":"","sources":["../../src/core/fanout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAAkB,EAClB,KAA+B,EAC/B,OAA0D;IAE1D,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,eAAe,CAAC;IAE9C,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QAC7B,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;gBACpE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,IAAI,CAAC;wBACH,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;wBACxC,OAAO,GAAG,UAAU,CAAC;wBACrB,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,GAAG,QAAQ,CAAC;oBACrB,CAAC;gBACH,CAAC;gBACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACzB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,12 @@ export type LogSDKConfig = {
13
13
  context: unknown;
14
14
  system: SystemOwnership;
15
15
  sinks: ReadonlyArray<SinkEntry>;
16
+ /**
17
+ * Execution mode of the logger.
18
+ * - "authoritative" (default): requires at least one authoritative sink
19
+ * - "non-authoritative": allows orchestration-only runtimes (CLI, planners)
20
+ */
21
+ mode?: "authoritative" | "non-authoritative";
16
22
  };
17
23
  export type LogApi = {
18
24
  step(message: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAW5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,KAAK,SAAS,GAAG,eAAe,GAAG,eAAe,CAAC;AAEnD,KAAK,IAAI,GAAG;IACV,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAwDvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEzD;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAW5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,KAAK,SAAS,GAAG,eAAe,GAAG,eAAe,CAAC;AAEnD,KAAK,IAAI,GAAG;IACV,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAChC;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA0DvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAEzD;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -28,7 +28,9 @@ export function initLogSDK(config) {
28
28
  record_id: idGenerator.nextRecordId(),
29
29
  });
30
30
  assertStepRecord(record);
31
- const outcome = await fanout(record, sinks);
31
+ const outcome = await fanout(record, sinks, {
32
+ mode: config.mode ?? "authoritative",
33
+ });
32
34
  if (outcome === "FAILED") {
33
35
  throw new NonComplianceError(AUTHORITATIVE_FAILURE_SWALLOWED, "Authoritative sink failed to emit.");
34
36
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AA4BrC,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE5B,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAW;QAClB,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAC3C,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,EAC3B,4CAA4C,CAC7C,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,EAC3B,2BAA2B,CAC5B,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CACpE,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE;gBACjF,SAAS,EAAE,WAAW,CAAC,YAAY,EAAE;aACtC,CAAC,CAAC;YAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,kBAAkB,CAC1B,+BAA+B,EAC/B,oCAAoC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK;YACT,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;IAEF,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,eAAe,EAAmB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EACL,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAkCrC,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE5B,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAW;QAClB,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAC3C,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,EAC3B,4CAA4C,CAC7C,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,EAC3B,2BAA2B,CAC5B,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CACpE,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE;gBACjF,SAAS,EAAE,WAAW,CAAC,YAAY,EAAE;aACtC,CAAC,CAAC;YAEH,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE;gBAC1C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,eAAe;aACrC,CAAC,CAAC;YACH,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,kBAAkB,CAC1B,+BAA+B,EAC/B,oCAAoC,CACrC,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK;YACT,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrB,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;IAEF,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@unifyplane/logsdk",
4
- "version": "0.1.5",
4
+ "version": "0.1.6",
5
5
 
6
6
  "exports": {
7
7
  ".": {
@@ -6,9 +6,14 @@ export type FanoutOutcome = "OK" | "DEGRADED" | "FAILED";
6
6
 
7
7
  export async function fanout(
8
8
  record: StepRecord,
9
- sinks: ReadonlyArray<SinkEntry>
9
+ sinks: ReadonlyArray<SinkEntry>,
10
+ options?: { mode?: "authoritative" | "non-authoritative" }
10
11
  ): Promise<FanoutOutcome> {
11
- assertHasAuthoritativeSink(sinks);
12
+ const mode = options?.mode ?? "authoritative";
13
+
14
+ if (mode === "authoritative") {
15
+ assertHasAuthoritativeSink(sinks);
16
+ }
12
17
  const frozenRecord = Object.isFrozen(record) ? record : Object.freeze(record);
13
18
  let outcome: FanoutOutcome = "OK";
14
19
  let spooled = false;
@@ -17,7 +22,7 @@ export async function fanout(
17
22
  try {
18
23
  await entry.sink.emit(frozenRecord);
19
24
  } catch {
20
- if (entry.sinkClass === "authoritative") {
25
+ if (mode === "authoritative" && entry.sinkClass === "authoritative") {
21
26
  if (!spooled) {
22
27
  try {
23
28
  await writeEmergencySpool(frozenRecord);
package/src/index.ts CHANGED
@@ -29,6 +29,12 @@ export type LogSDKConfig = {
29
29
  context: unknown;
30
30
  system: SystemOwnership;
31
31
  sinks: ReadonlyArray<SinkEntry>;
32
+ /**
33
+ * Execution mode of the logger.
34
+ * - "authoritative" (default): requires at least one authoritative sink
35
+ * - "non-authoritative": allows orchestration-only runtimes (CLI, planners)
36
+ */
37
+ mode?: "authoritative" | "non-authoritative";
32
38
  };
33
39
 
34
40
  export type LogApi = {
@@ -75,7 +81,9 @@ export function initLogSDK(config: LogSDKConfig): LogApi {
75
81
 
76
82
  assertStepRecord(record);
77
83
 
78
- const outcome = await fanout(record, sinks);
84
+ const outcome = await fanout(record, sinks, {
85
+ mode: config.mode ?? "authoritative",
86
+ });
79
87
  if (outcome === "FAILED") {
80
88
  throw new NonComplianceError(
81
89
  AUTHORITATIVE_FAILURE_SWALLOWED,
package/src.zip CHANGED
Binary file