ethos-cli 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/ethos.js CHANGED
@@ -6,6 +6,7 @@ import { Command } from "commander";
6
6
  import { registerAgents } from "../commands/agents.js";
7
7
  import { registerAuth } from "../commands/auth.js";
8
8
  import { registerFlows } from "../commands/flows.js";
9
+ import { registerHooks } from "../commands/hooks.js";
9
10
  import { registerSkills } from "../commands/skills.js";
10
11
  import { registerTables } from "../commands/tables.js";
11
12
  import { addGlobalOptions } from "../lib/config.js";
@@ -20,6 +21,7 @@ export function createEthosProgram() {
20
21
  registerAuth(program);
21
22
  registerAgents(program);
22
23
  registerFlows(program);
24
+ registerHooks(program);
23
25
  registerSkills(program);
24
26
  registerTables(program);
25
27
  return program;
@@ -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,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,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"}
@@ -1,6 +1,7 @@
1
1
  import { jsonRequest, withClient } from "../lib/command-helpers.js";
2
- import { FIND_PEOPLE_AT_COMPANIES_FLOW, buildFindPeopleFlowStart, inferAppUrl, } from "../lib/agent-clients.js";
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 appUrl = options.appUrl || process.env.ETHOS_APP_URL || inferAppUrl(config.apiUrl);
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
- const destinationUrl = new URL(flowStart.upload_url);
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(handoff.handoff_url);
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":"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"}
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,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA2B/C,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gEAAgE,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,KAAK;SACvB,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,yBAAyB,EAAE,2DAA2D,EAAE,MAAM,CAAC;SACtG,MAAM,CAAC,2BAA2B,EAAE,+CAA+C,EAAE,MAAM,CAAC;SAC5F,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;SAC9C,MAAM,CAAC,wBAAwB,EAAE,0CAA0C,CAAC;SAC5E,MAAM,CAAC,oBAAoB,EAAE,8DAA8D,CAAC;SAC5F,MAAM,CAAC,QAAQ,EAAE,uEAAuE,CAAC,CAAC;IAE7F,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QACzC,IAAI,IAAI,KAAK,6BAA6B,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,sBAAsB,6BAA6B,GAAG,CAAC,CAAC;QACnG,CAAC;QAED,MAAM,UAAU,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAoB,CAAC;YACtD,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE;gBAC3D,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,OAAO,CAAC,IAAI;gBAAE,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,KAAK;SACtB,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,0FAA0F,CAAC;SACvG,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,EAAE,KAAK,CAAC;SAClF,MAAM,CAAC,2BAA2B,EAAE,+BAA+B,EAAE,GAAG,CAAC,CAAC;IAE7E,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,YAAoB,EAAE,EAAE;QAChD,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAmB,CAAC;YACpD,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YAC5E,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;YAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC;YAEpD,SAAS,CAAC;gBACR,IAAI,OAA6C,CAAC;gBAClD,IAAI,CAAC;oBACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACpG,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;gBAC7E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,oEAAoE;oBACpE,mEAAmE;oBACnE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;gBACxC,CAAC;gBACD,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;oBAC7B,WAAW,CAAC,MAAM,EAAE;wBAClB,KAAK,EAAE,0BAA0B,OAAO,CAAC,eAAe,EAAE;wBAC1D,IAAI,EAAE;4BACJ,GAAG,OAAO;4BACV,aAAa,EAAE,YAAY;4BAC3B,QAAQ,EAAE,OAAO,CAAC,eAAe;yBAClC;qBACF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CACb,mBAAmB,cAAc,4CAA4C;wBAC3E,uEAAuE,YAAY,KAAK,CAC3F,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,KAAK,UAAU,kBAAkB,CAC/B,MAAmB,EACnB,YAAoB,EACpB,gBAAwB;IAExB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAA2B,kCAAkC,EAAE;YACxF,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;YACvD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3D,MAAM,IAAI,aAAa,CACrB,mIAAmI,EACnI,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,IAAI,CACX,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,CACZ,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAK,KAA4B,CAAC,IAAI,KAAK,YAAY,CAC7G,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB,EAAE,IAAY,EAAE,GAAW;IAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wCAAwC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerHooks(program: Command): void;
3
+ export declare function matchesEagerOpenTrigger(prompt: string): boolean;
@@ -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"}
@@ -0,0 +1,39 @@
1
+ import { buildFindPeopleFlowStart } from "./agent-clients.js";
2
+ import type { EthosClient } from "./client.js";
3
+ import type { EthosConfig } from "./config.js";
4
+ export type BrowserFlowHandoff = {
5
+ status: "pending" | "claimed";
6
+ handoff_token: string;
7
+ handoff_url: string;
8
+ destination_url: string;
9
+ destination_path: string;
10
+ flow: string;
11
+ org_id: string;
12
+ org_name: string;
13
+ agent_client?: string | null;
14
+ agent_surface?: string | null;
15
+ result_table_id?: string | null;
16
+ expires_at: string;
17
+ };
18
+ export type FindPeopleFlowOptions = {
19
+ agentClient?: string;
20
+ agentSurface?: string;
21
+ appUrl?: string;
22
+ codexThreadId?: string;
23
+ returnUrl?: string;
24
+ };
25
+ export type FindPeopleHandoff = ReturnType<typeof buildFindPeopleFlowStart> & {
26
+ org_id: string;
27
+ org_name: string;
28
+ handoff_token: string;
29
+ upload_url: string;
30
+ handoff_url: string;
31
+ destination_url: string;
32
+ destination_path: string;
33
+ };
34
+ /**
35
+ * Create a browser handoff for the find-people-at-companies flow. Shared by
36
+ * `flows start` and the `hooks eager-open` UserPromptSubmit handler so both go
37
+ * through the exact same flow-start logic and target the same environment.
38
+ */
39
+ export declare function createFindPeopleHandoff(client: EthosClient, config: EthosConfig, options: FindPeopleFlowOptions): Promise<FindPeopleHandoff>;
@@ -0,0 +1,37 @@
1
+ import { FIND_PEOPLE_AT_COMPANIES_FLOW, buildFindPeopleFlowStart, inferAppUrl, } from "./agent-clients.js";
2
+ import { jsonRequest } from "./command-helpers.js";
3
+ /**
4
+ * Create a browser handoff for the find-people-at-companies flow. Shared by
5
+ * `flows start` and the `hooks eager-open` UserPromptSubmit handler so both go
6
+ * through the exact same flow-start logic and target the same environment.
7
+ */
8
+ export async function createFindPeopleHandoff(client, config, options) {
9
+ const appUrl = options.appUrl || process.env.ETHOS_APP_URL || inferAppUrl(config.apiUrl);
10
+ const flowStart = buildFindPeopleFlowStart({
11
+ agentClient: options.agentClient,
12
+ agentSurface: options.agentSurface,
13
+ appUrl,
14
+ codexThreadId: options.codexThreadId,
15
+ returnUrl: options.returnUrl,
16
+ });
17
+ const destinationUrl = new URL(flowStart.upload_url);
18
+ const destinationPath = `${destinationUrl.pathname}${destinationUrl.search}`;
19
+ const handoff = await client.request("/v1/auth/browser-handoffs", jsonRequest("POST", {
20
+ app_url: appUrl.replace(/\/+$/, ""),
21
+ destination_path: destinationPath,
22
+ flow: FIND_PEOPLE_AT_COMPANIES_FLOW,
23
+ agent_client: flowStart.agent_client,
24
+ agent_surface: flowStart.agent_surface,
25
+ }));
26
+ return {
27
+ ...flowStart,
28
+ org_id: handoff.org_id,
29
+ org_name: handoff.org_name,
30
+ handoff_token: handoff.handoff_token,
31
+ upload_url: handoff.handoff_url,
32
+ handoff_url: handoff.handoff_url,
33
+ destination_url: handoff.destination_url,
34
+ destination_path: handoff.destination_path,
35
+ };
36
+ }
37
+ //# sourceMappingURL=find-people-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-people-flow.js","sourceRoot":"","sources":["../../src/lib/find-people-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,EACxB,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAoCnD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAmB,EACnB,MAAmB,EACnB,OAA8B;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,wBAAwB,CAAC;QACzC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,MAAM;QACN,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,GAAG,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAClC,2BAA2B,EAC3B,WAAW,CAAC,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,gBAAgB,EAAE,eAAe;QACjC,IAAI,EAAE,6BAA6B;QACnC,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,aAAa,EAAE,SAAS,CAAC,aAAa;KACvC,CAAC,CACH,CAAC;IACF,OAAO;QACL,GAAG,SAAS;QACZ,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,WAAW;QAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ethos-cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Commander-based CLI for Ethos table operations",
5
5
  "homepage": "https://github.com/cluster-software/ethos#readme",
6
6
  "repository": {
@@ -60,6 +60,13 @@ setup.
60
60
 
61
61
  ## Start Upload Flow
62
62
 
63
+ **Reuse a pre-started flow first.** If the conversation already contains an
64
+ injected Ethos handoff — for example a `UserPromptSubmit` hook reporting that the
65
+ upload browser is already opening and providing a `handoff_token` — do NOT run
66
+ `ethos flows start` again. Reuse that `handoff_token`: skip to the brief and then
67
+ `ethos flows wait <handoff_token>`. Only run the command below when no such
68
+ handoff has been provided.
69
+
63
70
  Start the browser handoff flow through the CLI abstraction instead of constructing client-specific URLs. Pass `--open` so the CLI opens the upload browser itself:
64
71
 
65
72
  ```sh