@agent-team-foundation/first-tree-hub 0.11.4 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/{bootstrap-D-Yf8yOc.mjs → bootstrap-C_K2CKXC.mjs} +7 -0
  2. package/dist/cli/index.mjs +73 -11
  3. package/dist/client-BPUdUaZT-CyCrpCTP.mjs +2033 -0
  4. package/dist/client-BhCtO2df-BGOu-rRN.mjs +7 -0
  5. package/dist/{dist-BQtAQNRD.mjs → dist-LgF7LHpE.mjs} +1 -1
  6. package/dist/{dist-ClFs4WMj.mjs → dist-UOZ6vMUW.mjs} +372 -197
  7. package/dist/drizzle/0033_onboarding_dismissed_at.sql +13 -0
  8. package/dist/drizzle/0034_pending_questions.sql +34 -0
  9. package/dist/drizzle/meta/_journal.json +14 -0
  10. package/dist/{errors-BmyRwN0Y-Dad3eV8F.mjs → errors-CF5evtJt-B0NTIVPt.mjs} +2 -1
  11. package/dist/{feishu-AI3pwmqN.mjs → feishu-C6qlhju2.mjs} +1 -1
  12. package/dist/{getMachineId-bsd-c2VImogj.mjs → getMachineId-bsd-BmasEOJr.mjs} +1 -1
  13. package/dist/{getMachineId-bsd-DyySs8xz.mjs → getMachineId-bsd-Dh3h0DDE.mjs} +1 -1
  14. package/dist/{getMachineId-darwin-Cl7TSzgO.mjs → getMachineId-darwin-CuhM3hfZ.mjs} +1 -1
  15. package/dist/{getMachineId-darwin-DKgI8b1d.mjs → getMachineId-darwin-D9wR0SLj.mjs} +1 -1
  16. package/dist/{getMachineId-linux-1OIMWfdh.mjs → getMachineId-linux-CYfb0oxZ.mjs} +1 -1
  17. package/dist/{getMachineId-linux-cT7EbP10.mjs → getMachineId-linux-D8ZaSjAC.mjs} +1 -1
  18. package/dist/{getMachineId-unsupported-CkX-YOG1.mjs → getMachineId-unsupported-Cu3iisaD.mjs} +1 -1
  19. package/dist/{getMachineId-unsupported-CmVlhzIo.mjs → getMachineId-unsupported-DZqI4ZT5.mjs} +1 -1
  20. package/dist/{getMachineId-win-C2cM60YT.mjs → getMachineId-win-8ZJbtrdf.mjs} +1 -1
  21. package/dist/{getMachineId-win-Chl03TYe.mjs → getMachineId-win-DT-hqwVp.mjs} +1 -1
  22. package/dist/index.mjs +9 -9
  23. package/dist/{invitation-Dnn5gGGX-DXryyvRG.mjs → invitation-Bg0TRiyx-BsZH4GCS.mjs} +2 -2
  24. package/dist/invitation-C299fxkP-KyCNax4T.mjs +4 -0
  25. package/dist/{observability-BAScT_5S-gw1ODB_o.mjs → observability-BAScT_5S-BcW9HgkG.mjs} +13 -13
  26. package/dist/{observability-CYsdAcoF.mjs → observability-eLA9iNK_.mjs} +3 -3
  27. package/dist/{saas-connect-CVoRK0Ex.mjs → saas-connect-Drn9g6cR.mjs} +1195 -1685
  28. package/dist/web/assets/index-B_Tf2I6v.css +1 -0
  29. package/dist/web/assets/{index-Bm6hgcvt.js → index-Bnyz7inW.js} +1 -1
  30. package/dist/web/assets/index-Dy3jIUX5.js +391 -0
  31. package/dist/web/index.html +2 -2
  32. package/package.json +1 -1
  33. package/dist/client-By1K4VVT-DuI6EnSh.mjs +0 -4
  34. package/dist/client-CLdRbuml-svTO0Eat.mjs +0 -524
  35. package/dist/invitation-DWlyNb8x-BvXubk24.mjs +0 -4
  36. package/dist/web/assets/index-fNb_M0nL.css +0 -1
  37. package/dist/web/assets/index-k2bWRKc-.js +0 -388
  38. /package/dist/{esm-Ci8E1Gtj.mjs → esm-iadMkGbV.mjs} +0 -0
  39. /package/dist/{src-aJMV60mR.mjs → src-DNBS5Yjj.mjs} +0 -0
