@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.
- package/dist/{bootstrap-D-Yf8yOc.mjs → bootstrap-C_K2CKXC.mjs} +7 -0
- package/dist/cli/index.mjs +73 -11
- package/dist/client-BPUdUaZT-CyCrpCTP.mjs +2033 -0
- package/dist/client-BhCtO2df-BGOu-rRN.mjs +7 -0
- package/dist/{dist-BQtAQNRD.mjs → dist-LgF7LHpE.mjs} +1 -1
- package/dist/{dist-ClFs4WMj.mjs → dist-UOZ6vMUW.mjs} +372 -197
- package/dist/drizzle/0033_onboarding_dismissed_at.sql +13 -0
- package/dist/drizzle/0034_pending_questions.sql +34 -0
- package/dist/drizzle/meta/_journal.json +14 -0
- package/dist/{errors-BmyRwN0Y-Dad3eV8F.mjs → errors-CF5evtJt-B0NTIVPt.mjs} +2 -1
- package/dist/{feishu-AI3pwmqN.mjs → feishu-C6qlhju2.mjs} +1 -1
- package/dist/{getMachineId-bsd-c2VImogj.mjs → getMachineId-bsd-BmasEOJr.mjs} +1 -1
- package/dist/{getMachineId-bsd-DyySs8xz.mjs → getMachineId-bsd-Dh3h0DDE.mjs} +1 -1
- package/dist/{getMachineId-darwin-Cl7TSzgO.mjs → getMachineId-darwin-CuhM3hfZ.mjs} +1 -1
- package/dist/{getMachineId-darwin-DKgI8b1d.mjs → getMachineId-darwin-D9wR0SLj.mjs} +1 -1
- package/dist/{getMachineId-linux-1OIMWfdh.mjs → getMachineId-linux-CYfb0oxZ.mjs} +1 -1
- package/dist/{getMachineId-linux-cT7EbP10.mjs → getMachineId-linux-D8ZaSjAC.mjs} +1 -1
- package/dist/{getMachineId-unsupported-CkX-YOG1.mjs → getMachineId-unsupported-Cu3iisaD.mjs} +1 -1
- package/dist/{getMachineId-unsupported-CmVlhzIo.mjs → getMachineId-unsupported-DZqI4ZT5.mjs} +1 -1
- package/dist/{getMachineId-win-C2cM60YT.mjs → getMachineId-win-8ZJbtrdf.mjs} +1 -1
- package/dist/{getMachineId-win-Chl03TYe.mjs → getMachineId-win-DT-hqwVp.mjs} +1 -1
- package/dist/index.mjs +9 -9
- package/dist/{invitation-Dnn5gGGX-DXryyvRG.mjs → invitation-Bg0TRiyx-BsZH4GCS.mjs} +2 -2
- package/dist/invitation-C299fxkP-KyCNax4T.mjs +4 -0
- package/dist/{observability-BAScT_5S-gw1ODB_o.mjs → observability-BAScT_5S-BcW9HgkG.mjs} +13 -13
- package/dist/{observability-CYsdAcoF.mjs → observability-eLA9iNK_.mjs} +3 -3
- package/dist/{saas-connect-CVoRK0Ex.mjs → saas-connect-Drn9g6cR.mjs} +1195 -1685
- package/dist/web/assets/index-B_Tf2I6v.css +1 -0
- package/dist/web/assets/{index-Bm6hgcvt.js → index-Bnyz7inW.js} +1 -1
- package/dist/web/assets/index-Dy3jIUX5.js +391 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/client-By1K4VVT-DuI6EnSh.mjs +0 -4
- package/dist/client-CLdRbuml-svTO0Eat.mjs +0 -524
- package/dist/invitation-DWlyNb8x-BvXubk24.mjs +0 -4
- package/dist/web/assets/index-fNb_M0nL.css +0 -1
- package/dist/web/assets/index-k2bWRKc-.js +0 -388
- /package/dist/{esm-Ci8E1Gtj.mjs → esm-iadMkGbV.mjs} +0 -0
- /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(), {
|
package/dist/cli/index.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "../observability-BAScT_5S-
|
|
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-
|
|
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-
|
|
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-
|
|
8
|
-
import { n as bindFeishuUser, t as bindFeishuBot } from "../feishu-
|
|
9
|
-
import "../errors-
|
|
10
|
-
import "../
|
|
11
|
-
import "../
|
|
12
|
-
import "../invitation-
|
|
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-
|
|
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-
|
|
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 {};
|