omnius 1.0.569 → 1.0.570

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/dist/index.js CHANGED
@@ -43773,20 +43773,27 @@ function scoreSkill(skill, terms2) {
43773
43773
  const hay = skillHaystack(skill);
43774
43774
  const matched = [];
43775
43775
  let score = 0;
43776
+ let capabilityMatches = 0;
43776
43777
  for (const term of terms2) {
43777
43778
  if (!hay.includes(term))
43778
43779
  continue;
43780
+ const nameMatch = skill.name.toLowerCase().includes(term);
43781
+ const triggerMatch = skill.triggers.some((trigger) => trigger.toLowerCase().includes(term));
43782
+ const descriptionMatch = skill.description.toLowerCase().includes(term);
43783
+ if (!nameMatch && !triggerMatch && !descriptionMatch)
43784
+ continue;
43779
43785
  matched.push(term);
43780
- if (skill.name.toLowerCase().includes(term))
43786
+ capabilityMatches++;
43787
+ if (nameMatch)
43781
43788
  score += 5;
43782
- if (skill.triggers.some((trigger) => trigger.toLowerCase().includes(term)))
43789
+ if (triggerMatch)
43783
43790
  score += 3;
43784
- if (skill.description.toLowerCase().includes(term))
43791
+ if (descriptionMatch)
43785
43792
  score += 2;
43786
43793
  if (skill.source.toLowerCase().includes(term))
43787
43794
  score += 1;
43788
43795
  }
43789
- if (score <= 0)
43796
+ if (score <= 0 || capabilityMatches === 0)
43790
43797
  return null;
43791
43798
  return {
43792
43799
  skill,
@@ -568049,7 +568056,8 @@ function recordCompletionEvidence(ledger, evidence) {
568049
568056
  ...evidence.family ? { family: cleanText(evidence.family, 120) } : {},
568050
568057
  ...evidence.verificationImpact ? { verificationImpact: evidence.verificationImpact } : {},
568051
568058
  ...evidence.metrics ? { metrics: evidence.metrics } : {},
568052
- ...evidence.receipt ? { receipt: evidence.receipt } : {}
568059
+ ...evidence.receipt ? { receipt: evidence.receipt } : {},
568060
+ ...evidence.progressClass ? { progressClass: evidence.progressClass } : {}
568053
568061
  };
568054
568062
  return {
568055
568063
  ...ledger,
@@ -568075,7 +568083,8 @@ function recordToolEvidence(ledger, input) {
568075
568083
  family: input.family,
568076
568084
  verificationImpact: input.verificationImpact,
568077
568085
  metrics: input.metrics,
568078
- receipt: input.receipt
568086
+ receipt: input.receipt,
568087
+ progressClass: input.progressClass
568079
568088
  });
568080
568089
  }
568081
568090
  function addCompletionClaims(ledger, claims) {
@@ -568199,6 +568208,9 @@ function classifyCompletionProgress(entry) {
568199
568208
  if (entry.kind === "file_change" || entry.role === "mutation") {
568200
568209
  return "work_product";
568201
568210
  }
568211
+ if (/^(file_write|file_edit|file_patch|batch_edit)$/.test(entry.toolName ?? "")) {
568212
+ return "work_product";
568213
+ }
568202
568214
  return "observation";
568203
568215
  }
568204
568216
  function isMutationEvidence(entry) {
@@ -568233,7 +568245,11 @@ function isVerificationInvalidatingMutation(entry) {
568233
568245
  return entry.verificationImpact !== "neutral";
568234
568246
  }
568235
568247
  function isSuccessfulVerificationEvidence(entry) {
568236
- return entry.role === "verification" && entry.success === true;
568248
+ if (entry.role !== "verification" || entry.success !== true)
568249
+ return false;
568250
+ if (!entry.receipt)
568251
+ return true;
568252
+ return entry.receipt.schema === "omnius.command-evidence-receipt.v1" && Boolean(entry.receipt.canonicalCommand.trim()) && Boolean(entry.receipt.cwd.trim()) && entry.receipt.exitCode === 0 && !entry.receipt.timedOut;
568237
568253
  }
568238
568254
  function isFailedVerificationEvidence(entry) {
568239
568255
  return entry.role === "verification" && entry.success === false;
@@ -571665,6 +571681,45 @@ var init_reference_contracts = __esm({
571665
571681
  }
571666
571682
  });
571667
571683
 
571684
+ // packages/orchestrator/dist/phase-skill-guidance.js
571685
+ function buildPhaseSkillGuidance(input) {
571686
+ const query = [
571687
+ `Active lifecycle phase: ${input.phase}.`,
571688
+ `Phase focus: ${PHASE_FOCUS[input.phase]}.`,
571689
+ `Current user goal: ${input.goal}`,
571690
+ input.currentStep ? `Current work item: ${input.currentStep}` : ""
571691
+ ].filter(Boolean).join("\n");
571692
+ const pack = buildEphemeralSkillPack(input.skills ?? discoverSkills(input.repoRoot), {
571693
+ task: query,
571694
+ modelTier: input.modelTier,
571695
+ // Phase support must leave the evidence and current task dominant.
571696
+ limit: input.modelTier === "small" ? 2 : 3
571697
+ });
571698
+ if (!pack)
571699
+ return "";
571700
+ return [
571701
+ "[PHASE SKILL GUIDANCE]",
571702
+ `phase=${input.phase}`,
571703
+ "This is a live manifest selected from installed/project skills for the current phase. Load targeted guidance only when it materially helps the next action.",
571704
+ pack,
571705
+ "[/PHASE SKILL GUIDANCE]"
571706
+ ].join("\n");
571707
+ }
571708
+ var PHASE_FOCUS;
571709
+ var init_phase_skill_guidance = __esm({
571710
+ "packages/orchestrator/dist/phase-skill-guidance.js"() {
571711
+ "use strict";
571712
+ init_dist5();
571713
+ PHASE_FOCUS = {
571714
+ explore: "repository discovery requirements analysis source inspection provenance",
571715
+ plan: "requirements planning architecture design acceptance criteria risk analysis",
571716
+ implement: "implementation code change editing debugging tests integration safety",
571717
+ verify: "verification validation acceptance tests release documentation consistency",
571718
+ mixed: "implementation verification testing code review evidence"
571719
+ };
571720
+ }
571721
+ });
571722
+
571668
571723
  // packages/orchestrator/dist/deliveryCoverage.js
571669
571724
  import { createHash as createHash30 } from "node:crypto";
571670
571725
  import { existsSync as existsSync90, readFileSync as readFileSync70 } from "node:fs";
@@ -575540,6 +575595,8 @@ function buildTrajectoryCheckpoint(input) {
575540
575595
  } else if (focus) {
575541
575596
  assessment = "recovery_required";
575542
575597
  const focusDiagnostic = extractFocusNextAction(focus);
575598
+ if (focusDiagnostic)
575599
+ nextAction = focusDiagnostic;
575543
575600
  successEvidence = focusDiagnostic ? `Active controller directive remains unresolved: ${focusDiagnostic}` : "An active controller directive is unresolved; its evidence is recorded separately.";
575544
575601
  } else if (hasRecentFailure && !fullWriteRecoveredByMutation) {
575545
575602
  assessment = "recovery_required";
@@ -576262,7 +576319,7 @@ function extractAnchorsFromMessages(messages2, turn, workspaceRoot) {
576262
576319
  continue;
576263
576320
  if (msg.role === "tool" || msg.role === "assistant") {
576264
576321
  const matches = content.match(FILE_PATH_RE) ?? [];
576265
- const distinctPaths = Array.from(new Set(matches.filter((p2) => isFileAnchorCandidate(p2, workspaceRoot)))).slice(0, 5);
576322
+ const distinctPaths = Array.from(new Set(matches.map((p2) => p2.trim().replace(/^['"`]+|['"`,.;:)\]]+$/g, "")).filter((p2) => isFileAnchorCandidate(p2, workspaceRoot)))).slice(0, 5);
576266
576323
  for (const p2 of distinctPaths) {
576267
576324
  const summary = `file: ${p2}`;
576268
576325
  if (seenSummaries.has(summary))
@@ -591485,6 +591542,7 @@ var init_agenticRunner = __esm({
591485
591542
  init_personality();
591486
591543
  init_promptLoader();
591487
591544
  init_reference_contracts();
591545
+ init_phase_skill_guidance();
591488
591546
  init_deliveryCoverage();
591489
591547
  init_critic();
591490
591548
  init_reflection();
@@ -592143,6 +592201,10 @@ var init_agenticRunner = __esm({
592143
592201
  _toolLastUsedTurn = /* @__PURE__ */ new Map();
592144
592202
  _ephemeralSkillPackContext = "";
592145
592203
  _stickyDynamicContext = "";
592204
+ // Successful PFV/SSMA analyses are controller facts, not prompt fragments.
592205
+ // Keep one expiring delta so a capable model sees the current diagnosis and
592206
+ // evidence handle without inheriting an archive of REG directives.
592207
+ _recoveryControllerDelta = null;
592146
592208
  // Phase 1 — Context Tree. Tracks current phase + per-phase anchors so
592147
592209
  // compactMessages can summarize-by-phase and Phase 6 can surface anchors
592148
592210
  // by keyword. Initialized lazily in run() because the system-prompt hash
@@ -592978,6 +593040,17 @@ ${parts.join("\n")}
592978
593040
  lines.push(`declared_next_action=${ts.nextAction.replace(/\s+/g, " ").slice(0, 220)}`);
592979
593041
  }
592980
593042
  lines.push(`progress_anchor=completed_steps:${ts.completedSteps.length} failed_approaches:${ts.failedApproaches.length} modified_files:${ts.modifiedFiles.size} tool_calls:${ts.toolCallCount}`);
593043
+ const recoveryDelta = this._recoveryControllerDelta;
593044
+ if (recoveryDelta && recoveryDelta.expiresAtTurn >= turn) {
593045
+ lines.push(`recovery_delta=${recoveryDelta.source} evidence=${recoveryDelta.evidenceHandle}`);
593046
+ lines.push(`recovery_diagnosis=${recoveryDelta.diagnosis}`);
593047
+ lines.push(`recovery_next_action=${recoveryDelta.nextAction}`);
593048
+ if (recoveryDelta.verification) {
593049
+ lines.push(`recovery_exit_evidence=${recoveryDelta.verification}`);
593050
+ }
593051
+ } else if (recoveryDelta) {
593052
+ this._recoveryControllerDelta = null;
593053
+ }
592981
593054
  if (ts.completedSteps.length > 0) {
592982
593055
  lines.push(`recent_completed=${ts.completedSteps.slice(-3).join(" | ").replace(/\s+/g, " ").slice(0, 420)}`);
592983
593056
  }
@@ -593029,6 +593102,24 @@ ${parts.join("\n")}
593029
593102
  lines.push(this._todoWriteAvailable() ? "not_progress=repeat unchanged todo_write; repeat broad discovery already represented in this frame; keep discovery active after a real mutation" : "not_progress=repeat broad discovery already represented in this frame; keep discovery active after a real mutation");
593030
593103
  return lines.join("\n");
593031
593104
  }
593105
+ _recordRecoveryControllerDelta(input) {
593106
+ const diagnosis = String(input.diagnosis ?? "").replace(/\s+/g, " ").trim().slice(0, 320);
593107
+ const nextAction = String(input.nextAction ?? "").replace(/\s+/g, " ").trim().slice(0, 320);
593108
+ if (!diagnosis || !nextAction)
593109
+ return;
593110
+ this._recoveryControllerDelta = {
593111
+ source: input.source,
593112
+ evidenceHandle: `${input.source}@turn-${input.turn}`,
593113
+ diagnosis,
593114
+ nextAction,
593115
+ verification: String(input.verification ?? "").replace(/\s+/g, " ").trim().slice(0, 260),
593116
+ expectedTool: input.expectedTool,
593117
+ // A delta is a live controller state, not an instruction archive. It
593118
+ // naturally expires unless the proposed action is attempted first.
593119
+ expiresAtTurn: input.turn + 4
593120
+ };
593121
+ this._trajectoryDirtyCauses.add(`recovery_${input.source}`);
593122
+ }
593032
593123
  _workboardTodoCardForPaths(snapshot, paths) {
593033
593124
  const targets = [
593034
593125
  ...new Set(paths.map((path16) => this._normalizeEvidencePath(path16)))
@@ -600124,7 +600215,12 @@ ${String(concreteGoal).replace(/\s+/g, " ").trim().slice(0, 1200)}` : null
600124
600215
  const gitBlock = this._renderGitProgressBlock(turn);
600125
600216
  const failureBlock = null;
600126
600217
  const churnBlock = null;
600127
- const focusBlock = null;
600218
+ const focusDirective = this._focusSupervisor?.snapshot().directive;
600219
+ const focusBlock = focusDirective ? [
600220
+ `required_next_action=${focusDirective.requiredNextAction}`,
600221
+ `reason=${focusDirective.reason}`,
600222
+ `state=${focusDirective.state}`
600223
+ ].join("\n") : null;
600128
600224
  const actionContractBlock = this._renderNextActionContract(turn);
600129
600225
  const deliveryCoverageBlock = this._deliveryCoverageState()?.rendered ?? null;
600130
600226
  const referenceContractPhase = this._contextTree?.getCurrentPhase() ?? "mixed";
@@ -600135,6 +600231,13 @@ ${String(concreteGoal).replace(/\s+/g, " ").trim().slice(0, 1200)}` : null
600135
600231
  includePhase: true,
600136
600232
  includeExplicit: false
600137
600233
  });
600234
+ const phaseSkillGuidance = buildPhaseSkillGuidance({
600235
+ repoRoot: this.authoritativeWorkingDirectory(),
600236
+ phase: referenceContractPhase,
600237
+ goal: concreteGoal,
600238
+ currentStep: this._taskState.currentStep,
600239
+ modelTier: this.options.modelTier ?? "large"
600240
+ });
600138
600241
  const trajectoryCheckpoint = await this._refreshTrajectoryCheckpoint(turn, focusBlock, [
600139
600242
  workspaceTreeBlock,
600140
600243
  filesystemBlock,
@@ -600242,6 +600345,15 @@ ${String(concreteGoal).replace(/\s+/g, " ").trim().slice(0, 1200)}` : null
600242
600345
  contractIds: phaseContracts.contracts.map((contract) => contract.id)
600243
600346
  }
600244
600347
  }),
600348
+ signalFromBlock("runtime_guidance", "turn.phase-skills", phaseSkillGuidance, {
600349
+ id: "phase-skills",
600350
+ dedupeKey: "turn.phase-skills",
600351
+ semanticKey: "context.phase-skills",
600352
+ priority: PRIORITY.RUNTIME_GUIDANCE - 1,
600353
+ createdTurn: turn,
600354
+ ttlTurns: 1,
600355
+ metadata: { phase: referenceContractPhase }
600356
+ }),
600245
600357
  signalFromBlock("task_state", "turn.todos", todoBlock, {
600246
600358
  id: "todo-state",
600247
600359
  dedupeKey: "turn.todos",
@@ -600414,6 +600526,10 @@ ${String(concreteGoal).replace(/\s+/g, " ").trim().slice(0, 1200)}` : null
600414
600526
  * transition (so the primary loop can reset per-phase tool budgets) or null.
600415
600527
  */
600416
600528
  _advanceContextTreeOnToolCall(toolName, argsKey, turn, messages2) {
600529
+ if (this._recoveryControllerDelta?.expectedTool === toolName) {
600530
+ this._recoveryControllerDelta = null;
600531
+ this._trajectoryDirtyCauses.add("recovery_action_attempted");
600532
+ }
600417
600533
  if (!this._contextTree)
600418
600534
  return null;
600419
600535
  this._contextTree.observeToolCall(toolName, argsKey, turn);
@@ -601704,14 +601820,16 @@ ${notice}`;
601704
601820
  * protocol correctness; only stale assistant-visible planning prose changes.
601705
601821
  */
601706
601822
  _retireLinkedAssistantReadIntents(messages2) {
601707
- if (!this._legacyModelVisibleCompactionAllowed())
601708
- return;
601709
601823
  const resolvedToolCallIds = new Set(messages2.filter((message2) => message2.role === "tool" && message2.tool_call_id).map((message2) => message2.tool_call_id));
601710
601824
  for (const message2 of messages2) {
601711
601825
  if (message2.role !== "assistant" || typeof message2.content !== "string" || !Array.isArray(message2.tool_calls) || !message2.tool_calls.some((call) => resolvedToolCallIds.has(call.id)) || !/\b(?:i|we)\s+(?:need|will|should|have)\s+to\s+(?:read|inspect|open)\b/i.test(message2.content)) {
601712
601826
  continue;
601713
601827
  }
601714
- message2.content = "[assistant read intent retired: the linked tool result is present below; decide from that evidence rather than planning the same read]";
601828
+ const index = messages2.indexOf(message2);
601829
+ messages2[index] = {
601830
+ ...message2,
601831
+ content: ASSISTANT_READ_INTENT_RETIRED_MARKER
601832
+ };
601715
601833
  }
601716
601834
  }
601717
601835
  _emitSteeringLifecycle(record, reason) {
@@ -603489,6 +603607,7 @@ Respond with the assessment and take the selected evidence-backed action.`;
603489
603607
  this._toolLastUsedTurn.clear();
603490
603608
  this._ephemeralSkillPackContext = "";
603491
603609
  this._stickyDynamicContext = "";
603610
+ this._recoveryControllerDelta = null;
603492
603611
  this._stableReferenceContracts = [];
603493
603612
  this._referenceContractSelections = [];
603494
603613
  this._referenceContractPhase = "mixed";
@@ -603695,6 +603814,7 @@ Respond with the assessment and take the selected evidence-backed action.`;
603695
603814
  this._memexArchive.clear();
603696
603815
  this._todoOutputLedger.clear();
603697
603816
  this._sessionId = this.options.sessionId && String(this.options.sessionId) || process.env["OMNIUS_SESSION_ID"] && String(process.env["OMNIUS_SESSION_ID"]) || `session-${Date.now()}`;
603817
+ setTodoSessionId(this._sessionId);
603698
603818
  const continuesPriorTask = this._allowImplicitContinuation || this._isContinuationResumeGoal(persistentTaskGoal);
603699
603819
  if (!continuesPriorTask) {
603700
603820
  this._hidePriorSessionTodosForFreshTask(persistentTaskGoal);
@@ -605314,8 +605434,15 @@ Respond with EXACTLY this structure before your next tool call:
605314
605434
  },
605315
605435
  callable: _smaCallable
605316
605436
  }).then((_smaResult) => {
605317
- if (_smaResult.injection && !_smaResult.directive.parseFallback) {
605318
- void _smaResult.injection;
605437
+ if (!_smaResult.directive.parseFallback) {
605438
+ this._recordRecoveryControllerDelta({
605439
+ source: "stuck_meta",
605440
+ turn,
605441
+ diagnosis: _smaResult.directive.diagnosis,
605442
+ nextAction: `${_smaResult.directive.next_action.tool}: ${_smaResult.directive.next_action.rationale}`,
605443
+ verification: _smaResult.directive.verification,
605444
+ expectedTool: _smaResult.directive.next_action.tool
605445
+ });
605319
605446
  this.emit({
605320
605447
  type: "status",
605321
605448
  content: `REG-49 stuck-meta-analyzer fired at turn ${turn} — diagnosis="${_smaResult.directive.diagnosis.slice(0, 80)}", next=${_smaResult.directive.next_action.tool}, ${_smaResult.durationMs}ms`,
@@ -605471,8 +605598,15 @@ Respond with EXACTLY this structure before your next tool call:
605471
605598
  },
605472
605599
  callable: _smaCallable50
605473
605600
  }).then((_smaResult) => {
605474
- if (_smaResult.injection && !_smaResult.directive.parseFallback) {
605475
- void _smaResult.injection;
605601
+ if (!_smaResult.directive.parseFallback) {
605602
+ this._recordRecoveryControllerDelta({
605603
+ source: "stuck_meta",
605604
+ turn,
605605
+ diagnosis: _smaResult.directive.diagnosis,
605606
+ nextAction: `${_smaResult.directive.next_action.tool}: ${_smaResult.directive.next_action.rationale}`,
605607
+ verification: _smaResult.directive.verification,
605608
+ expectedTool: _smaResult.directive.next_action.tool
605609
+ });
605476
605610
  this.emit({
605477
605611
  type: "status",
605478
605612
  content: `REG-50 → SSMA fired at turn ${turn} — diagnosis="${_smaResult.directive.diagnosis.slice(0, 80)}", next=${_smaResult.directive.next_action.tool}, ${_smaResult.durationMs}ms`,
@@ -605612,8 +605746,15 @@ Respond with EXACTLY this structure before your next tool call:
605612
605746
  },
605613
605747
  callable: _pfvCallable
605614
605748
  }).then((_pfvResult) => {
605615
- if (_pfvResult.injection && !_pfvResult.verdict.parseFallback && _pfvResult.verdict.verdict !== "continue") {
605616
- void _pfvResult.injection;
605749
+ if (!_pfvResult.verdict.parseFallback && _pfvResult.verdict.verdict !== "continue") {
605750
+ const frame = _pfvResult.verdict.recommended_frame;
605751
+ this._recordRecoveryControllerDelta({
605752
+ source: "problem_frame",
605753
+ turn,
605754
+ diagnosis: `${_pfvResult.verdict.verdict}: ${_pfvResult.verdict.rationale}`,
605755
+ nextAction: frame?.new_subtask || _pfvResult.verdict.blocker_summary || "Re-evaluate the active task frame against current evidence.",
605756
+ verification: frame?.success_criterion || "Record new evidence for the selected frame."
605757
+ });
605617
605758
  this.emit({
605618
605759
  type: "status",
605619
605760
  content: `REG-51 PFV fired at turn ${turn} — verdict=${_pfvResult.verdict.verdict}, trigger=${_pfvTriggerReason}, ssmaCount=${this._ssmaFiredCount}, ${_pfvResult.durationMs}ms`,
@@ -607679,7 +607820,8 @@ ${cachedResult}`,
607679
607820
  const normalizedDispatchName = resolvedTool?.name ?? tc.name;
607680
607821
  let branchEvidenceResult = null;
607681
607822
  if (normalizedDispatchName === "file_read" && this._fileReadMode(tc.arguments) !== "extract") {
607682
- const exactReadKey = this._buildToolFingerprint("file_read", tc.arguments);
607823
+ const exactReadFingerprint = this._buildToolFingerprint("file_read", tc.arguments);
607824
+ const exactReadKey = this._resolveReadCoverageFingerprint("file_read", tc.arguments, exactReadFingerprint);
607683
607825
  const priorRead = exactFileReadObservations.get(exactReadKey);
607684
607826
  if (priorRead) {
607685
607827
  const currentRead = this._fileReadDiskIdentity(tc.arguments);
@@ -610039,8 +610181,15 @@ Only call task_complete when the task is actually complete and the evidence is f
610039
610181
  },
610040
610182
  callable: _smaCallable
610041
610183
  }).then((_smaResult) => {
610042
- if (_smaResult.injection && !_smaResult.directive.parseFallback) {
610043
- void _smaResult.injection;
610184
+ if (!_smaResult.directive.parseFallback) {
610185
+ this._recordRecoveryControllerDelta({
610186
+ source: "stuck_meta",
610187
+ turn,
610188
+ diagnosis: _smaResult.directive.diagnosis,
610189
+ nextAction: `${_smaResult.directive.next_action.tool}: ${_smaResult.directive.next_action.rationale}`,
610190
+ verification: _smaResult.directive.verification,
610191
+ expectedTool: _smaResult.directive.next_action.tool
610192
+ });
610044
610193
  this.emit({
610045
610194
  type: "status",
610046
610195
  content: `REG-49 stuck-meta-analyzer fired (loop-intervention path) at turn ${turn} — diagnosis="${_smaResult.directive.diagnosis.slice(0, 80)}", next=${_smaResult.directive.next_action.tool}, ${_smaResult.durationMs}ms`,
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.569",
3
+ "version": "1.0.570",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "omnius",
9
- "version": "1.0.569",
9
+ "version": "1.0.570",
10
10
  "bundleDependencies": [
11
11
  "image-to-ascii"
12
12
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnius",
3
- "version": "1.0.569",
3
+ "version": "1.0.570",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",