@@ -569,6 +569,13 @@ const serverConfigSchema = defineConfig({
569
569
  refreshTokenExpiry: field(z.string().default("30d"), { env: "FIRST_TREE_HUB_AUTH_REFRESH_TOKEN_EXPIRY" }),
570
570
  connectTokenExpiry: field(z.string().default("10m"), { env: "FIRST_TREE_HUB_AUTH_CONNECT_TOKEN_EXPIRY" })
571
571
  },
572
+ contextTreeSync: optional({
573
+ githubToken: field(z.string(), {
574
+ env: "FIRST_TREE_HUB_CONTEXT_TREE_GITHUB_TOKEN",
575
+ secret: true
576
+ }),
577
+ githubTokenRepos: field(z.string().optional(), { env: "FIRST_TREE_HUB_CONTEXT_TREE_GITHUB_TOKEN_REPOS" })
578
+ }),
572
579
  oauth: optional({ github: optional({
573
580
  clientId: field(z.string(), { env: "FIRST_TREE_HUB_GITHUB_OAUTH_CLIENT_ID" }),
574
581
  clientSecret: field(z.string(), {
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import "../observability-BAScT_5S-gw1ODB_o.mjs";
3
- import { $ as formatStaleReason, A as checkDocker, B as isServiceSupported, C as createApiNameResolver, D as checkBackgroundService, E as checkAgentConfigs, F as checkWebSocket, H as restartClientService, I as printResults, J as stopPostgres, L as reconcileAgentConfigs, M as checkServerConfig, N as checkServerHealth, O as checkClientConfig, P as checkServerReachable, Q as findStaleAliases, R as getClientServiceStatus, S as runHomeMigration, T as runMigrations, U as startClientService, W as stopClientService, X as handleClientOrgMismatch, Y as ClientRuntime, _ as formatCheckReport, a as declineUpdate, at as success, b as onboardCreate, c as detectInstallMode, ct as FirstTreeHubSDK, d as startServer, dt as cleanWorkspaces, et as removeLocalAgent, f as reconcileLocalRuntimeProviders, ft as probeCapabilities, g as promptMissingFields, h as promptAddAgent, i as createExecuteUpdate, it as fail, j as checkNodeVersion, k as checkDatabase, l as fetchLatestVersion, lt as SdkError, m as isInteractive, mt as configureClientLoggerForService, o as promptUpdate, ot as ClientOrgMismatchError, p as uploadClientCapabilities, pt as applyClientLoggerConfig, r as registerSaaSConnectCommand, rt as resolveReplyToFromEnv, s as PACKAGE_NAME, st as ClientUserMismatchError, tt as createOwner, u as installGlobalLatest, ut as SessionRegistry, v as loadOnboardState, w as migrateLocalAgentDirs, x as saveOnboardState, y as onboardCheck, z as installClientService } from "../saas-connect-CVoRK0Ex.mjs";
2
+ import "../observability-BAScT_5S-BcW9HgkG.mjs";
3
+ import { $ as formatStaleReason, A as checkDocker, B as isServiceSupported, C as createApiNameResolver, D as checkBackgroundService, E as checkAgentConfigs, F as checkWebSocket, H as restartClientService, I as printResults, J as stopPostgres, L as reconcileAgentConfigs, M as checkServerConfig, N as checkServerHealth, O as checkClientConfig, P as checkServerReachable, Q as findStaleAliases, R as getClientServiceStatus, S as runHomeMigration, T as runMigrations, U as startClientService, W as stopClientService, X as handleClientOrgMismatch, Y as ClientRuntime, _ as formatCheckReport, a as declineUpdate, at as success, b as onboardCreate, c as detectInstallMode, ct as FirstTreeHubSDK, d as startServer, dt as cleanWorkspaces, et as removeLocalAgent, f as reconcileLocalRuntimeProviders, ft as probeCapabilities, g as promptMissingFields, h as promptAddAgent, i as createExecuteUpdate, it as fail, j as checkNodeVersion, k as checkDatabase, l as fetchLatestVersion, lt as SdkError, m as isInteractive, mt as configureClientLoggerForService, o as promptUpdate, ot as ClientOrgMismatchError, p as uploadClientCapabilities, pt as applyClientLoggerConfig, r as registerSaaSConnectCommand, rt as resolveReplyToFromEnv, s as PACKAGE_NAME, st as ClientUserMismatchError, tt as createOwner, u as installGlobalLatest, ut as SessionRegistry, v as loadOnboardState, w as migrateLocalAgentDirs, x as saveOnboardState, y as onboardCheck, z as installClientService } from "../saas-connect-Drn9g6cR.mjs";
4
4
  import "../logger-core-BTmvdflj-DjW8FM4T.mjs";
5
- import { C as resetConfigMeta, E as setConfigValue, S as resetConfig, T as serverConfigSchema, _ as getConfigValue, a as ensureFreshAdminToken, c as resolveServerUrl, d as DEFAULT_CONFIG_DIR, f as DEFAULT_DATA_DIR, h as clientConfigSchema, i as ensureFreshAccessToken, l as saveAgentConfig, m as agentConfigSchema, o as loadCredentials, p as DEFAULT_HOME_DIR, u as saveCredentials, v as initConfig, w as resolveConfigReadonly, x as readConfigFile, y as loadAgents } from "../bootstrap-D-Yf8yOc.mjs";
5
+ import { C as resetConfigMeta, E as setConfigValue, S as resetConfig, T as serverConfigSchema, _ as getConfigValue, a as ensureFreshAdminToken, c as resolveServerUrl, d as DEFAULT_CONFIG_DIR, f as DEFAULT_DATA_DIR, h as clientConfigSchema, i as ensureFreshAccessToken, l as saveAgentConfig, m as agentConfigSchema, o as loadCredentials, p as DEFAULT_HOME_DIR, u as saveCredentials, v as initConfig, w as resolveConfigReadonly, x as readConfigFile, y as loadAgents } from "../bootstrap-C_K2CKXC.mjs";
6
6
  import { a as print, n as CLI_USER_AGENT, o as setJsonMode, r as COMMAND_VERSION, t as cliFetch } from "../cli-fetch--tiwKm5S.mjs";
7
- import "../dist-ClFs4WMj.mjs";
8
- import { n as bindFeishuUser, t as bindFeishuBot } from "../feishu-AI3pwmqN.mjs";
9
- import "../errors-BmyRwN0Y-Dad3eV8F.mjs";
10
- import "../client-CLdRbuml-svTO0Eat.mjs";
11
- import "../src-aJMV60mR.mjs";
12
- import "../invitation-Dnn5gGGX-DXryyvRG.mjs";
7
+ import "../dist-UOZ6vMUW.mjs";
8
+ import { n as bindFeishuUser, t as bindFeishuBot } from "../feishu-C6qlhju2.mjs";
9
+ import "../errors-CF5evtJt-B0NTIVPt.mjs";
10
+ import "../src-DNBS5Yjj.mjs";
11
+ import "../client-BPUdUaZT-CyCrpCTP.mjs";
12
+ import "../invitation-Bg0TRiyx-BsZH4GCS.mjs";
13
13
  import { join } from "node:path";
14
14
  import { existsSync, mkdirSync, readFileSync, readdirSync } from "node:fs";
15
15
  import * as semver from "semver";
@@ -1670,13 +1670,13 @@ function isSecretField(schema, dotPath) {
1670
1670
  //#region src/commands/onboard.ts
1671
1671
  async function promptMissing(args) {
1672
1672
  if (!args.server) try {
1673
- const { resolveServerUrl } = await import("../bootstrap-D-Yf8yOc.mjs").then((n) => n.r);
1673
+ const { resolveServerUrl } = await import("../bootstrap-C_K2CKXC.mjs").then((n) => n.r);
1674
1674
  resolveServerUrl();
1675
1675
  } catch {
1676
1676
  args.server = await input({ message: "Hub server URL:" });
1677
1677
  saveOnboardState(args);
1678
1678
  }
1679
- const { loadCredentials } = await import("../bootstrap-D-Yf8yOc.mjs").then((n) => n.r);
1679
+ const { loadCredentials } = await import("../bootstrap-C_K2CKXC.mjs").then((n) => n.r);
1680
1680
  if (!loadCredentials()) throw new Error("No saved credentials. Run `first-tree-hub client connect <server-url>` before onboarding.");
1681
1681
  if (!args.id) {
1682
1682
  args.id = await input({ message: "Agent ID:" });
@@ -1798,6 +1798,67 @@ function registerOnboardCommand(program) {
1798
1798
  });
1799
1799
  }
1800
1800
  //#endregion
1801
+ //#region src/commands/org.ts
1802
+ /**
1803
+ * `first-tree-hub org` — organization-level operations.
1804
+ *
1805
+ * Today this only ships `bind-tree`, called by Step 3 onboarding agents
1806
+ * after they create a fresh context-tree GitHub repo so the Hub records
1807
+ * the binding in the org's `context_tree` settings namespace. The verb
1808
+ * mirrors first-tree CLI's own `tree bind` vocabulary so agents reading
1809
+ * "bind-tree" know what it means without translation. See
1810
+ * docs/new-user-onboarding-design.md §7.4 (Path B).
1811
+ */
1812
+ function registerOrgCommands(program) {
1813
+ program.command("org").description("Organization-level operations").command("bind-tree").description("Bind the caller's organization to a context-tree GitHub URL").argument("<url>", "GitHub URL of the context-tree repository (https://github.com/...)").option("--org <orgId>", "Override the org to bind. Defaults to your selected/default org via /me.").action(async (rawUrl, options) => {
1814
+ try {
1815
+ const url = rawUrl.trim();
1816
+ if (!url) fail("INVALID_URL", "URL must not be empty", 2);
1817
+ try {
1818
+ const parsed = new URL(url);
1819
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") fail("INVALID_URL", `URL scheme must be http or https (got ${parsed.protocol})`, 2);
1820
+ } catch {
1821
+ fail("INVALID_URL", `"${url}" is not a valid URL`, 2);
1822
+ }
1823
+ const serverUrl = resolveServerUrl();
1824
+ const accessToken = await ensureFreshAccessToken();
1825
+ const orgId = options.org?.trim() || await resolveDefaultOrgId(serverUrl, accessToken);
1826
+ const res = await fetch(`${serverUrl}/api/v1/orgs/${encodeURIComponent(orgId)}/settings/context_tree`, {
1827
+ method: "PUT",
1828
+ headers: {
1829
+ Authorization: `Bearer ${accessToken}`,
1830
+ "Content-Type": "application/json"
1831
+ },
1832
+ body: JSON.stringify({ repo: url })
1833
+ });
1834
+ if (!res.ok) {
1835
+ const text = await res.text().catch(() => "");
1836
+ fail("PUT_FAILED", `hub returned ${res.status} on PUT /orgs/${orgId}/settings/context_tree: ${text.slice(0, 256)}`, 1);
1837
+ }
1838
+ print.status("•", `Bound organization to context-tree at ${url}`);
1839
+ success({
1840
+ orgId,
1841
+ repo: url
1842
+ });
1843
+ } catch (err) {
1844
+ fail("UNEXPECTED", err instanceof Error ? err.message : String(err), 1);
1845
+ }
1846
+ });
1847
+ }
1848
+ async function resolveDefaultOrgId(serverUrl, accessToken) {
1849
+ const res = await fetch(`${serverUrl}/api/v1/me`, {
1850
+ headers: { Authorization: `Bearer ${accessToken}` },
1851
+ signal: AbortSignal.timeout(1e4)
1852
+ });
1853
+ if (!res.ok) fail("ME_FAILED", `hub returned ${res.status} on /me`, 1);
1854
+ const me = await res.json();
1855
+ const memberships = me.memberships ?? [];
1856
+ if (me.defaultOrganizationId && memberships.some((m) => m.organizationId === me.defaultOrganizationId)) return me.defaultOrganizationId;
1857
+ if (memberships.length === 1 && memberships[0]) return memberships[0].organizationId;
1858
+ if (memberships.length === 0) fail("NO_ORG", "You don't belong to any organization", 1);
1859
+ fail("AMBIGUOUS_ORG", "Multiple organizations — pass --org <orgId> explicitly or set a default in the web UI first", 1);
1860
+ }
1861
+ //#endregion
1801
1862
  //#region src/commands/server.ts
1802
1863
  function registerServerCommands(program) {
1803
1864
  const server = program.command("server").description("Manage First Tree Hub server");
@@ -1990,6 +2051,7 @@ registerAgentCommands(program);
1990
2051
  registerConfigCommands(program);
1991
2052
  registerUpdateCommand(program);
1992
2053
  registerOnboardCommand(program);
2054
+ registerOrgCommands(program);
1993
2055
  program.parse();
1994
2056
  //#endregion
1995
2057
  export {};