@happyvertical/smrt-sales 0.57.22 → 0.57.24

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 (67) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +34 -0
  3. package/agents/agreements.md +32 -0
  4. package/agents/commissions.md +2 -1
  5. package/agents/crm.md +150 -0
  6. package/agents/svelte.md +7 -0
  7. package/dist/agreements/collections/AgreementCollection.d.ts +3 -2
  8. package/dist/agreements/collections/AgreementCollection.d.ts.map +1 -1
  9. package/dist/agreements/models/Agreement.d.ts.map +1 -1
  10. package/dist/agreements/services/AgreementExecutionService.d.ts +9 -0
  11. package/dist/agreements/services/AgreementExecutionService.d.ts.map +1 -1
  12. package/dist/agreements/types.d.ts +2 -0
  13. package/dist/agreements/types.d.ts.map +1 -1
  14. package/dist/agreements.js +2 -2
  15. package/dist/chunks/__smrt-register__-Yzz7_2xD.js +6 -0
  16. package/dist/chunks/__smrt-register__-Yzz7_2xD.js.map +1 -0
  17. package/dist/chunks/{agreements-jBiVmttD.js → agreements-RsyRLeDn.js} +35 -16
  18. package/dist/chunks/agreements-RsyRLeDn.js.map +1 -0
  19. package/dist/chunks/{commissions-D5x24d4o.js → commissions-nMBMa0DT.js} +410 -344
  20. package/dist/chunks/commissions-nMBMa0DT.js.map +1 -0
  21. package/dist/chunks/{crm-BRICSwf2.js → crm-BENK-hHd.js} +793 -123
  22. package/dist/chunks/crm-BENK-hHd.js.map +1 -0
  23. package/dist/chunks/{referrals-BRdTkEFt.js → referrals-BPEaXqCz.js} +2 -2
  24. package/dist/chunks/{referrals-BRdTkEFt.js.map → referrals-BPEaXqCz.js.map} +1 -1
  25. package/dist/commissions/collections/CommissionPayoutCollection.d.ts +3 -1
  26. package/dist/commissions/collections/CommissionPayoutCollection.d.ts.map +1 -1
  27. package/dist/commissions/models/CommissionPayout.d.ts +15 -1
  28. package/dist/commissions/models/CommissionPayout.d.ts.map +1 -1
  29. package/dist/commissions/services/CommissionPayoutService.d.ts.map +1 -1
  30. package/dist/commissions/types.d.ts +2 -0
  31. package/dist/commissions/types.d.ts.map +1 -1
  32. package/dist/commissions.js +2 -2
  33. package/dist/crm/collections/SalesGovernanceEventCollection.d.ts +7 -0
  34. package/dist/crm/collections/SalesGovernanceEventCollection.d.ts.map +1 -0
  35. package/dist/crm/collections/SalesGovernanceStateCollection.d.ts +13 -0
  36. package/dist/crm/collections/SalesGovernanceStateCollection.d.ts.map +1 -0
  37. package/dist/crm/index.d.ts +6 -0
  38. package/dist/crm/index.d.ts.map +1 -1
  39. package/dist/crm/models/SalesGovernanceEvent.d.ts +19 -0
  40. package/dist/crm/models/SalesGovernanceEvent.d.ts.map +1 -0
  41. package/dist/crm/models/SalesGovernanceState.d.ts +17 -0
  42. package/dist/crm/models/SalesGovernanceState.d.ts.map +1 -0
  43. package/dist/crm/services/SalesGovernanceService.d.ts +68 -0
  44. package/dist/crm/services/SalesGovernanceService.d.ts.map +1 -0
  45. package/dist/crm/services/governance-write.d.ts +4 -0
  46. package/dist/crm/services/governance-write.d.ts.map +1 -0
  47. package/dist/crm/services/sales-governance-types.d.ts +108 -0
  48. package/dist/crm/services/sales-governance-types.d.ts.map +1 -0
  49. package/dist/crm.js +3 -3
  50. package/dist/index.js +6 -6
  51. package/dist/manifest.json +592 -5
  52. package/dist/referrals.js +2 -2
  53. package/dist/smrt-knowledge.json +320 -14
  54. package/dist/svelte/components/SellerGovernancePanel.svelte +65 -0
  55. package/dist/svelte/components/SellerGovernancePanel.svelte.d.ts +13 -0
  56. package/dist/svelte/components/SellerGovernancePanel.svelte.d.ts.map +1 -0
  57. package/dist/svelte/index.d.ts +2 -1
  58. package/dist/svelte/index.d.ts.map +1 -1
  59. package/dist/svelte/index.js +1 -0
  60. package/dist/svelte/types.d.ts +22 -1
  61. package/dist/svelte/types.d.ts.map +1 -1
  62. package/package.json +6 -6
  63. package/dist/chunks/__smrt-register__-bn1C2AUF.js +0 -6
  64. package/dist/chunks/__smrt-register__-bn1C2AUF.js.map +0 -1
  65. package/dist/chunks/agreements-jBiVmttD.js.map +0 -1
  66. package/dist/chunks/commissions-D5x24d4o.js.map +0 -1
  67. package/dist/chunks/crm-BRICSwf2.js.map +0 -1
