@wirecat/cli-core 0.595.0 → 0.597.0

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 (52) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/background/deliver.d.ts +7 -1
  3. package/dist/background/deliver.js +66 -10
  4. package/dist/background/telegram-html.d.ts +2 -0
  5. package/dist/background/telegram-html.js +66 -0
  6. package/dist/calendar/mcp/index.d.ts +12 -12
  7. package/dist/cli/index.d.ts +1 -1
  8. package/dist/cli/permission-keys.d.ts +10 -2
  9. package/dist/cli/preview.d.ts +3 -0
  10. package/dist/cli/preview.js +9 -5
  11. package/dist/crm/cli/index.js +71 -14
  12. package/dist/crm/index.d.ts +1 -1
  13. package/dist/crm/index.js +1 -1
  14. package/dist/crm/source.d.ts +6 -1
  15. package/dist/crm/sync.d.ts +5 -4
  16. package/dist/crm/sync.js +22 -4
  17. package/dist/crm/testing/index.d.ts +1 -1
  18. package/dist/crm/testing/index.js +1 -1
  19. package/dist/crm/testing/source-contract.js +28 -0
  20. package/dist/crm/testing/source.d.ts +8 -1
  21. package/dist/crm/testing/source.js +53 -9
  22. package/dist/crm/testing/sync-contract.js +14 -3
  23. package/dist/crm/writer.d.ts +11 -2
  24. package/dist/crm/writer.js +31 -0
  25. package/dist/crm/writes.d.ts +12 -2
  26. package/dist/crm/writes.js +93 -8
  27. package/dist/domain/crm.d.ts +29 -1
  28. package/dist/entities/deal.d.ts +16 -0
  29. package/dist/entities/deal.js +8 -0
  30. package/dist/entities/index.d.ts +12 -0
  31. package/dist/errors/reasons.js +4 -0
  32. package/dist/index.d.ts +1 -1
  33. package/dist/meetings/mcp/index.d.ts +15 -15
  34. package/dist/store/driver.d.ts +2 -0
  35. package/dist/store/driver.js +2 -0
  36. package/dist/store/search-index.js +6 -1
  37. package/dist/store/sqlite/accounts.js +1 -0
  38. package/dist/store/sqlite/crm.d.ts +5 -1
  39. package/dist/store/sqlite/crm.js +52 -0
  40. package/dist/store/sqlite/deals.d.ts +5 -0
  41. package/dist/store/sqlite/deals.js +13 -0
  42. package/dist/store/sqlite/manifest.js +1 -0
  43. package/dist/store/sqlite/migrations.generated.js +6 -0
  44. package/dist/store/sqlite/note-index.d.ts +1 -1
  45. package/dist/store/sqlite/note-index.js +3 -0
  46. package/dist/store/sqlite/open-store.d.ts +2 -2
  47. package/dist/store/sqlite/open-store.js +29 -6
  48. package/dist/store/sqlite/read-compatibility.d.ts +2 -0
  49. package/dist/store/sqlite/read-compatibility.js +7 -3
  50. package/dist/store/sqlite/schema.d.ts +217 -0
  51. package/dist/store/sqlite/schema.js +18 -0
  52. package/package.json +7 -1
@@ -1,2 +1,4 @@
1
1
  import type { CacheDatabase } from "../driver.js";
2
+ /** "older" when the file needs migrating before a read-only open; throws for every file it may not read. */
3
+ export declare const readCompatibility: (database: CacheDatabase, command?: string) => "current" | "older";
2
4
  export declare const assertReadCompatible: (database: CacheDatabase, command?: string) => void;
@@ -1,7 +1,8 @@
1
1
  import { CliError } from "@wirecat/cli-base";
2
2
  import { MIGRATIONS } from "../migrations.js";
3
3
  import { refusalAdvice, storeClients } from "./clients.js";
