{"_id":"@braedonsaunders/appkit-sync","_rev":"2-6a12089cfb85d1948965cf4da9046496","name":"@braedonsaunders/appkit-sync","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.0":{"name":"@braedonsaunders/appkit-sync","version":"1.1.0","keywords":["appkit","application-framework","typescript"],"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","_id":"@braedonsaunders/appkit-sync@1.1.0","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/sync#readme","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"dist":{"shasum":"5b3101f464139c570bb4676b9f81462e428816dd","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-sync/-/appkit-sync-1.1.0.tgz","fileCount":72,"integrity":"sha512-Gi+xGyuhpMPTAlzFBiBkig5WR8B61dxbRFD2gPS9RBeh9BQL4HL965L6EfTecE2WOC/fm4+wzsJSGr4D0Nkcig==","signatures":[{"sig":"MEQCIBXh/cm4qxN4BC3O4HoB19SaMW24QjBbf1fMq8Zm9vcAAiBLy6UFBaAcE0WE7td3c0e5DZ+gl0gOCAKOVekp+6NBxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-sync@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":444274},"main":"./index.js","type":"module","_from":"file:braedonsaunders-appkit-sync-1.1.0.tgz","types":"./index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./csv":{"types":"./csv.d.ts","import":"./csv.js","default":"./csv.js"},"./egress":{"types":"./egress.d.ts","import":"./egress.js","default":"./egress.js"},"./schema":{"types":"./schema.d.ts","import":"./schema.js","default":"./schema.js"},"./catalog":{"types":"./types.d.ts","import":"./types.js","default":"./types.js"},"./drizzle":{"types":"./drizzle.d.ts","import":"./drizzle.js","default":"./drizzle.js"},"./runtime":{"types":"./runtime.d.ts","import":"./runtime.js","default":"./runtime.js"},"./registry":{"types":"./registry.d.ts","import":"./registry.js","default":"./registry.js"},"./transform":{"types":"./transform.d.ts","import":"./transform.js","default":"./transform.js"},"./db-drivers":{"types":"./db-drivers.d.ts","import":"./db-drivers.js","default":"./db-drivers.js"},"./package.json":"./package.json","./connectors/csv":{"types":"./connectors/csv.d.ts","import":"./connectors/csv.js","default":"./connectors/csv.js"},"./snapshot-policy":{"types":"./snapshot-policy.d.ts","import":"./snapshot-policy.js","default":"./snapshot-policy.js"},"./connectors/nango":{"types":"./connectors/nango.d.ts","import":"./connectors/nango.js","default":"./connectors/nango.js"},"./person-sync-policy":{"types":"./person-sync-policy.d.ts","import":"./person-sync-policy.js","default":"./person-sync-policy.js"},"./connectors/database":{"types":"./connectors/database.d.ts","import":"./connectors/database.js","default":"./connectors/database.js"},"./connectors/netsuite":{"types":"./connectors/netsuite.d.ts","import":"./connectors/netsuite.js","default":"./connectors/netsuite.js"},"./connectors/http-json":{"types":"./connectors/http-json.d.ts","import":"./connectors/http-json.js","default":"./connectors/http-json.js"}},"_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"_resolved":"/tmp/eb895eac07b00b82211104e2fb25e357/braedonsaunders-appkit-sync-1.1.0.tgz","_integrity":"sha512-Gi+xGyuhpMPTAlzFBiBkig5WR8B61dxbRFD2gPS9RBeh9BQL4HL965L6EfTecE2WOC/fm4+wzsJSGr4D0Nkcig==","repository":{"url":"git+https://github.com/braedonsaunders/appkit.git","type":"git","directory":"packages/sync"},"_npmVersion":"10.9.8","description":"Production data synchronization with transactional batches, per-record ledgers, fail-closed snapshots, connector families, and durable cursors.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"@braedonsaunders/appkit-egress-proxy":"^0.1.0"},"_hasShrinkwrap":false,"peerDependencies":{"mssql":"^11.0.1","mysql2":"^3.22.6","postgres":"^3.4.9","drizzle-orm":"^0.45.2","@braedonsaunders/appkit-db":"^0.2.0"},"peerDependenciesMeta":{"mssql":{"optional":true},"mysql2":{"optional":true},"postgres":{"optional":true},"drizzle-orm":{"optional":true},"@braedonsaunders/appkit-db":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit-sync_1.1.0_1787183255514_0.18670442674249932","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"_id":"@braedonsaunders/appkit-sync@1.1.1","bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"dist":{"shasum":"d51b3d17cf16adf0a3ff76ad598e070ecfe1015e","tarball":"https://registry.npmjs.org/@braedonsaunders/appkit-sync/-/appkit-sync-1.1.1.tgz","fileCount":72,"integrity":"sha512-VyhaM9dhufb3e/zGohTTEVmwJlOy331ELFL8a/tEF+/qpi/ZNy16r1cpJ5JjoSe/T7mlrrTFqs0zeG9iHH9f5w==","signatures":[{"sig":"MEQCIHooJA2qEFsyH6My8eXTPD+lmEzefXJaQNPxnAkM35t4AiBUz/TJbQfdnIC8reAlRDBw9HwKfVHlRwJUf8z82zgbSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCHvrblGObUu891Rp+kbWsls/NXonCrAxAJsj07dkRXXQIhALe+lCahEiLuXLNDNyMpcpAUp8ZOCiDEbegk9o3pVBK/"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@braedonsaunders%2fappkit-sync@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":444274},"main":"./index.js","name":"@braedonsaunders/appkit-sync","type":"module","_from":"file:braedonsaunders-appkit-sync-1.1.1.tgz","types":"./index.d.ts","author":{"name":"Braedon Saunders"},"engines":{"node":">=22"},"exports":{".":{"types":"./index.d.ts","import":"./index.js","default":"./index.js"},"./csv":{"types":"./csv.d.ts","import":"./csv.js","default":"./csv.js"},"./egress":{"types":"./egress.d.ts","import":"./egress.js","default":"./egress.js"},"./schema":{"types":"./schema.d.ts","import":"./schema.js","default":"./schema.js"},"./catalog":{"types":"./types.d.ts","import":"./types.js","default":"./types.js"},"./drizzle":{"types":"./drizzle.d.ts","import":"./drizzle.js","default":"./drizzle.js"},"./runtime":{"types":"./runtime.d.ts","import":"./runtime.js","default":"./runtime.js"},"./registry":{"types":"./registry.d.ts","import":"./registry.js","default":"./registry.js"},"./transform":{"types":"./transform.d.ts","import":"./transform.js","default":"./transform.js"},"./db-drivers":{"types":"./db-drivers.d.ts","import":"./db-drivers.js","default":"./db-drivers.js"},"./package.json":"./package.json","./connectors/csv":{"types":"./connectors/csv.d.ts","import":"./connectors/csv.js","default":"./connectors/csv.js"},"./snapshot-policy":{"types":"./snapshot-policy.d.ts","import":"./snapshot-policy.js","default":"./snapshot-policy.js"},"./connectors/nango":{"types":"./connectors/nango.d.ts","import":"./connectors/nango.js","default":"./connectors/nango.js"},"./person-sync-policy":{"types":"./person-sync-policy.d.ts","import":"./person-sync-policy.js","default":"./person-sync-policy.js"},"./connectors/database":{"types":"./connectors/database.d.ts","import":"./connectors/database.js","default":"./connectors/database.js"},"./connectors/netsuite":{"types":"./connectors/netsuite.d.ts","import":"./connectors/netsuite.js","default":"./connectors/netsuite.js"},"./connectors/http-json":{"types":"./connectors/http-json.d.ts","import":"./connectors/http-json.js","default":"./connectors/http-json.js"}},"license":"AGPL-3.0-or-later","version":"1.1.1","_npmUser":{"name":"braedonsaunders","email":"bsaunders@rassaun.com"},"homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/sync#readme","keywords":["appkit","application-framework","typescript"],"_resolved":"/tmp/ba9693b31bb6b710f5e631207ed19881/braedonsaunders-appkit-sync-1.1.1.tgz","_integrity":"sha512-VyhaM9dhufb3e/zGohTTEVmwJlOy331ELFL8a/tEF+/qpi/ZNy16r1cpJ5JjoSe/T7mlrrTFqs0zeG9iHH9f5w==","repository":{"url":"git+https://github.com/braedonsaunders/appkit.git","type":"git","directory":"packages/sync"},"_npmVersion":"10.9.8","description":"Production data synchronization with transactional batches, per-record ledgers, fail-closed snapshots, connector families, and durable cursors.","directories":{},"maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"_nodeVersion":"22.23.2","dependencies":{"@braedonsaunders/appkit-egress-proxy":"^0.2.0"},"_hasShrinkwrap":false,"peerDependencies":{"mssql":"^11.0.1","mysql2":"^3.22.6","postgres":"^3.4.9","drizzle-orm":"^0.45.2","@braedonsaunders/appkit-db":"^0.2.0"},"peerDependenciesMeta":{"mssql":{"optional":true},"mysql2":{"optional":true},"postgres":{"optional":true},"drizzle-orm":{"optional":true},"@braedonsaunders/appkit-db":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/appkit-sync_1.1.1_1789003803882_0.4518291254051259"}}},"time":{"created":"2026-08-19T23:47:35.366Z","modified":"2026-09-10T01:30:04.404Z","1.1.0":"2026-08-19T23:47:35.704Z","1.1.1":"2026-09-10T01:30:04.016Z"},"bugs":{"url":"https://github.com/braedonsaunders/appkit/issues"},"author":{"name":"Braedon Saunders"},"license":"AGPL-3.0-or-later","homepage":"https://github.com/braedonsaunders/appkit/tree/main/packages/sync#readme","keywords":["appkit","application-framework","typescript"],"repository":{"url":"git+https://github.com/braedonsaunders/appkit.git","type":"git","directory":"packages/sync"},"description":"Production data synchronization with transactional batches, per-record ledgers, fail-closed snapshots, connector families, and durable cursors.","maintainers":[{"name":"braedonsaunders","email":"bsaunders@rassaun.com"}],"readme":"# @braedonsaunders/appkit-sync\n\nProduction inbound synchronization for applications that need to ingest CSV,\ndatabase, HTTP, managed-connector, or ERP data without giving up transaction\nsafety or an audit trail.\n\n## What ships\n\n- The production connector contract, registry, summaries, CSV parser,\n  transforms, database drivers, and hardened outbound-network policy.\n- A source-compatible orchestration entry through `createSyncOrchestrator`:\n  tenant, connection, trigger, and optional preview mode go in; a durable run\n  result comes back.\n- Transactional batches with a savepoint per source record. One invalid row can\n  be recorded and skipped without poisoning the remaining batch.\n- A per-record change ledger containing action, canonical identity, before and\n  after values, diff, source hash, failure detail, and dry-run state.\n- Clean-run-only cursor advancement. Failed and partial runs retain the prior\n  cursor so the next pull covers every failed row again.\n- Fail-closed authoritative snapshots: missing-record archival is disabled when\n  any row failed, an entity snapshot is empty, or authority was not explicit.\n- Source-wins and manual-wins ownership policy, including the extracted people\n  convergence and natural-key adoption rules.\n- Complete Drizzle schema and migration for connections, crosswalks, runs, and\n  record changes, plus database-free memory persistence and target adapters.\n\n## Compose the runtime\n\n```ts\nimport {\n  createSyncOrchestrator,\n  type SyncTarget,\n} from '@braedonsaunders/appkit-sync'\nimport { createDrizzleSyncPersistence } from '@braedonsaunders/appkit-sync/drizzle'\n\nconst runSync = createSyncOrchestrator({\n  connectors,\n  persistence: createDrizzleSyncPersistence(db, withTenant),\n  target: applicationTarget satisfies SyncTarget,\n  resolveSecrets: (sealed) => credentials.unsealAll(sealed),\n})\n\nconst result = await runSync({\n  tenantId,\n  connectionId,\n  trigger: 'manual',\n})\n```\n\nThe application target is the deliberate domain boundary. It owns canonical\ntables, natural keys, permission-aware lookups, field ownership, and archive\nbehavior. AppKit owns connection execution, transactions, savepoints, run and\nchange ledgers, cursor safety, snapshot policy, and connector infrastructure.\nCredential unsealing is likewise injected through `resolveSecrets`, so this\npackage does not force an application to adopt a particular key derivation or\nsecret store.\n\n## Public entries\n\n- `@braedonsaunders/appkit-sync` — source-shaped runtime and the dependency-light API; optional\n  SQL drivers remain isolated at `/db-drivers`\n- `@braedonsaunders/appkit-sync/catalog` and `/registry` — connector contracts and the optional\n  built-in registry, isolated so unused database vendors never enter the root\n- `@braedonsaunders/appkit-sync/csv` and `/transform` — browser-safe parsing and mapping helpers\n- `@braedonsaunders/appkit-sync/connectors/*` — optional connector families\n- `@braedonsaunders/appkit-sync/runtime` — orchestration and memory adapters\n- `@braedonsaunders/appkit-sync/person-sync-policy` — extracted ownership conflict decisions\n- `@braedonsaunders/appkit-sync/snapshot-policy` — fail-closed archival planning\n- `@braedonsaunders/appkit-sync/egress` and `/db-drivers` — compatibility access to the\n  hardened `@braedonsaunders/appkit-egress-proxy/secure-fetch` transport and database drivers\n- `@braedonsaunders/appkit-sync/schema` and `/drizzle` — feature-owned persistence\n\nNo credentials, application record schema, entity mapping, or product-specific\nroute is bundled in this package.\n","readmeFilename":"README.md"}