nolo-cli 0.8.0-alpha.2 → 0.8.0-alpha.21
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 +1 -1
- package/_executeModel-42U3VOVZ.js +205 -0
- package/action-TLI3V62L.js +28 -0
- package/addContentAction-57RSIIMR.js +26 -0
- package/addDialogAgentAction-G3VWEA6E.js +68 -0
- package/agentDeleteCommand-5DD2IM3J.js +327 -0
- package/agentEmailCommands-6FACJBU4.js +628 -0
- package/agentListCommands-I6KZYCIG.js +223 -0
- package/agentMachineCommands-VKLIGMZA.js +425 -0
- package/agentPullCommand-O2MTUAFR.js +122 -0
- package/agentRecordCommands-7TZICYDT.js +96 -0
- package/agentRunCommand-L4OM23KV.js +114 -0
- package/agentRunControl-K4VKNEHF.js +57 -0
- package/agentRuntimeLocal-ZYEIPTY4.js +104 -0
- package/agentSlice-BX7GXSNO.js +42 -0
- package/authCommand-EB5JSOX5.js +581 -0
- package/authCommands-XPEHTKSM.js +35 -0
- package/chunk-25LCXTML.js +175 -0
- package/chunk-2ECQG4YX.js +22296 -0
- package/chunk-2FTTDCD4.js +675 -0
- package/chunk-2JCXITPK.js +1078 -0
- package/chunk-3ASDTTEI.js +1774 -0
- package/chunk-3EUW3WEO.js +8 -0
- package/chunk-3LY4F7SV.js +9293 -0
- package/chunk-4CQLVGRV.js +50 -0
- package/chunk-4IJYA27C.js +342 -0
- package/chunk-4O3CARJ4.js +231 -0
- package/chunk-4QEWT7KD.js +933 -0
- package/chunk-4SN6J65J.js +38 -0
- package/chunk-4VNS5WPM.js +42 -0
- package/chunk-4XENYTF5.js +222 -0
- package/chunk-4ZDM73SD.js +34 -0
- package/chunk-5CS33IBL.js +301 -0
- package/chunk-5EFXE3O7.js +138 -0
- package/chunk-5KLGBAAR.js +386 -0
- package/chunk-5MIDPSSK.js +206 -0
- package/chunk-5MMAK75Q.js +15 -0
- package/chunk-63W5N6P3.js +150 -0
- package/chunk-6HYVJV7B.js +102 -0
- package/chunk-6KHNO3SK.js +1948 -0
- package/chunk-6WD3OOJS.js +20 -0
- package/chunk-7DAJ4AI4.js +191 -0
- package/chunk-7GNGZRLZ.js +1939 -0
- package/chunk-7KCUSYT2.js +354 -0
- package/chunk-7U44LYTR.js +238 -0
- package/chunk-AFON4QUU.js +112 -0
- package/chunk-AGFH73SK.js +239 -0
- package/chunk-AL2KDGR2.js +27339 -0
- package/chunk-AS4PVWA4.js +221 -0
- package/chunk-ATNTHIZI.js +13 -0
- package/chunk-AVMKZHBC.js +85 -0
- package/chunk-AZPCASRE.js +36 -0
- package/chunk-BBYVOSU2.js +792 -0
- package/chunk-C3RUNRHT.js +51 -0
- package/chunk-C4FTUXVF.js +146 -0
- package/chunk-CF2WZF4N.js +134 -0
- package/chunk-CF7PE763.js +10 -0
- package/chunk-CKOJQDKR.js +198 -0
- package/chunk-CMKUBIGW.js +1550 -0
- package/chunk-CWMSB67P.js +34 -0
- package/chunk-DCOA4QSN.js +105 -0
- package/chunk-DFFIZ25G.js +30 -0
- package/chunk-DSZUWUYB.js +478 -0
- package/chunk-DWLEOOGR.js +8 -0
- package/chunk-DZ3XJVET.js +231 -0
- package/chunk-EHLHSX7R.js +1433 -0
- package/chunk-ENOG22KJ.js +939 -0
- package/chunk-FSO5B7GH.js +171 -0
- package/chunk-FVYY6MCS.js +1447 -0
- package/chunk-G3SUCT4W.js +8 -0
- package/chunk-GAKEBQD6.js +30 -0
- package/chunk-GBRG75BQ.js +86 -0
- package/chunk-GU3PEVGZ.js +4723 -0
- package/chunk-H33743XH.js +25 -0
- package/chunk-HNMXYYJR.js +12 -0
- package/chunk-HNW7IJSK.js +71 -0
- package/chunk-I42VC5KR.js +15 -0
- package/chunk-I6XMPTMR.js +113 -0
- package/chunk-IDZTNRP2.js +85 -0
- package/chunk-ISNCLGUZ.js +146 -0
- package/chunk-IWX4UW2E.js +548 -0
- package/chunk-JBTJAPUF.js +35 -0
- package/chunk-JEXVIMYZ.js +55 -0
- package/chunk-JRKKFRAV.js +537 -0
- package/chunk-JZPBVBIY.js +94 -0
- package/chunk-KKY4B2Q2.js +21 -0
- package/chunk-KQHGZWSV.js +63 -0
- package/chunk-KUG52IAP.js +8 -0
- package/chunk-KX6YBIHG.js +8 -0
- package/chunk-LCBAMY2M.js +60 -0
- package/chunk-LM6IYQ3F.js +16 -0
- package/chunk-LTRXGFMS.js +83 -0
- package/chunk-M76ECQRD.js +13658 -0
- package/chunk-MRC4Q34M.js +188 -0
- package/chunk-MTU75CZ2.js +91 -0
- package/chunk-N54XAP77.js +19 -0
- package/chunk-O2ZNTTET.js +3272 -0
- package/chunk-O4BU24WZ.js +3212 -0
- package/chunk-OLZBQWZU.js +6 -0
- package/chunk-OOSFSFMA.js +271 -0
- package/chunk-OPZYGHUC.js +89 -0
- package/chunk-OWOHNGCN.js +50 -0
- package/chunk-P3PKED2I.js +962 -0
- package/chunk-QSJ3HFEF.js +8 -0
- package/chunk-RCSJFQPB.js +9036 -0
- package/chunk-RL776AGR.js +190 -0
- package/chunk-ROWQEJRP.js +139 -0
- package/chunk-S7Z2HMCN.js +25 -0
- package/chunk-SDJDLO5W.js +628 -0
- package/chunk-SOTZ6RDN.js +69 -0
- package/chunk-TILFE6LV.js +381 -0
- package/chunk-U4TRT5V4.js +246 -0
- package/chunk-U6VC4MU4.js +8 -0
- package/chunk-UAD2WT54.js +64 -0
- package/chunk-UB6SN4NJ.js +421 -0
- package/chunk-URUUZLPA.js +807 -0
- package/chunk-UTLZINAP.js +3066 -0
- package/chunk-VC6OZXO5.js +298 -0
- package/chunk-VF4K2QE6.js +21 -0
- package/chunk-VHBWHNVT.js +59 -0
- package/chunk-VIDPVFP3.js +20 -0
- package/chunk-VP4WJWKW.js +8882 -0
- package/chunk-VUW5FBDB.js +573 -0
- package/chunk-VVX233PH.js +482 -0
- package/chunk-VX3SXJ3N.js +2052 -0
- package/chunk-W4NVOSFF.js +37 -0
- package/chunk-WWC7I6TA.js +8 -0
- package/chunk-WZSRQNQG.js +2587 -0
- package/chunk-XBUBEFNX.js +34 -0
- package/chunk-XENYHRUE.js +104 -0
- package/chunk-Y5GCAMGP.js +9 -0
- package/chunk-YPRZSPF3.js +148 -0
- package/chunk-Z4NR32XR.js +50 -0
- package/chunk-ZNFJWEN4.js +56 -0
- package/cliExecutor-K3F7DMRO.js +36 -0
- package/clipboardy-BVE3LVEH.js +12001 -0
- package/createAgentAutomationAction-RJF3N2QY.js +866 -0
- package/createDialogAction-DRSPS6CE.js +55 -0
- package/createPageAction-6B2WMNO3.js +172 -0
- package/db-HCJ5PRB5.js +271 -0
- package/dbSlice-Q3TM2FJV.js +60 -0
- package/deleteFile-OW53A6BX.js +41 -0
- package/dialogCommands-4IX4XIZE.js +63 -0
- package/dialogSlice-3M7KX2TX.js +148 -0
- package/docCreateCommands-SIL3NPGT.js +220 -0
- package/docDeleteCommands-7IOMLUS4.js +181 -0
- package/docReadCommands-FNFXUA5L.js +134 -0
- package/docStore-SV7E34D4.js +98 -0
- package/docUpdateCommands-X2HNDVUC.js +318 -0
- package/fetchMessages-KTNM7QAR.js +17 -0
- package/getPricing-3E6UNPKL.js +30 -0
- package/handleSendMessageAction-JYETO5RZ.js +185 -0
- package/index.js +188 -112958
- package/lib-FYYBQIXS.js +19839 -0
- package/localDialogRead-2VRI24F4.js +26 -0
- package/localFirstLog-DHNOY2NA.js +19 -0
- package/localRuntimeAuthority-TEGCOWX4.js +471 -0
- package/localRuntimeDb-LGDF6FQP.js +12 -0
- package/machineCommands-RIO3RP5Q.js +781 -0
- package/machineInfo-M6KB6HZN.js +10 -0
- package/machineWsRunDispatch-W7UYLGB5.js +112 -0
- package/memoryCommands-O4MIPIWQ.js +476 -0
- package/models-4OPOOLFS.js +9 -0
- package/offlineMarxistsAgentCommand-BCPJITJL.js +242 -0
- package/package.json +4 -24
- package/read-GW7ZEI23.js +17 -0
- package/readDocTool-HUFU6OCT.js +16 -0
- package/readlineWorkspace-27JR7WPW.js +5682 -0
- package/removeDialogAgentAction-CXKR4NJI.js +73 -0
- package/runAgentClientLoop-HZFAPJHS.js +293 -0
- package/runtimeDoctorCommands-LRHLPDRC.js +289 -0
- package/setDialogExtraReferencesAction-6RKUSXHX.js +60 -0
- package/setPrimaryDialogAgentAction-T3UTBEFG.js +80 -0
- package/settingSlice-IVKXJXMG.js +199 -0
- package/skillDiscovery-UGSQGX2U.js +16 -0
- package/skillSummaryMarker-42HKSXYY.js +9 -0
- package/slateToRenderMarkdown-Y5IYN73U.js +7 -0
- package/slateUtils-2M7MUTWX.js +19 -0
- package/spaceCommands-E7VOF4LO.js +450 -0
- package/spaceSlice-TSVROA5U.js +149 -0
- package/streamAgentChatTurn-3C5RQZJF.js +4510 -0
- package/tableCommands-O7O2LBEG.js +1286 -0
- package/toolApiClient-QI3YBNWB.js +26 -0
- package/tools-EQDEKR6N.js +87 -0
- package/tuiSummaryLlmCaller-RV3THLZF.js +78 -0
- package/understanding-3CUQQ6SV.js +271 -0
- package/updateCommands-VOSPKXFF.js +31 -0
- package/updateDialogTitleAction-3XV7VWSZ.js +188 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
asOptionalTrimmedString
|
|
3
|
+
} from "./chunk-G3SUCT4W.js";
|
|
4
|
+
import {
|
|
5
|
+
isRecord
|
|
6
|
+
} from "./chunk-KUG52IAP.js";
|
|
7
|
+
|
|
8
|
+
// packages/cli/cliSpaceHelpers.ts
|
|
9
|
+
function normalizeSpaceIdInput(rawInput) {
|
|
10
|
+
const raw = rawInput.trim();
|
|
11
|
+
if (!raw) return "";
|
|
12
|
+
let candidate = raw;
|
|
13
|
+
if (raw.startsWith("http://") || raw.startsWith("https://")) {
|
|
14
|
+
const match = new URL(raw).pathname.match(/^\/space\/([^/?#]+)/);
|
|
15
|
+
if (!match?.[1]) return "";
|
|
16
|
+
candidate = decodeURIComponent(match[1]);
|
|
17
|
+
}
|
|
18
|
+
return candidate.startsWith("space-") ? candidate.slice("space-".length) : candidate;
|
|
19
|
+
}
|
|
20
|
+
function buildSpaceLookup(rawInput) {
|
|
21
|
+
const spaceId = normalizeSpaceIdInput(rawInput);
|
|
22
|
+
return {
|
|
23
|
+
spaceId,
|
|
24
|
+
spaceKey: spaceId ? `space-${spaceId}` : ""
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function getSpaceContentKeys(spaceRecord) {
|
|
28
|
+
const keys = /* @__PURE__ */ new Set();
|
|
29
|
+
const contents = spaceRecord?.contents;
|
|
30
|
+
if (!contents || typeof contents !== "object") return keys;
|
|
31
|
+
for (const [entryKey, value] of Object.entries(contents)) {
|
|
32
|
+
const trimmedEntryKey = asOptionalTrimmedString(entryKey);
|
|
33
|
+
if (trimmedEntryKey) {
|
|
34
|
+
keys.add(trimmedEntryKey);
|
|
35
|
+
}
|
|
36
|
+
if (isRecord(value)) {
|
|
37
|
+
const contentKey = asOptionalTrimmedString(value.contentKey);
|
|
38
|
+
if (contentKey) {
|
|
39
|
+
keys.add(contentKey);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return keys;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
normalizeSpaceIdInput,
|
|
48
|
+
buildSpaceLookup,
|
|
49
|
+
getSpaceContentKeys
|
|
50
|
+
};
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import {
|
|
2
|
+
generatePkcePair,
|
|
3
|
+
startCallbackServer
|
|
4
|
+
} from "./chunk-EHLHSX7R.js";
|
|
5
|
+
import {
|
|
6
|
+
toErrorMessage
|
|
7
|
+
} from "./chunk-HNMXYYJR.js";
|
|
8
|
+
import {
|
|
9
|
+
asOptionalFiniteNumber
|
|
10
|
+
} from "./chunk-WWC7I6TA.js";
|
|
11
|
+
|
|
12
|
+
// packages/cli/oauth/flows/cloudflare.ts
|
|
13
|
+
var CLOUDFLARE_OAUTH_AUTH_ENDPOINT = "https://dash.cloudflare.com/oauth2/auth";
|
|
14
|
+
var CLOUDFLARE_OAUTH_TOKEN_ENDPOINT = "https://dash.cloudflare.com/oauth2/token";
|
|
15
|
+
var CLOUDFLARE_API_BASE = "https://api.cloudflare.com/client/v4";
|
|
16
|
+
var CLOUDFLARE_OAUTH_REDIRECT_HOST = "127.0.0.1";
|
|
17
|
+
var CLOUDFLARE_OAUTH_REDIRECT_PORT = 56122;
|
|
18
|
+
var CLOUDFLARE_OAUTH_REDIRECT_PATH = "/callback";
|
|
19
|
+
var ACCESS_TOKEN_CLIENT_SKEW_MS = 5 * 60 * 1e3;
|
|
20
|
+
var TOKEN_REQUEST_TIMEOUT_MS = 2e4;
|
|
21
|
+
var DEFAULT_SCOPE = "account:read zone:read zone:edit user:read user:edit";
|
|
22
|
+
function generateState() {
|
|
23
|
+
const bytes = new Uint8Array(16);
|
|
24
|
+
crypto.getRandomValues(bytes);
|
|
25
|
+
return Array.from(bytes).map((value) => value.toString(16).padStart(2, "0")).join("");
|
|
26
|
+
}
|
|
27
|
+
function getClientId(args) {
|
|
28
|
+
const value = args?.clientId?.trim() || process.env.CLOUDFLARE_OAUTH_CLIENT_ID?.trim();
|
|
29
|
+
if (!value) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
"Cloudflare OAuth client ID is required. Set CLOUDFLARE_OAUTH_CLIENT_ID or pass --client-id."
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function getScope(args) {
|
|
37
|
+
return args?.scope?.trim() || process.env.CLOUDFLARE_OAUTH_SCOPE?.trim() || DEFAULT_SCOPE;
|
|
38
|
+
}
|
|
39
|
+
function buildCloudflareAuthorizeUrl(opts) {
|
|
40
|
+
const params = new URLSearchParams({
|
|
41
|
+
response_type: "code",
|
|
42
|
+
client_id: opts.clientId,
|
|
43
|
+
redirect_uri: opts.redirectUri,
|
|
44
|
+
scope: opts.scope,
|
|
45
|
+
code_challenge: opts.codeChallenge,
|
|
46
|
+
code_challenge_method: "S256",
|
|
47
|
+
state: opts.state
|
|
48
|
+
});
|
|
49
|
+
return `${CLOUDFLARE_OAUTH_AUTH_ENDPOINT}?${params.toString()}`;
|
|
50
|
+
}
|
|
51
|
+
async function exchangeCloudflareToken(fetchImpl, code, redirectUri, verifier, clientId) {
|
|
52
|
+
const body = new URLSearchParams({
|
|
53
|
+
grant_type: "authorization_code",
|
|
54
|
+
client_id: clientId,
|
|
55
|
+
code,
|
|
56
|
+
redirect_uri: redirectUri,
|
|
57
|
+
code_verifier: verifier
|
|
58
|
+
});
|
|
59
|
+
const response = await fetchImpl(CLOUDFLARE_OAUTH_TOKEN_ENDPOINT, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: {
|
|
62
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
63
|
+
Accept: "application/json"
|
|
64
|
+
},
|
|
65
|
+
body,
|
|
66
|
+
signal: AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS)
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
let detail = "";
|
|
70
|
+
try {
|
|
71
|
+
detail = (await response.text()).trim();
|
|
72
|
+
} catch {
|
|
73
|
+
}
|
|
74
|
+
throw new Error(
|
|
75
|
+
`Cloudflare token exchange failed: ${response.status}${detail ? ` ${detail}` : ""}`
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
const data = await response.json();
|
|
79
|
+
if (typeof data.access_token !== "string" || !data.access_token) {
|
|
80
|
+
throw new Error("Cloudflare token exchange response missing access_token");
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
accessToken: data.access_token,
|
|
84
|
+
refreshToken: typeof data.refresh_token === "string" ? data.refresh_token : void 0,
|
|
85
|
+
expiresIn: asOptionalFiniteNumber(data.expires_in),
|
|
86
|
+
scope: typeof data.scope === "string" ? data.scope : void 0,
|
|
87
|
+
idToken: typeof data.id_token === "string" ? data.id_token : void 0
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async function runCloudflareOAuthLogin(deps = {}) {
|
|
91
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
92
|
+
const output = deps.output ?? console;
|
|
93
|
+
const error = deps.error ?? console;
|
|
94
|
+
const clientId = getClientId(deps);
|
|
95
|
+
const scope = getScope(deps);
|
|
96
|
+
const redirectUri = `http://${CLOUDFLARE_OAUTH_REDIRECT_HOST}:${CLOUDFLARE_OAUTH_REDIRECT_PORT}${CLOUDFLARE_OAUTH_REDIRECT_PATH}`;
|
|
97
|
+
let handle;
|
|
98
|
+
try {
|
|
99
|
+
handle = await startCallbackServer({
|
|
100
|
+
port: CLOUDFLARE_OAUTH_REDIRECT_PORT,
|
|
101
|
+
hostname: CLOUDFLARE_OAUTH_REDIRECT_HOST,
|
|
102
|
+
timeoutMs: 5 * 6e4
|
|
103
|
+
});
|
|
104
|
+
} catch (err) {
|
|
105
|
+
throw new Error(
|
|
106
|
+
`Failed to start Cloudflare OAuth callback server on ${CLOUDFLARE_OAUTH_REDIRECT_PORT}: ${toErrorMessage(err)}`
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const state = generateState();
|
|
111
|
+
const pkce = await generatePkcePair();
|
|
112
|
+
const authUrl = buildCloudflareAuthorizeUrl({
|
|
113
|
+
redirectUri,
|
|
114
|
+
codeChallenge: pkce.challenge,
|
|
115
|
+
state,
|
|
116
|
+
clientId,
|
|
117
|
+
scope
|
|
118
|
+
});
|
|
119
|
+
output.log(
|
|
120
|
+
`Open the following URL in your browser to authorize Cloudflare access:
|
|
121
|
+
${authUrl}
|
|
122
|
+
|
|
123
|
+
Requested scopes: ${scope}`
|
|
124
|
+
);
|
|
125
|
+
if (deps.openBrowser) {
|
|
126
|
+
try {
|
|
127
|
+
await deps.openBrowser(authUrl);
|
|
128
|
+
} catch (err) {
|
|
129
|
+
error.error(
|
|
130
|
+
`Failed to open browser automatically: ${toErrorMessage(err)}`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const callback = await handle.waitForCode();
|
|
135
|
+
const token = await exchangeCloudflareToken(
|
|
136
|
+
fetchImpl,
|
|
137
|
+
callback.code,
|
|
138
|
+
redirectUri,
|
|
139
|
+
pkce.verifier,
|
|
140
|
+
clientId
|
|
141
|
+
);
|
|
142
|
+
const now = (deps.now ?? Date.now)();
|
|
143
|
+
const expiresIn = token.expiresIn;
|
|
144
|
+
return {
|
|
145
|
+
provider: "cloudflare",
|
|
146
|
+
accessToken: token.accessToken,
|
|
147
|
+
refreshToken: token.refreshToken,
|
|
148
|
+
expiresAt: typeof expiresIn === "number" ? now + expiresIn * 1e3 - ACCESS_TOKEN_CLIENT_SKEW_MS : void 0,
|
|
149
|
+
scope: token.scope,
|
|
150
|
+
idToken: token.idToken,
|
|
151
|
+
obtainedAt: now
|
|
152
|
+
};
|
|
153
|
+
} finally {
|
|
154
|
+
await handle.close();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function createCloudflareApiToken(input) {
|
|
158
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
159
|
+
const response = await fetchImpl(`${CLOUDFLARE_API_BASE}/user/tokens`, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: {
|
|
162
|
+
"Content-Type": "application/json",
|
|
163
|
+
Authorization: `Bearer ${input.accessToken}`
|
|
164
|
+
},
|
|
165
|
+
body: JSON.stringify({
|
|
166
|
+
name: input.name,
|
|
167
|
+
policies: input.policies
|
|
168
|
+
}),
|
|
169
|
+
signal: AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS)
|
|
170
|
+
});
|
|
171
|
+
if (!response.ok) {
|
|
172
|
+
let detail = "";
|
|
173
|
+
try {
|
|
174
|
+
detail = (await response.text()).trim();
|
|
175
|
+
} catch {
|
|
176
|
+
}
|
|
177
|
+
throw new Error(
|
|
178
|
+
`Cloudflare API token creation failed: ${response.status}${detail ? ` ${detail}` : ""}`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
const data = await response.json();
|
|
182
|
+
const tokenValue = data.result?.value;
|
|
183
|
+
if (typeof tokenValue !== "string" || !tokenValue) {
|
|
184
|
+
throw new Error(
|
|
185
|
+
"Cloudflare API token creation response did not contain a token value"
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return tokenValue;
|
|
189
|
+
}
|
|
190
|
+
async function listCloudflarePermissionGroups(accessToken, fetchImpl = fetch) {
|
|
191
|
+
const response = await fetchImpl(
|
|
192
|
+
`${CLOUDFLARE_API_BASE}/user/tokens/permission_groups`,
|
|
193
|
+
{
|
|
194
|
+
method: "GET",
|
|
195
|
+
headers: {
|
|
196
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197
|
+
Accept: "application/json"
|
|
198
|
+
},
|
|
199
|
+
signal: AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS)
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
let detail = "";
|
|
204
|
+
try {
|
|
205
|
+
detail = (await response.text()).trim();
|
|
206
|
+
} catch {
|
|
207
|
+
}
|
|
208
|
+
throw new Error(
|
|
209
|
+
`Cloudflare permission groups lookup failed: ${response.status}${detail ? ` ${detail}` : ""}`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
const data = await response.json();
|
|
213
|
+
if (!Array.isArray(data.result)) {
|
|
214
|
+
throw new Error("Cloudflare permission groups response missing result array");
|
|
215
|
+
}
|
|
216
|
+
return data.result.filter(
|
|
217
|
+
(group) => typeof group.id === "string" && typeof group.name === "string" && Array.isArray(group.permissions)
|
|
218
|
+
).map((group) => ({
|
|
219
|
+
id: group.id,
|
|
220
|
+
name: group.name,
|
|
221
|
+
permissions: group.permissions
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
async function findCloudflareZoneIdByName(accessToken, zoneName, fetchImpl = fetch) {
|
|
225
|
+
const response = await fetchImpl(
|
|
226
|
+
`${CLOUDFLARE_API_BASE}/zones?name=${encodeURIComponent(zoneName)}`,
|
|
227
|
+
{
|
|
228
|
+
method: "GET",
|
|
229
|
+
headers: {
|
|
230
|
+
Authorization: `Bearer ${accessToken}`,
|
|
231
|
+
Accept: "application/json"
|
|
232
|
+
},
|
|
233
|
+
signal: AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS)
|
|
234
|
+
}
|
|
235
|
+
);
|
|
236
|
+
if (!response.ok) {
|
|
237
|
+
let detail = "";
|
|
238
|
+
try {
|
|
239
|
+
detail = (await response.text()).trim();
|
|
240
|
+
} catch {
|
|
241
|
+
}
|
|
242
|
+
throw new Error(
|
|
243
|
+
`Cloudflare zone lookup failed: ${response.status}${detail ? ` ${detail}` : ""}`
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
const data = await response.json();
|
|
247
|
+
if (!Array.isArray(data.result)) {
|
|
248
|
+
throw new Error("Cloudflare zone lookup response missing result array");
|
|
249
|
+
}
|
|
250
|
+
const zone = data.result.find((z) => z.name === zoneName);
|
|
251
|
+
return zone?.id ?? null;
|
|
252
|
+
}
|
|
253
|
+
async function generateCloudflareEmailRoutingToken(input) {
|
|
254
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
255
|
+
const zoneId = await findCloudflareZoneIdByName(
|
|
256
|
+
input.accessToken,
|
|
257
|
+
input.zoneName,
|
|
258
|
+
fetchImpl
|
|
259
|
+
);
|
|
260
|
+
if (!zoneId) {
|
|
261
|
+
throw new Error(`Cloudflare zone "${input.zoneName}" not found`);
|
|
262
|
+
}
|
|
263
|
+
const groups = await listCloudflarePermissionGroups(
|
|
264
|
+
input.accessToken,
|
|
265
|
+
fetchImpl
|
|
266
|
+
);
|
|
267
|
+
const emailRoutingGroup = groups.find(
|
|
268
|
+
(g) => g.name.toLowerCase().includes("email routing")
|
|
269
|
+
);
|
|
270
|
+
if (!emailRoutingGroup) {
|
|
271
|
+
throw new Error(
|
|
272
|
+
"Cloudflare Email Routing Edit permission group not found for this account."
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
const token = await createCloudflareApiToken({
|
|
276
|
+
name: input.tokenName ?? `nolo-email-routing-${input.zoneName}-${Date.now()}`,
|
|
277
|
+
policies: [buildEmailRoutingPolicy(zoneId, [emailRoutingGroup.id])],
|
|
278
|
+
accessToken: input.accessToken,
|
|
279
|
+
fetchImpl
|
|
280
|
+
});
|
|
281
|
+
return { token, zoneId };
|
|
282
|
+
}
|
|
283
|
+
function buildEmailRoutingPolicy(zoneId, emailRoutingPermissionGroupIds) {
|
|
284
|
+
if (emailRoutingPermissionGroupIds.length === 0) {
|
|
285
|
+
throw new Error(
|
|
286
|
+
"Email routing permission group IDs are required. Resolve them with listCloudflarePermissionGroups."
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
effect: "allow",
|
|
291
|
+
resources: {
|
|
292
|
+
"com.cloudflare.api.account": "*",
|
|
293
|
+
"com.cloudflare.api.zone": zoneId
|
|
294
|
+
},
|
|
295
|
+
permission_groups: emailRoutingPermissionGroupIds.map((id) => ({ id }))
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// packages/cli/oauth/envFile.ts
|
|
300
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
301
|
+
import { resolve } from "node:path";
|
|
302
|
+
function upsertEnvVariable(filePath, key, value) {
|
|
303
|
+
const normalizedPath = resolve(filePath);
|
|
304
|
+
let content = "";
|
|
305
|
+
if (existsSync(normalizedPath)) {
|
|
306
|
+
content = readFileSync(normalizedPath, "utf8");
|
|
307
|
+
}
|
|
308
|
+
const lines = content.length > 0 ? content.split("\n") : [];
|
|
309
|
+
const keyPrefix = `${key}=`;
|
|
310
|
+
let replaced = false;
|
|
311
|
+
const newLines = lines.map((line) => {
|
|
312
|
+
const trimmed = line.trim();
|
|
313
|
+
if (trimmed.startsWith(keyPrefix) || trimmed.startsWith(`${key} =`)) {
|
|
314
|
+
replaced = true;
|
|
315
|
+
return `${key}=${value}`;
|
|
316
|
+
}
|
|
317
|
+
return line;
|
|
318
|
+
});
|
|
319
|
+
if (!replaced) {
|
|
320
|
+
if (newLines.length > 0 && newLines[newLines.length - 1] !== "") {
|
|
321
|
+
newLines.push("");
|
|
322
|
+
}
|
|
323
|
+
newLines.push(`${key}=${value}`);
|
|
324
|
+
}
|
|
325
|
+
writeFileSync(normalizedPath, newLines.join("\n"), "utf8");
|
|
326
|
+
}
|
|
327
|
+
function parseFlagWithOptionalValue(args, flag) {
|
|
328
|
+
const index = args.indexOf(flag);
|
|
329
|
+
if (index === -1) return void 0;
|
|
330
|
+
const next = args[index + 1];
|
|
331
|
+
if (next && !next.startsWith("--")) {
|
|
332
|
+
return next;
|
|
333
|
+
}
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export {
|
|
338
|
+
runCloudflareOAuthLogin,
|
|
339
|
+
generateCloudflareEmailRoutingToken,
|
|
340
|
+
upsertEnvVariable,
|
|
341
|
+
parseFlagWithOptionalValue
|
|
342
|
+
};
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_AGENT_BASE_POLICY,
|
|
3
|
+
DEFAULT_USER_PREFERENCE_PROFILE
|
|
4
|
+
} from "./chunk-VX3SXJ3N.js";
|
|
5
|
+
|
|
6
|
+
// packages/ai/policy/runtimePolicy.ts
|
|
7
|
+
var clampLevel = (value, fallback) => {
|
|
8
|
+
const n = Number(value);
|
|
9
|
+
if (n === 1 || n === 2 || n === 3 || n === 4) {
|
|
10
|
+
return n;
|
|
11
|
+
}
|
|
12
|
+
return fallback;
|
|
13
|
+
};
|
|
14
|
+
var normalizeTonePreset = (value, fallback) => {
|
|
15
|
+
switch (value) {
|
|
16
|
+
case "professional":
|
|
17
|
+
case "friendly":
|
|
18
|
+
case "direct":
|
|
19
|
+
case "pragmatic":
|
|
20
|
+
case "default":
|
|
21
|
+
return value;
|
|
22
|
+
default:
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var normalizeToneResolutionMode = (value, fallback) => {
|
|
27
|
+
switch (value) {
|
|
28
|
+
case "agent_first":
|
|
29
|
+
case "user_first":
|
|
30
|
+
case "blend":
|
|
31
|
+
return value;
|
|
32
|
+
default:
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var normalizeSelfEvolutionMode = (value, fallback) => {
|
|
37
|
+
switch (value) {
|
|
38
|
+
case "none":
|
|
39
|
+
case "knowledge_only":
|
|
40
|
+
case "prompt_and_refs":
|
|
41
|
+
case "full":
|
|
42
|
+
return value;
|
|
43
|
+
default:
|
|
44
|
+
return fallback;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var resolveAgentBasePolicy = (agentConfig) => {
|
|
48
|
+
const raw = agentConfig?.basePolicy ?? {};
|
|
49
|
+
return {
|
|
50
|
+
version: 1,
|
|
51
|
+
tone: {
|
|
52
|
+
preset: normalizeTonePreset(
|
|
53
|
+
raw?.tone?.preset,
|
|
54
|
+
DEFAULT_AGENT_BASE_POLICY.tone?.preset ?? "default"
|
|
55
|
+
),
|
|
56
|
+
resolutionMode: normalizeToneResolutionMode(
|
|
57
|
+
raw?.tone?.resolutionMode,
|
|
58
|
+
DEFAULT_AGENT_BASE_POLICY.tone?.resolutionMode ?? "blend"
|
|
59
|
+
)
|
|
60
|
+
},
|
|
61
|
+
knowledgeCaptureMaxLevel: clampLevel(
|
|
62
|
+
raw?.knowledgeCaptureMaxLevel,
|
|
63
|
+
DEFAULT_AGENT_BASE_POLICY.knowledgeCaptureMaxLevel
|
|
64
|
+
),
|
|
65
|
+
spaceContextMaxLevel: clampLevel(
|
|
66
|
+
raw?.spaceContextMaxLevel,
|
|
67
|
+
DEFAULT_AGENT_BASE_POLICY.spaceContextMaxLevel
|
|
68
|
+
),
|
|
69
|
+
selfEvolutionMode: normalizeSelfEvolutionMode(
|
|
70
|
+
raw?.selfEvolutionMode,
|
|
71
|
+
DEFAULT_AGENT_BASE_POLICY.selfEvolutionMode
|
|
72
|
+
)
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
var resolveUserPreferenceProfile = (settingsRecord) => {
|
|
76
|
+
const fallbackSpaceLevel = settingsRecord?.enableReadCurrentSpace === false ? 1 : DEFAULT_USER_PREFERENCE_PROFILE.spaceContextLevel;
|
|
77
|
+
return {
|
|
78
|
+
version: 1,
|
|
79
|
+
tone: {
|
|
80
|
+
preset: normalizeTonePreset(
|
|
81
|
+
settingsRecord?.userTonePreset,
|
|
82
|
+
DEFAULT_USER_PREFERENCE_PROFILE.tone?.preset ?? "default"
|
|
83
|
+
)
|
|
84
|
+
},
|
|
85
|
+
knowledgeCaptureLevel: clampLevel(
|
|
86
|
+
settingsRecord?.knowledgeCaptureLevel,
|
|
87
|
+
DEFAULT_USER_PREFERENCE_PROFILE.knowledgeCaptureLevel
|
|
88
|
+
),
|
|
89
|
+
spaceContextLevel: clampLevel(
|
|
90
|
+
settingsRecord?.spaceContextLevel,
|
|
91
|
+
fallbackSpaceLevel
|
|
92
|
+
)
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
var containsAny = (text, patterns) => patterns.some((pattern) => text.includes(pattern));
|
|
96
|
+
var inferCaptureIntent = (userInput) => {
|
|
97
|
+
const normalized = userInput.toLowerCase();
|
|
98
|
+
if (containsAny(normalized, [
|
|
99
|
+
"\u4FDD\u5B58",
|
|
100
|
+
"\u5B58\u4E00\u4E0B",
|
|
101
|
+
"\u6C89\u6DC0",
|
|
102
|
+
"\u8BB0\u4F4F",
|
|
103
|
+
"\u5199\u5165\u6587\u6863",
|
|
104
|
+
"\u5EFA\u6587\u6863",
|
|
105
|
+
"\u521B\u5EFA\u6587\u6863",
|
|
106
|
+
"\u5BFC\u5165 skill",
|
|
107
|
+
"\u5BFC\u5165\u8FD9\u4E2A skill",
|
|
108
|
+
"\u786E\u8BA4\u5BFC\u5165",
|
|
109
|
+
"\u786E\u8BA4\u5BFC\u5165\u8FD9\u4E2A skill",
|
|
110
|
+
"\u5BFC\u5165\u8FD9\u4E2A\u6280\u80FD",
|
|
111
|
+
"\u786E\u8BA4\u5BFC\u5165\u8FD9\u4E2A\u6280\u80FD",
|
|
112
|
+
"\u521B\u5EFA skill",
|
|
113
|
+
"\u521B\u5EFA\u8FD9\u4E2A skill",
|
|
114
|
+
"skill \u6587\u6863",
|
|
115
|
+
"\u521B\u5EFA\u8868\u683C",
|
|
116
|
+
"createtable",
|
|
117
|
+
"addtablerow",
|
|
118
|
+
"addtablerows",
|
|
119
|
+
"\u5EFA\u8868",
|
|
120
|
+
"\u5EFA\u4E2A\u8868",
|
|
121
|
+
"\u505A\u4E2A\u8868",
|
|
122
|
+
"\u505A\u4E00\u5F20\u8868",
|
|
123
|
+
"\u5199\u8868",
|
|
124
|
+
"\u5199\u5165\u8868",
|
|
125
|
+
"\u5199\u5165\u4E00\u884C",
|
|
126
|
+
"\u5199\u5165 table",
|
|
127
|
+
"\u653E\u5230 table",
|
|
128
|
+
"\u5B58\u5230 table",
|
|
129
|
+
"\u4FDD\u5B58\u5230 table",
|
|
130
|
+
"\u8BB0\u5F55\u4E0B\u6765",
|
|
131
|
+
"\u91C7\u96C6",
|
|
132
|
+
"\u505A\u6570\u636E\u96C6",
|
|
133
|
+
"\u505A\u6210\u6570\u636E\u96C6",
|
|
134
|
+
"\u6574\u7406\u6210\u6570\u636E\u96C6",
|
|
135
|
+
"\u6574\u7406\u6210\u8868",
|
|
136
|
+
"\u6574\u7406\u6210\u4E00\u5F20\u8868",
|
|
137
|
+
"\u5EFA\u7ACB\u4E00\u4E2A\u8868",
|
|
138
|
+
"\u5EFA\u7ACB\u4E00\u5F20\u8868",
|
|
139
|
+
"\u5EFA\u7ACB\u6210\u8868",
|
|
140
|
+
"\u5EFA\u7ACB\u6210\u4E00\u5F20\u8868",
|
|
141
|
+
"\u521B\u5EFA\u8FD9\u4E2A\u8868\u683C",
|
|
142
|
+
"\u786E\u8BA4\u521B\u5EFA",
|
|
143
|
+
"\u786E\u8BA4\u521B\u5EFA\u8FD9\u5F20\u8868\u683C",
|
|
144
|
+
"create doc",
|
|
145
|
+
"import skill",
|
|
146
|
+
"confirm import",
|
|
147
|
+
"create skill",
|
|
148
|
+
"create table",
|
|
149
|
+
"write table",
|
|
150
|
+
"save to table",
|
|
151
|
+
"dataset",
|
|
152
|
+
"save this",
|
|
153
|
+
"remember this",
|
|
154
|
+
"document this"
|
|
155
|
+
])) {
|
|
156
|
+
return "strong";
|
|
157
|
+
}
|
|
158
|
+
if (containsAny(normalized, [
|
|
159
|
+
"\u603B\u7ED3",
|
|
160
|
+
"\u65B9\u6848",
|
|
161
|
+
"\u8C03\u7814",
|
|
162
|
+
"\u89C4\u8303",
|
|
163
|
+
"\u4F1A\u8BAE\u7EAA\u8981",
|
|
164
|
+
"\u603B\u7ED3\u4E00\u4E0B",
|
|
165
|
+
"research",
|
|
166
|
+
"proposal",
|
|
167
|
+
"spec",
|
|
168
|
+
"summary"
|
|
169
|
+
])) {
|
|
170
|
+
return "possible";
|
|
171
|
+
}
|
|
172
|
+
return "none";
|
|
173
|
+
};
|
|
174
|
+
var resolveTonePreset = (agentTone, userTone, mode) => {
|
|
175
|
+
if (mode === "agent_first") {
|
|
176
|
+
return agentTone === "default" ? userTone : agentTone;
|
|
177
|
+
}
|
|
178
|
+
if (mode === "user_first") {
|
|
179
|
+
return userTone === "default" ? agentTone : userTone;
|
|
180
|
+
}
|
|
181
|
+
if (userTone !== "default") return userTone;
|
|
182
|
+
return agentTone;
|
|
183
|
+
};
|
|
184
|
+
var preloadSummaryCountByLevel = (level) => ({ 1: 0, 2: 0, 3: 8, 4: 16 })[level];
|
|
185
|
+
var preloadBudgetRatioByLevel = (level) => ({ 1: 0, 2: 0.01, 3: 0.04, 4: 0.08 })[level];
|
|
186
|
+
var knowledgeCaptureLevelLabel = (level) => ({
|
|
187
|
+
1: "\u4E0D\u4E3B\u52A8\u521B\u5EFA",
|
|
188
|
+
2: "\u5148\u95EE\u518D\u521B\u5EFA",
|
|
189
|
+
3: "\u56DE\u7B54\u540E\u5EFA\u8BAE\u521B\u5EFA",
|
|
190
|
+
4: "\u9AD8\u4EF7\u503C\u7ED3\u679C\u53EF\u81EA\u52A8\u521B\u5EFA"
|
|
191
|
+
})[level] ?? "\u672A\u77E5\u7EA7\u522B";
|
|
192
|
+
var spaceContextLevelLabel = (level) => ({
|
|
193
|
+
1: "\u4E0D\u81EA\u52A8\u8BFB\u53D6",
|
|
194
|
+
2: "\u53EA\u770B\u7ED3\u6784\u548C\u6807\u9898",
|
|
195
|
+
3: "\u8F7B\u91CF\u8BFB\u53D6",
|
|
196
|
+
4: "\u81EA\u9002\u5E94\u8BFB\u53D6"
|
|
197
|
+
})[level] ?? "\u672A\u77E5\u7EA7\u522B";
|
|
198
|
+
var buildStaticUserPolicyContext = (params) => {
|
|
199
|
+
const agentBasePolicy = resolveAgentBasePolicy(params.agentConfig);
|
|
200
|
+
const userPreferenceProfile = resolveUserPreferenceProfile(params.settingsRecord);
|
|
201
|
+
const tonePreset = resolveTonePreset(
|
|
202
|
+
agentBasePolicy.tone?.preset ?? "default",
|
|
203
|
+
userPreferenceProfile.tone?.preset ?? "default",
|
|
204
|
+
agentBasePolicy.tone?.resolutionMode ?? "blend"
|
|
205
|
+
);
|
|
206
|
+
const knowledgeLevel = Math.min(
|
|
207
|
+
agentBasePolicy.knowledgeCaptureMaxLevel,
|
|
208
|
+
userPreferenceProfile.knowledgeCaptureLevel
|
|
209
|
+
);
|
|
210
|
+
const spaceLevel = Math.min(
|
|
211
|
+
agentBasePolicy.spaceContextMaxLevel,
|
|
212
|
+
userPreferenceProfile.spaceContextLevel
|
|
213
|
+
);
|
|
214
|
+
return [
|
|
215
|
+
`\u7528\u6237\u8BED\u6C14\u504F\u597D\uFF1A${tonePreset}`,
|
|
216
|
+
`\u77E5\u8BC6\u6C89\u6DC0\u7EA7\u522B\uFF1A${knowledgeLevel}\uFF08${knowledgeCaptureLevelLabel(knowledgeLevel)}\uFF09`,
|
|
217
|
+
`\u7A7A\u95F4\u4E0A\u4E0B\u6587\u7EA7\u522B\uFF1A${spaceLevel}\uFF08${spaceContextLevelLabel(spaceLevel)}\uFF09`,
|
|
218
|
+
"\u8BF7\u5C3D\u91CF\u4FDD\u7559 agent \u81EA\u8EAB\u89D2\u8272\u8BBE\u5B9A\uFF0C\u540C\u65F6\u6309\u7528\u6237\u504F\u597D\u8C03\u6574\u8868\u8FBE\u548C\u81EA\u52A8\u5316\u7A0B\u5EA6\u3002"
|
|
219
|
+
].join("\n");
|
|
220
|
+
};
|
|
221
|
+
var resolveSpaceContextPreloadPlan = (level) => ({
|
|
222
|
+
preloadSummaryCount: preloadSummaryCountByLevel(level),
|
|
223
|
+
preloadBudgetRatio: preloadBudgetRatioByLevel(level),
|
|
224
|
+
includeRecentContent: level >= 3
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
export {
|
|
228
|
+
inferCaptureIntent,
|
|
229
|
+
buildStaticUserPolicyContext,
|
|
230
|
+
resolveSpaceContextPreloadPlan
|
|
231
|
+
};
|