4
- export const assertReadCompatible = (database, command) => {
4
+ /** "older" when the file needs migrating before a read-only open; throws for every file it may not read. */
5
+ export const readCompatibility = (database, command) => {
5
6
  const ours = MIGRATIONS.at(-1)?.version ?? 0;
6
7
  if (!database.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='schema_migrations'").get())
7
8
  throw new CliError("configuration_error", "The store has no schema history; initialize it explicitly before a read-only open");
@@ -15,8 +16,11 @@ export const assertReadCompatible = (database, command) => {
15
16
  minCompatible < 1 ||
16
17
  minCompatible > version)
17
18
  throw new CliError("configuration_error", "The store schema history is invalid; read-only opening cannot repair it");
18
- if (version < ours)
19
- throw new CliError("configuration_error", `The store needs schema ${ours} maintenance before a read-only open (found ${version})`);
20
19
  if (minCompatible > ours)
21
20
  throw new CliError("configuration_error", `The store requires schema ${minCompatible}, but this tool supports ${ours}; ${refusalAdvice(storeClients(database), command, version)}`);
21
+ return version < ours ? "older" : "current";
22
+ };
23
+ export const assertReadCompatible = (database, command) => {
24
+ if (readCompatibility(database, command) === "older")
25
+ throw new CliError("configuration_error", `The store needs schema ${MIGRATIONS.at(-1)?.version ?? 0} maintenance before a read-only open`);
22
26
  };
@@ -16542,6 +16542,223 @@ export declare const pipelineStageChanges: import("drizzle-orm/sqlite-core").SQL
16542
16542
  dialect: 'sqlite';
16543
16543
  isAlias: false;
16544
16544
  }>;
16545
+ /** A CRM account's own fields on one kind; their values stay in each row's `metadata`, keyed by code. */
16546
+ export declare const crmFields: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
16547
+ name: "crm_fields";
16548
+ schema: undefined;
16549
+ columns: {
16550
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16551
+ name: string;
16552
+ tableName: "crm_fields";
16553
+ dataType: "number int53";
16554
+ data: number;
16555
+ driverParam: number;
16556
+ notNull: true;
16557
+ hasDefault: true;
16558
+ isPrimaryKey: true;
16559
+ isAutoincrement: false;
16560
+ hasRuntimeDefault: false;
16561
+ enumValues: undefined;
16562
+ baseColumn: never;
16563
+ identity: undefined;
16564
+ generated: undefined;
16565
+ }, {}>;
16566
+ accountId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16567
+ name: string;
16568
+ tableName: "crm_fields";
16569
+ dataType: "number int53";
16570
+ data: number;
16571
+ driverParam: number;
16572
+ notNull: true;
16573
+ hasDefault: false;
16574
+ isPrimaryKey: false;
16575
+ isAutoincrement: false;
16576
+ hasRuntimeDefault: false;
16577
+ enumValues: undefined;
16578
+ baseColumn: never;
16579
+ identity: undefined;
16580
+ generated: undefined;
16581
+ }, {}>;
16582
+ kind: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16583
+ name: string;
16584
+ tableName: "crm_fields";
16585
+ dataType: "string";
16586
+ data: string;
16587
+ driverParam: string;
16588
+ notNull: true;
16589
+ hasDefault: false;
16590
+ isPrimaryKey: false;
16591
+ isAutoincrement: false;
16592
+ hasRuntimeDefault: false;
16593
+ enumValues: [string, ...string[]];
16594
+ baseColumn: never;
16595
+ identity: undefined;
16596
+ generated: undefined;
16597
+ }, {}>;
16598
+ code: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16599
+ name: string;
16600
+ tableName: "crm_fields";
16601
+ dataType: "string";
16602
+ data: string;
16603
+ driverParam: string;
16604
+ notNull: true;
16605
+ hasDefault: false;
16606
+ isPrimaryKey: false;
16607
+ isAutoincrement: false;
16608
+ hasRuntimeDefault: false;
16609
+ enumValues: [string, ...string[]];
16610
+ baseColumn: never;
16611
+ identity: undefined;
16612
+ generated: undefined;
16613
+ }, {}>;
16614
+ label: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16615
+ name: string;
16616
+ tableName: "crm_fields";
16617
+ dataType: "string";
16618
+ data: string;
16619
+ driverParam: string;
16620
+ notNull: false;
16621
+ hasDefault: false;
16622
+ isPrimaryKey: false;
16623
+ isAutoincrement: false;
16624
+ hasRuntimeDefault: false;
16625
+ enumValues: [string, ...string[]];
16626
+ baseColumn: never;
16627
+ identity: undefined;
16628
+ generated: undefined;
16629
+ }, {}>;
16630
+ type: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16631
+ name: string;
16632
+ tableName: "crm_fields";
16633
+ dataType: "string";
16634
+ data: string;
16635
+ driverParam: string;
16636
+ notNull: true;
16637
+ hasDefault: false;
16638
+ isPrimaryKey: false;
16639
+ isAutoincrement: false;
16640
+ hasRuntimeDefault: false;
16641
+ enumValues: [string, ...string[]];
16642
+ baseColumn: never;
16643
+ identity: undefined;
16644
+ generated: undefined;
16645
+ }, {}>;
16646
+ multiple: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16647
+ name: string;
16648
+ tableName: "crm_fields";
16649
+ dataType: "number int53";
16650
+ data: number;
16651
+ driverParam: number;
16652
+ notNull: true;
16653
+ hasDefault: false;
16654
+ isPrimaryKey: false;
16655
+ isAutoincrement: false;
16656
+ hasRuntimeDefault: false;
16657
+ enumValues: undefined;
16658
+ baseColumn: never;
16659
+ identity: undefined;
16660
+ generated: undefined;
16661
+ }, {}>;
16662
+ filterable: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16663
+ name: string;
16664
+ tableName: "crm_fields";
16665
+ dataType: "number int53";
16666
+ data: number;
16667
+ driverParam: number;
16668
+ notNull: true;
16669
+ hasDefault: false;
16670
+ isPrimaryKey: false;
16671
+ isAutoincrement: false;
16672
+ hasRuntimeDefault: false;
16673
+ enumValues: undefined;
16674
+ baseColumn: never;
16675
+ identity: undefined;
16676
+ generated: undefined;
16677
+ }, {}>;
16678
+ options: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16679
+ name: string;
16680
+ tableName: "crm_fields";
16681
+ dataType: "string";
16682
+ data: string;
16683
+ driverParam: string;
16684
+ notNull: false;
16685
+ hasDefault: false;
16686
+ isPrimaryKey: false;
16687
+ isAutoincrement: false;
16688
+ hasRuntimeDefault: false;
16689
+ enumValues: [string, ...string[]];
16690
+ baseColumn: never;
16691
+ identity: undefined;
16692
+ generated: undefined;
16693
+ }, {}>;
16694
+ position: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16695
+ name: string;
16696
+ tableName: "crm_fields";
16697
+ dataType: "number int53";
16698
+ data: number;
16699
+ driverParam: number;
16700
+ notNull: true;
16701
+ hasDefault: false;
16702
+ isPrimaryKey: false;
16703
+ isAutoincrement: false;
16704
+ hasRuntimeDefault: false;
16705
+ enumValues: undefined;
16706
+ baseColumn: never;
16707
+ identity: undefined;
16708
+ generated: undefined;
16709
+ }, {}>;
16710
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16711
+ name: string;
16712
+ tableName: "crm_fields";
16713
+ dataType: "number int53";
16714
+ data: number;
16715
+ driverParam: number;
16716
+ notNull: true;
16717
+ hasDefault: false;
16718
+ isPrimaryKey: false;
16719
+ isAutoincrement: false;
16720
+ hasRuntimeDefault: false;
16721
+ enumValues: undefined;
16722
+ baseColumn: never;
16723
+ identity: undefined;
16724
+ generated: undefined;
16725
+ }, {}>;
16726
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16727
+ name: string;
16728
+ tableName: "crm_fields";
16729
+ dataType: "number int53";
16730
+ data: number;
16731
+ driverParam: number;
16732
+ notNull: true;
16733
+ hasDefault: false;
16734
+ isPrimaryKey: false;
16735
+ isAutoincrement: false;
16736
+ hasRuntimeDefault: false;
16737
+ enumValues: undefined;
16738
+ baseColumn: never;
16739
+ identity: undefined;
16740
+ generated: undefined;
16741
+ }, {}>;
16742
+ deletedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
16743
+ name: string;
16744
+ tableName: "crm_fields";
16745
+ dataType: "number int53";
16746
+ data: number;
16747
+ driverParam: number;
16748
+ notNull: false;
16749
+ hasDefault: false;
16750
+ isPrimaryKey: false;
16751
+ isAutoincrement: false;
16752
+ hasRuntimeDefault: false;
16753
+ enumValues: undefined;
16754
+ baseColumn: never;
16755
+ identity: undefined;
16756
+ generated: undefined;
16757
+ }, {}>;
16758
+ };
16759
+ dialect: 'sqlite';
16760
+ isAlias: false;
16761
+ }>;
16545
16762
  /** What a source said about one of its records, as it said it: the layer under the entity an import makes. */
