@datasynx/agentic-crm 0.1.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.
- package/LICENSE +21 -0
- package/README.md +767 -0
- package/dist/agent-config-zPvcqu07.js +14 -0
- package/dist/agent-config-zPvcqu07.js.map +1 -0
- package/dist/approvals-DpjxGHFp.js +67 -0
- package/dist/approvals-DpjxGHFp.js.map +1 -0
- package/dist/ask-CID3jnuL.js +52 -0
- package/dist/ask-CID3jnuL.js.map +1 -0
- package/dist/audit-log-DNMY9mUZ.js +49 -0
- package/dist/audit-log-DNMY9mUZ.js.map +1 -0
- package/dist/auth-CyFuu9X_.js +2 -0
- package/dist/auth-DFWwWcYD.js +93 -0
- package/dist/auth-DFWwWcYD.js.map +1 -0
- package/dist/autofill-Di_-SP7t.js +51 -0
- package/dist/autofill-Di_-SP7t.js.map +1 -0
- package/dist/backup-CeMk9z86.js +417 -0
- package/dist/backup-CeMk9z86.js.map +1 -0
- package/dist/backup-f_hC7rBV.js +2 -0
- package/dist/calendly-Bft_wwji.js +52 -0
- package/dist/calendly-Bft_wwji.js.map +1 -0
- package/dist/calendly-D3coO92o.cjs +53 -0
- package/dist/calendly-D3coO92o.cjs.map +1 -0
- package/dist/chunk-DakpK96I.cjs +43 -0
- package/dist/churn-C28IgnAj.js +54 -0
- package/dist/churn-C28IgnAj.js.map +1 -0
- package/dist/cli.js +4396 -0
- package/dist/cli.js.map +1 -0
- package/dist/colors-BG07TZQz.js +11 -0
- package/dist/colors-BG07TZQz.js.map +1 -0
- package/dist/compliance-B1kk5-YS.js +115 -0
- package/dist/compliance-B1kk5-YS.js.map +1 -0
- package/dist/compliance-B91zNvCR.cjs +156 -0
- package/dist/compliance-B91zNvCR.cjs.map +1 -0
- package/dist/compliance-CKSBoQUe.js +118 -0
- package/dist/compliance-CKSBoQUe.js.map +1 -0
- package/dist/compliance-CujOqAKk.js +2 -0
- package/dist/context-builder-BzWAp3Zs.js +96 -0
- package/dist/context-builder-BzWAp3Zs.js.map +1 -0
- package/dist/context-builder-DlrRcqmJ.js +2 -0
- package/dist/conversation-intel-mm7Lhemh.js +72 -0
- package/dist/conversation-intel-mm7Lhemh.js.map +1 -0
- package/dist/custom-fields-CzNeD3_v.js +2 -0
- package/dist/custom-fields-Pl2t9xzp.js +73 -0
- package/dist/custom-fields-Pl2t9xzp.js.map +1 -0
- package/dist/custom-objects-BHgn1GEX.js +78 -0
- package/dist/custom-objects-BHgn1GEX.js.map +1 -0
- package/dist/custom-objects-CIFrmQ2V.js +2 -0
- package/dist/customer-dir-DIylZ8Q6.js +75 -0
- package/dist/customer-dir-DIylZ8Q6.js.map +1 -0
- package/dist/daemon/worker.js +207 -0
- package/dist/daemon/worker.js.map +1 -0
- package/dist/enrichment-3XvgGDfB.js +103 -0
- package/dist/enrichment-3XvgGDfB.js.map +1 -0
- package/dist/file-lock-B_zi7NQl.js +22 -0
- package/dist/file-lock-B_zi7NQl.js.map +1 -0
- package/dist/gmail-auth-BP6cJwfw.js +40 -0
- package/dist/gmail-auth-BP6cJwfw.js.map +1 -0
- package/dist/gmail-auth-DxakCtGm.cjs +44 -0
- package/dist/gmail-auth-DxakCtGm.cjs.map +1 -0
- package/dist/gmail-auth-OComS92L.js +40 -0
- package/dist/gmail-auth-OComS92L.js.map +1 -0
- package/dist/gmail-push-watch-DELQFMPk.js +20 -0
- package/dist/gmail-push-watch-DELQFMPk.js.map +1 -0
- package/dist/gmail-sender-StTpJ9Ub.js +32 -0
- package/dist/gmail-sender-StTpJ9Ub.js.map +1 -0
- package/dist/gmail-sync-DIaxInDT.js +204 -0
- package/dist/gmail-sync-DIaxInDT.js.map +1 -0
- package/dist/gmail-sync-hHm9gaWd.cjs +218 -0
- package/dist/gmail-sync-hHm9gaWd.cjs.map +1 -0
- package/dist/gmail-sync-rQaVqKWd.js +214 -0
- package/dist/gmail-sync-rQaVqKWd.js.map +1 -0
- package/dist/gmail-webhook-handler-DS7OlRPX.js +3 -0
- package/dist/gmail-webhook-handler-e5Od25FX.js +97 -0
- package/dist/gmail-webhook-handler-e5Od25FX.js.map +1 -0
- package/dist/goal-engine-CUZSpERI.js +2 -0
- package/dist/goal-engine-KpBftn4V.js +295 -0
- package/dist/goal-engine-KpBftn4V.js.map +1 -0
- package/dist/google-drive-sync-DEPcqFca.js +105 -0
- package/dist/google-drive-sync-DEPcqFca.js.map +1 -0
- package/dist/hybrid-search-BmHttLrR.js +40 -0
- package/dist/hybrid-search-BmHttLrR.js.map +1 -0
- package/dist/hygiene-DZqfYpFf.js +38 -0
- package/dist/hygiene-DZqfYpFf.js.map +1 -0
- package/dist/identity-CI6olMNm.js +41 -0
- package/dist/identity-CI6olMNm.js.map +1 -0
- package/dist/identity-gyfWdrcX.js +2 -0
- package/dist/import-hubspot-BaK71U_K.js +588 -0
- package/dist/import-hubspot-BaK71U_K.js.map +1 -0
- package/dist/index-V8BFaH-b.d.ts +539 -0
- package/dist/index-V8BFaH-b.d.ts.map +1 -0
- package/dist/index-YqwMd6aQ.d.cts +538 -0
- package/dist/index-YqwMd6aQ.d.cts.map +1 -0
- package/dist/index.cjs +185 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +538 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +539 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions-writer-CrPStUll.cjs +77 -0
- package/dist/interactions-writer-CrPStUll.cjs.map +1 -0
- package/dist/interactions-writer-DO3KcSR3.js +52 -0
- package/dist/interactions-writer-DO3KcSR3.js.map +1 -0
- package/dist/interactions-writer-SLHnoEeE.js +46 -0
- package/dist/interactions-writer-SLHnoEeE.js.map +1 -0
- package/dist/interactions-writer-dSPy1XfO.js +2 -0
- package/dist/knowledge-base-D0Fh40kc.js +1013 -0
- package/dist/knowledge-base-D0Fh40kc.js.map +1 -0
- package/dist/lancedb-CCBbpulq.js +2 -0
- package/dist/lancedb-rlvWoPwl.js +98 -0
- package/dist/lancedb-rlvWoPwl.js.map +1 -0
- package/dist/lead-model-BCFzyktm.js +109 -0
- package/dist/lead-model-BCFzyktm.js.map +1 -0
- package/dist/llm-DEjWcqmW.js +2 -0
- package/dist/llm-DvzZqva0.js +372 -0
- package/dist/llm-DvzZqva0.js.map +1 -0
- package/dist/llm-Z8RIYkpF.js +174 -0
- package/dist/llm-Z8RIYkpF.js.map +1 -0
- package/dist/llm-iijeXmgq.cjs +198 -0
- package/dist/llm-iijeXmgq.cjs.map +1 -0
- package/dist/mcp-CdTJWTJf.d.cts +12 -0
- package/dist/mcp-CdTJWTJf.d.cts.map +1 -0
- package/dist/mcp-CdTJWTJf.d.ts +12 -0
- package/dist/mcp-CdTJWTJf.d.ts.map +1 -0
- package/dist/mcp.cjs +7464 -0
- package/dist/mcp.cjs.map +1 -0
- package/dist/mcp.d.cts +12 -0
- package/dist/mcp.d.cts.map +1 -0
- package/dist/mcp.d.ts +12 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +7448 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory-Bb6ky3kb.js +58 -0
- package/dist/memory-Bb6ky3kb.js.map +1 -0
- package/dist/memory-Cy6-Tbyl.js +2 -0
- package/dist/metrics-DH8wHvya.js +26 -0
- package/dist/metrics-DH8wHvya.js.map +1 -0
- package/dist/microsoft-auth-B8_S45gh.js +17 -0
- package/dist/microsoft-auth-B8_S45gh.js.map +1 -0
- package/dist/microsoft-calendar-B6MMtUQK.js +67 -0
- package/dist/microsoft-calendar-B6MMtUQK.js.map +1 -0
- package/dist/microsoft-sync-CpZVoSuq.js +68 -0
- package/dist/microsoft-sync-CpZVoSuq.js.map +1 -0
- package/dist/nba-3wanmJ0U.js +48 -0
- package/dist/nba-3wanmJ0U.js.map +1 -0
- package/dist/notification-dispatcher-0vYNngWe.js +97 -0
- package/dist/notification-dispatcher-0vYNngWe.js.map +1 -0
- package/dist/opportunity-score-BTMOQSTV.js +47 -0
- package/dist/opportunity-score-BTMOQSTV.js.map +1 -0
- package/dist/pipedrive-client-CdGKpH9b.js +17 -0
- package/dist/pipedrive-client-CdGKpH9b.js.map +1 -0
- package/dist/pipeline-writer-BqBrYrQc.js +2 -0
- package/dist/pipeline-writer-BvVquKIe.js +96 -0
- package/dist/pipeline-writer-BvVquKIe.js.map +1 -0
- package/dist/pipeline-writer-N2omexxp.cjs +121 -0
- package/dist/pipeline-writer-N2omexxp.cjs.map +1 -0
- package/dist/pipeline-writer-eufx_0o1.js +102 -0
- package/dist/pipeline-writer-eufx_0o1.js.map +1 -0
- package/dist/proactive-agent-BgQXw3ac.js +96 -0
- package/dist/proactive-agent-BgQXw3ac.js.map +1 -0
- package/dist/proactive-worker-BrLHNhjH.js +229 -0
- package/dist/proactive-worker-BrLHNhjH.js.map +1 -0
- package/dist/push-manager-CdqIIkuh.js +108 -0
- package/dist/push-manager-CdqIIkuh.js.map +1 -0
- package/dist/push-manager-CowY-0IK.js +2 -0
- package/dist/quote-generator-BfwENXzg.js +133 -0
- package/dist/quote-generator-BfwENXzg.js.map +1 -0
- package/dist/quote-generator-OhSFsi3x.js +2 -0
- package/dist/rbac-C7c8tcES.js +2 -0
- package/dist/rbac-CTIktZaC.js +91 -0
- package/dist/rbac-CTIktZaC.js.map +1 -0
- package/dist/relationship-health-odxEoQdJ.js +454 -0
- package/dist/relationship-health-odxEoQdJ.js.map +1 -0
- package/dist/revenue-simulation-BJdRTEHc.js +2 -0
- package/dist/revenue-simulation-Bqf2DLVB.js +251 -0
- package/dist/revenue-simulation-Bqf2DLVB.js.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
- package/dist/salesforce-client-rhZFa_p5.js +51 -0
- package/dist/salesforce-client-rhZFa_p5.js.map +1 -0
- package/dist/segments-BqcD5HIl.js +61 -0
- package/dist/segments-BqcD5HIl.js.map +1 -0
- package/dist/sequence-engine-CCTHEBgi.js +2 -0
- package/dist/sequence-engine-J1lTW_in.js +91 -0
- package/dist/sequence-engine-J1lTW_in.js.map +1 -0
- package/dist/sequence-store-DaaWr0Os.js +221 -0
- package/dist/sequence-store-DaaWr0Os.js.map +1 -0
- package/dist/server-Dyva03K8.js +4287 -0
- package/dist/server-Dyva03K8.js.map +1 -0
- package/dist/session-B9AilxOE.js +81 -0
- package/dist/session-B9AilxOE.js.map +1 -0
- package/dist/session-D0qFkBla.cjs +82 -0
- package/dist/session-D0qFkBla.cjs.map +1 -0
- package/dist/session-D9ub6Wl1.js +79 -0
- package/dist/session-D9ub6Wl1.js.map +1 -0
- package/dist/session-mWHA71Lw.js +2 -0
- package/dist/session-store-B0QZE8Bx.cjs +697 -0
- package/dist/session-store-B0QZE8Bx.cjs.map +1 -0
- package/dist/session-store-C8tEvMPw.js +543 -0
- package/dist/session-store-C8tEvMPw.js.map +1 -0
- package/dist/session-store-CEa39Dxs.js +15 -0
- package/dist/session-store-CEa39Dxs.js.map +1 -0
- package/dist/sla-engine-5IhTsBUR.js +2 -0
- package/dist/sla-engine-BqX-7u-7.js +53 -0
- package/dist/sla-engine-BqX-7u-7.js.map +1 -0
- package/dist/sop-DkhVChGy.js +2 -0
- package/dist/sop-Vp0UPWFW.js +70 -0
- package/dist/sop-Vp0UPWFW.js.map +1 -0
- package/dist/survey-engine-C06hcQt3.js +2 -0
- package/dist/survey-engine-DBjCYqCv.js +147 -0
- package/dist/survey-engine-DBjCYqCv.js.map +1 -0
- package/dist/sync-state-ChaLbamC.js +33 -0
- package/dist/sync-state-ChaLbamC.js.map +1 -0
- package/dist/sync-state-CwLSt_1m.js +2 -0
- package/dist/ticket-writer-CjqKeIRD.js +2 -0
- package/dist/ticket-writer-j2oX_Wal.js +134 -0
- package/dist/ticket-writer-j2oX_Wal.js.map +1 -0
- package/dist/tone-Bdm5uaht.js +48 -0
- package/dist/tone-Bdm5uaht.js.map +1 -0
- package/dist/tone-DRKlZgPr.cjs +43 -0
- package/dist/tone-DRKlZgPr.cjs.map +1 -0
- package/dist/tone-vNb2DAAD.js +39 -0
- package/dist/tone-vNb2DAAD.js.map +1 -0
- package/dist/transcript-watcher-CL2QUygI.js +132 -0
- package/dist/transcript-watcher-CL2QUygI.js.map +1 -0
- package/dist/unmatched-transcripts-BsH5bhkU.js +26 -0
- package/dist/unmatched-transcripts-BsH5bhkU.js.map +1 -0
- package/dist/unmatched-transcripts-D0PrJ9iz.js +2 -0
- package/dist/update-deal-BNwPGaTV.js +2 -0
- package/dist/update-deal-DKC79skb.js +91 -0
- package/dist/update-deal-DKC79skb.js.map +1 -0
- package/dist/usage-CClTf5e6.cjs +57 -0
- package/dist/usage-CClTf5e6.cjs.map +1 -0
- package/dist/usage-D0-TYJkw.js +93 -0
- package/dist/usage-D0-TYJkw.js.map +1 -0
- package/dist/usage-D0u9a-lV.js +54 -0
- package/dist/usage-D0u9a-lV.js.map +1 -0
- package/dist/vault-C1D3zScD.js +2 -0
- package/dist/vault-DXCg29W-.js +86 -0
- package/dist/vault-DXCg29W-.js.map +1 -0
- package/dist/webhooks-7EpA05Qr.js +138 -0
- package/dist/webhooks-7EpA05Qr.js.map +1 -0
- package/dist/webhooks-BO2UAnmn.js +94 -0
- package/dist/webhooks-BO2UAnmn.js.map +1 -0
- package/dist/webhooks-Xn6zO6kd.cjs +97 -0
- package/dist/webhooks-Xn6zO6kd.cjs.map +1 -0
- package/dist/write-queue-BDolUxfs.cjs +26 -0
- package/dist/write-queue-BDolUxfs.cjs.map +1 -0
- package/dist/write-queue-IbsAjUnh.js +21 -0
- package/dist/write-queue-IbsAjUnh.js.map +1 -0
- package/package.json +142 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { i as readMainFacts, t as customerExists } from "./customer-dir-DIylZ8Q6.js";
|
|
2
|
+
import { i as success, n as error, r as info } from "./colors-BG07TZQz.js";
|
|
3
|
+
import { n as getSession, r as setSession, t as clearSession } from "./session-store-CEa39Dxs.js";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
//#region src/commands/session.ts
|
|
8
|
+
function sessionsDir(dataDir) {
|
|
9
|
+
return path.join(dataDir, ".agentic", "sessions");
|
|
10
|
+
}
|
|
11
|
+
function persistSession(dataDir, session) {
|
|
12
|
+
const dir = sessionsDir(dataDir);
|
|
13
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
14
|
+
const key = (session.owner ?? `pid-${process.pid}`).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
15
|
+
fs.writeFileSync(path.join(dir, `${key}.json`), JSON.stringify({
|
|
16
|
+
...session,
|
|
17
|
+
pid: process.pid
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
function clearPersistedSession(dataDir, owner) {
|
|
21
|
+
const dir = sessionsDir(dataDir);
|
|
22
|
+
if (!fs.existsSync(dir)) return;
|
|
23
|
+
if (owner !== void 0) {
|
|
24
|
+
const key = owner.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
25
|
+
const file = path.join(dir, `${key}.json`);
|
|
26
|
+
if (fs.existsSync(file)) fs.unlinkSync(file);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
for (const f of fs.readdirSync(dir).filter((n) => n.endsWith(".json"))) try {
|
|
31
|
+
fs.unlinkSync(path.join(dir, f));
|
|
32
|
+
} catch {}
|
|
33
|
+
} catch {}
|
|
34
|
+
}
|
|
35
|
+
function readAllSessions(dataDir) {
|
|
36
|
+
const dir = sessionsDir(dataDir);
|
|
37
|
+
if (!fs.existsSync(dir)) return [];
|
|
38
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith(".json")).map((f) => {
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(fs.readFileSync(path.join(dir, f), "utf-8"));
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}).filter((s) => s !== null);
|
|
45
|
+
}
|
|
46
|
+
const sessionCommand = new Command("session");
|
|
47
|
+
sessionCommand.command("open <slug>").option("--owner <owner>", "Set the owner of this session").action(async (slug, opts) => {
|
|
48
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
49
|
+
if (!customerExists(dataDir, slug)) {
|
|
50
|
+
console.error(error(`✗ Customer not found: ${slug}`));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const facts = await readMainFacts(dataDir, slug);
|
|
54
|
+
const owner = opts.owner ?? process.env["DXCRM_ACTOR"];
|
|
55
|
+
const session = {
|
|
56
|
+
customerSlug: slug,
|
|
57
|
+
customerName: facts.name,
|
|
58
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
59
|
+
...owner !== void 0 ? { owner } : {}
|
|
60
|
+
};
|
|
61
|
+
setSession(session);
|
|
62
|
+
persistSession(dataDir, session);
|
|
63
|
+
console.log(success(`✓ Session opened: ${facts.name}`));
|
|
64
|
+
});
|
|
65
|
+
sessionCommand.command("close").action(() => {
|
|
66
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
67
|
+
const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;
|
|
68
|
+
clearSession();
|
|
69
|
+
clearPersistedSession(dataDir, s?.owner);
|
|
70
|
+
console.log(success("✓ Session closed."));
|
|
71
|
+
});
|
|
72
|
+
sessionCommand.command("status").action(() => {
|
|
73
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
74
|
+
const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;
|
|
75
|
+
if (!s) console.log(info("No active session."));
|
|
76
|
+
else console.log(info(`Active: ${s.customerName} (${s.customerSlug}) since ${s.startedAt}`));
|
|
77
|
+
});
|
|
78
|
+
//#endregion
|
|
79
|
+
export { sessionCommand as i, persistSession as n, readAllSessions as r, clearPersistedSession as t };
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=session-B9AilxOE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-B9AilxOE.js","names":[],"sources":["../src/commands/session.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { setSession, getSession, clearSession } from \"../core/session-store.js\";\nimport { readMainFacts, customerExists } from \"../fs/customer-dir.js\";\nimport { success, error, info } from \"../ui/colors.js\";\n\nfunction sessionsDir(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"sessions\");\n}\n\nexport function persistSession(\n dataDir: string,\n session: {\n customerSlug: string;\n customerName: string;\n startedAt: string;\n owner?: string;\n }\n): void {\n const dir = sessionsDir(dataDir);\n fs.mkdirSync(dir, { recursive: true });\n const key = (session.owner ?? `pid-${process.pid}`).replace(/[^a-zA-Z0-9_-]/g, \"_\");\n fs.writeFileSync(path.join(dir, `${key}.json`), JSON.stringify({ ...session, pid: process.pid }));\n}\n\nexport function clearPersistedSession(dataDir: string, owner?: string): void {\n const dir = sessionsDir(dataDir);\n if (!fs.existsSync(dir)) return;\n if (owner !== undefined) {\n const key = owner.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const file = path.join(dir, `${key}.json`);\n if (fs.existsSync(file)) fs.unlinkSync(file);\n return;\n }\n // No specific owner — clear all session files\n try {\n for (const f of fs.readdirSync(dir).filter((n) => n.endsWith(\".json\"))) {\n try {\n fs.unlinkSync(path.join(dir, f));\n } catch {\n /* ignore */\n }\n }\n } catch {\n /* ignore */\n }\n}\n\nexport function readAllSessions(\n dataDir: string\n): Array<{ customerSlug: string; customerName: string; startedAt: string; owner?: string }> {\n const dir = sessionsDir(dataDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n return JSON.parse(fs.readFileSync(path.join(dir, f), \"utf-8\")) as {\n customerSlug: string;\n customerName: string;\n startedAt: string;\n owner?: string;\n };\n } catch {\n return null;\n }\n })\n .filter((s): s is NonNullable<typeof s> => s !== null);\n}\n\nexport const sessionCommand = new Command(\"session\");\n\nsessionCommand\n .command(\"open <slug>\")\n .option(\"--owner <owner>\", \"Set the owner of this session\")\n .action(async (slug: string, opts: { owner?: string }) => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n if (!customerExists(dataDir, slug)) {\n console.error(error(`✗ Customer not found: ${slug}`));\n process.exit(1);\n }\n const facts = await readMainFacts(dataDir, slug);\n const owner = opts.owner ?? process.env[\"DXCRM_ACTOR\"];\n const session = {\n customerSlug: slug,\n customerName: facts.name,\n startedAt: new Date().toISOString(),\n ...(owner !== undefined ? { owner } : {}),\n };\n setSession(session);\n persistSession(dataDir, session);\n console.log(success(`✓ Session opened: ${facts.name}`));\n });\n\nsessionCommand.command(\"close\").action(() => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;\n clearSession();\n clearPersistedSession(dataDir, s?.owner);\n console.log(success(\"✓ Session closed.\"));\n});\n\nsessionCommand.command(\"status\").action(() => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;\n if (!s) {\n console.log(info(\"No active session.\"));\n } else {\n console.log(info(`Active: ${s.customerName} (${s.customerSlug}) since ${s.startedAt}`));\n }\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const require_chunk = require("./chunk-DakpK96I.cjs");
|
|
2
|
+
const require_session_store = require("./session-store-B0QZE8Bx.cjs");
|
|
3
|
+
let commander = require("commander");
|
|
4
|
+
let path = require("path");
|
|
5
|
+
path = require_chunk.__toESM(path, 1);
|
|
6
|
+
let fs = require("fs");
|
|
7
|
+
fs = require_chunk.__toESM(fs, 1);
|
|
8
|
+
//#region src/commands/session.ts
|
|
9
|
+
function sessionsDir(dataDir) {
|
|
10
|
+
return path.default.join(dataDir, ".agentic", "sessions");
|
|
11
|
+
}
|
|
12
|
+
function persistSession(dataDir, session) {
|
|
13
|
+
const dir = sessionsDir(dataDir);
|
|
14
|
+
fs.default.mkdirSync(dir, { recursive: true });
|
|
15
|
+
const key = (session.owner ?? `pid-${process.pid}`).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
16
|
+
fs.default.writeFileSync(path.default.join(dir, `${key}.json`), JSON.stringify({
|
|
17
|
+
...session,
|
|
18
|
+
pid: process.pid
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
function clearPersistedSession(dataDir, owner) {
|
|
22
|
+
const dir = sessionsDir(dataDir);
|
|
23
|
+
if (!fs.default.existsSync(dir)) return;
|
|
24
|
+
if (owner !== void 0) {
|
|
25
|
+
const key = owner.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
26
|
+
const file = path.default.join(dir, `${key}.json`);
|
|
27
|
+
if (fs.default.existsSync(file)) fs.default.unlinkSync(file);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
for (const f of fs.default.readdirSync(dir).filter((n) => n.endsWith(".json"))) try {
|
|
32
|
+
fs.default.unlinkSync(path.default.join(dir, f));
|
|
33
|
+
} catch {}
|
|
34
|
+
} catch {}
|
|
35
|
+
}
|
|
36
|
+
function readAllSessions(dataDir) {
|
|
37
|
+
const dir = sessionsDir(dataDir);
|
|
38
|
+
if (!fs.default.existsSync(dir)) return [];
|
|
39
|
+
return fs.default.readdirSync(dir).filter((f) => f.endsWith(".json")).map((f) => {
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(fs.default.readFileSync(path.default.join(dir, f), "utf-8"));
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}).filter((s) => s !== null);
|
|
46
|
+
}
|
|
47
|
+
const sessionCommand = new commander.Command("session");
|
|
48
|
+
sessionCommand.command("open <slug>").option("--owner <owner>", "Set the owner of this session").action(async (slug, opts) => {
|
|
49
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
50
|
+
if (!require_session_store.customerExists(dataDir, slug)) {
|
|
51
|
+
console.error(require_session_store.error(`✗ Customer not found: ${slug}`));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const facts = await require_session_store.readMainFacts(dataDir, slug);
|
|
55
|
+
const owner = opts.owner ?? process.env["DXCRM_ACTOR"];
|
|
56
|
+
const session = {
|
|
57
|
+
customerSlug: slug,
|
|
58
|
+
customerName: facts.name,
|
|
59
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
60
|
+
...owner !== void 0 ? { owner } : {}
|
|
61
|
+
};
|
|
62
|
+
require_session_store.setSession(session);
|
|
63
|
+
persistSession(dataDir, session);
|
|
64
|
+
console.log(require_session_store.success(`✓ Session opened: ${facts.name}`));
|
|
65
|
+
});
|
|
66
|
+
sessionCommand.command("close").action(() => {
|
|
67
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
68
|
+
const s = require_session_store.getSession() ?? readAllSessions(dataDir)[0] ?? null;
|
|
69
|
+
require_session_store.clearSession();
|
|
70
|
+
clearPersistedSession(dataDir, s?.owner);
|
|
71
|
+
console.log(require_session_store.success("✓ Session closed."));
|
|
72
|
+
});
|
|
73
|
+
sessionCommand.command("status").action(() => {
|
|
74
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
75
|
+
const s = require_session_store.getSession() ?? readAllSessions(dataDir)[0] ?? null;
|
|
76
|
+
if (!s) console.log(require_session_store.info("No active session."));
|
|
77
|
+
else console.log(require_session_store.info(`Active: ${s.customerName} (${s.customerSlug}) since ${s.startedAt}`));
|
|
78
|
+
});
|
|
79
|
+
//#endregion
|
|
80
|
+
exports.readAllSessions = readAllSessions;
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=session-D0qFkBla.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-D0qFkBla.cjs","names":["Command","customerExists","error","readMainFacts","success","getSession","info"],"sources":["../src/commands/session.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { setSession, getSession, clearSession } from \"../core/session-store.js\";\nimport { readMainFacts, customerExists } from \"../fs/customer-dir.js\";\nimport { success, error, info } from \"../ui/colors.js\";\n\nfunction sessionsDir(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"sessions\");\n}\n\nexport function persistSession(\n dataDir: string,\n session: {\n customerSlug: string;\n customerName: string;\n startedAt: string;\n owner?: string;\n }\n): void {\n const dir = sessionsDir(dataDir);\n fs.mkdirSync(dir, { recursive: true });\n const key = (session.owner ?? `pid-${process.pid}`).replace(/[^a-zA-Z0-9_-]/g, \"_\");\n fs.writeFileSync(path.join(dir, `${key}.json`), JSON.stringify({ ...session, pid: process.pid }));\n}\n\nexport function clearPersistedSession(dataDir: string, owner?: string): void {\n const dir = sessionsDir(dataDir);\n if (!fs.existsSync(dir)) return;\n if (owner !== undefined) {\n const key = owner.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const file = path.join(dir, `${key}.json`);\n if (fs.existsSync(file)) fs.unlinkSync(file);\n return;\n }\n // No specific owner — clear all session files\n try {\n for (const f of fs.readdirSync(dir).filter((n) => n.endsWith(\".json\"))) {\n try {\n fs.unlinkSync(path.join(dir, f));\n } catch {\n /* ignore */\n }\n }\n } catch {\n /* ignore */\n }\n}\n\nexport function readAllSessions(\n dataDir: string\n): Array<{ customerSlug: string; customerName: string; startedAt: string; owner?: string }> {\n const dir = sessionsDir(dataDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n return JSON.parse(fs.readFileSync(path.join(dir, f), \"utf-8\")) as {\n customerSlug: string;\n customerName: string;\n startedAt: string;\n owner?: string;\n };\n } catch {\n return null;\n }\n })\n .filter((s): s is NonNullable<typeof s> => s !== null);\n}\n\nexport const sessionCommand = new Command(\"session\");\n\nsessionCommand\n .command(\"open <slug>\")\n .option(\"--owner <owner>\", \"Set the owner of this session\")\n .action(async (slug: string, opts: { owner?: string }) => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n if (!customerExists(dataDir, slug)) {\n console.error(error(`✗ Customer not found: ${slug}`));\n process.exit(1);\n }\n const facts = await readMainFacts(dataDir, slug);\n const owner = opts.owner ?? process.env[\"DXCRM_ACTOR\"];\n const session = {\n customerSlug: slug,\n customerName: facts.name,\n startedAt: new Date().toISOString(),\n ...(owner !== undefined ? { owner } : {}),\n };\n setSession(session);\n persistSession(dataDir, session);\n console.log(success(`✓ Session opened: ${facts.name}`));\n });\n\nsessionCommand.command(\"close\").action(() => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;\n clearSession();\n clearPersistedSession(dataDir, s?.owner);\n console.log(success(\"✓ Session closed.\"));\n});\n\nsessionCommand.command(\"status\").action(() => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;\n if (!s) {\n console.log(info(\"No active session.\"));\n } else {\n console.log(info(`Active: ${s.customerName} (${s.customerSlug}) since ${s.startedAt}`));\n }\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { C as readMainFacts, _ as info, b as customerExists, g as error, n as getSession, r as setSession, t as clearSession, v as success } from "./session-store-C8tEvMPw.js";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
//#region src/commands/session.ts
|
|
6
|
+
function sessionsDir(dataDir) {
|
|
7
|
+
return path.join(dataDir, ".agentic", "sessions");
|
|
8
|
+
}
|
|
9
|
+
function persistSession(dataDir, session) {
|
|
10
|
+
const dir = sessionsDir(dataDir);
|
|
11
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
12
|
+
const key = (session.owner ?? `pid-${process.pid}`).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
13
|
+
fs.writeFileSync(path.join(dir, `${key}.json`), JSON.stringify({
|
|
14
|
+
...session,
|
|
15
|
+
pid: process.pid
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
function clearPersistedSession(dataDir, owner) {
|
|
19
|
+
const dir = sessionsDir(dataDir);
|
|
20
|
+
if (!fs.existsSync(dir)) return;
|
|
21
|
+
if (owner !== void 0) {
|
|
22
|
+
const key = owner.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
23
|
+
const file = path.join(dir, `${key}.json`);
|
|
24
|
+
if (fs.existsSync(file)) fs.unlinkSync(file);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
for (const f of fs.readdirSync(dir).filter((n) => n.endsWith(".json"))) try {
|
|
29
|
+
fs.unlinkSync(path.join(dir, f));
|
|
30
|
+
} catch {}
|
|
31
|
+
} catch {}
|
|
32
|
+
}
|
|
33
|
+
function readAllSessions(dataDir) {
|
|
34
|
+
const dir = sessionsDir(dataDir);
|
|
35
|
+
if (!fs.existsSync(dir)) return [];
|
|
36
|
+
return fs.readdirSync(dir).filter((f) => f.endsWith(".json")).map((f) => {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(fs.readFileSync(path.join(dir, f), "utf-8"));
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}).filter((s) => s !== null);
|
|
43
|
+
}
|
|
44
|
+
const sessionCommand = new Command("session");
|
|
45
|
+
sessionCommand.command("open <slug>").option("--owner <owner>", "Set the owner of this session").action(async (slug, opts) => {
|
|
46
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
47
|
+
if (!customerExists(dataDir, slug)) {
|
|
48
|
+
console.error(error(`✗ Customer not found: ${slug}`));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const facts = await readMainFacts(dataDir, slug);
|
|
52
|
+
const owner = opts.owner ?? process.env["DXCRM_ACTOR"];
|
|
53
|
+
const session = {
|
|
54
|
+
customerSlug: slug,
|
|
55
|
+
customerName: facts.name,
|
|
56
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
57
|
+
...owner !== void 0 ? { owner } : {}
|
|
58
|
+
};
|
|
59
|
+
setSession(session);
|
|
60
|
+
persistSession(dataDir, session);
|
|
61
|
+
console.log(success(`✓ Session opened: ${facts.name}`));
|
|
62
|
+
});
|
|
63
|
+
sessionCommand.command("close").action(() => {
|
|
64
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
65
|
+
const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;
|
|
66
|
+
clearSession();
|
|
67
|
+
clearPersistedSession(dataDir, s?.owner);
|
|
68
|
+
console.log(success("✓ Session closed."));
|
|
69
|
+
});
|
|
70
|
+
sessionCommand.command("status").action(() => {
|
|
71
|
+
const dataDir = process.env["DXCRM_DATA_DIR"] ?? process.cwd();
|
|
72
|
+
const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;
|
|
73
|
+
if (!s) console.log(info("No active session."));
|
|
74
|
+
else console.log(info(`Active: ${s.customerName} (${s.customerSlug}) since ${s.startedAt}`));
|
|
75
|
+
});
|
|
76
|
+
//#endregion
|
|
77
|
+
export { readAllSessions };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=session-D9ub6Wl1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-D9ub6Wl1.js","names":[],"sources":["../src/commands/session.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { setSession, getSession, clearSession } from \"../core/session-store.js\";\nimport { readMainFacts, customerExists } from \"../fs/customer-dir.js\";\nimport { success, error, info } from \"../ui/colors.js\";\n\nfunction sessionsDir(dataDir: string): string {\n return path.join(dataDir, \".agentic\", \"sessions\");\n}\n\nexport function persistSession(\n dataDir: string,\n session: {\n customerSlug: string;\n customerName: string;\n startedAt: string;\n owner?: string;\n }\n): void {\n const dir = sessionsDir(dataDir);\n fs.mkdirSync(dir, { recursive: true });\n const key = (session.owner ?? `pid-${process.pid}`).replace(/[^a-zA-Z0-9_-]/g, \"_\");\n fs.writeFileSync(path.join(dir, `${key}.json`), JSON.stringify({ ...session, pid: process.pid }));\n}\n\nexport function clearPersistedSession(dataDir: string, owner?: string): void {\n const dir = sessionsDir(dataDir);\n if (!fs.existsSync(dir)) return;\n if (owner !== undefined) {\n const key = owner.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n const file = path.join(dir, `${key}.json`);\n if (fs.existsSync(file)) fs.unlinkSync(file);\n return;\n }\n // No specific owner — clear all session files\n try {\n for (const f of fs.readdirSync(dir).filter((n) => n.endsWith(\".json\"))) {\n try {\n fs.unlinkSync(path.join(dir, f));\n } catch {\n /* ignore */\n }\n }\n } catch {\n /* ignore */\n }\n}\n\nexport function readAllSessions(\n dataDir: string\n): Array<{ customerSlug: string; customerName: string; startedAt: string; owner?: string }> {\n const dir = sessionsDir(dataDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n return JSON.parse(fs.readFileSync(path.join(dir, f), \"utf-8\")) as {\n customerSlug: string;\n customerName: string;\n startedAt: string;\n owner?: string;\n };\n } catch {\n return null;\n }\n })\n .filter((s): s is NonNullable<typeof s> => s !== null);\n}\n\nexport const sessionCommand = new Command(\"session\");\n\nsessionCommand\n .command(\"open <slug>\")\n .option(\"--owner <owner>\", \"Set the owner of this session\")\n .action(async (slug: string, opts: { owner?: string }) => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n if (!customerExists(dataDir, slug)) {\n console.error(error(`✗ Customer not found: ${slug}`));\n process.exit(1);\n }\n const facts = await readMainFacts(dataDir, slug);\n const owner = opts.owner ?? process.env[\"DXCRM_ACTOR\"];\n const session = {\n customerSlug: slug,\n customerName: facts.name,\n startedAt: new Date().toISOString(),\n ...(owner !== undefined ? { owner } : {}),\n };\n setSession(session);\n persistSession(dataDir, session);\n console.log(success(`✓ Session opened: ${facts.name}`));\n });\n\nsessionCommand.command(\"close\").action(() => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;\n clearSession();\n clearPersistedSession(dataDir, s?.owner);\n console.log(success(\"✓ Session closed.\"));\n});\n\nsessionCommand.command(\"status\").action(() => {\n const dataDir = process.env[\"DXCRM_DATA_DIR\"] ?? process.cwd();\n const s = getSession() ?? readAllSessions(dataDir)[0] ?? null;\n if (!s) {\n console.log(info(\"No active session.\"));\n } else {\n console.log(info(`Active: ${s.customerName} (${s.customerSlug}) since ${s.startedAt}`));\n }\n});\n"],"mappings":"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"}
|