ethos-cli 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/bin/ethos.js +6 -0
- package/dist/bin/ethos.js.map +1 -1
- package/dist/commands/campaigns.d.ts +2 -0
- package/dist/commands/campaigns.js +25 -0
- package/dist/commands/campaigns.js.map +1 -0
- package/dist/commands/flows.js +6 -28
- package/dist/commands/flows.js.map +1 -1
- package/dist/commands/hooks.d.ts +3 -0
- package/dist/commands/hooks.js +195 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/lists.d.ts +2 -0
- package/dist/commands/lists.js +513 -0
- package/dist/commands/lists.js.map +1 -0
- package/dist/commands/tables.d.ts +1 -1
- package/dist/commands/tables.js +1 -39
- package/dist/commands/tables.js.map +1 -1
- package/dist/lib/find-people-flow.d.ts +39 -0
- package/dist/lib/find-people-flow.js +37 -0
- package/dist/lib/find-people-flow.js.map +1 -0
- package/dist/lib/table-detail.d.ts +4 -0
- package/dist/lib/table-detail.js +41 -0
- package/dist/lib/table-detail.js.map +1 -0
- package/package.json +1 -1
- package/skills/find-people-at-companies.md +7 -0
package/README.md
CHANGED
|
@@ -124,5 +124,18 @@ ethos tables source-people <company-table-id> \
|
|
|
124
124
|
ethos tables create-people-table <company-table-id> --column-id <people-finder-column-id>
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
+
## List And Campaign Commands
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
ethos lists import-from-table <people-table-id> \
|
|
131
|
+
--linkedin-column "LinkedIn URL" \
|
|
132
|
+
--custom-variable outreach_message \
|
|
133
|
+
--custom-variable normalized_company_name
|
|
134
|
+
|
|
135
|
+
ethos campaigns attach-list <campaign-id> <list-id>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`lists import-from-table` creates contacts from table rows with valid LinkedIn person profile URLs or identifiers. It skips missing, invalid, and duplicate LinkedIn identities, reuses matching workspace contacts by default, and preserves source row IDs plus selected custom variables.
|
|
139
|
+
|
|
127
140
|
When stdout is not a TTY, output is JSON by default so coding agents can parse it reliably.
|
|
128
141
|
Table-detail commands such as `tables get`, `tables import-csv`, and `tables create-people-table` include top-level `table_id`, `column_ids`, `row_ids`, and `view_ids` in addition to the full nested objects. `tables source-people` includes top-level `table_id`, `column_id`, and `run_id`.
|
package/dist/bin/ethos.js
CHANGED
|
@@ -5,7 +5,10 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
import { registerAgents } from "../commands/agents.js";
|
|
7
7
|
import { registerAuth } from "../commands/auth.js";
|
|
8
|
+
import { registerCampaigns } from "../commands/campaigns.js";
|
|
8
9
|
import { registerFlows } from "../commands/flows.js";
|
|
10
|
+
import { registerHooks } from "../commands/hooks.js";
|
|
11
|
+
import { registerLists } from "../commands/lists.js";
|
|
9
12
|
import { registerSkills } from "../commands/skills.js";
|
|
10
13
|
import { registerTables } from "../commands/tables.js";
|
|
11
14
|
import { addGlobalOptions } from "../lib/config.js";
|
|
@@ -19,7 +22,10 @@ export function createEthosProgram() {
|
|
|
19
22
|
.version(pkg.version));
|
|
20
23
|
registerAuth(program);
|
|
21
24
|
registerAgents(program);
|
|
25
|
+
registerCampaigns(program);
|
|
22
26
|
registerFlows(program);
|
|
27
|
+
registerHooks(program);
|
|
28
|
+
registerLists(program);
|
|
23
29
|
registerSkills(program);
|
|
24
30
|
registerTables(program);
|
|
25
31
|
return program;
|
package/dist/bin/ethos.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethos.js","sourceRoot":"","sources":["../../src/bin/ethos.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AAExF,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,gBAAgB,CACd,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,8CAA8C,CAAC;SAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CACxB,CAAC;IAEF,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI;IACtD,MAAM,kBAAkB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,kBAAkB,EAAE,EAAE,CAAC;IACzB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"ethos.js","sourceRoot":"","sources":["../../src/bin/ethos.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAwB,CAAC;AAExF,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,gBAAgB,CACd,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,8CAA8C,CAAC;SAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CACxB,CAAC;IAEF,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI;IACtD,MAAM,kBAAkB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,kBAAkB,EAAE,EAAE,CAAC;IACzB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsonRequest, pathId, withClient } from "../lib/command-helpers.js";
|
|
2
|
+
import { printResult } from "../lib/output.js";
|
|
3
|
+
export function registerCampaigns(program) {
|
|
4
|
+
const campaigns = program.command("campaigns").alias("campaign").description("Manage Ethos campaigns");
|
|
5
|
+
const attachListCommand = campaigns
|
|
6
|
+
.command("attach-list <campaign-id> <list-id>")
|
|
7
|
+
.description("Attach a contact list to a draft campaign");
|
|
8
|
+
attachListCommand.action(async (campaignId, listId) => {
|
|
9
|
+
await withClient(attachListCommand, async (client, config) => {
|
|
10
|
+
const campaign = await client.request(`/v1/campaigns/${pathId(campaignId)}`, jsonRequest("PATCH", { list_id: listId }));
|
|
11
|
+
printResult(config, attachListCommandResult(campaign));
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function attachListCommandResult(campaign) {
|
|
16
|
+
return {
|
|
17
|
+
label: `Attached list ${campaign.list_id} to campaign ${campaign.id}`,
|
|
18
|
+
data: {
|
|
19
|
+
...campaign,
|
|
20
|
+
campaign_id: campaign.id,
|
|
21
|
+
list_id: campaign.list_id,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=campaigns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/commands/campaigns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AAcnE,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAEvG,MAAM,iBAAiB,GAAG,SAAS;SAChC,OAAO,CAAC,qCAAqC,CAAC;SAC9C,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAC5D,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,MAAc,EAAE,EAAE;QACpE,MAAM,UAAU,CAAC,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC3D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CACnC,iBAAiB,MAAM,CAAC,UAAU,CAAC,EAAE,EACrC,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAC1C,CAAC;YACF,WAAW,CAAC,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAkB;IACjD,OAAO;QACL,KAAK,EAAE,iBAAiB,QAAQ,CAAC,OAAO,gBAAgB,QAAQ,CAAC,EAAE,EAAE;QACrE,IAAI,EAAE;YACJ,GAAG,QAAQ;YACX,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B;KACF,CAAC;AACJ,CAAC"}
|
package/dist/commands/flows.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsonRequest, withClient } from "../lib/command-helpers.js";
|
|
2
|
-
import { FIND_PEOPLE_AT_COMPANIES_FLOW
|
|
2
|
+
import { FIND_PEOPLE_AT_COMPANIES_FLOW } from "../lib/agent-clients.js";
|
|
3
3
|
import { EthosApiError } from "../lib/client.js";
|
|
4
|
+
import { createFindPeopleHandoff } from "../lib/find-people-flow.js";
|
|
4
5
|
import { openInBrowser } from "../lib/open-browser.js";
|
|
5
6
|
import { printResult } from "../lib/output.js";
|
|
6
7
|
export function registerFlows(program) {
|
|
@@ -22,39 +23,16 @@ export function registerFlows(program) {
|
|
|
22
23
|
}
|
|
23
24
|
await withClient(startCommand, async (client, config) => {
|
|
24
25
|
const options = startCommand.opts();
|
|
25
|
-
const
|
|
26
|
-
const flowStart = buildFindPeopleFlowStart({
|
|
26
|
+
const result = await createFindPeopleHandoff(client, config, {
|
|
27
27
|
agentClient: options.agentClient,
|
|
28
28
|
agentSurface: options.agentSurface,
|
|
29
|
-
appUrl,
|
|
29
|
+
appUrl: options.appUrl,
|
|
30
30
|
codexThreadId: options.codexThreadId,
|
|
31
31
|
returnUrl: options.returnUrl,
|
|
32
32
|
});
|
|
33
|
-
|
|
34
|
-
const destinationPath = `${destinationUrl.pathname}${destinationUrl.search}`;
|
|
35
|
-
const handoff = await client.request("/v1/auth/browser-handoffs", {
|
|
36
|
-
method: "POST",
|
|
37
|
-
headers: { "Content-Type": "application/json" },
|
|
38
|
-
body: JSON.stringify({
|
|
39
|
-
app_url: appUrl.replace(/\/+$/, ""),
|
|
40
|
-
destination_path: destinationPath,
|
|
41
|
-
flow,
|
|
42
|
-
agent_client: flowStart.agent_client,
|
|
43
|
-
agent_surface: flowStart.agent_surface,
|
|
44
|
-
}),
|
|
45
|
-
});
|
|
46
|
-
printResult(config, {
|
|
47
|
-
...flowStart,
|
|
48
|
-
org_id: handoff.org_id,
|
|
49
|
-
org_name: handoff.org_name,
|
|
50
|
-
handoff_token: handoff.handoff_token,
|
|
51
|
-
upload_url: handoff.handoff_url,
|
|
52
|
-
handoff_url: handoff.handoff_url,
|
|
53
|
-
destination_url: handoff.destination_url,
|
|
54
|
-
destination_path: handoff.destination_path,
|
|
55
|
-
});
|
|
33
|
+
printResult(config, result);
|
|
56
34
|
if (options.open)
|
|
57
|
-
openInBrowser(
|
|
35
|
+
openInBrowser(result.handoff_url);
|
|
58
36
|
});
|
|
59
37
|
});
|
|
60
38
|
const waitCommand = flows
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flows.js","sourceRoot":"","sources":["../../src/commands/flows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,
|
|
1
|
+
{"version":3,"file":"flows.js","sourceRoot":"","sources":["../../src/commands/flows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { withClient } from "../lib/command-helpers.js";
|
|
6
|
+
import { isJsonMode } from "../lib/config.js";
|
|
7
|
+
import { createFindPeopleHandoff } from "../lib/find-people-flow.js";
|
|
8
|
+
import { openInBrowser } from "../lib/open-browser.js";
|
|
9
|
+
import { printResult } from "../lib/output.js";
|
|
10
|
+
const SKILL = "find-people-at-companies";
|
|
11
|
+
const HOOK_EVENT = "UserPromptSubmit";
|
|
12
|
+
// Explicit invocation only: the skill named in the prompt, with or without a
|
|
13
|
+
// leading slash. Conservative on purpose so unrelated prompts never open a browser.
|
|
14
|
+
const EAGER_OPEN_TRIGGER = /(^|\s)\/?find-people-at-companies\b/i;
|
|
15
|
+
// Substring used to find/replace/remove our hook entry idempotently.
|
|
16
|
+
const HOOK_COMMAND_MARKER = "hooks eager-open";
|
|
17
|
+
const ALL_HOOK_AGENTS = ["claude-code"];
|
|
18
|
+
export function registerHooks(program) {
|
|
19
|
+
const hooks = program
|
|
20
|
+
.command("hooks")
|
|
21
|
+
.description("Manage Ethos agent hooks, such as the find-people eager-open UserPromptSubmit hook");
|
|
22
|
+
registerEagerOpen(hooks);
|
|
23
|
+
registerInstall(hooks);
|
|
24
|
+
registerUninstall(hooks);
|
|
25
|
+
}
|
|
26
|
+
export function matchesEagerOpenTrigger(prompt) {
|
|
27
|
+
return EAGER_OPEN_TRIGGER.test(prompt);
|
|
28
|
+
}
|
|
29
|
+
function registerEagerOpen(hooks) {
|
|
30
|
+
const eagerOpen = hooks
|
|
31
|
+
.command("eager-open")
|
|
32
|
+
.description(`${HOOK_EVENT} hook handler: when the ${SKILL} skill is invoked, pre-open the upload browser and inject the started handoff for the skill to reuse`);
|
|
33
|
+
eagerOpen.action(async () => {
|
|
34
|
+
try {
|
|
35
|
+
const prompt = readHookPrompt();
|
|
36
|
+
if (!matchesEagerOpenTrigger(prompt))
|
|
37
|
+
return; // not this skill - leave the prompt untouched
|
|
38
|
+
await withClient(eagerOpen, async (client, config) => {
|
|
39
|
+
const handoff = await createFindPeopleHandoff(client, config, { agentClient: "auto" });
|
|
40
|
+
openInBrowser(handoff.handoff_url);
|
|
41
|
+
emitAdditionalContext(eagerOpenContext(handoff));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Never block or fail the user's prompt; the skill's own `flows start` is the fallback.
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function readHookPrompt() {
|
|
50
|
+
if (process.stdin.isTTY)
|
|
51
|
+
return "";
|
|
52
|
+
try {
|
|
53
|
+
const raw = readFileSync(0, "utf8");
|
|
54
|
+
if (!raw.trim())
|
|
55
|
+
return "";
|
|
56
|
+
const data = JSON.parse(raw);
|
|
57
|
+
return typeof data.prompt === "string" ? data.prompt : "";
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return "";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function eagerOpenContext(handoff) {
|
|
64
|
+
const workspace = handoff.org_name ? ` in workspace "${handoff.org_name}"` : "";
|
|
65
|
+
return (`Ethos find-people: the CSV upload browser is already opening${workspace} (pre-started by a hook). ` +
|
|
66
|
+
`Reuse this flow when running the ${SKILL} skill - do NOT run \`ethos flows start\` again. ` +
|
|
67
|
+
`handoff_token=${handoff.handoff_token}. ` +
|
|
68
|
+
`Next: ask the user for their ICP and buying-signal brief while they upload, then run ` +
|
|
69
|
+
`\`ethos flows wait ${handoff.handoff_token} --json\` to capture the uploaded table id.`);
|
|
70
|
+
}
|
|
71
|
+
function emitAdditionalContext(additionalContext) {
|
|
72
|
+
process.stdout.write(JSON.stringify({
|
|
73
|
+
hookSpecificOutput: { hookEventName: HOOK_EVENT, additionalContext },
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
function registerInstall(hooks) {
|
|
77
|
+
const install = hooks
|
|
78
|
+
.command("install")
|
|
79
|
+
.description("Register the find-people eager-open UserPromptSubmit hook in your agent config")
|
|
80
|
+
.option("-a, --agents <list>", `comma-separated agents (default: claude-code). Supported: ${ALL_HOOK_AGENTS.join(", ")}`);
|
|
81
|
+
install.action(async () => {
|
|
82
|
+
const agents = parseHookAgents(install.opts().agents);
|
|
83
|
+
const command = `${ethosCliCommand()} hooks eager-open`;
|
|
84
|
+
const results = [];
|
|
85
|
+
for (const agent of agents) {
|
|
86
|
+
if (agent === "claude-code")
|
|
87
|
+
results.push(await installClaudeHook(command));
|
|
88
|
+
}
|
|
89
|
+
printHooksResult(install, {
|
|
90
|
+
label: `Eager-open hook installed for ${results.map((entry) => entry.agent).join(", ")} (command: ${command})`,
|
|
91
|
+
data: { command, agents: results },
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function registerUninstall(hooks) {
|
|
96
|
+
const uninstall = hooks
|
|
97
|
+
.command("uninstall")
|
|
98
|
+
.description("Remove the find-people eager-open hook from your agent config")
|
|
99
|
+
.option("-a, --agents <list>", `comma-separated agents (default: claude-code). Supported: ${ALL_HOOK_AGENTS.join(", ")}`);
|
|
100
|
+
uninstall.action(async () => {
|
|
101
|
+
const agents = parseHookAgents(uninstall.opts().agents);
|
|
102
|
+
const results = [];
|
|
103
|
+
for (const agent of agents) {
|
|
104
|
+
if (agent === "claude-code")
|
|
105
|
+
results.push(await uninstallClaudeHook());
|
|
106
|
+
}
|
|
107
|
+
const removed = results.reduce((total, entry) => total + entry.removed, 0);
|
|
108
|
+
printHooksResult(uninstall, {
|
|
109
|
+
label: removed ? `Removed the eager-open hook from ${results.map((entry) => entry.agent).join(", ")}` : "Nothing to remove.",
|
|
110
|
+
data: { agents: results },
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async function installClaudeHook(command) {
|
|
115
|
+
const path = claudeSettingsPath();
|
|
116
|
+
const settings = await readClaudeSettings(path);
|
|
117
|
+
const allHooks = (settings.hooks ??= {});
|
|
118
|
+
const list = (allHooks[HOOK_EVENT] ??= []);
|
|
119
|
+
let updated = false;
|
|
120
|
+
for (const group of list) {
|
|
121
|
+
for (const entry of group.hooks ?? []) {
|
|
122
|
+
if (typeof entry.command === "string" && entry.command.includes(HOOK_COMMAND_MARKER)) {
|
|
123
|
+
entry.type = "command";
|
|
124
|
+
entry.command = command;
|
|
125
|
+
updated = true;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (!updated) {
|
|
130
|
+
list.push({ hooks: [{ type: "command", command }] });
|
|
131
|
+
}
|
|
132
|
+
await writeJsonFile(path, settings);
|
|
133
|
+
return { agent: "claude-code", path, action: updated ? "updated" : "installed", command };
|
|
134
|
+
}
|
|
135
|
+
async function uninstallClaudeHook() {
|
|
136
|
+
const path = claudeSettingsPath();
|
|
137
|
+
if (!existsSync(path))
|
|
138
|
+
return { agent: "claude-code", path, removed: 0 };
|
|
139
|
+
const settings = await readClaudeSettings(path);
|
|
140
|
+
const list = settings.hooks?.[HOOK_EVENT];
|
|
141
|
+
if (!settings.hooks || !list)
|
|
142
|
+
return { agent: "claude-code", path, removed: 0 };
|
|
143
|
+
let removed = 0;
|
|
144
|
+
const kept = [];
|
|
145
|
+
for (const group of list) {
|
|
146
|
+
const groupHooks = group.hooks ?? [];
|
|
147
|
+
const filtered = groupHooks.filter((entry) => !(typeof entry.command === "string" && entry.command.includes(HOOK_COMMAND_MARKER)));
|
|
148
|
+
removed += groupHooks.length - filtered.length;
|
|
149
|
+
if (filtered.length)
|
|
150
|
+
kept.push({ ...group, hooks: filtered });
|
|
151
|
+
}
|
|
152
|
+
if (kept.length)
|
|
153
|
+
settings.hooks[HOOK_EVENT] = kept;
|
|
154
|
+
else
|
|
155
|
+
delete settings.hooks[HOOK_EVENT];
|
|
156
|
+
await writeJsonFile(path, settings);
|
|
157
|
+
return { agent: "claude-code", path, removed };
|
|
158
|
+
}
|
|
159
|
+
function ethosCliCommand() {
|
|
160
|
+
return process.env.ETHOS_CLI_COMMAND || "ethos";
|
|
161
|
+
}
|
|
162
|
+
function claudeSettingsPath() {
|
|
163
|
+
const base = process.env.CLAUDE_CONFIG_DIR || join(homedir(), ".claude");
|
|
164
|
+
return join(base, "settings.json");
|
|
165
|
+
}
|
|
166
|
+
async function readClaudeSettings(path) {
|
|
167
|
+
try {
|
|
168
|
+
const raw = await readFile(path, "utf8");
|
|
169
|
+
const parsed = raw.trim() ? JSON.parse(raw) : {};
|
|
170
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return {};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async function writeJsonFile(path, value) {
|
|
177
|
+
await mkdir(dirname(path), { recursive: true });
|
|
178
|
+
await writeFile(path, `${JSON.stringify(value, null, 2)}\n`);
|
|
179
|
+
}
|
|
180
|
+
function parseHookAgents(value) {
|
|
181
|
+
if (!value)
|
|
182
|
+
return ["claude-code"];
|
|
183
|
+
const parsed = [];
|
|
184
|
+
for (const raw of value.split(",").map((part) => part.trim()).filter(Boolean)) {
|
|
185
|
+
if (ALL_HOOK_AGENTS.includes(raw))
|
|
186
|
+
parsed.push(raw);
|
|
187
|
+
else
|
|
188
|
+
throw new Error(`unknown hook agent: ${raw} (supported: ${ALL_HOOK_AGENTS.join(", ")})`);
|
|
189
|
+
}
|
|
190
|
+
return parsed.length ? parsed : ["claude-code"];
|
|
191
|
+
}
|
|
192
|
+
function printHooksResult(command, result) {
|
|
193
|
+
printResult({ apiUrl: "", apiKey: "", json: isJsonMode(command) }, result);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAA0B,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,KAAK,GAAG,0BAA0B,CAAC;AACzC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AACtC,6EAA6E;AAC7E,oFAAoF;AACpF,MAAM,kBAAkB,GAAG,sCAAsC,CAAC;AAClE,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAG/C,MAAM,eAAe,GAAoB,CAAC,aAAa,CAAC,CAAC;AAMzD,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oFAAoF,CAAC,CAAC;IAErG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzB,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,SAAS,GAAG,KAAK;SACpB,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CACV,GAAG,UAAU,2BAA2B,KAAK,sGAAsG,CACpJ,CAAC;IACJ,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,8CAA8C;YAC5F,MAAM,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACnD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvF,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACnC,qBAAqB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wFAAwF;QAC1F,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACrD,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA0B;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,OAAO,CACL,+DAA+D,SAAS,4BAA4B;QACpG,oCAAoC,KAAK,mDAAmD;QAC5F,iBAAiB,OAAO,CAAC,aAAa,IAAI;QAC1C,uFAAuF;QACvF,sBAAsB,OAAO,CAAC,aAAa,6CAA6C,CACzF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,iBAAyB;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;QACb,kBAAkB,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE;KACrE,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gFAAgF,CAAC;SAC7F,MAAM,CACL,qBAAqB,EACrB,6DAA6D,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;IACJ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAuB,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,GAAG,eAAe,EAAE,mBAAmB,CAAC;QACxD,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,aAAa;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,gBAAgB,CAAC,OAAO,EAAE;YACxB,KAAK,EAAE,iCAAiC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,OAAO,GAAG;YAC9G,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;SACnC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,SAAS,GAAG,KAAK;SACpB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CACL,qBAAqB,EACrB,6DAA6D,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;IACJ,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,EAAuB,CAAC,MAAM,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,KAAK,aAAa;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,gBAAgB,CAAC,SAAS,EAAE;YAC1B,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,oCAAoC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB;YAC5H,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAe;IAEf,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACrF,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;gBACvB,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBACxB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;AAC5F,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAEzE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAEhF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAChC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAC/F,CAAC;QACF,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI,QAAQ,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,IAAI,CAAC,MAAM;QAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;;QAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,KAAc;IACvD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACnC,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,IAAK,eAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAoB,CAAC,CAAC;;YAC9E,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,gBAAgB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB,EAAE,MAAwC;IAClF,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC"}
|