16546
16763
  export declare const records: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
16547
16764
  name: "records";
@@ -1661,6 +1661,24 @@ export const pipelineStageChanges = sqliteTable("pipeline_stage_changes", {
1661
1661
  index("pipeline_stage_changes_by_from_stage_id").on(table.fromStageId),
1662
1662
  index("pipeline_stage_changes_by_to_stage_id").on(table.toStageId),
1663
1663
  ]);
1664
+ /** A CRM account's own fields on one kind; their values stay in each row's `metadata`, keyed by code. */
1665
+ export const crmFields = sqliteTable("crm_fields", {
1666
+ id: integer("id").primaryKey(),
1667
+ accountId: integer("account_id")
1668
+ .notNull()
1669
+ .references(() => accounts.id),
1670
+ kind: text("kind").notNull(),
1671
+ code: text("code").notNull(),
1672
+ label: text("label"),
1673
+ type: text("type").notNull(),
1674
+ multiple: integer("multiple").notNull(),
1675
+ filterable: integer("filterable").notNull(),
1676
+ options: text("options"),
1677
+ position: integer("position").notNull(),
1678
+ createdAt: integer("created_at").notNull(),
1679
+ updatedAt: integer("updated_at").notNull(),
1680
+ deletedAt: integer("deleted_at"),
1681
+ }, (table) => [unique().on(table.accountId, table.kind, table.code)]);
1664
1682
  /** What a source said about one of its records, as it said it: the layer under the entity an import makes. */
1665
1683
  export const records = sqliteTable("records", {
1666
1684
  id: integer("id").primaryKey(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecat/cli-core",
3
- "version": "0.595.0",
3
+ "version": "0.597.0",
4
4
  "description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Viacheslav Ptsarev",
@@ -13,6 +13,12 @@
13
13
  "url": "https://github.com/WireCatLabs/cli-core/issues"
14
14
  },
15
15
  "type": "module",
16
+ "wirecat": {
17
+ "store": {
18
+ "speaks": 54,
19
+ "minCompatible": 34
20
+ }
21
+ },
16
22
  "engines": {
17
23
  "node": "^22.16.0 || >=24"
18
24
  },