huntr-cli 1.0.9
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/.env.example +7 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +43 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
- package/.github/labels.json +92 -0
- package/.github/pull_request_template.md +64 -0
- package/.github/workflows/ci.yml +87 -0
- package/.github/workflows/labels.yml +27 -0
- package/.github/workflows/manual-publish.yml +105 -0
- package/.github/workflows/publish.yml +57 -0
- package/.github/workflows/release.yml +124 -0
- package/.github/workflows/security-audit.yml +44 -0
- package/.husky/pre-commit +12 -0
- package/.husky/pre-push +27 -0
- package/.lintstagedrc.json +3 -0
- package/AGENTS.md +449 -0
- package/CHANGELOG.md +38 -0
- package/CHANGES.md +259 -0
- package/LICENSE +15 -0
- package/PUBLISHING.md +191 -0
- package/README.md +385 -0
- package/ROADMAP.md +158 -0
- package/SETUP-COMPLETE.md +446 -0
- package/WORKFLOW-SUMMARY.md +368 -0
- package/completions/_huntr +168 -0
- package/completions/huntr.1 +266 -0
- package/completions/huntr.bash +91 -0
- package/dist/api/client.d.ts +14 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +74 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/personal/activities.d.ts +20 -0
- package/dist/api/personal/activities.d.ts.map +1 -0
- package/dist/api/personal/activities.js +50 -0
- package/dist/api/personal/activities.js.map +1 -0
- package/dist/api/personal/boards.d.ts +9 -0
- package/dist/api/personal/boards.d.ts.map +1 -0
- package/dist/api/personal/boards.js +16 -0
- package/dist/api/personal/boards.js.map +1 -0
- package/dist/api/personal/index.d.ts +17 -0
- package/dist/api/personal/index.d.ts.map +1 -0
- package/dist/api/personal/index.js +37 -0
- package/dist/api/personal/index.js.map +1 -0
- package/dist/api/personal/jobs.d.ts +13 -0
- package/dist/api/personal/jobs.d.ts.map +1 -0
- package/dist/api/personal/jobs.js +31 -0
- package/dist/api/personal/jobs.js.map +1 -0
- package/dist/api/personal/user.d.ts +8 -0
- package/dist/api/personal/user.d.ts.map +1 -0
- package/dist/api/personal/user.js +13 -0
- package/dist/api/personal/user.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +501 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/capture-session.d.ts +10 -0
- package/dist/commands/capture-session.d.ts.map +1 -0
- package/dist/commands/capture-session.js +478 -0
- package/dist/commands/capture-session.js.map +1 -0
- package/dist/config/clerk-session-manager.d.ts +44 -0
- package/dist/config/clerk-session-manager.d.ts.map +1 -0
- package/dist/config/clerk-session-manager.js +232 -0
- package/dist/config/clerk-session-manager.js.map +1 -0
- package/dist/config/config-manager.d.ts +15 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +51 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/keychain-manager.d.ts +6 -0
- package/dist/config/keychain-manager.d.ts.map +1 -0
- package/dist/config/keychain-manager.js +37 -0
- package/dist/config/keychain-manager.js.map +1 -0
- package/dist/config/token-capture.d.ts +11 -0
- package/dist/config/token-capture.d.ts.map +1 -0
- package/dist/config/token-capture.js +252 -0
- package/dist/config/token-capture.js.map +1 -0
- package/dist/config/token-manager.d.ts +38 -0
- package/dist/config/token-manager.d.ts.map +1 -0
- package/dist/config/token-manager.js +153 -0
- package/dist/config/token-manager.js.map +1 -0
- package/dist/lib/list-options.d.ts +69 -0
- package/dist/lib/list-options.d.ts.map +1 -0
- package/dist/lib/list-options.js +299 -0
- package/dist/lib/list-options.js.map +1 -0
- package/dist/types/personal.d.ts +113 -0
- package/dist/types/personal.d.ts.map +1 -0
- package/dist/types/personal.js +4 -0
- package/dist/types/personal.js.map +1 -0
- package/docs/AUTOMATIC-PUBLISHING.md +520 -0
- package/docs/CHANGELOG-AUTOMATION.md +418 -0
- package/docs/CI-CD-SETUP.md +582 -0
- package/docs/DEV-SETUP.md +512 -0
- package/docs/ENHANCEMENT-PLAN.md +204 -0
- package/docs/ENTITY-TYPES.md +462 -0
- package/docs/GITHUB-ACTIONS-GUIDE.md +367 -0
- package/docs/NPM-PUBLISHING.md +324 -0
- package/docs/OUTPUT-EXAMPLES.md +414 -0
- package/docs/OUTPUT-FORMATS.md +299 -0
- package/docs/TESTING.md +216 -0
- package/eslint.config.js +68 -0
- package/package.json +64 -0
- package/src/api/client.ts +88 -0
- package/src/api/personal/activities.ts +66 -0
- package/src/api/personal/boards.ts +14 -0
- package/src/api/personal/index.ts +25 -0
- package/src/api/personal/jobs.ts +33 -0
- package/src/api/personal/user.ts +10 -0
- package/src/cli.ts +487 -0
- package/src/commands/capture-session.ts +582 -0
- package/src/config/clerk-session-manager.ts +263 -0
- package/src/config/config-manager.ts +56 -0
- package/src/config/keychain-manager.ts +30 -0
- package/src/config/token-capture.ts +233 -0
- package/src/config/token-manager.ts +139 -0
- package/src/lib/list-options.ts +370 -0
- package/src/types/personal.ts +114 -0
- package/tests/example.test.ts +130 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersonalJobsApi = void 0;
|
|
4
|
+
class PersonalJobsApi {
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
// API returns { jobs: { [id]: PersonalJob } } — an object map, not an array
|
|
9
|
+
async listByBoard(boardId) {
|
|
10
|
+
return this.client.get(`/board/${boardId}/jobs`);
|
|
11
|
+
}
|
|
12
|
+
// Convenience: returns flat array
|
|
13
|
+
async listByBoardFlat(boardId) {
|
|
14
|
+
const response = await this.listByBoard(boardId);
|
|
15
|
+
return Object.values(response.jobs);
|
|
16
|
+
}
|
|
17
|
+
async get(boardId, jobId) {
|
|
18
|
+
return this.client.get(`/board/${boardId}/jobs/${jobId}`);
|
|
19
|
+
}
|
|
20
|
+
async create(boardId, job) {
|
|
21
|
+
return this.client.post(`/board/${boardId}/jobs`, job);
|
|
22
|
+
}
|
|
23
|
+
async update(boardId, jobId, updates) {
|
|
24
|
+
return this.client.put(`/board/${boardId}/jobs/${jobId}`, updates);
|
|
25
|
+
}
|
|
26
|
+
async delete(boardId, jobId) {
|
|
27
|
+
return this.client.delete(`/board/${boardId}/jobs/${jobId}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.PersonalJobsApi = PersonalJobsApi;
|
|
31
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/api/personal/jobs.ts"],"names":[],"mappings":";;;AAGA,MAAa,eAAe;IAC1B,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C,4EAA4E;IAC5E,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAuB,UAAU,OAAO,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,KAAa;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAc,UAAU,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,GAAyB;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAc,UAAU,OAAO,OAAO,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,KAAa,EAAE,OAA6B;QACxE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAc,UAAU,OAAO,SAAS,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,KAAa;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAO,UAAU,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;CACF;AA7BD,0CA6BC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HuntrApiClient } from '../client';
|
|
2
|
+
import { UserProfile } from '../../types/personal';
|
|
3
|
+
export declare class PersonalUserApi {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(client: HuntrApiClient);
|
|
6
|
+
getProfile(): Promise<UserProfile>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/api/personal/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;CAGzC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersonalUserApi = void 0;
|
|
4
|
+
class PersonalUserApi {
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
async getProfile() {
|
|
9
|
+
return this.client.get('/me');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.PersonalUserApi = PersonalUserApi;
|
|
13
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/api/personal/user.ts"],"names":[],"mappings":";;;AAGA,MAAa,eAAe;IAC1B,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAc,KAAK,CAAC,CAAC;IAC7C,CAAC;CACF;AAND,0CAMC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const personal_1 = require("./api/personal");
|
|
39
|
+
const token_manager_1 = require("./config/token-manager");
|
|
40
|
+
const clerk_session_manager_1 = require("./config/clerk-session-manager");
|
|
41
|
+
const capture_session_1 = require("./commands/capture-session");
|
|
42
|
+
const list_options_1 = require("./lib/list-options");
|
|
43
|
+
const program = new commander_1.Command();
|
|
44
|
+
const tokenManager = new token_manager_1.TokenManager();
|
|
45
|
+
async function getApi(token) {
|
|
46
|
+
const provider = await tokenManager.getTokenProvider({ token });
|
|
47
|
+
return new personal_1.HuntrPersonalApi(provider);
|
|
48
|
+
}
|
|
49
|
+
program
|
|
50
|
+
.name('huntr')
|
|
51
|
+
.description('CLI tool for Huntr')
|
|
52
|
+
.version('1.0.0')
|
|
53
|
+
.option('-t, --token <token>', 'API token (overrides all other sources)');
|
|
54
|
+
// ── me ───────────────────────────────────────────────────────────────────────
|
|
55
|
+
program
|
|
56
|
+
.command('me')
|
|
57
|
+
.description('Show your user profile')
|
|
58
|
+
.option('-j, --json', 'Output as JSON')
|
|
59
|
+
.action(async (options, command) => {
|
|
60
|
+
try {
|
|
61
|
+
const api = await getApi(command.parent?.opts().token);
|
|
62
|
+
const profile = await api.user.getProfile();
|
|
63
|
+
if (options.json) {
|
|
64
|
+
console.log(JSON.stringify(profile, null, 2));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(`Name: ${profile.givenName ?? profile.firstName ?? ''} ${profile.familyName ?? profile.lastName ?? ''}`);
|
|
68
|
+
console.log(`Email: ${profile.email}`);
|
|
69
|
+
console.log(`ID: ${profile.id}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// ── boards ───────────────────────────────────────────────────────────────────
|
|
78
|
+
const boards = program.command('boards').description('Manage your boards');
|
|
79
|
+
boards
|
|
80
|
+
.command('list')
|
|
81
|
+
.description('List all your boards')
|
|
82
|
+
.option('-f, --format <format>', 'Output format: table (default), json, csv, pdf, excel')
|
|
83
|
+
.option('-j, --json', 'Output as JSON (legacy, same as --format json)')
|
|
84
|
+
.option('--fields <fields>', 'Comma-separated list of fields to include')
|
|
85
|
+
.action(async (options, command) => {
|
|
86
|
+
try {
|
|
87
|
+
const AVAILABLE_FIELDS = ['ID', 'Name', 'Created'];
|
|
88
|
+
const listOpts = (0, list_options_1.parseListOptions)(options);
|
|
89
|
+
const fields = (0, list_options_1.validateFields)(AVAILABLE_FIELDS, listOpts.fields);
|
|
90
|
+
const api = await getApi(command.parent?.parent?.opts().token);
|
|
91
|
+
const response = await api.boards.list();
|
|
92
|
+
const boardsList = Array.isArray(response) ? response : response.data ?? [];
|
|
93
|
+
if (boardsList.length === 0) {
|
|
94
|
+
console.log('No boards found.');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const rows = boardsList.map((b) => ({
|
|
98
|
+
ID: b.id,
|
|
99
|
+
Name: b.name ?? 'N/A',
|
|
100
|
+
Created: new Date(b.createdAt).toLocaleDateString(),
|
|
101
|
+
}));
|
|
102
|
+
if (listOpts.format === 'json') {
|
|
103
|
+
console.log((0, list_options_1.formatJsonWithFields)(rows, fields));
|
|
104
|
+
}
|
|
105
|
+
else if (listOpts.format === 'csv') {
|
|
106
|
+
console.log((0, list_options_1.formatCsvWithFields)(rows, fields));
|
|
107
|
+
}
|
|
108
|
+
else if (listOpts.format === 'pdf') {
|
|
109
|
+
const buffer = (0, list_options_1.formatPdf)(rows, fields, 'Boards List');
|
|
110
|
+
process.stdout.write(buffer);
|
|
111
|
+
}
|
|
112
|
+
else if (listOpts.format === 'excel') {
|
|
113
|
+
const buffer = await (0, list_options_1.formatExcel)(rows, fields, 'Boards');
|
|
114
|
+
process.stdout.write(buffer);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.log((0, list_options_1.formatTableWithFields)(rows, fields));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
boards
|
|
126
|
+
.command('get')
|
|
127
|
+
.description('Get details of a specific board')
|
|
128
|
+
.argument('<board-id>', 'Board ID')
|
|
129
|
+
.option('-j, --json', 'Output as JSON')
|
|
130
|
+
.action(async (boardId, options, command) => {
|
|
131
|
+
try {
|
|
132
|
+
const api = await getApi(command.parent?.parent?.opts().token);
|
|
133
|
+
const board = await api.boards.get(boardId);
|
|
134
|
+
if (options.json) {
|
|
135
|
+
console.log(JSON.stringify(board, null, 2));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log(`Board: ${board.name}`);
|
|
139
|
+
console.log(`ID: ${board.id}`);
|
|
140
|
+
console.log(`Created: ${new Date(board.createdAt).toLocaleString()}`);
|
|
141
|
+
if (board.lists?.length) {
|
|
142
|
+
console.log('\nLists:');
|
|
143
|
+
board.lists.forEach(l => console.log(` - ${l.name}`));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// ── jobs ─────────────────────────────────────────────────────────────────────
|
|
153
|
+
const jobs = program.command('jobs').description('Manage jobs on your boards');
|
|
154
|
+
jobs
|
|
155
|
+
.command('list')
|
|
156
|
+
.description('List jobs on a board')
|
|
157
|
+
.argument('<board-id>', 'Board ID')
|
|
158
|
+
.option('-f, --format <format>', 'Output format: table (default), json, csv, pdf, excel')
|
|
159
|
+
.option('-j, --json', 'Output as JSON (legacy, same as --format json)')
|
|
160
|
+
.option('--fields <fields>', 'Comma-separated list of fields to include')
|
|
161
|
+
.action(async (boardId, options, command) => {
|
|
162
|
+
try {
|
|
163
|
+
const AVAILABLE_FIELDS = ['ID', 'Title', 'URL', 'Created'];
|
|
164
|
+
const listOpts = (0, list_options_1.parseListOptions)(options);
|
|
165
|
+
const fields = (0, list_options_1.validateFields)(AVAILABLE_FIELDS, listOpts.fields);
|
|
166
|
+
const api = await getApi(command.parent?.parent?.opts().token);
|
|
167
|
+
const jobsList = await api.jobs.listByBoardFlat(boardId);
|
|
168
|
+
if (jobsList.length === 0) {
|
|
169
|
+
console.log('No jobs found.');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const rows = jobsList.map(j => ({
|
|
173
|
+
ID: j.id,
|
|
174
|
+
Title: j.title,
|
|
175
|
+
URL: j.url ?? 'N/A',
|
|
176
|
+
Created: new Date(j.createdAt).toLocaleDateString(),
|
|
177
|
+
}));
|
|
178
|
+
if (listOpts.format === 'json') {
|
|
179
|
+
console.log((0, list_options_1.formatJsonWithFields)(rows, fields));
|
|
180
|
+
}
|
|
181
|
+
else if (listOpts.format === 'csv') {
|
|
182
|
+
console.log((0, list_options_1.formatCsvWithFields)(rows, fields));
|
|
183
|
+
}
|
|
184
|
+
else if (listOpts.format === 'pdf') {
|
|
185
|
+
const buffer = (0, list_options_1.formatPdf)(rows, fields, 'Jobs List');
|
|
186
|
+
process.stdout.write(buffer);
|
|
187
|
+
}
|
|
188
|
+
else if (listOpts.format === 'excel') {
|
|
189
|
+
const buffer = await (0, list_options_1.formatExcel)(rows, fields, 'Jobs');
|
|
190
|
+
process.stdout.write(buffer);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
console.log((0, list_options_1.formatTableWithFields)(rows, fields));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
jobs
|
|
202
|
+
.command('get')
|
|
203
|
+
.description('Get details of a specific job')
|
|
204
|
+
.argument('<board-id>', 'Board ID')
|
|
205
|
+
.argument('<job-id>', 'Job ID')
|
|
206
|
+
.option('-j, --json', 'Output as JSON')
|
|
207
|
+
.action(async (boardId, jobId, options, command) => {
|
|
208
|
+
try {
|
|
209
|
+
const api = await getApi(command.parent?.parent?.opts().token);
|
|
210
|
+
const job = await api.jobs.get(boardId, jobId);
|
|
211
|
+
if (options.json) {
|
|
212
|
+
console.log(JSON.stringify(job, null, 2));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.log('\nJob Details:');
|
|
216
|
+
console.log(` Title: ${job.title}`);
|
|
217
|
+
console.log(` URL: ${job.url ?? 'N/A'}`);
|
|
218
|
+
console.log(` Location: ${job.location?.address ?? 'N/A'}`);
|
|
219
|
+
if (job.salary) {
|
|
220
|
+
console.log(` Salary: ${job.salary.min ?? 'N/A'} - ${job.salary.max ?? 'N/A'} ${job.salary.currency ?? ''}`);
|
|
221
|
+
}
|
|
222
|
+
console.log(` Created: ${new Date(job.createdAt).toLocaleString()}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
// ── activities ───────────────────────────────────────────────────────────────
|
|
231
|
+
const activities = program.command('activities').description('View your board activity log');
|
|
232
|
+
activities
|
|
233
|
+
.command('list')
|
|
234
|
+
.description('List actions for a board')
|
|
235
|
+
.argument('<board-id>', 'Board ID')
|
|
236
|
+
.option('-f, --format <format>', 'Output format: table (default), json, csv, pdf, excel')
|
|
237
|
+
.option('-d, --days <days>', 'Filter to last N days (e.g. 7 for past week)')
|
|
238
|
+
.option('-w, --week', 'Filter to last 7 days (legacy, same as --days 7)')
|
|
239
|
+
.option('--types <types>', 'Comma-separated action types (e.g. JOB_MOVED,NOTE_CREATED)')
|
|
240
|
+
.option('--fields <fields>', 'Comma-separated list of fields to include')
|
|
241
|
+
.option('-j, --json', 'Output as JSON (legacy, same as --format json)')
|
|
242
|
+
.action(async (boardId, options, command) => {
|
|
243
|
+
try {
|
|
244
|
+
const AVAILABLE_FIELDS = ['Date', 'Type', 'Company', 'Job', 'Status'];
|
|
245
|
+
const listOpts = (0, list_options_1.parseListOptions)(options);
|
|
246
|
+
const fields = (0, list_options_1.validateFields)(AVAILABLE_FIELDS, listOpts.fields);
|
|
247
|
+
const api = await getApi(command.parent?.parent?.opts().token);
|
|
248
|
+
const apiOpts = {};
|
|
249
|
+
if (listOpts.days) {
|
|
250
|
+
apiOpts.since = new Date(Date.now() - listOpts.days * 24 * 60 * 60 * 1000);
|
|
251
|
+
}
|
|
252
|
+
if (listOpts.types) {
|
|
253
|
+
apiOpts.types = listOpts.types;
|
|
254
|
+
}
|
|
255
|
+
const actions = await api.actions.listByBoardFlat(boardId, apiOpts);
|
|
256
|
+
if (actions.length === 0) {
|
|
257
|
+
console.log('No activities found.');
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const rows = actions.map(a => ({
|
|
261
|
+
Date: new Date(a.date || a.createdAt).toISOString().substring(0, 16),
|
|
262
|
+
Type: a.actionType,
|
|
263
|
+
Company: a.data?.company?.name ?? '',
|
|
264
|
+
Job: (a.data?.job?.title ?? '').substring(0, 40),
|
|
265
|
+
Status: a.data?.toList?.name ?? '',
|
|
266
|
+
}));
|
|
267
|
+
if (listOpts.format === 'json') {
|
|
268
|
+
console.log((0, list_options_1.formatJsonWithFields)(rows, fields));
|
|
269
|
+
}
|
|
270
|
+
else if (listOpts.format === 'csv') {
|
|
271
|
+
console.log((0, list_options_1.formatCsvWithFields)(rows, fields));
|
|
272
|
+
}
|
|
273
|
+
else if (listOpts.format === 'pdf') {
|
|
274
|
+
const buffer = (0, list_options_1.formatPdf)(rows, fields, 'Activities List');
|
|
275
|
+
process.stdout.write(buffer);
|
|
276
|
+
}
|
|
277
|
+
else if (listOpts.format === 'excel') {
|
|
278
|
+
const buffer = await (0, list_options_1.formatExcel)(rows, fields, 'Activities');
|
|
279
|
+
process.stdout.write(buffer);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
console.log((0, list_options_1.formatTableWithFields)(rows, fields));
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
287
|
+
process.exit(1);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
activities
|
|
291
|
+
.command('week-csv')
|
|
292
|
+
.description('Export last 7 days of activity as CSV')
|
|
293
|
+
.argument('<board-id>', 'Board ID')
|
|
294
|
+
.action(async (boardId, options, command) => {
|
|
295
|
+
try {
|
|
296
|
+
const api = await getApi(command.parent?.parent?.opts().token);
|
|
297
|
+
const rows = await api.actions.weekSummary(boardId);
|
|
298
|
+
const lines = ['Date,Action,Company,Job Title,Status,Job URL'];
|
|
299
|
+
for (const r of rows) {
|
|
300
|
+
lines.push([
|
|
301
|
+
r.date,
|
|
302
|
+
r.actionType,
|
|
303
|
+
`"${r.company.replace(/"/g, '""')}"`,
|
|
304
|
+
`"${r.jobTitle.replace(/"/g, '""')}"`,
|
|
305
|
+
r.status,
|
|
306
|
+
r.url,
|
|
307
|
+
].join(','));
|
|
308
|
+
}
|
|
309
|
+
console.log(lines.join('\n'));
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
// ── config ───────────────────────────────────────────────────────────────────
|
|
317
|
+
const config = program.command('config').description('Manage CLI configuration');
|
|
318
|
+
config
|
|
319
|
+
.command('set-token')
|
|
320
|
+
.description('Save API token to config file or keychain')
|
|
321
|
+
.argument('<token>', 'API token to save')
|
|
322
|
+
.option('-k, --keychain', 'Save to macOS Keychain instead of config file')
|
|
323
|
+
.action(async (token, options) => {
|
|
324
|
+
try {
|
|
325
|
+
const location = options.keychain ? 'keychain' : 'config';
|
|
326
|
+
await tokenManager.saveToken(token, location);
|
|
327
|
+
const locationName = options.keychain ? 'macOS Keychain' : '~/.huntr/config.json';
|
|
328
|
+
console.log(`✓ Token saved to ${locationName}`);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
config
|
|
336
|
+
.command('capture-session')
|
|
337
|
+
.description('Capture Clerk session from your browser automatically (recommended)')
|
|
338
|
+
.action(async () => {
|
|
339
|
+
try {
|
|
340
|
+
await (0, capture_session_1.captureSession)();
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
config
|
|
348
|
+
.command('check-cdp')
|
|
349
|
+
.description('Check Chrome DevTools + Clerk cookie visibility for session capture')
|
|
350
|
+
.action(async () => {
|
|
351
|
+
try {
|
|
352
|
+
await (0, capture_session_1.checkCdpSession)();
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
config
|
|
360
|
+
.command('set-session')
|
|
361
|
+
.description('Save Clerk session cookie for automatic JWT refresh (recommended)')
|
|
362
|
+
.argument('<session-cookie>', 'Value of the __session cookie from your browser')
|
|
363
|
+
.argument('[session-id]', 'Clerk session ID (sess_...) — auto-detected from cookie if omitted')
|
|
364
|
+
.addHelpText('after', `
|
|
365
|
+
How to get your __session cookie:
|
|
366
|
+
1. Open huntr.co in Chrome and log in
|
|
367
|
+
2. Open DevTools → Application → Cookies → https://huntr.co
|
|
368
|
+
3. Find the cookie named __session and copy its Value (the long JWT string)
|
|
369
|
+
4. Run: huntr config set-session <value>
|
|
370
|
+
|
|
371
|
+
The session ID (sess_...) is extracted automatically from the JWT.
|
|
372
|
+
The session persists for weeks; re-run set-session if you get auth errors.
|
|
373
|
+
`)
|
|
374
|
+
.action(async (sessionCookie, sessionId) => {
|
|
375
|
+
try {
|
|
376
|
+
const mgr = tokenManager.clerkSession;
|
|
377
|
+
// Auto-detect session ID from the JWT payload (sid claim)
|
|
378
|
+
let resolvedSessionId = sessionId;
|
|
379
|
+
if (!resolvedSessionId) {
|
|
380
|
+
const detected = clerk_session_manager_1.ClerkSessionManager.extractSessionId(sessionCookie);
|
|
381
|
+
if (detected) {
|
|
382
|
+
resolvedSessionId = detected;
|
|
383
|
+
console.log(` Session ID detected: ${resolvedSessionId}`);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
console.error('Could not auto-detect session ID from the __session JWT.\n' +
|
|
387
|
+
'Find it in the browser console: Clerk.session.id\n' +
|
|
388
|
+
'Then run: huntr config set-session <cookie> <session-id>');
|
|
389
|
+
process.exit(1);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Strip prefix if user pasted "__session=..." prefix
|
|
393
|
+
const rawCookie = sessionCookie.startsWith('__session=')
|
|
394
|
+
? sessionCookie.slice('__session='.length)
|
|
395
|
+
: sessionCookie;
|
|
396
|
+
await mgr.saveSession(rawCookie, resolvedSessionId);
|
|
397
|
+
// Verify it works immediately
|
|
398
|
+
console.log(' Testing session…');
|
|
399
|
+
try {
|
|
400
|
+
const token = await mgr.getFreshToken();
|
|
401
|
+
console.log(`✓ Session saved and verified (token starts with: ${token.substring(0, 20)}…)`);
|
|
402
|
+
console.log(' Tokens will auto-refresh before each command.');
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
console.warn(`⚠ Session saved but test refresh failed: ${err instanceof Error ? err.message : err}`);
|
|
406
|
+
console.warn(' Your cookie may be expired. Try extracting it again from the browser.');
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
411
|
+
process.exit(1);
|
|
412
|
+
}
|
|
413
|
+
});
|
|
414
|
+
config
|
|
415
|
+
.command('test-session')
|
|
416
|
+
.description('Test the stored Clerk session by fetching a fresh token and calling /me')
|
|
417
|
+
.action(async () => {
|
|
418
|
+
try {
|
|
419
|
+
const mgr = tokenManager.clerkSession;
|
|
420
|
+
if (!(await mgr.hasSession())) {
|
|
421
|
+
console.error('No session stored. Run: huntr config set-session <__session-cookie>');
|
|
422
|
+
process.exit(1);
|
|
423
|
+
}
|
|
424
|
+
process.stdout.write(' Refreshing token from Clerk… ');
|
|
425
|
+
const token = await mgr.getFreshToken();
|
|
426
|
+
console.log(`✓ (${token.substring(0, 20)}…)`);
|
|
427
|
+
process.stdout.write(' Calling Huntr API /me… ');
|
|
428
|
+
const api = new (await Promise.resolve().then(() => __importStar(require('./api/personal')))).HuntrPersonalApi(token);
|
|
429
|
+
const profile = await api.user.getProfile();
|
|
430
|
+
console.log('✓');
|
|
431
|
+
console.log(`\n Logged in as: ${profile.givenName ?? profile.firstName ?? ''} ${profile.familyName ?? profile.lastName ?? ''} <${profile.email}>`);
|
|
432
|
+
console.log(' Session is working correctly. Tokens auto-refresh before each command.');
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
console.error('\nFailed:', error instanceof Error ? error.message : error);
|
|
436
|
+
process.exit(1);
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
config
|
|
440
|
+
.command('show-token')
|
|
441
|
+
.description('Show which authentication sources are configured')
|
|
442
|
+
.action(async () => {
|
|
443
|
+
try {
|
|
444
|
+
const sources = await tokenManager.showTokenSources();
|
|
445
|
+
console.log('\nConfigured authentication sources:');
|
|
446
|
+
console.log(` Environment variable (HUNTR_API_TOKEN): ${sources.env ? '✓ Set' : '✗ Not set'}`);
|
|
447
|
+
console.log(` Clerk session (auto-refresh): ${sources.clerkSession ? '✓ Set' : '✗ Not set'}`);
|
|
448
|
+
console.log(` Config file (~/.huntr/config.json): ${sources.config ? '✓ Set' : '✗ Not set'}`);
|
|
449
|
+
console.log(` macOS Keychain: ${sources.keychain ? '✓ Set' : '✗ Not set'}`);
|
|
450
|
+
if (!sources.env && !sources.clerkSession && !sources.config && !sources.keychain) {
|
|
451
|
+
console.log('\nNo credentials found.');
|
|
452
|
+
console.log('Recommended: huntr config set-session <__session-cookie>');
|
|
453
|
+
console.log('Alternative: huntr config set-token <token> [--keychain]');
|
|
454
|
+
}
|
|
455
|
+
else if (sources.clerkSession) {
|
|
456
|
+
console.log('\n✓ Clerk session active — tokens refresh automatically.');
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
config
|
|
465
|
+
.command('clear-token')
|
|
466
|
+
.description('Remove saved API token')
|
|
467
|
+
.option('-k, --keychain', 'Clear from macOS Keychain only')
|
|
468
|
+
.option('-c, --config', 'Clear from config file only')
|
|
469
|
+
.action(async (options) => {
|
|
470
|
+
try {
|
|
471
|
+
let location = 'all';
|
|
472
|
+
if (options.keychain && !options.config)
|
|
473
|
+
location = 'keychain';
|
|
474
|
+
else if (options.config && !options.keychain)
|
|
475
|
+
location = 'config';
|
|
476
|
+
await tokenManager.clearToken(location);
|
|
477
|
+
const message = location === 'all' ? 'all locations'
|
|
478
|
+
: location === 'keychain' ? 'macOS Keychain'
|
|
479
|
+
: 'config file';
|
|
480
|
+
console.log(`✓ Token cleared from ${message}`);
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
484
|
+
process.exit(1);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
config
|
|
488
|
+
.command('clear-session')
|
|
489
|
+
.description('Remove saved Clerk session cookie')
|
|
490
|
+
.action(async () => {
|
|
491
|
+
try {
|
|
492
|
+
await tokenManager.clerkSession.clearSession();
|
|
493
|
+
console.log('✓ Clerk session cleared');
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
497
|
+
process.exit(1);
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
program.parse();
|
|
501
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,6CAAkD;AAClD,0DAAsD;AACtD,0EAAqE;AACrE,gEAA6E;AAC7E,qDAQ4B;AAE5B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,MAAM,YAAY,GAAG,IAAI,4BAAY,EAAE,CAAC;AAExC,KAAK,UAAU,MAAM,CAAC,KAAc;IAClC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,2BAAgB,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oBAAoB,CAAC;KACjC,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,CAAC,CAAC;AAE5E,gFAAgF;AAEhF,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;YACrH,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gFAAgF;AAEhF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;AAE3E,MAAM;KACH,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,uBAAuB,EAAE,uDAAuD,CAAC;KACxF,MAAM,CAAC,YAAY,EAAE,gDAAgD,CAAC;KACtE,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAA,+BAAgB,EAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,6BAAc,EAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,QAAgB,CAAC,IAAI,IAAI,EAAE,CAAC;QAErF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YACvC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK;YACrB,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE;SACpD,CAAC,CAAC,CAAC;QAEJ,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,IAAA,mCAAoB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAA,kCAAmB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAA,oCAAqB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,iCAAiC,CAAC;KAC9C,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KAClC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACtE,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gFAAgF;AAEhF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;AAE/E,IAAI;KACD,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sBAAsB,CAAC;KACnC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KAClC,MAAM,CAAC,uBAAuB,EAAE,uDAAuD,CAAC;KACxF,MAAM,CAAC,YAAY,EAAE,gDAAgD,CAAC;KACtE,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAA,+BAAgB,EAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,6BAAc,EAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEzD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK;YACnB,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE;SACpD,CAAC,CAAC,CAAC;QAEJ,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,IAAA,mCAAoB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAA,kCAAmB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAA,oCAAqB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,IAAI;KACD,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,+BAA+B,CAAC;KAC5C,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KAClC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;KAC9B,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;YAClH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gFAAgF;AAEhF,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC;AAE7F,UAAU;KACP,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0BAA0B,CAAC;KACvC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KAClC,MAAM,CAAC,uBAAuB,EAAE,uDAAuD,CAAC;KACxF,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,CAAC;KAC3E,MAAM,CAAC,YAAY,EAAE,kDAAkD,CAAC;KACxE,MAAM,CAAC,iBAAiB,EAAE,4DAA4D,CAAC;KACvF,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,YAAY,EAAE,gDAAgD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAA,+BAAgB,EAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAA,6BAAc,EAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAuC,EAAE,CAAC;QACvD,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACjC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YACvE,IAAI,EAAK,CAAC,CAAC,UAAU;YACrB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE;YACpC,GAAG,EAAM,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,EAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE;SACpC,CAAC,CAAC,CAAC;QAEJ,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,IAAA,mCAAoB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAA,kCAAmB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAA,wBAAS,EAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAA,oCAAqB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,UAAU;KACP,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,uCAAuC,CAAC;KACpD,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC/D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC;gBACT,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,UAAU;gBACZ,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;gBACpC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG;gBACrC,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,GAAG;aACN,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACf,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gFAAgF;AAEhF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;AAEjF,MAAM;KACH,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,2CAA2C,CAAC;KACxD,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;KACxC,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;KACzE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAC/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1D,MAAM,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,oBAAoB,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,gCAAc,GAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,iCAAe,GAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,mEAAmE,CAAC;KAChF,QAAQ,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;KAC/E,QAAQ,CAAC,cAAc,EAAE,oEAAoE,CAAC;KAC9F,WAAW,CAAC,OAAO,EAAE;;;;;;;;;GASrB,CAAC;KACD,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC;QAEtC,0DAA0D;QAC1D,IAAI,iBAAiB,GAAG,SAA+B,CAAC;QACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,2CAAmB,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACrE,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,GAAG,QAAQ,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,iBAAiB,EAAE,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,4DAA4D;oBAC5D,oDAAoD;oBACpD,0DAA0D,CAC3D,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,YAAY,CAAC;YACtD,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;YAC1C,CAAC,CAAC,aAAa,CAAC;QAElB,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,iBAAkB,CAAC,CAAC;QAErD,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,oDAAoD,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,4CAA4C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACrG,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,yEAAyE,CAAC;KACtF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,wDAAa,gBAAgB,GAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;QACpJ,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;IAC1F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,CAAC,GAAG,CAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,CAAC,MAAM,CAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,CAAC,QAAQ,CAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,6BAA6B,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,QAAQ,GAAkC,KAAK,CAAC;QACpD,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,QAAQ,GAAG,UAAU,CAAC;aAC1D,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,QAAQ,GAAG,QAAQ,CAAC;QAClE,MAAM,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe;YAClD,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB;gBAC5C,CAAC,CAAC,aAAa,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Session capture via Chrome DevTools Protocol (CDP).
|
|
4
|
+
* - Connects to a Chrome instance started with --remote-debugging-port.
|
|
5
|
+
* - Reads required Huntr/Clerk cookies from the active huntr.co tab.
|
|
6
|
+
* - Verifies refresh with Clerk and stores session data in macOS Keychain.
|
|
7
|
+
*/
|
|
8
|
+
export declare function captureSession(): Promise<void>;
|
|
9
|
+
export declare function checkCdpSession(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=capture-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-session.d.ts","sourceRoot":"","sources":["../../src/commands/capture-session.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AA+CH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+EpD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDrD"}
|