jpdcl 1.0.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 (103) hide show
  1. package/.env.example +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +219 -0
  4. package/dist/catalog.d.ts +141 -0
  5. package/dist/catalog.js +261 -0
  6. package/dist/catalog.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +395 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +6 -0
  11. package/dist/config.js +13 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/credentials.d.ts +13 -0
  14. package/dist/credentials.js +100 -0
  15. package/dist/credentials.js.map +1 -0
  16. package/dist/crypto.d.ts +3 -0
  17. package/dist/crypto.js +21 -0
  18. package/dist/crypto.js.map +1 -0
  19. package/dist/dates.d.ts +5 -0
  20. package/dist/dates.js +20 -0
  21. package/dist/dates.js.map +1 -0
  22. package/dist/errors.d.ts +11 -0
  23. package/dist/errors.js +23 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/http-handler.d.ts +1 -0
  26. package/dist/http-handler.js +46 -0
  27. package/dist/http-handler.js.map +1 -0
  28. package/dist/http.d.ts +9 -0
  29. package/dist/http.js +43 -0
  30. package/dist/http.js.map +1 -0
  31. package/dist/index.d.ts +13 -0
  32. package/dist/index.js +14 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/launcher.d.ts +2 -0
  35. package/dist/launcher.js +11 -0
  36. package/dist/launcher.js.map +1 -0
  37. package/dist/ledger-client.d.ts +112 -0
  38. package/dist/ledger-client.js +221 -0
  39. package/dist/ledger-client.js.map +1 -0
  40. package/dist/main-client.d.ts +25 -0
  41. package/dist/main-client.js +221 -0
  42. package/dist/main-client.js.map +1 -0
  43. package/dist/mcp-stdio.d.ts +2 -0
  44. package/dist/mcp-stdio.js +6 -0
  45. package/dist/mcp-stdio.js.map +1 -0
  46. package/dist/mcp.d.ts +8 -0
  47. package/dist/mcp.js +517 -0
  48. package/dist/mcp.js.map +1 -0
  49. package/dist/runtime.d.ts +27 -0
  50. package/dist/runtime.js +316 -0
  51. package/dist/runtime.js.map +1 -0
  52. package/dist/server.d.ts +4 -0
  53. package/dist/server.js +221 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/session.d.ts +4 -0
  56. package/dist/session.js +30 -0
  57. package/dist/session.js.map +1 -0
  58. package/dist/smart-client.d.ts +50 -0
  59. package/dist/smart-client.js +238 -0
  60. package/dist/smart-client.js.map +1 -0
  61. package/dist/tariff.d.ts +121 -0
  62. package/dist/tariff.js +124 -0
  63. package/dist/tariff.js.map +1 -0
  64. package/dist/types.d.ts +51 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/worker.d.ts +5 -0
  68. package/dist/worker.js +3 -0
  69. package/dist/worker.js.map +1 -0
  70. package/openapi.yaml +284 -0
  71. package/package.json +89 -0
  72. package/scripts/audit-http.ts +36 -0
  73. package/scripts/audit-launcher.mjs +28 -0
  74. package/scripts/audit-ledger-portal.ts +23 -0
  75. package/scripts/audit-mcp.mjs +140 -0
  76. package/scripts/audit-smart-portal.mjs +63 -0
  77. package/scripts/build.mjs +19 -0
  78. package/scripts/publish-smithery.mjs +47 -0
  79. package/src/catalog.ts +291 -0
  80. package/src/cli.ts +397 -0
  81. package/src/config.ts +15 -0
  82. package/src/credentials.ts +114 -0
  83. package/src/crypto.ts +21 -0
  84. package/src/dates.ts +19 -0
  85. package/src/errors.ts +26 -0
  86. package/src/http-handler.ts +48 -0
  87. package/src/http.ts +49 -0
  88. package/src/index.ts +13 -0
  89. package/src/launcher.ts +9 -0
  90. package/src/ledger-client.ts +258 -0
  91. package/src/main-client.ts +230 -0
  92. package/src/mcp-stdio.ts +6 -0
  93. package/src/mcp.ts +546 -0
  94. package/src/runtime.ts +329 -0
  95. package/src/server.ts +218 -0
  96. package/src/session.ts +29 -0
  97. package/src/smart-client.ts +249 -0
  98. package/src/tariff.ts +148 -0
  99. package/src/toolkit.test.ts +136 -0
  100. package/src/types.ts +51 -0
  101. package/src/worker.ts +3 -0
  102. package/tsconfig.build.json +11 -0
  103. package/tsconfig.json +16 -0
