@inetafrica/open-claudia 3.2.3 → 3.3.2
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.
- package/CHANGELOG.md +20 -0
- package/bin/loopback-client.js +4 -0
- package/bot.js +10 -1
- package/channels/kazee/adapter.js +5 -0
- package/channels/kazee/call/audio.js +79 -0
- package/channels/kazee/call/manager.js +6 -0
- package/channels/kazee/call/session.js +356 -48
- package/channels/kazee/call/speech-client.js +38 -3
- package/core/actions.js +96 -4
- package/core/enforcer.js +52 -3
- package/core/handlers.js +46 -2
- package/core/intro-flow.js +81 -16
- package/core/loopback.js +37 -0
- package/core/media.js +71 -18
- package/core/pack-review.js +18 -0
- package/core/relationship.js +18 -2
- package/core/router.js +17 -7
- package/core/runner.js +7 -1
- package/core/speaker-attest.js +56 -0
- package/core/system-prompt.js +21 -4
- package/core/verify-contact.js +156 -0
- package/package.json +2 -2
- package/test-enforcer.js +31 -0
- package/test-kazee-call-manager.js +4 -1
- package/test-kazee-call-session.js +100 -4
- package/test-mandate-hygiene.js +23 -5
- package/test-provider-language.js +25 -1
package/test-mandate-hygiene.js
CHANGED
|
@@ -63,13 +63,31 @@ assert.strictEqual(entities.readEntity("busy-contact").sections.Mandate, nearFul
|
|
|
63
63
|
// ── no record: nothing to write to → refused with a reason ──
|
|
64
64
|
const r4 = appendMandate({ entitySlug: "", personName: "" }, "anything");
|
|
65
65
|
assert.strictEqual(r4.ok, false, "no contact record → refused");
|
|
66
|
-
assert.ok(/no contact record/.test(r4.reason));
|
|
66
|
+
assert.ok(/no linked contact record/.test(r4.reason));
|
|
67
67
|
|
|
68
|
-
// ──
|
|
68
|
+
// ── name-only records are REFUSED, never name-keyed: a display name is
|
|
69
|
+
// spoofable, and a name-keyed upsert could land security text on a same-named
|
|
70
|
+
// OTHER person's note (v3.3.2 — this replaced the legacy fallback). ──
|
|
69
71
|
const r5 = appendMandate({ entitySlug: "", personName: "Legacy Larry" }, "asking build status");
|
|
70
|
-
assert.strictEqual(r5.ok,
|
|
71
|
-
assert.ok(/
|
|
72
|
-
|
|
72
|
+
assert.strictEqual(r5.ok, false, "name-only record is refused");
|
|
73
|
+
assert.ok(/no linked contact record/.test(r5.reason));
|
|
74
|
+
assert.strictEqual(entities.readEntity("legacy-larry"), null,
|
|
75
|
+
"no entity is ever minted from a bare display name");
|
|
76
|
+
|
|
77
|
+
// ── personId resolution: a record without an entitySlug resolves through the
|
|
78
|
+
// person REGISTRY (id → entitySlug), never through the spoofable name ──
|
|
79
|
+
const people = require("./core/people");
|
|
80
|
+
const harry = people.add({ name: "Hash Harry" });
|
|
81
|
+
people.setEntitySlug(harry.id, "hash-harry-9f9f9f");
|
|
82
|
+
entities.upsertEntity({ slug: "hash-harry-9f9f9f", name: "Hash Harry", relationship: "external" });
|
|
83
|
+
const r6 = appendMandate({ personId: harry.id, personName: "Spoofed Name" }, "asking build status");
|
|
84
|
+
assert.strictEqual(r6.ok, true, "personId-only record resolves via the registry");
|
|
85
|
+
assert.ok(/build status/.test(entities.readEntity("hash-harry-9f9f9f").sections.Mandate || ""),
|
|
86
|
+
"the grant lands on the person's registered slug");
|
|
87
|
+
assert.strictEqual(entities.readEntity("spoofed-name"), null,
|
|
88
|
+
"the transport display name never picks the target");
|
|
89
|
+
const r7 = appendMandate({ personId: "missing-person-id", personName: "Ghost" }, "anything");
|
|
90
|
+
assert.strictEqual(r7.ok, false, "an unresolvable personId is refused, not name-keyed");
|
|
73
91
|
|
|
74
92
|
// ── P3: capability-scoped grants — expiry, refresh, ids, revoke ──
|
|
75
93
|
const mandates = require("./core/mandates");
|
|
@@ -365,7 +365,31 @@ assert.match(pkg.description, /provider-agnostic coding-agent harness/i);
|
|
|
365
365
|
// 2h); a lapsed deadline with a still-failing check fires the wake anyway as
|
|
366
366
|
// a marked "Watch expired" prompt and removes the watch, so a watch whose
|
|
367
367
|
// condition never comes true can no longer end silently.
|
|
368
|
-
|
|
368
|
+
// 3.3.0 cut 2026-08-14 (verify-contact batch: owner-only verify flow, HMAC
|
|
369
|
+
// speaker attest on owner-gated loopback kinds, closed relay/transcript
|
|
370
|
+
// egress) — but the release commit bumped package.json WITHOUT this pin, so
|
|
371
|
+
// the tag's build job failed on this very assert: npm kept 3.2.3 and nothing
|
|
372
|
+
// was published. Never retag a failed version — re-cut as +1.
|
|
373
|
+
// 3.3.1 approved by Sumeet 2026-08-19 ("The tts timeout for long messages is
|
|
374
|
+
// getting to be a problem Please fix it", with the sales-bot failure
|
|
375
|
+
// screenshot): pocket TTS sentence-packs long text into ≤450-char chunks,
|
|
376
|
+
// synthesizes each inside its own 120s window (one retry per chunk), and
|
|
377
|
+
// ffmpeg-concats the wavs into ONE ogg — message length can no longer abort
|
|
378
|
+
// the single gateway request and strand pods (no ElevenLabs key, no macOS
|
|
379
|
+
// say) voiceless. Carries the unpublished 3.3.0 content plus the Kazee calls
|
|
380
|
+
// batch (trickle ICE + streaming TTS playback, ringing-on-invite/deferred
|
|
381
|
+
// publish, werift ICE rejection suppression). Plus this pin repair.
|
|
382
|
+
// 3.3.2 approved by Sumeet 2026-08-20 ("Okay, I'll go with your
|
|
383
|
+
// recommendations. Can you make sure you fix everything ... push everything
|
|
384
|
+
// out once the new versions have landed for the dockers update the entire
|
|
385
|
+
// fleet"): the identity/guardrail batch behind the Coders Africa incident —
|
|
386
|
+
// transport-verified sender adoption (a known transport user id in an
|
|
387
|
+
// adapter-attested DM is never interrogated; the router falls through and
|
|
388
|
+
// handles the adopted turn), applyApproval mirrors person.isOwner instead of
|
|
389
|
+
// demoting approved owners, and the mandate writer is strictly slug-keyed
|
|
390
|
+
// (name-keyed fallback removed) with stranded dual-file grants surfaced on
|
|
391
|
+
// the escalation card.
|
|
392
|
+
assert.strictEqual(pkg.version, "3.3.2", "release version must remain unchanged without explicit approval");
|
|
369
393
|
for (const keyword of ["claude", "codex", "coding-agent", "provider-agnostic"]) {
|
|
370
394
|
assert.ok(pkg.keywords.includes(keyword), `package keyword missing: ${keyword}`);
|
|
371
395
|
}
|