@agent-crm/cli 0.0.1

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.
@@ -0,0 +1,451 @@
1
+ import { readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { findWorkspace, openWorkspace } from "../workspace/open.js";
4
+ import { exec } from "../db/execute.js";
5
+ import { fail, isJson, ok, setJsonMode } from "../output/json.js";
6
+ import { startUiServer } from "./ui.js";
7
+ import { generateUuid } from "../lib/ids.js";
8
+ import { nowIso } from "../lib/time.js";
9
+ import { AcrmError, ERR } from "../lib/errors.js";
10
+ import { encode, normalizeUniqueKey, normalizeDomain, domainFromEmail, } from "../domain/values.js";
11
+ function parseCsv(text) {
12
+ const rows = [];
13
+ let cur = [];
14
+ let field = "";
15
+ let inQuotes = false;
16
+ let i = 0;
17
+ while (i < text.length) {
18
+ const c = text[i];
19
+ if (inQuotes) {
20
+ if (c === '"') {
21
+ if (text[i + 1] === '"') {
22
+ field += '"';
23
+ i += 2;
24
+ continue;
25
+ }
26
+ inQuotes = false;
27
+ i++;
28
+ continue;
29
+ }
30
+ field += c;
31
+ i++;
32
+ continue;
33
+ }
34
+ if (c === '"') {
35
+ inQuotes = true;
36
+ i++;
37
+ continue;
38
+ }
39
+ if (c === ",") {
40
+ cur.push(field);
41
+ field = "";
42
+ i++;
43
+ continue;
44
+ }
45
+ if (c === "\r") {
46
+ i++;
47
+ continue;
48
+ }
49
+ if (c === "\n") {
50
+ cur.push(field);
51
+ rows.push(cur);
52
+ cur = [];
53
+ field = "";
54
+ i++;
55
+ continue;
56
+ }
57
+ field += c;
58
+ i++;
59
+ }
60
+ if (field.length || cur.length) {
61
+ cur.push(field);
62
+ rows.push(cur);
63
+ }
64
+ if (!rows.length)
65
+ return [];
66
+ const header = rows[0].map((h) => h.trim().toLowerCase());
67
+ const out = [];
68
+ for (let r = 1; r < rows.length; r++) {
69
+ const row = rows[r];
70
+ if (row.length === 1 && row[0] === "")
71
+ continue;
72
+ const obj = {};
73
+ for (let c = 0; c < header.length; c++) {
74
+ obj[header[c]] = (row[c] ?? "").trim();
75
+ }
76
+ out.push(obj);
77
+ }
78
+ return out;
79
+ }
80
+ function pick(row, ...keys) {
81
+ for (const k of keys) {
82
+ const v = row[k];
83
+ if (v && v.length)
84
+ return v;
85
+ }
86
+ return null;
87
+ }
88
+ async function findRecordByUnique(lix, object_slug, attribute_slug, normalized_key) {
89
+ const r = await exec(lix, `SELECT record_id FROM acrm_value
90
+ WHERE object_slug = $1 AND attribute_slug = $2
91
+ AND normalized_key = $3 AND active_until IS NULL
92
+ LIMIT 1`, [object_slug, attribute_slug, normalized_key]);
93
+ return r.rows[0]?.record_id ?? null;
94
+ }
95
+ async function insertRecord(lix, object_slug, record_id) {
96
+ await exec(lix, "INSERT INTO acrm_record (object_slug, record_id) VALUES ($1, $2)", [object_slug, record_id]);
97
+ }
98
+ async function insertValue(lix, args) {
99
+ const normalized = normalizeUniqueKey(args.attribute_type, args.value_json);
100
+ const ref = args.attribute_type === "record-reference"
101
+ ? {
102
+ ref_object: args.value_json.target_object ?? null,
103
+ ref_record_id: args.value_json.target_record_id ?? null,
104
+ }
105
+ : { ref_object: null, ref_record_id: null };
106
+ const params = [
107
+ await generateUuid(lix),
108
+ args.object_slug,
109
+ args.record_id,
110
+ args.attribute_slug,
111
+ JSON.stringify(args.value_json),
112
+ args.attribute_type,
113
+ nowIso(),
114
+ normalized,
115
+ ref.ref_object,
116
+ ref.ref_record_id,
117
+ args.source,
118
+ JSON.stringify(args.provenance),
119
+ ];
120
+ await exec(lix, `INSERT INTO acrm_value
121
+ (id, object_slug, record_id, attribute_slug, value_json, attribute_type,
122
+ active_from, normalized_key, ref_object, ref_record_id, source, provenance_json)
123
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, params);
124
+ }
125
+ async function getAttribute(lix, object_slug, attribute_slug) {
126
+ const r = await exec(lix, "SELECT attribute_type FROM acrm_attribute WHERE object_slug = $1 AND attribute_slug = $2", [object_slug, attribute_slug]);
127
+ const row = r.rows[0];
128
+ if (!row)
129
+ return null;
130
+ return { attribute_type: row.attribute_type };
131
+ }
132
+ async function setSingleValue(lix, args) {
133
+ const value_json = encode(args.attribute_type, args.value);
134
+ // close any active values
135
+ await exec(lix, `UPDATE acrm_value SET active_until = $1
136
+ WHERE object_slug = $2 AND record_id = $3 AND attribute_slug = $4 AND active_until IS NULL`, [nowIso(), args.object_slug, args.record_id, args.attribute_slug]);
137
+ await insertValue(lix, { ...args, value_json });
138
+ }
139
+ async function addMultiValue(lix, args) {
140
+ const value_json = encode(args.attribute_type, args.value);
141
+ const normalized = normalizeUniqueKey(args.attribute_type, value_json);
142
+ if (normalized) {
143
+ const exists = await exec(lix, `SELECT 1 FROM acrm_value
144
+ WHERE object_slug = $1 AND record_id = $2 AND attribute_slug = $3
145
+ AND normalized_key = $4 AND active_until IS NULL LIMIT 1`, [args.object_slug, args.record_id, args.attribute_slug, normalized]);
146
+ if (exists.rows.length)
147
+ return;
148
+ }
149
+ await insertValue(lix, { ...args, value_json });
150
+ }
151
+ async function importRow(lix, row, source, rowIndex, stats) {
152
+ const provenance = { row: rowIndex };
153
+ const email = pick(row, "email", "email_address", "email_addresses");
154
+ const composed = [pick(row, "first_name"), pick(row, "last_name")]
155
+ .filter(Boolean)
156
+ .join(" ")
157
+ .trim();
158
+ const fullName = pick(row, "name", "full_name", "person_name") ?? (composed.length ? composed : null);
159
+ const companyName = pick(row, "company", "company_name", "organization");
160
+ const domainRaw = pick(row, "domain", "website", "company_domain");
161
+ const jobTitle = pick(row, "job_title", "title", "role");
162
+ const linkedin = pick(row, "linkedin_url", "linkedin");
163
+ // company
164
+ let companyId = null;
165
+ let companyDomain = null;
166
+ if (domainRaw)
167
+ companyDomain = normalizeDomain(domainRaw);
168
+ else if (email)
169
+ companyDomain = domainFromEmail(email);
170
+ if (companyDomain) {
171
+ const existing = await findRecordByUnique(lix, "companies", "domains", companyDomain);
172
+ if (existing) {
173
+ companyId = existing;
174
+ }
175
+ else {
176
+ companyId = await generateUuid(lix);
177
+ await insertRecord(lix, "companies", companyId);
178
+ await addMultiValue(lix, {
179
+ object_slug: "companies",
180
+ record_id: companyId,
181
+ attribute_slug: "domains",
182
+ attribute_type: "domain",
183
+ value: companyDomain,
184
+ source,
185
+ provenance,
186
+ });
187
+ if (companyName) {
188
+ await setSingleValue(lix, {
189
+ object_slug: "companies",
190
+ record_id: companyId,
191
+ attribute_slug: "name",
192
+ attribute_type: "text",
193
+ value: companyName,
194
+ source,
195
+ provenance,
196
+ });
197
+ }
198
+ stats.companies_created++;
199
+ }
200
+ }
201
+ // person
202
+ let personId = null;
203
+ if (email) {
204
+ const normalized = email.trim().toLowerCase();
205
+ const existing = await findRecordByUnique(lix, "people", "email_addresses", normalized);
206
+ if (existing) {
207
+ personId = existing;
208
+ }
209
+ else {
210
+ personId = await generateUuid(lix);
211
+ await insertRecord(lix, "people", personId);
212
+ await addMultiValue(lix, {
213
+ object_slug: "people",
214
+ record_id: personId,
215
+ attribute_slug: "email_addresses",
216
+ attribute_type: "email-address",
217
+ value: email,
218
+ source,
219
+ provenance,
220
+ });
221
+ if (fullName) {
222
+ await setSingleValue(lix, {
223
+ object_slug: "people",
224
+ record_id: personId,
225
+ attribute_slug: "name",
226
+ attribute_type: "personal-name",
227
+ value: fullName,
228
+ source,
229
+ provenance,
230
+ });
231
+ }
232
+ if (jobTitle) {
233
+ await setSingleValue(lix, {
234
+ object_slug: "people",
235
+ record_id: personId,
236
+ attribute_slug: "job_title",
237
+ attribute_type: "text",
238
+ value: jobTitle,
239
+ source,
240
+ provenance,
241
+ });
242
+ }
243
+ if (linkedin) {
244
+ await setSingleValue(lix, {
245
+ object_slug: "people",
246
+ record_id: personId,
247
+ attribute_slug: "linkedin_url",
248
+ attribute_type: "url",
249
+ value: linkedin,
250
+ source,
251
+ provenance,
252
+ });
253
+ }
254
+ stats.people_created++;
255
+ }
256
+ if (companyId) {
257
+ await setSingleValue(lix, {
258
+ object_slug: "people",
259
+ record_id: personId,
260
+ attribute_slug: "company",
261
+ attribute_type: "record-reference",
262
+ value: { target_object: "companies", target_record_id: companyId },
263
+ source,
264
+ provenance,
265
+ });
266
+ }
267
+ }
268
+ // deal (optional)
269
+ const dealName = pick(row, "deal_name", "deal");
270
+ if (dealName) {
271
+ const dealId = await generateUuid(lix);
272
+ await insertRecord(lix, "deals", dealId);
273
+ await setSingleValue(lix, {
274
+ object_slug: "deals",
275
+ record_id: dealId,
276
+ attribute_slug: "name",
277
+ attribute_type: "text",
278
+ value: dealName,
279
+ source,
280
+ provenance,
281
+ });
282
+ const stage = pick(row, "deal_stage", "stage");
283
+ if (stage) {
284
+ const attr = await getAttribute(lix, "deals", "stage");
285
+ if (attr) {
286
+ await setSingleValue(lix, {
287
+ object_slug: "deals",
288
+ record_id: dealId,
289
+ attribute_slug: "stage",
290
+ attribute_type: attr.attribute_type,
291
+ value: stage,
292
+ source,
293
+ provenance,
294
+ });
295
+ }
296
+ }
297
+ const dealValue = pick(row, "deal_value", "value");
298
+ if (dealValue) {
299
+ await setSingleValue(lix, {
300
+ object_slug: "deals",
301
+ record_id: dealId,
302
+ attribute_slug: "value",
303
+ attribute_type: "currency",
304
+ value: dealValue,
305
+ source,
306
+ provenance,
307
+ });
308
+ }
309
+ const closeDate = pick(row, "close_date", "deal_close_date");
310
+ if (closeDate) {
311
+ await setSingleValue(lix, {
312
+ object_slug: "deals",
313
+ record_id: dealId,
314
+ attribute_slug: "close_date",
315
+ attribute_type: "date",
316
+ value: closeDate,
317
+ source,
318
+ provenance,
319
+ });
320
+ }
321
+ const nextStep = pick(row, "next_step", "deal_next_step");
322
+ if (nextStep) {
323
+ await setSingleValue(lix, {
324
+ object_slug: "deals",
325
+ record_id: dealId,
326
+ attribute_slug: "next_step",
327
+ attribute_type: "text",
328
+ value: nextStep,
329
+ source,
330
+ provenance,
331
+ });
332
+ }
333
+ if (companyId) {
334
+ await setSingleValue(lix, {
335
+ object_slug: "deals",
336
+ record_id: dealId,
337
+ attribute_slug: "associated_company",
338
+ attribute_type: "record-reference",
339
+ value: { target_object: "companies", target_record_id: companyId },
340
+ source,
341
+ provenance,
342
+ });
343
+ }
344
+ if (personId) {
345
+ await addMultiValue(lix, {
346
+ object_slug: "deals",
347
+ record_id: dealId,
348
+ attribute_slug: "associated_people",
349
+ attribute_type: "record-reference",
350
+ value: { target_object: "people", target_record_id: personId },
351
+ source,
352
+ provenance,
353
+ });
354
+ }
355
+ stats.deals_created++;
356
+ }
357
+ }
358
+ export function registerImport(program) {
359
+ const importCmd = program
360
+ .command("import")
361
+ .description("import data into the .acrm file (creates people + companies; deals only when the CSV has deal columns)");
362
+ importCmd
363
+ .command("csv <path>")
364
+ .description("import a CSV. Creates one person per email and one company per domain. Creates a deal only when the CSV has a 'deal_name' or 'deal' column — leads alone do not become deals.")
365
+ .option("-p, --port <port>", "port for the UI server", "3737")
366
+ .option("--no-ui", "do not launch the UI after import")
367
+ .option("--no-open", "do not auto-open the browser when launching the UI")
368
+ .addHelpText("after", `
369
+ Recognized columns (header is trim+lowercase only — use snake_case, not "Company Name"):
370
+
371
+ Person email | email_address | email_addresses
372
+ name | full_name | person_name (or first_name + last_name)
373
+ job_title | title | role
374
+ linkedin_url | linkedin
375
+
376
+ Company company | company_name | organization
377
+ domain | website | company_domain
378
+
379
+ Deal deal_name | deal (presence triggers deal creation)
380
+ deal_stage | stage
381
+ deal_value | value
382
+ close_date | deal_close_date
383
+ next_step | deal_next_step
384
+
385
+ Identity:
386
+ - companies are deduplicated by normalized domain (or domain-from-email)
387
+ - people are deduplicated by lowercased email
388
+ - rows without an email skip person creation
389
+ - rows without a domain or email skip company creation
390
+ `)
391
+ .action(async (csvPath, opts) => {
392
+ const root = program.opts();
393
+ setJsonMode(root.json);
394
+ const port = Number(opts.port);
395
+ if (opts.ui && (!Number.isInteger(port) || port <= 0 || port > 65535)) {
396
+ fail(`invalid port: ${opts.port}`, ERR.IMPORT);
397
+ process.exit(1);
398
+ }
399
+ let lix = null;
400
+ try {
401
+ const abs = path.resolve(csvPath);
402
+ const text = readFileSync(abs, "utf8");
403
+ const rows = parseCsv(text);
404
+ const source = `csv:${path.basename(abs)}`;
405
+ lix = await openWorkspace({ workspace: root.workspace });
406
+ const stats = {
407
+ rows: rows.length,
408
+ companies_created: 0,
409
+ people_created: 0,
410
+ deals_created: 0,
411
+ };
412
+ for (let i = 0; i < rows.length; i++) {
413
+ await importRow(lix, rows[i], source, i + 1, stats);
414
+ }
415
+ ok(stats);
416
+ if (opts.ui) {
417
+ const resolved = root.workspace
418
+ ? root.workspace.endsWith(".acrm")
419
+ ? root.workspace
420
+ : root.workspace + ".acrm"
421
+ : (findWorkspace() ?? "workspace.acrm");
422
+ const workspaceLabel = path.basename(resolved);
423
+ startUiServer(lix, workspaceLabel, { port, open: opts.open });
424
+ // server now owns the lix handle
425
+ return;
426
+ }
427
+ await lix.close();
428
+ if (!isJson()) {
429
+ const bold = process.env.NO_COLOR ? "" : "\x1b[1m";
430
+ const reset = process.env.NO_COLOR ? "" : "\x1b[0m";
431
+ process.stdout.write(`\nNext: ${bold}acrm ui${reset} to validate the import in your browser\n`);
432
+ }
433
+ }
434
+ catch (e) {
435
+ if (lix) {
436
+ try {
437
+ await lix.close();
438
+ }
439
+ catch {
440
+ // ignore
441
+ }
442
+ }
443
+ if (e instanceof AcrmError)
444
+ fail(e.message, e.code, e.hint);
445
+ else
446
+ fail(e instanceof Error ? e.message : String(e), ERR.IMPORT);
447
+ process.exit(1);
448
+ }
449
+ });
450
+ }
451
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,eAAe,EACf,eAAe,GAEhB,MAAM,qBAAqB,CAAC;AAI7B,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,KAAK,IAAI,GAAG,CAAC;oBACb,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,QAAQ,GAAG,KAAK,CAAC;gBACjB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,KAAK,GAAG,EAAE,CAAC;YACX,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,GAAG,GAAG,EAAE,CAAC;YACT,KAAK,GAAG,EAAE,CAAC;YACX,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,KAAK,IAAI,CAAC,CAAC;QACX,CAAC,EAAE,CAAC;IACN,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,SAAS;QAChD,MAAM,GAAG,GAAW,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,GAAG,IAAc;IAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAQ,EACR,WAAmB,EACnB,cAAsB,EACtB,cAAsB;IAEtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAClB,GAAG,EACH;;;aAGS,EACT,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAC9C,CAAC;IACF,OAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAgC,IAAI,IAAI,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAQ,EACR,WAAmB,EACnB,SAAiB;IAEjB,MAAM,IAAI,CACR,GAAG,EACH,kEAAkE,EAClE,CAAC,WAAW,EAAE,SAAS,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAQ,EACR,IAQC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5E,MAAM,GAAG,GACP,IAAI,CAAC,cAAc,KAAK,kBAAkB;QACxC,CAAC,CAAC;YACE,UAAU,EAAG,IAAI,CAAC,UAAU,CAAC,aAAwB,IAAI,IAAI;YAC7D,aAAa,EAAG,IAAI,CAAC,UAAU,CAAC,gBAA2B,IAAI,IAAI;SACpE;QACH,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,MAAM,GAAsB;QAChC,MAAM,YAAY,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,WAAW;QAChB,IAAI,CAAC,SAAS;QACd,IAAI,CAAC,cAAc;QACnB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,cAAc;QACnB,MAAM,EAAE;QACR,UAAU;QACV,GAAG,CAAC,UAAU;QACd,GAAG,CAAC,aAAa;QACjB,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;KAChC,CAAC;IACF,MAAM,IAAI,CACR,GAAG,EACH;;;gEAG4D,EAC5D,MAAM,CACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAQ,EACR,WAAmB,EACnB,cAAsB;IAEtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAClB,GAAG,EACH,0FAA0F,EAC1F,CAAC,WAAW,EAAE,cAAc,CAAC,CAC9B,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,cAA+B,EAAE,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAQ,EACR,IAQC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,0BAA0B;IAC1B,MAAM,IAAI,CACR,GAAG,EACH;gGAC4F,EAC5F,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAClE,CAAC;IACF,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,GAAQ,EACR,IAQC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,GAAG,EACH;;kEAE4D,EAC5D,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CACpE,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;IACjC,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AAClD,CAAC;AASD,KAAK,UAAU,SAAS,CACtB,GAAQ,EACR,GAAW,EACX,MAAc,EACd,QAAgB,EAChB,KAAY;IAEZ,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;SAC/D,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;IACV,MAAM,QAAQ,GACZ,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAEvD,UAAU;IACV,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,SAAS;QAAE,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;SACrD,IAAI,KAAK;QAAE,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QACtF,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,GAAG,QAAQ,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;YAChD,MAAM,aAAa,CAAC,GAAG,EAAE;gBACvB,WAAW,EAAE,WAAW;gBACxB,SAAS,EAAE,SAAS;gBACpB,cAAc,EAAE,SAAS;gBACzB,cAAc,EAAE,QAAQ;gBACxB,KAAK,EAAE,aAAa;gBACpB,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;YACH,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,cAAc,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,WAAW;oBACxB,SAAS,EAAE,SAAS;oBACpB,cAAc,EAAE,MAAM;oBACtB,cAAc,EAAE,MAAM;oBACtB,KAAK,EAAE,WAAW;oBAClB,MAAM;oBACN,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,SAAS;IACT,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CACvC,GAAG,EACH,QAAQ,EACR,iBAAiB,EACjB,UAAU,CACX,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC5C,MAAM,aAAa,CAAC,GAAG,EAAE;gBACvB,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,QAAQ;gBACnB,cAAc,EAAE,iBAAiB;gBACjC,cAAc,EAAE,eAAe;gBAC/B,KAAK,EAAE,KAAK;gBACZ,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,cAAc,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,QAAQ;oBACnB,cAAc,EAAE,MAAM;oBACtB,cAAc,EAAE,eAAe;oBAC/B,KAAK,EAAE,QAAQ;oBACf,MAAM;oBACN,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,cAAc,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,QAAQ;oBACnB,cAAc,EAAE,WAAW;oBAC3B,cAAc,EAAE,MAAM;oBACtB,KAAK,EAAE,QAAQ;oBACf,MAAM;oBACN,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,cAAc,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,QAAQ;oBACrB,SAAS,EAAE,QAAQ;oBACnB,cAAc,EAAE,cAAc;oBAC9B,cAAc,EAAE,KAAK;oBACrB,KAAK,EAAE,QAAQ;oBACf,MAAM;oBACN,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,cAAc,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,QAAQ;gBACnB,cAAc,EAAE,SAAS;gBACzB,cAAc,EAAE,kBAAkB;gBAClC,KAAK,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE;gBAClE,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,GAAG,EAAE;YACxB,WAAW,EAAE,OAAO;YACpB,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,MAAM;YACtB,cAAc,EAAE,MAAM;YACtB,KAAK,EAAE,QAAQ;YACf,MAAM;YACN,UAAU;SACX,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,OAAO;oBACpB,SAAS,EAAE,MAAM;oBACjB,cAAc,EAAE,OAAO;oBACvB,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,KAAK,EAAE,KAAK;oBACZ,MAAM;oBACN,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,cAAc,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,OAAO;gBACvB,cAAc,EAAE,UAAU;gBAC1B,KAAK,EAAE,SAAS;gBAChB,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,cAAc,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,YAAY;gBAC5B,cAAc,EAAE,MAAM;gBACtB,KAAK,EAAE,SAAS;gBAChB,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,cAAc,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,WAAW;gBAC3B,cAAc,EAAE,MAAM;gBACtB,KAAK,EAAE,QAAQ;gBACf,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,cAAc,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,oBAAoB;gBACpC,cAAc,EAAE,kBAAkB;gBAClC,KAAK,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE;gBAClE,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,aAAa,CAAC,GAAG,EAAE;gBACvB,WAAW,EAAE,OAAO;gBACpB,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,cAAc,EAAE,kBAAkB;gBAClC,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE;gBAC9D,MAAM;gBACN,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,wGAAwG,CACzG,CAAC;IAEJ,SAAS;SACN,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CACV,+KAA+K,CAChL;SACA,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,CAAC;SAC7D,MAAM,CAAC,SAAS,EAAE,mCAAmC,CAAC;SACtD,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;SACzE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;CAsBL,CACI;SACA,MAAM,CACL,KAAK,EACH,OAAe,EACf,IAAkD,EAClD,EAAE;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAA4C,CAAC;QACtE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,GAAG,GAAqD,IAAI,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,GAAG,GAAG,MAAM,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACzD,MAAM,KAAK,GAAU;gBACnB,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,iBAAiB,EAAE,CAAC;gBACpB,cAAc,EAAE,CAAC;gBACjB,aAAa,EAAE,CAAC;aACjB,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;YACD,EAAE,CAAC,KAAK,CAAC,CAAC;YACV,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS;oBAC7B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAChC,CAAC,CAAC,IAAI,CAAC,SAAS;wBAChB,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO;oBAC5B,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,gBAAgB,CAAC,CAAC;gBAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC/C,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9D,iCAAiC;gBACjC,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,IAAI,UAAU,KAAK,2CAA2C,CAC1E,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;gBACpB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,IAAI,CAAC,YAAY,SAAS;gBAAE,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;;gBACvD,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { openWorkspace } from "../workspace/open.js";
2
+ import { registerAllSchemas } from "../workspace/schemas/index.js";
3
+ import { exec } from "../db/execute.js";
4
+ import { fail, isJson, ok, setJsonMode } from "../output/json.js";
5
+ import { generateUuid } from "../lib/ids.js";
6
+ import { AcrmError, ERR } from "../lib/errors.js";
7
+ const OBJECTS = [
8
+ { object_slug: "people", singular_name: "Person", plural_name: "People" },
9
+ { object_slug: "companies", singular_name: "Company", plural_name: "Companies" },
10
+ { object_slug: "deals", singular_name: "Deal", plural_name: "Deals" },
11
+ ];
12
+ const ATTRIBUTES = [
13
+ // companies
14
+ { object_slug: "companies", attribute_slug: "name", title: "Name", attribute_type: "text", is_multivalued: false, is_unique: false },
15
+ { object_slug: "companies", attribute_slug: "domains", title: "Domains", attribute_type: "domain", is_multivalued: true, is_unique: true },
16
+ { object_slug: "companies", attribute_slug: "description", title: "Description", attribute_type: "text", is_multivalued: false, is_unique: false },
17
+ { object_slug: "companies", attribute_slug: "linkedin_url", title: "LinkedIn", attribute_type: "url", is_multivalued: false, is_unique: false },
18
+ { object_slug: "companies", attribute_slug: "team", title: "Team", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "people", inverse: "company" } },
19
+ { object_slug: "companies", attribute_slug: "associated_deals", title: "Associated deals", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "deals", inverse: "associated_company" } },
20
+ // people
21
+ { object_slug: "people", attribute_slug: "name", title: "Name", attribute_type: "personal-name", is_multivalued: false, is_unique: false },
22
+ { object_slug: "people", attribute_slug: "email_addresses", title: "Email addresses", attribute_type: "email-address", is_multivalued: true, is_unique: true },
23
+ { object_slug: "people", attribute_slug: "job_title", title: "Job title", attribute_type: "text", is_multivalued: false, is_unique: false },
24
+ { object_slug: "people", attribute_slug: "linkedin_url", title: "LinkedIn", attribute_type: "url", is_multivalued: false, is_unique: false },
25
+ { object_slug: "people", attribute_slug: "company", title: "Company", attribute_type: "record-reference", is_multivalued: false, is_unique: false, config: { target_object: "companies", inverse: "team" } },
26
+ { object_slug: "people", attribute_slug: "associated_deals", title: "Associated deals", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "deals", inverse: "associated_people" } },
27
+ // deals
28
+ { object_slug: "deals", attribute_slug: "name", title: "Name", attribute_type: "text", is_multivalued: false, is_unique: false },
29
+ { object_slug: "deals", attribute_slug: "stage", title: "Stage", attribute_type: "status", is_multivalued: false, is_unique: false, config: { options: [{ id: "lead", title: "Lead" }, { id: "in_progress", title: "In Progress" }, { id: "won", title: "Won 🎉" }, { id: "lost", title: "Lost" }] } },
30
+ { object_slug: "deals", attribute_slug: "value", title: "Value", attribute_type: "currency", is_multivalued: false, is_unique: false, config: { currency_code: "USD" } },
31
+ { object_slug: "deals", attribute_slug: "associated_company", title: "Associated company", attribute_type: "record-reference", is_multivalued: false, is_unique: false, config: { target_object: "companies", inverse: "associated_deals" } },
32
+ { object_slug: "deals", attribute_slug: "associated_people", title: "Associated people", attribute_type: "record-reference", is_multivalued: true, is_unique: false, config: { target_object: "people", inverse: "associated_deals" } },
33
+ { object_slug: "deals", attribute_slug: "close_date", title: "Close date", attribute_type: "date", is_multivalued: false, is_unique: false },
34
+ { object_slug: "deals", attribute_slug: "next_step", title: "Next step", attribute_type: "text", is_multivalued: false, is_unique: false },
35
+ ];
36
+ async function seedObjects(lix) {
37
+ for (const o of OBJECTS) {
38
+ const have = await exec(lix, "SELECT object_slug FROM acrm_object WHERE object_slug = $1", [o.object_slug]);
39
+ if (have.rows.length)
40
+ continue;
41
+ await exec(lix, "INSERT INTO acrm_object (object_slug, singular_name, plural_name) VALUES ($1, $2, $3)", [o.object_slug, o.singular_name, o.plural_name]);
42
+ }
43
+ }
44
+ async function seedAttributes(lix) {
45
+ for (const a of ATTRIBUTES) {
46
+ const have = await exec(lix, "SELECT attribute_slug FROM acrm_attribute WHERE object_slug = $1 AND attribute_slug = $2", [a.object_slug, a.attribute_slug]);
47
+ if (have.rows.length)
48
+ continue;
49
+ const params = [
50
+ a.object_slug,
51
+ a.attribute_slug,
52
+ a.title,
53
+ a.attribute_type,
54
+ a.is_multivalued,
55
+ a.is_unique,
56
+ a.config ? JSON.stringify(a.config) : null,
57
+ ];
58
+ await exec(lix, `INSERT INTO acrm_attribute
59
+ (object_slug, attribute_slug, title, attribute_type, is_multivalued, is_unique, config_json)
60
+ VALUES ($1, $2, $3, $4, $5, $6, $7)`, params);
61
+ }
62
+ }
63
+ export function registerInit(program) {
64
+ program
65
+ .command("init <name>")
66
+ .description("create a new .acrm file in the current directory (e.g. `acrm init cluster.acrm`)")
67
+ .action(async (name) => {
68
+ const root = program.opts();
69
+ setJsonMode(root.json);
70
+ try {
71
+ const lix = await openWorkspace({ workspace: name, create: true });
72
+ try {
73
+ await registerAllSchemas(lix);
74
+ await seedObjects(lix);
75
+ await seedAttributes(lix);
76
+ const workspaceId = await generateUuid(lix);
77
+ ok({ initialized: true, workspace_id: workspaceId });
78
+ if (!isJson()) {
79
+ const bold = process.env.NO_COLOR ? "" : "\x1b[1m";
80
+ const reset = process.env.NO_COLOR ? "" : "\x1b[0m";
81
+ process.stdout.write(`\nNext: ${bold}acrm import csv <path>${reset} to load your leads\n`);
82
+ }
83
+ }
84
+ finally {
85
+ await lix.close();
86
+ }
87
+ }
88
+ catch (e) {
89
+ if (e instanceof AcrmError)
90
+ fail(e.message, e.code, e.hint);
91
+ else
92
+ fail(e instanceof Error ? e.message : String(e), ERR.INIT);
93
+ process.exit(1);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}