package/dist/cli.js ADDED
@@ -0,0 +1,395 @@
1
+ #!/usr/bin/env node
2
+ import { input, password as passwordPrompt } from "@inquirer/prompts";
3
+ import { Command } from "commander";
4
+ import fs from "node:fs/promises";
5
+ import { endpointCatalog, isEndpointName, listEndpoints } from "./catalog.js";
6
+ import { assertDateRange } from "./dates.js";
7
+ import { credentialStatus, deleteEnvCredentials, storeEnvCredentials } from "./credentials.js";
8
+ import { JpdclError } from "./errors.js";
9
+ import { clearSession } from "./session.js";
10
+ import { JPDCL_TARIFF_ORDER_2025_26 } from "./tariff.js";
11
+ import { JpdclRuntime } from "./runtime.js";
12
+ const program = new Command();
13
+ program
14
+ .name("jpdcl")
15
+ .description("API-only CLI for Jammu Power Distribution Corporation Limited (JPDCL) consumer and smart-meter services")
16
+ .version("1.0.0")
17
+ .option("--compact", "print compact JSON");
18
+ const print = (value) => {
19
+ const compact = program.opts().compact;
20
+ process.stdout.write(`${JSON.stringify(value, null, compact ? 0 : 2)}\n`);
21
+ };
22
+ const auth = program.command("auth").description("Manage API authentication");
23
+ auth
24
+ .command("login")
25
+ .description("Log in and save a session; optionally save credentials to the private project .env")
26
+ .option("--login-id <id>", "mobile number or email")
27
+ .option("--save-env", "store credentials in .env for automatic MCP/CLI re-login")
28
+ .action(async (options) => {
29
+ const loginId = options.loginId ?? process.env.JPDCL_LOGIN_ID ?? await input({ message: "JPDCL mobile/email:" });
30
+ const secret = process.env.JPDCL_PASSWORD ?? await passwordPrompt({ message: "JPDCL password:", mask: "*" });
31
+ const runtime = await JpdclRuntime.create();
32
+ const result = await runtime.login(loginId, secret);
33
+ const envFile = options.saveEnv ? await storeEnvCredentials(loginId, secret) : undefined;
34
+ print({
35
+ status: result.status,
36
+ message: result.message ?? "Login successful",
37
+ sessionSaved: true,
38
+ automaticRelogin: Boolean(options.saveEnv || (process.env.JPDCL_LOGIN_ID && process.env.JPDCL_PASSWORD)),
39
+ credentialStorage: options.saveEnv ? "private .env" : "not stored",
40
+ envFile,
41
+ });
42
+ });
43
+ auth.command("status").action(async () => {
44
+ const runtime = await JpdclRuntime.create();
45
+ const session = runtime.main.currentSession;
46
+ const automatic = await credentialStatus();
47
+ print(session ? {
48
+ authenticated: true,
49
+ loginId: session.loginId,
50
+ primaryAccountId: session.primaryAccountId,
51
+ smartAuthenticated: Boolean(session.smart?.token),
52
+ smartExpiresAt: session.smart?.expiresAt,
53
+ automaticRelogin: automatic.automaticRelogin,
54
+ credentialSource: automatic.source,
55
+ credentialFile: automatic.envFile,
56
+ updatedAt: session.updatedAt,
57
+ } : { authenticated: false });
58
+ });
59
+ auth.command("logout").option("--forget", "also remove JPDCL credentials from .env").action(async (options) => {
60
+ const runtime = await JpdclRuntime.create();
61
+ const credentialsRemoved = options.forget ? await deleteEnvCredentials() : false;
62
+ await clearSession();
63
+ print({ authenticated: false, sessionRemoved: true, credentialsRemoved, automaticReloginMayRemain: !options.forget });
64
+ });
65
+ auth.command("forget-credentials").description("Remove JPDCL credentials from the private project .env")
66
+ .action(async () => {
67
+ print({ removed: await deleteEnvCredentials(), sessionKept: true });
68
+ });
69
+ program
70
+ .command("catalog")
71
+ .description("List every mapped JPDCL and smart-meter endpoint")
72
+ .option("--portal <portal>", "main, smart, or ledger")
73
+ .action((options) => {
74
+ if (options.portal && !["main", "smart", "ledger"].includes(options.portal)) {
75
+ throw new JpdclError("--portal must be main, smart, or ledger", 400);
76
+ }
77
+ print(listEndpoints(options.portal));
78
+ });
79
+ const account = program.command("account").description("Consumer account information");
80
+ account.command("info").option("--account <id>").action(async ({ account }) => {
81
+ const runtime = await readyRuntime();
82
+ print(await runtime.main.customerInfo(account));
83
+ await runtime.persist();
84
+ });
85
+ account.command("digest").option("--account <id>").action(async ({ account }) => {
86
+ const runtime = await readyRuntime();
87
+ print(await runtime.main.digest(account));
88
+ await runtime.persist();
89
+ });
90
+ account.command("linked").action(async () => {
91
+ const runtime = await readyRuntime();
92
+ print(await runtime.main.linkedAccounts());
93
+ });
94
+ program.command("snapshot").description("Best AI-ready factual snapshot across JPDCL and smart-meter APIs")
95
+ .option("--account <id>")
96
+ .action(async (o) => {
97
+ const runtime = await readyRuntime();
98
+ print(await runtime.aiSnapshot(o.account));
99
+ });
100
+ const tariff = program.command("tariff").description("Official JPDCL tariff rates and deterministic charge estimates");
101
+ tariff.command("rates").description("Show the encoded FY 2025-26 domestic tariff and source pages")
102
+ .action(() => print(JPDCL_TARIFF_ORDER_2025_26));
103
+ tariff.command("estimate").description("Calculate domestic charges; current smart-meter month and account load are automatic by default")
104
+ .option("--account <id>")
105
+ .option("--units <kwh>", "override automatically selected current-period meter consumption")
106
+ .option("--load <kw>", "override portal sanctioned load")
107
+ .option("--prepaid", "apply the official 2% prepaid energy rebate")
108
+ .option("--solar-water-heater", "apply the Rs.150 verified solar-water-heater rebate")
109
+ .option("--electricity-duty <amount>", "explicit duty amount; never guessed")
110
+ .option("--other-charges <amount>", "explicit adjustments or other charges")
111
+ .option("--unpaid-principal <amount>", "principal subject to late-payment surcharge")
112
+ .option("--late-months <months>", "months late at 1.5% per month")
113
+ .action(async (o) => {
114
+ const runtime = await readyRuntime();
115
+ const overrides = {};
116
+ if (o.units !== undefined)
117
+ overrides.unitsKwh = cliNumber("units", o.units);
118
+ if (o.load !== undefined)
119
+ overrides.sanctionedLoadKw = cliNumber("load", o.load);
120
+ if (o.prepaid)
121
+ overrides.prepaid = true;
122
+ if (o.solarWaterHeater)
123
+ overrides.solarWaterHeaterEligible = true;
124
+ if (o.electricityDuty !== undefined)
125
+ overrides.electricityDutyAmount = cliNumber("electricity-duty", o.electricityDuty);
126
+ if (o.otherCharges !== undefined)
127
+ overrides.otherChargesAmount = cliNumber("other-charges", o.otherCharges);
128
+ if (o.unpaidPrincipal !== undefined)
129
+ overrides.unpaidPrincipalAmount = cliNumber("unpaid-principal", o.unpaidPrincipal);
130
+ if (o.lateMonths !== undefined)
131
+ overrides.lateMonths = cliNumber("late-months", o.lateMonths);
132
+ print(await runtime.tariffEstimate(o.account, overrides));
133
+ });
134
+ program.command("bills")
135
+ .option("--account <id>")
136
+ .option("--from <yyyy-mm-dd>")
137
+ .option("--to <yyyy-mm-dd>")
138
+ .action(async (o) => {
139
+ assertDateRange(o.from, o.to);
140
+ const runtime = await readyRuntime();
141
+ print(await runtime.main.history("BILL", o.account, o.from, o.to));
142
+ });
143
+ program.command("payments")
144
+ .option("--account <id>")
145
+ .option("--from <yyyy-mm-dd>")
146
+ .option("--to <yyyy-mm-dd>")
147
+ .action(async (o) => {
148
+ assertDateRange(o.from, o.to);
149
+ const runtime = await readyRuntime();
150
+ print(await runtime.main.history("PAYM", o.account, o.from, o.to));
151
+ });
152
+ program.command("consumption")
153
+ .option("--account <id>")
154
+ .option("--from <yyyy-mm-dd>")
155
+ .option("--to <yyyy-mm-dd>")
156
+ .action(async (o) => {
157
+ assertDateRange(o.from, o.to);
158
+ const runtime = await readyRuntime();
159
+ print(await runtime.main.consumption(o.account, o.from, o.to));
160
+ });
161
+ const smart = program.command("smart").description("Genus smart-meter records, readings, reports, and status evidence");
162
+ smart.command("connect")
163
+ .option("--account <id>")
164
+ .option("--meter <number>")
165
+ .action(async (o) => {
166
+ const runtime = await readyRuntime();
167
+ const client = await runtime.ensureSmart(o.account, o.meter);
168
+ print({ connected: Boolean(client.bearerToken), tokenSaved: true });
169
+ });
170
+ smart.command("session").description("Show smart-meter SSO account/session metadata").action(async () => {
171
+ const runtime = await readyRuntime();
172
+ print(await (await runtime.ensureSmart()).connections());
173
+ });
174
+ smart.command("dashboard").description("Measured/account smart-meter digest; predictions and tips are excluded by default")
175
+ .option("--account <id>")
176
+ .option("--include-derived", "include forecasts, estimates, insights, and smart tips")
177
+ .action(async (o) => {
178
+ const runtime = await readyRuntime();
179
+ print(await (await runtime.ensureSmart(o.account)).dashboard(o.account, { includeDerived: o.includeDerived }));
180
+ });
181
+ smart.command("meter").description("Meter technical profile and current reading")
182
+ .option("--account <id>").option("--meter <number>")
183
+ .action(async (o) => {
184
+ const runtime = await readyRuntime();
185
+ const client = await runtime.ensureSmart(o.account, o.meter);
186
+ const accountId = o.account ?? client.accountId;
187
+ const meterNumber = o.meter ?? client.meterNumber;
188
+ if (!accountId || !meterNumber)
189
+ throw new JpdclError("Account ID and meter number are required", 400);
190
+ const [details, reading] = await Promise.all([
191
+ client.request("smart_meter_details", { params: { meterNumber } }),
192
+ client.request("smart_current_meter_reading", { params: { accountId } }),
193
+ ]);
194
+ print({ details: details.data, currentReading: reading.data });
195
+ });
196
+ smart.command("health").description("Unified supply, connectivity evidence, on-demand readings, voltage, outages, daily ledger, and alarms")
197
+ .option("--account <id>").action(async (o) => {
198
+ const runtime = await readyRuntime();
199
+ print(await runtime.meterHealth(o.account));
200
+ });
201
+ smart.command("alerts").description("Live usage and daily/monthly alert thresholds")
202
+ .option("--account <id>").action(async (o) => {
203
+ const runtime = await readyRuntime();
204
+ const client = await runtime.ensureSmart(o.account);
205
+ if (!client.accountId || !client.meterNumber)
206
+ throw new JpdclError("Smart account is incomplete", 400);
207
+ print(await client.request("smart_my_alerts", { params: { accountId: client.accountId, meterNumber: client.meterNumber } }));
208
+ });
209
+ smart.command("billing").description("Postpaid bills/payments or prepaid balance/recharges, selected automatically")
210
+ .option("--account <id>").action(async (o) => {
211
+ const runtime = await readyRuntime();
212
+ const client = await runtime.ensureSmart(o.account);
213
+ if (!client.accountId || !client.meterNumber)
214
+ throw new JpdclError("Smart account is incomplete", 400);
215
+ const isPrepaid = String(client.claims.currentAccountIsMeterPrepaid).toLowerCase() === "true";
216
+ if (isPrepaid) {
217
+ const [balance, rechargeBalance, recharges, bills] = await Promise.all([
218
+ client.request("smart_prepaid_balance", { params: { meterNumber: client.meterNumber } }),
219
+ client.request("smart_prepaid_recharge_balance", { params: { accountId: client.accountId } }),
220
+ client.request("smart_prepaid_recharge_history", { params: { meterNumber: client.meterNumber } }),
221
+ client.request("smart_prepaid_bill_history", { params: { meterNumber: client.meterNumber } }),
222
+ ]);
223
+ print({ plan: "prepaid", balance: balance.data, rechargeBalance: rechargeBalance.data, recharges: recharges.data, bills: bills.data });
224
+ return;
225
+ }
226
+ const [lastBill, bills, payments] = await Promise.all([
227
+ client.request("smart_postpaid_last_bill", { params: { accountId: client.accountId } }),
228
+ client.request("smart_postpaid_bill_history", { params: { accountId: client.accountId } }),
229
+ client.request("smart_postpaid_payment_history", { params: { accountId: client.accountId } }),
230
+ ]);
231
+ print({ plan: "postpaid", lastBill: lastBill.data, bills: bills.data, payments: payments.data });
232
+ });
233
+ smart.command("preferences").description("Every notification category and delivery-channel preference")
234
+ .option("--account <id>").action(async (o) => {
235
+ const runtime = await readyRuntime();
236
+ const client = await runtime.ensureSmart(o.account);
237
+ const isPrepaid = String(client.claims.currentAccountIsMeterPrepaid).toLowerCase() === "true";
238
+ print(await client.request("smart_preferences", { params: { isPrepaid } }));
239
+ });
240
+ smart.command("notifications").description("Notifications and unread count")
241
+ .option("--account <id>").action(async (o) => {
242
+ const runtime = await readyRuntime();
243
+ const client = await runtime.ensureSmart(o.account);
244
+ const userId = typeof client.claims.sub === "string" ? client.claims.sub : undefined;
245
+ if (!userId)
246
+ throw new JpdclError("Smart user ID is unavailable", 400);
247
+ const [items, unread] = await Promise.all([
248
+ client.request("smart_notifications", { params: { userId } }).catch(() => ({ status: true, data: [] })),
249
+ client.request("smart_notification_unread_count", { params: { userId } }).catch(() => ({ status: true, data: { unreadCount: 0 } })),
250
+ ]);
251
+ print({ items: items.data, unread: unread.data });
252
+ });
253
+ smart.command("support").description("FAQs, contact details, categories, and complaint history")
254
+ .option("--account <id>").option("--page <number>", "page number", "1").option("--page-size <number>", "records per page", "20")
255
+ .action(async (o) => {
256
+ const runtime = await readyRuntime();
257
+ const client = await runtime.ensureSmart(o.account);
258
+ const userId = typeof client.claims.sub === "string" ? client.claims.sub : undefined;
259
+ if (!userId)
260
+ throw new JpdclError("Smart user ID is unavailable", 400);
261
+ const [faqs, contact, categories, complaints] = await Promise.all([
262
+ client.request("smart_faqs"), client.request("smart_contact_support").catch(() => ({ status: true, data: null })), client.request("smart_complaint_categories"),
263
+ client.request("smart_complaints", { params: { userId, pageNumber: Number(o.page), pageSize: Number(o.pageSize) } }),
264
+ ]);
265
+ print({ faqs: faqs.data, contact: contact.data, categories: categories.data, complaints: complaints.data });
266
+ });
267
+ smart.command("consumption")
268
+ .option("--account <id>")
269
+ .option("--type <type>", "daily, weekly, or monthly", "monthly")
270
+ .option("--value <number>", "number of periods", "12")
271
+ .action(async (o) => {
272
+ const runtime = await readyRuntime();
273
+ print(await (await runtime.ensureSmart(o.account)).consumption(o.account, o.type, Number(o.value)));
274
+ });
275
+ smart.command("intervals")
276
+ .option("--account <id>")
277
+ .requiredOption("--from <yyyy-mm-dd>")
278
+ .requiredOption("--to <yyyy-mm-dd>")
279
+ .option("--sort <order>", "date or another portal-supported order", "date")
280
+ .action(async (o) => {
281
+ assertDateRange(o.from, o.to, { requireBoth: true });
282
+ const runtime = await readyRuntime();
283
+ print(await (await runtime.ensureSmart(o.account)).intervalConsumption(o.account, o.from, o.to, o.sort));
284
+ });
285
+ smart.command("report")
286
+ .option("--account <id>")
287
+ .requiredOption("--type <type>", "monthly-tod, daily-tod, power-events, peak-slots, peak-monthly, voltage, or demand")
288
+ .option("--from <yyyy-mm-dd>")
289
+ .option("--to <yyyy-mm-dd>")
290
+ .option("--start <number>", "first record", "1")
291
+ .option("--end <number>", "last record")
292
+ .option("--filter <value>", "advanced: pre-encoded portal report filter")
293
+ .option("--format <format>", "xlsx or pdf")
294
+ .action(async (o) => {
295
+ assertDateRange(o.from, o.to, { pairedWhenPresent: true });
296
+ const names = {
297
+ "monthly-tod": "MonthlyTOD",
298
+ "daily-tod": "DayWiseTOD",
299
+ "power-events": "PowerOnOff",
300
+ "peak-slots": "PeakSlotConsumption",
301
+ "peak-monthly": "PeakSlotConsumptionMonthly",
302
+ voltage: "ConsumerVoltageDataProfile",
303
+ demand: "SanctionLoadVSMaxDemand",
304
+ };
305
+ const name = names[o.type];
306
+ if (!name)
307
+ throw new JpdclError("Unknown report type", 400);
308
+ const runtime = await readyRuntime();
309
+ print(await (await runtime.ensureSmart(o.account)).report(name, o.account, {
310
+ from: o.from,
311
+ to: o.to,
312
+ start: Number(o.start),
313
+ end: o.end ? Number(o.end) : undefined,
314
+ filter: o.filter,
315
+ format: o.format,
316
+ }));
317
+ });
318
+ const ledger = program.command("ledger").description("Public JPDCL daily smart-meter import/export register ledger");
319
+ ledger.command("readings")
320
+ .option("--account <id>")
321
+ .option("--from <yyyy-mm-dd>")
322
+ .option("--to <yyyy-mm-dd>")
323
+ .option("--limit <count>", "maximum daily rows returned", "35")
324
+ .action(async (o) => {
325
+ assertDateRange(o.from, o.to);
326
+ const runtime = await readyRuntime();
327
+ print(await runtime.energyLedger(o.account, { from: o.from, to: o.to, limit: cliNumber("limit", o.limit) }));
328
+ });
329
+ ledger.command("summary")
330
+ .option("--account <id>")
331
+ .option("--month <yyyy-mm>", "defaults to the latest available ledger month")
332
+ .action(async (o) => {
333
+ if (o.month && !/^\d{4}-\d{2}$/.test(o.month))
334
+ throw new JpdclError("--month must be YYYY-MM", 400);
335
+ const runtime = await readyRuntime();
336
+ const from = o.month ? `${o.month}-01` : undefined;
337
+ const to = o.month ? `${o.month}-31` : undefined;
338
+ const result = await runtime.energyLedger(o.account, { from, to, limit: 0 });
339
+ print(result);
340
+ });
341
+ program.command("request")
342
+ .description("Call any catalog endpoint directly")
343
+ .argument("<endpoint>")
344
+ .option("--params <json>", "URL parameter JSON", "{}")
345
+ .option("--body <json>", "request body/filter JSON", "{}")
346
+ .option("--output <file>", "write base64 binary data to a file")
347
+ .option("--confirm", "confirm this exact account-changing endpoint")
348
+ .action(async (name, options) => {
349
+ if (!isEndpointName(name))
350
+ throw new JpdclError(`Unknown endpoint: ${name}`, 400);
351
+ const runtime = await readyRuntime();
352
+ const request = { params: JSON.parse(options.params), body: JSON.parse(options.body) };
353
+ const definition = endpointCatalog[name];
354
+ if (definition.mutation && !options.confirm) {
355
+ throw new JpdclError("Mutating endpoints require --confirm and JPDCL_ENABLE_MUTATIONS=true", 400);
356
+ }
357
+ const result = definition.portal === "main"
358
+ ? await runtime.main.request(name, request)
359
+ : definition.portal === "smart"
360
+ ? await (await runtime.ensureSmart()).request(name, request)
361
+ : await runtime.ledger.request(name, request);
362
+ if (options.output) {
363
+ const data = result.data;
364
+ const base64 = typeof data === "string" ? data : data?.base64;
365
+ if (!base64)
366
+ throw new JpdclError("The response did not contain base64 file data", 422);
367
+ await fs.writeFile(options.output, Buffer.from(base64, "base64"));
368
+ print({ saved: options.output });
369
+ }
370
+ else
371
+ print(result);
372
+ await runtime.persist();
373
+ });
374
+ function cliNumber(name, value) {
375
+ const parsed = Number(value);
376
+ if (!Number.isFinite(parsed) || parsed < 0)
377
+ throw new JpdclError(`--${name} must be a non-negative number`, 400);
378
+ return parsed;
379
+ }
380
+ async function readyRuntime() {
381
+ const runtime = await JpdclRuntime.create();
382
+ await runtime.ensureLogin();
383
+ return runtime;
384
+ }
385
+ program.parseAsync().catch((error) => {
386
+ const known = error instanceof JpdclError;
387
+ process.stderr.write(`${JSON.stringify({
388
+ error: known ? error.name : "Error",
389
+ message: error instanceof Error ? error.message : String(error),
390
+ status: known ? error.status : 500,
391
+ details: known ? error.details : undefined,
392
+ }, null, 2)}\n`);
393
+ process.exitCode = 1;
394
+ });
395
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const MAIN_API_URL = "https://mob.jpdcl.co.in/WSSJPDCL/JWTAUTHENC/API";
2
+ export declare const SMART_API_URL = "https://cp.rdssjpdcl.com/api";
3
+ export declare const PORTAL_BASIC = "portal:portal123";
4
+ export declare const LOGIN_CREDENTIAL_HEADER = "mhgj70aizasybty01ob6mfvqoh0fj6rwvjluukcw8mjr04pkjh";
5
+ export declare const defaultSessionFile: string;
6
+ export declare function mutationsEnabled(): boolean;
package/dist/config.js ADDED
@@ -0,0 +1,13 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export const MAIN_API_URL = "https://mob.jpdcl.co.in/WSSJPDCL/JWTAUTHENC/API";
4
+ export const SMART_API_URL = "https://cp.rdssjpdcl.com/api";
5
+ export const PORTAL_BASIC = "portal:portal123";
6
+ export const LOGIN_CREDENTIAL_HEADER = "mhgj70aizasybty01ob6mfvqoh0fj6rwvjluukcw8mjr04pkjh";
7
+ export const defaultSessionFile = process.env.JPDCL_SESSION_FILE
8
+ ? path.resolve(process.env.JPDCL_SESSION_FILE)
9
+ : path.join(os.homedir(), ".jpdcl", "session.json");
10
+ export function mutationsEnabled() {
11
+ return process.env.JPDCL_ENABLE_MUTATIONS?.toLowerCase() === "true";
12
+ }
13
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAC9E,MAAM,CAAC,MAAM,aAAa,GAAG,8BAA8B,CAAC;AAC5D,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,uBAAuB,GAAG,oDAAoD,CAAC;AAE5F,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;IAC9D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAEtD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC;AACtE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface Credentials {
2
+ loginId: string;
3
+ password: string;
4
+ source: "environment" | "dotenv";
5
+ }
6
+ export declare function resolveCredentials(): Promise<Credentials | undefined>;
7
+ export declare function storeEnvCredentials(loginId: string, password: string, targetFile?: string): Promise<string>;
8
+ export declare function deleteEnvCredentials(targetFile?: string): Promise<boolean>;
9
+ export declare function credentialStatus(): Promise<{
10
+ automaticRelogin: boolean;
11
+ source?: Credentials["source"];
12
+ envFile?: string;
13
+ }>;
@@ -0,0 +1,100 @@
1
+ import { config as loadDotEnv } from "dotenv";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ let loadedEnv;
5
+ let credentialsExistedBeforeDotEnv = false;
6
+ let dotenvLoaded = false;
7
+ function configuredEnvFile() {
8
+ return process.env.JPDCL_ENV_FILE
9
+ ? path.resolve(process.env.JPDCL_ENV_FILE)
10
+ : path.resolve(process.cwd(), ".env");
11
+ }
12
+ function ensureDotEnvLoaded() {
13
+ if (dotenvLoaded)
14
+ return;
15
+ credentialsExistedBeforeDotEnv = Boolean(process.env.JPDCL_LOGIN_ID && process.env.JPDCL_PASSWORD);
16
+ loadedEnv = loadDotEnv({ path: configuredEnvFile(), override: false, quiet: true }).parsed;
17
+ dotenvLoaded = true;
18
+ }
19
+ export async function resolveCredentials() {
20
+ ensureDotEnvLoaded();
21
+ const loginId = process.env.JPDCL_LOGIN_ID;
22
+ const password = process.env.JPDCL_PASSWORD;
23
+ if (!loginId || !password)
24
+ return undefined;
25
+ const loadedFromDotEnv = !credentialsExistedBeforeDotEnv
26
+ && loadedEnv?.JPDCL_LOGIN_ID === loginId
27
+ && loadedEnv?.JPDCL_PASSWORD === password;
28
+ return {
29
+ loginId,
30
+ password,
31
+ source: loadedFromDotEnv ? "dotenv" : "environment",
32
+ };
33
+ }
34
+ export async function storeEnvCredentials(loginId, password, targetFile = configuredEnvFile()) {
35
+ const absoluteTarget = path.resolve(targetFile);
36
+ await fs.mkdir(path.dirname(absoluteTarget), { recursive: true, mode: 0o700 });
37
+ let existing = "";
38
+ try {
39
+ existing = await fs.readFile(absoluteTarget, "utf8");
40
+ }
41
+ catch (error) {
42
+ if (error.code !== "ENOENT")
43
+ throw error;
44
+ }
45
+ const kept = existing
46
+ .split(/\r?\n/)
47
+ .filter((line) => !/^\s*(?:export\s+)?JPDCL_(?:LOGIN_ID|PASSWORD)\s*=/.test(line));
48
+ while (kept.length && !kept.at(-1)?.trim())
49
+ kept.pop();
50
+ const credentials = [
51
+ `JPDCL_LOGIN_ID=${JSON.stringify(loginId)}`,
52
+ `JPDCL_PASSWORD=${JSON.stringify(password)}`,
53
+ ];
54
+ const content = [...kept, ...(kept.length ? [""] : []), ...credentials, ""].join("\n");
55
+ await fs.writeFile(absoluteTarget, content, { mode: 0o600 });
56
+ await fs.chmod(absoluteTarget, 0o600);
57
+ process.env.JPDCL_LOGIN_ID = loginId;
58
+ process.env.JPDCL_PASSWORD = password;
59
+ loadedEnv = { ...loadedEnv, JPDCL_LOGIN_ID: loginId, JPDCL_PASSWORD: password };
60
+ credentialsExistedBeforeDotEnv = false;
61
+ dotenvLoaded = true;
62
+ return absoluteTarget;
63
+ }
64
+ export async function deleteEnvCredentials(targetFile = configuredEnvFile()) {
65
+ const absoluteTarget = path.resolve(targetFile);
66
+ let existing;
67
+ try {
68
+ existing = await fs.readFile(absoluteTarget, "utf8");
69
+ }
70
+ catch (error) {
71
+ if (error.code === "ENOENT")
72
+ return false;
73
+ throw error;
74
+ }
75
+ const lines = existing.split(/\r?\n/);
76
+ const filtered = lines.filter((line) => !/^\s*(?:export\s+)?JPDCL_(?:LOGIN_ID|PASSWORD)\s*=/.test(line));
77
+ const removed = filtered.length !== lines.length;
78
+ if (!removed)
79
+ return false;
80
+ const remaining = filtered.join("\n").replace(/^\s+|\s+$/g, "");
81
+ if (remaining) {
82
+ await fs.writeFile(absoluteTarget, `${remaining}\n`, { mode: 0o600 });
83
+ await fs.chmod(absoluteTarget, 0o600);
84
+ }
85
+ else {
86
+ await fs.unlink(absoluteTarget);
87
+ }
88
+ delete process.env.JPDCL_LOGIN_ID;
89
+ delete process.env.JPDCL_PASSWORD;
90
+ return true;
91
+ }
92
+ export async function credentialStatus() {
93
+ const credentials = await resolveCredentials();
94
+ return {
95
+ automaticRelogin: Boolean(credentials),
96
+ source: credentials?.source,
97
+ envFile: credentials?.source === "dotenv" ? configuredEnvFile() : undefined,
98
+ };
99
+ }
100
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const ENCRYPTED_FIELD = "khasgafsgauysuaysyuasyahghagsggadkdcnviw";
2
+ export declare function encryptPayload(payload: unknown): Record<string, string>;
3
+ export declare function decryptPayload<T = unknown>(payload: string): T;
package/dist/crypto.js ADDED
@@ -0,0 +1,21 @@
1
+ import CryptoJS from "crypto-js";
2
+ const PASSPHRASE = "wertyuioplkjhgfdsazxcvbnmkiujnhy";
3
+ export const ENCRYPTED_FIELD = "khasgafsgauysuaysyuasyahghagsggadkdcnviw";
4
+ export function encryptPayload(payload) {
5
+ const iv = CryptoJS.lib.WordArray.random(16);
6
+ const ciphertext = CryptoJS.AES.encrypt(JSON.stringify(payload), PASSPHRASE, { iv });
7
+ return { [ENCRYPTED_FIELD]: iv.toString(CryptoJS.enc.Base64) + ciphertext.toString() };
8
+ }
9
+ export function decryptPayload(payload) {
10
+ if (!payload || payload.length < 25) {
11
+ throw new Error("JPDCL returned an invalid encrypted response");
12
+ }
13
+ const iv = CryptoJS.enc.Base64.parse(payload.slice(0, 24));
14
+ const ciphertext = payload.slice(24);
15
+ const bytes = CryptoJS.AES.decrypt(ciphertext, PASSPHRASE, { iv });
16
+ const plaintext = bytes.toString(CryptoJS.enc.Utf8);
17
+ if (!plaintext)
18
+ throw new Error("Unable to decrypt the JPDCL response");
19
+ return JSON.parse(plaintext);
20
+ }
21
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,kCAAkC,CAAC;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,0CAA0C,CAAC;AAE1E,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrF,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;AACzF,CAAC;AACD,MAAM,UAAU,cAAc,CAAc,OAAe;IACzD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAM,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function isIsoDate(value: string): boolean;
2
+ export declare function assertDateRange(from?: string, to?: string, options?: {
3
+ requireBoth?: boolean;
4
+ pairedWhenPresent?: boolean;
5
+ }): void;