@fairmint/captable-ai 0.1.29 → 0.1.30

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 +46 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -15355,6 +15355,11 @@ function planImportStatus({ documents, sessionState, scopeUnknown = false }) {
15355
15355
  }
15356
15356
  }
15357
15357
  }
15358
+ function applyDraftCount(plan, draftCount) {
15359
+ if (plan.phase !== "complete" || draftCount !== 0)
15360
+ return plan;
15361
+ return { ...plan, state: "complete", actions: [] };
15362
+ }
15358
15363
  var EXTRACTION_NOT_READY_REASONS = [
15359
15364
  "pending_upload",
15360
15365
  "classification_in_progress"
@@ -15527,6 +15532,7 @@ var DOCUMENT_HEALTH_VALUES = [
15527
15532
  ];
15528
15533
  var documentProcessingStatusItemSchema = external_exports.object({
15529
15534
  s3AssetId: external_exports.string().describe("S3 asset / document ID."),
15535
+ name: external_exports.string().nullable().optional().describe("Original file name; absent on older servers."),
15530
15536
  status: external_exports.string().describe("Document processing status."),
15531
15537
  createdAt: external_exports.string().nullable().optional().describe("Immutable document creation timestamp; absent on older servers."),
15532
15538
  lastActivityAt: external_exports.string().nullable().describe("Last backend activity timestamp (updated_at / heartbeat); null if unknown."),
@@ -16658,6 +16664,8 @@ var ONBOARDING_STATES = {
16658
16664
  READY_TO_IMPORT: "ready_to_import",
16659
16665
  PROCESSING: "processing",
16660
16666
  NEEDS_REVIEW: "needs_review",
16667
+ /** Processing finished and nothing is left to review or commit (no drafts). */
16668
+ COMPLETE: "complete",
16661
16669
  BLOCKED: "blocked",
16662
16670
  READY_TO_COMMIT: "ready_to_commit"
16663
16671
  };
@@ -16695,6 +16703,11 @@ var onboardingStateSchema = external_exports.discriminatedUnion("state", [
16695
16703
  importSessionId: external_exports.string().uuid(),
16696
16704
  blockerCount: external_exports.number().int().nonnegative()
16697
16705
  }),
16706
+ onboardingStateBaseSchema.extend({
16707
+ state: external_exports.literal(ONBOARDING_STATES.COMPLETE),
16708
+ portalId: external_exports.string().uuid(),
16709
+ importSessionId: external_exports.string().uuid()
16710
+ }),
16698
16711
  onboardingStateBaseSchema.extend({
16699
16712
  state: external_exports.literal(ONBOARDING_STATES.BLOCKED),
16700
16713
  portalId: external_exports.string().uuid().optional(),
@@ -23026,6 +23039,37 @@ function importStatusCommand(action, sessionId) {
23026
23039
  ...action.id === "review_failures" && action.s3AssetIds && { s3AssetIds: action.s3AssetIds }
23027
23040
  };
23028
23041
  }
23042
+ var DRAFT_COUNT_MAX_PAGES = 100;
23043
+ async function readDraftCount(portalId) {
23044
+ if (!portalId) return null;
23045
+ try {
23046
+ let count = 0;
23047
+ let cursor;
23048
+ for (let page = 0; page < DRAFT_COUNT_MAX_PAGES; page += 1) {
23049
+ const res = await apiRequest(
23050
+ `/${encodeURIComponent(portalId)}/objects`,
23051
+ {
23052
+ query: { status: "draft", ...cursor ? { cursor } : {} },
23053
+ // Optional read: throw (caught below) instead of exiting the process on a failure.
23054
+ softFail: true
23055
+ }
23056
+ );
23057
+ const objects = res.data?.objects;
23058
+ if (!Array.isArray(objects)) return null;
23059
+ count += objects.filter(
23060
+ (obj) => obj.type !== "DOCUMENT" && obj.subtype !== "DOCUMENT"
23061
+ ).length;
23062
+ if (count > 0) return count;
23063
+ const next = res.meta?.cursor;
23064
+ if (!res.meta?.hasMore) return count;
23065
+ if (!next || next === cursor) return null;
23066
+ cursor = next;
23067
+ }
23068
+ return null;
23069
+ } catch {
23070
+ return null;
23071
+ }
23072
+ }
23029
23073
  async function runImportStatus(args) {
23030
23074
  validateFlags(args, { flags: [], booleans: [] });
23031
23075
  const sessionId = args.positional[0];
@@ -23040,11 +23084,12 @@ async function runImportStatus(args) {
23040
23084
  );
23041
23085
  const portalDocuments = response.data?.processing?.documents ?? [];
23042
23086
  const documents = documentsForImportSession(portalDocuments, response.data?.session?.createdAt);
23043
- const plan = planImportStatus({
23087
+ const documentPlan = planImportStatus({
23044
23088
  documents,
23045
23089
  sessionState: response.data?.session?.state,
23046
23090
  scopeUnknown: importSessionScopeUnknown(portalDocuments)
23047
23091
  });
23092
+ const plan = documentPlan.phase === "complete" ? applyDraftCount(documentPlan, await readDraftCount(response.data?.session?.portalId)) : documentPlan;
23048
23093
  const { summary } = plan;
23049
23094
  if (plan.shouldComplete) {
23050
23095
  const completed = await apiRequest(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fairmint/captable-ai",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "description": "Agent-native CLI for Captable AI — manage companies, upload documents, run OCF extraction, and commit cap tables from the terminal.",
5
5
  "keywords": [
6
6
  "captable",