@@ -219,7 +219,7 @@ var Agreement = class extends SmrtObject {
219
219
  /** @internal Complete observation of a collection-owned guarded transition. */
220
220
  async refreshAfterLifecycleTransition() {
221
221
  if (!this.isPersisted || !this.id) throw new Error("Agreement is not persisted");
222
- const durableRow = await this.db.get(this.tableName, { id: this.id });
222
+ const durableRow = await this.getCanonicalPersistedRow({ id: this.id });
223
223
  if (!durableRow) throw new Error("Agreement disappeared during transition");
224
224
  await this.completePersistedUpdate(durableRow);
225
225
  loadedStatus.set(this, this.status);
@@ -227,7 +227,7 @@ var Agreement = class extends SmrtObject {
227
227
  frozenEnd.set(this, this.effectiveTo?.getTime() ?? null);
228
228
  }
229
229
  async assertActivationProvenanceUnchanged() {
230
- const persisted = this.isPersisted && this.id ? await this.db.get(this.tableName, { id: this.id }) : null;
230
+ const persisted = this.isPersisted && this.id ? await this.getCanonicalPersistedRow({ id: this.id }) : null;
231
231
  const priorId = persisted?.amendment_predecessor_id ?? null;
232
232
  const priorEnd = coerceAgreementDate(persisted?.amendment_predecessor_end)?.getTime() ?? null;
233
233
  if (this.amendmentPredecessorId !== priorId || (this.amendmentPredecessorEnd?.getTime() ?? null) !== priorEnd) throw new Error("Agreement activation provenance is owned by activateAmendment");
@@ -249,15 +249,23 @@ var Agreement = class extends SmrtObject {
249
249
  async assertNaturalKeyNotTaken() {
250
250
  if (!this.kind || !this.partyA || !this.partyB) return;
251
251
  try {
252
- const res = await this.db.query(`SELECT id, tenant_id FROM ${this.tableName} WHERE kind = $1 AND party_a = $2 AND party_b = $3 AND version = $4`, this.kind, this.partyA, this.partyB, this.version);
253
- if ((Array.isArray(res) ? res : res.rows ?? []).some((row) => (row.tenant_id ?? null) === (this.tenantId ?? null) && row.id !== this.id)) throw new Error(`Agreement ${this.kind}@${this.version}: this immutable version already exists; create an amendment instead`);
252
+ const result = await this.db.query(`SELECT id, tenant_id FROM ${this.tableName} WHERE kind = $1 AND party_a = $2 AND party_b = $3 AND version = $4`, this.kind, this.partyA, this.partyB, this.version);
253
+ if ((Array.isArray(result) ? result : result.rows).length === 0) return;
254
+ if (await this.getCanonicalPersistedRow({
255
+ kind: this.kind,
256
+ party_a: this.partyA,
257
+ party_b: this.partyB,
258
+ version: this.version,
259
+ tenant_id: this.tenantId,
260
+ ...this.id ? { "id !=": this.id } : {}
261
+ })) throw new Error(`Agreement ${this.kind}@${this.version}: this immutable version already exists; create an amendment instead`);
254
262
  } catch (error) {
255
263
  if (error instanceof Error && error.message.includes("immutable version")) throw error;
256
264
  }
257
265
  }
258
266
  async resolvePriorStatus() {
259
267
  if (this.id) try {
260
- const row = await this.db.get(this.tableName, { id: this.id });
268
+ const row = await this.getCanonicalPersistedRow({ id: this.id });
261
269
  if (row?.status != null) return row.status;
262
270
  } catch {}
263
271
  return loadedStatus.get(this);
@@ -420,8 +428,9 @@ var AgreementCollection = class AgreementCollection extends SmrtCollection {
420
428
  if (!activated) throw new Error(`Agreement '${activatedId}' disappeared`);
421
429
  return activated;
422
430
  }
423
- /** Withdraw a scheduled successor before it has ever governed.
424
- * Restores only its persisted predecessor boundary, in the same transaction.
431
+ /** Withdraw a scheduled active version before it has ever governed.
432
+ * Restores its persisted predecessor boundary when activation closed one.
433
+ * Initial versions and amendments following a gap restore nothing.
425
434
  * Repeated/concurrent withdrawal refuses rather than applying recovery twice.
426
435
  */
427
436
  async withdrawAmendment(id) {
@@ -431,18 +440,21 @@ var AgreementCollection = class AgreementCollection extends SmrtCollection {
431
440
  const agreements = await AgreementCollection.create({ db: tx });
432
441
  const successor = await agreements.get({ id });
433
442
  const now = /* @__PURE__ */ new Date();
434
- if (!successor || successor.status !== "active" || !successor.effectiveFrom || successor.effectiveFrom <= now || !successor.amendmentPredecessorId) throw new Error("Only a scheduled active amendment with predecessor provenance can be withdrawn");
435
- const predecessor = await agreements.get({ id: successor.amendmentPredecessorId });
436
- if (!predecessor || predecessor.tenantId !== successor.tenantId || predecessor.kind !== successor.kind || predecessor.partyA !== successor.partyA || predecessor.partyB !== successor.partyB || predecessor.version >= successor.version || predecessor.status !== "superseded" || predecessor.effectiveTo?.getTime() !== successor.effectiveFrom.getTime()) throw new Error("Agreement withdrawal predecessor no longer matches activation provenance");
443
+ if (!successor || successor.status !== "active" || !successor.effectiveFrom || successor.effectiveFrom <= now) throw new Error("Only a scheduled active agreement can be withdrawn");
444
+ const predecessor = successor.amendmentPredecessorId ? await agreements.get({ id: successor.amendmentPredecessorId }) : null;
445
+ if (successor.amendmentPredecessorId && (!predecessor || predecessor.tenantId !== successor.tenantId || predecessor.kind !== successor.kind || predecessor.partyA !== successor.partyA || predecessor.partyB !== successor.partyB || predecessor.version >= successor.version || predecessor.status !== "superseded" || predecessor.effectiveTo?.getTime() !== successor.effectiveFrom.getTime())) throw new Error("Agreement withdrawal predecessor no longer matches activation provenance");
437
446
  const restoredEnd = successor.amendmentPredecessorEnd;
438
- if (restoredEnd && restoredEnd <= successor.effectiveFrom) throw new Error("Agreement withdrawal has invalid predecessor boundary provenance");
439
- if ((await agreements.findGoverningCandidates(successor.kind, successor.partyA, successor.partyB, successor.tenantId, false)).some((row) => row.id !== successor.id && row.id !== predecessor.id && row.status !== "draft" && row.status !== "cancelled" && (!restoredEnd || !row.effectiveFrom || row.effectiveFrom < restoredEnd) && (!row.effectiveTo || row.effectiveTo > successor.effectiveFrom))) throw new Error("Agreement withdrawal would overlap governing history");
447
+ if (restoredEnd && (!predecessor || restoredEnd <= successor.effectiveFrom)) throw new Error("Agreement withdrawal has invalid predecessor boundary provenance");
448
+ const checkedEnd = predecessor ? restoredEnd : successor.effectiveTo;
449
+ if ((await agreements.findGoverningCandidates(successor.kind, successor.partyA, successor.partyB, successor.tenantId, false)).some((row) => row.id !== successor.id && row.id !== predecessor?.id && row.status !== "draft" && row.status !== "cancelled" && (!checkedEnd || !row.effectiveFrom || row.effectiveFrom < checkedEnd) && (!row.effectiveTo || row.effectiveTo > successor.effectiveFrom))) throw new Error("Agreement withdrawal would overlap governing history");
440
450
  await claimLifecycleRevision(successor);
441
451
  if (returnedRows(await tx.query(`UPDATE ${agreements.tableName} SET status = 'cancelled' WHERE id = $1 AND status = 'active' AND effective_from > $2 RETURNING id`, id, (/* @__PURE__ */ new Date()).toISOString())).length !== 1) throw new Error("Agreement withdrawal lost its scheduled active transition");
442
- await claimLifecycleRevision(predecessor);
443
- if (returnedRows(await tx.query(`UPDATE ${agreements.tableName} SET status = 'active', effective_to = $1 WHERE id = $2 AND status = 'superseded' AND effective_to = $3 RETURNING id`, restoredEnd?.toISOString() ?? null, predecessor.id, successor.effectiveFrom.toISOString())).length !== 1) throw new Error("Agreement withdrawal predecessor changed concurrently");
452
+ if (predecessor) {
453
+ await claimLifecycleRevision(predecessor);
454
+ if (returnedRows(await tx.query(`UPDATE ${agreements.tableName} SET status = 'active', effective_to = $1 WHERE id = $2 AND status = 'superseded' AND effective_to = $3 RETURNING id`, restoredEnd?.toISOString() ?? null, predecessor.id, successor.effectiveFrom.toISOString())).length !== 1) throw new Error("Agreement withdrawal predecessor changed concurrently");
455
+ }
444
456
  await successor.refreshAfterLifecycleTransition();
445
- await predecessor.refreshAfterLifecycleTransition();
457
+ if (predecessor) await predecessor.refreshAfterLifecycleTransition();
446
458
  });
447
459
  invalidateCollectionCache(resolveDbCacheKey(this.db), this.tableName);
448
460
  const withdrawn = await this.get({ id });
@@ -1336,6 +1348,7 @@ var AgreementExecutionService = class {
1336
1348
  this.assertTenant(input.tenantId);
1337
1349
  this.assertProviderCapabilities();
1338
1350
  this.assertCreateInput(input);
1351
+ await this.authorizeSigning(input);
1339
1352
  const sourceBytes = await readByteSource(input.document.data);
1340
1353
  if (sourceBytes.byteLength === 0) throw new Error("Agreement execution document must not be empty");
1341
1354
  const sourceSha256 = sha256(sourceBytes);
@@ -1417,6 +1430,7 @@ var AgreementExecutionService = class {
1417
1430
  let request;
1418
1431
  let providerResponded = false;
1419
1432
  try {
1433
+ await this.authorizeSigning(input);
1420
1434
  request = await this.deps.provider.createRequest({
1421
1435
  tenantId: input.tenantId,
1422
1436
  idempotencyKey: input.idempotencyKey,
@@ -1999,6 +2013,10 @@ var AgreementExecutionService = class {
1999
2013
  replayed
2000
2014
  };
2001
2015
  }
2016
+ async authorizeSigning(input) {
2017
+ if (input.sourceKind === "sales-quote" && (!input.signingActorProfileId?.trim() || !this.deps.authorizeSigning)) throw new Error("Governed sales quote signing requires an actor and authorization guard");
2018
+ await this.deps.authorizeSigning?.(input);
2019
+ }
2002
2020
  assertTenant(expected) {
2003
2021
  this.assertTenantValue(requireTenantId(), expected, "tenant context");
2004
2022
  }
@@ -2018,6 +2036,7 @@ function hashRequestIntent(input, provider, sourceSha256, effectiveFrom, effecti
2018
2036
  sourceKind: input.sourceKind,
2019
2037
  sourceId: input.sourceId,
2020
2038
  sourceVersion: input.sourceVersion,
2039
+ ...input.signingActorProfileId ? { signingActorProfileId: input.signingActorProfileId } : {},
2021
2040
  sourceSha256,
2022
2041
  documentName: input.document.name,
2023
2042
  documentMediaType: input.document.mediaType,
@@ -2107,4 +2126,4 @@ function canAdvanceStatus(current, next) {
2107
2126
  //#endregion
2108
2127
  export { AgreementExecutionEvent as a, AgreementCollection as c, serializeAgreementParty as d, AGREEMENT_EXECUTION_STATUSES as f, sanitizeSignerIntent as g, sanitizeSignerEvidence as h, AgreementExecutionEventCollection as i, Agreement as l, coerceAgreementDate as m, ExecutedAgreementCollection as n, AgreementExecutionCollection as o, AGREEMENT_STATUSES as p, ExecutedAgreement as r, AgreementExecution as s, AgreementExecutionService as t, parseAgreementParty as u };
2109
2128
 
2110
- //# sourceMappingURL=agreements-jBiVmttD.js.map
2129
+ //# sourceMappingURL=agreements-RsyRLeDn.js.map