@integrity-labs/xero-broker 0.1.2 → 0.1.3

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 (2) hide show
  1. package/dist/index.js +32 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -20987,10 +20987,41 @@ var StdioServerTransport = class {
20987
20987
 
20988
20988
  // src/turn-initiator-marker.ts
20989
20989
  import { readFileSync } from "fs";
20990
+ import { dirname, join } from "path";
20990
20991
  var TURN_INITIATOR_MAX_AGE_MS = 5 * 60 * 1e3;
20992
+ var TURN_INITIATOR_LEDGER_FILENAME = ".turn-initiator-ledger.json";
20993
+ function readTurnInitiatorFromLedger(file, maxAgeMs) {
20994
+ const ledgerFile = join(dirname(file), TURN_INITIATOR_LEDGER_FILENAME);
20995
+ let entries;
20996
+ try {
20997
+ const parsed = JSON.parse(readFileSync(ledgerFile, "utf8"));
20998
+ if (!parsed || parsed.v !== 1 || !Array.isArray(parsed.entries)) return "no-ledger";
20999
+ entries = parsed.entries;
21000
+ } catch {
21001
+ return "no-ledger";
21002
+ }
21003
+ const now = Date.now();
21004
+ const fresh = entries.filter(
21005
+ (e) => e && typeof e.channel === "string" && e.channel && typeof e.sender_id === "string" && e.sender_id && typeof e.ts === "number" && Number.isFinite(e.ts) && now - e.ts >= 0 && now - e.ts <= maxAgeMs
21006
+ );
21007
+ if (fresh.length === 1) {
21008
+ const e = fresh[0];
21009
+ return { channel: e.channel, sender_id: e.sender_id };
21010
+ }
21011
+ if (fresh.length >= 2) {
21012
+ process.stderr.write(
21013
+ `turn-initiator: ambiguous (${fresh.length} fresh senders), withholding initiator
21014
+ `
21015
+ );
21016
+ return null;
21017
+ }
21018
+ return "no-ledger";
21019
+ }
20991
21020
  function readTurnInitiator(maxAgeMs = TURN_INITIATOR_MAX_AGE_MS) {
20992
21021
  const file = process.env["AGT_TURN_INITIATOR_FILE"];
20993
21022
  if (!file) return null;
21023
+ const fromLedger = readTurnInitiatorFromLedger(file, maxAgeMs);
21024
+ if (fromLedger !== "no-ledger") return fromLedger;
20994
21025
  try {
20995
21026
  const raw = readFileSync(file, "utf8");
20996
21027
  const m = JSON.parse(raw);
@@ -21207,7 +21238,7 @@ var awaitDecisionSchema = external_exports.object({
21207
21238
  // package.json
21208
21239
  var package_default = {
21209
21240
  name: "@integrity-labs/xero-broker",
21210
- version: "0.1.2",
21241
+ version: "0.1.3",
21211
21242
  description: "Xero Broker \u2014 MCP server that routes money- and ledger-touching Xero writes through approval-core (HITL). Sibling to cloud-broker / channel-broker; the only write path for an agent once the vendor xero-mcp-server's write tools are stripped. ENG-4922.",
21212
21243
  type: "module",
21213
21244
  bin: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/xero-broker",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Xero Broker — MCP server that routes money- and ledger-touching Xero writes through approval-core (HITL). Sibling to cloud-broker / channel-broker; the only write path for an agent once the vendor xero-mcp-server's write tools are stripped. ENG-4922.",
5
5
  "type": "module",
6
6
  "bin": {