nolo-cli 0.1.32 → 0.1.33
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 +0 -6
- package/agent-runtime/agentRecordConfig.ts +2 -0
- package/agent-runtime/hostAdapter.ts +1 -0
- package/agent-runtime/index.ts +0 -21
- package/agent-runtime/localToolPolicy.ts +6 -13
- package/agent-runtime/localWorkspaceTools.ts +30 -333
- package/agent-runtime/platformChatProvider.ts +1 -4
- package/agent-runtime/runtimeToolPolicy.ts +47 -32
- package/agentAliases.ts +14 -83
- package/agentCommandSupport.ts +3 -6
- package/agentInternalCommandEntries.ts +2 -13
- package/agentListCommands.ts +19 -28
- package/agentMachineCommands.ts +40 -336
- package/agentPullCommand.ts +36 -56
- package/agentRecordCommands.ts +3 -5
- package/agentRecordHelpers.ts +22 -189
- package/agentRunCommand.ts +438 -107
- package/agentRuntimeLocal.ts +0 -10
- package/ai/agent/cliExecutor.ts +19 -323
- package/authCommands.ts +2 -36
- package/cli/agentAliases.ts +14 -83
- package/cli/agentCommandSupport.ts +3 -6
- package/cli/agentInternalCommandEntries.ts +2 -13
- package/cli/agentListCommands.ts +19 -28
- package/cli/agentMachineCommands.ts +40 -336
- package/cli/agentPullCommand.ts +36 -56
- package/cli/agentRecordCommands.ts +3 -5
- package/cli/agentRecordHelpers.ts +22 -189
- package/cli/agentRunCommand.ts +438 -107
- package/cli/agentRuntimeLocal.ts +0 -10
- package/cli/authCommands.ts +2 -36
- package/cli/cliEnvHelpers.ts +21 -162
- package/cli/client/agentRun.ts +853 -57
- package/cli/client/localRuntimeAdapter.ts +22 -159
- package/cli/client/streamingOutput.ts +3 -1
- package/cli/client/taskRunPrompt.ts +24 -7
- package/cli/commandRegistry.ts +2 -3
- package/cli/connectorRunArtifact.ts +10 -34
- package/cli/connectorWebSocketTarget.ts +6 -10
- package/cli/internalCommandEntries.ts +0 -8
- package/cli/localRuntimeDb.ts +2 -39
- package/cli/machineCommands.ts +189 -190
- package/cli/machineDaemonCommands.ts +165 -9
- package/cli/machineHeartbeatCommands.ts +2 -1
- package/cli/machineStatusCommands.ts +13 -5
- package/cli/machineWatchCommands.ts +1 -1
- package/cli/machineWsRunDispatch.ts +14 -48
- package/cli/machineWsSession.ts +0 -2
- package/cli/offlineMarxistsAgentCommand.ts +314 -0
- package/cli/runtimeDoctorCommands.ts +69 -18
- package/cli/scriptCommandEntries.ts +45 -5
- package/cli/tableCommands.ts +133 -33
- package/cli/taskRunCommand.ts +211 -16
- package/cli/tui/session.ts +372 -43
- package/cli/workflowInternalCommandEntries.ts +0 -20
- package/cliEnvHelpers.ts +21 -162
- package/client/agentConfigResolver.test.ts +2 -0
- package/client/agentRun.test.ts +12 -208
- package/client/agentRun.ts +853 -57
- package/client/localRuntimeAdapter.test.ts +9 -168
- package/client/localRuntimeAdapter.ts +22 -159
- package/client/localToolPolicy.test.ts +4 -28
- package/client/streamingOutput.ts +3 -1
- package/client/taskRunPrompt.ts +24 -7
- package/commandRegistry.ts +2 -3
- package/connectorRunArtifact.ts +10 -34
- package/connectorWebSocketTarget.ts +6 -10
- package/database/server/db.ts +34 -15
- package/internalCommandEntries.ts +0 -8
- package/localRuntimeDb.ts +2 -39
- package/machineCommands.ts +189 -190
- package/machineDaemonCommands.ts +165 -9
- package/machineHeartbeatCommands.ts +2 -1
- package/machineStatusCommands.ts +13 -5
- package/machineWatchCommands.ts +1 -1
- package/machineWsRunDispatch.ts +14 -48
- package/machineWsSession.ts +0 -2
- package/offlineMarxistsAgentCommand.ts +314 -0
- package/package.json +49 -193
- package/runtimeDoctorCommands.ts +69 -18
- package/scriptCommandEntries.ts +45 -5
- package/tableCommands.ts +133 -33
- package/taskRunCommand.ts +211 -16
- package/tui/session.ts +372 -43
- package/workflowInternalCommandEntries.ts +0 -20
- package/agent-runtime/dialogStatus.ts +0 -139
- package/agent-runtime/hostRuntimeConfig.ts +0 -86
- package/agentCreateCustomCommands.ts +0 -278
- package/agentDialogsCommands.ts +0 -227
- package/agentDoctorCommands.ts +0 -203
- package/agentRunLocalWorkspace.ts +0 -182
- package/agentRunParsing.ts +0 -298
- package/agentSuperviseCommands.ts +0 -8
- package/agentUnpublishCommands.ts +0 -113
- package/ai/agent/agentRunDialogLineage.ts +0 -56
- package/ai/policy/types.ts +0 -64
- package/ai/skills/skillSummaryMarker.ts +0 -26
- package/app/types.ts +0 -358
- package/build.ts +0 -16
- package/buildPublish.ts +0 -138
- package/buildPublishArtifactAssembly.ts +0 -724
- package/buildPublishImportAnalysis.ts +0 -242
- package/chat/messages/fetchMessages.ts +0 -84
- package/chat/messages/types.ts +0 -185
- package/cli/agentCreateCustomCommands.ts +0 -278
- package/cli/agentDialogsCommands.ts +0 -227
- package/cli/agentDoctorCommands.ts +0 -203
- package/cli/agentRunLocalWorkspace.ts +0 -182
- package/cli/agentRunParsing.ts +0 -298
- package/cli/agentSuperviseCommands.ts +0 -8
- package/cli/agentUnpublishCommands.ts +0 -113
- package/cli/buildPublish.ts +0 -138
- package/cli/buildPublishArtifactAssembly.ts +0 -724
- package/cli/buildPublishImportAnalysis.ts +0 -242
- package/cli/cliIoTypes.ts +0 -3
- package/cli/cliRuntimeDoctorReport.ts +0 -193
- package/cli/client/agentRunInput.ts +0 -10
- package/cli/client/agentRunLocalExecution.ts +0 -124
- package/cli/client/agentRunLocalExecutor.ts +0 -179
- package/cli/client/agentRunRuntimeSelection.ts +0 -145
- package/cli/client/agentRunServerTransport.ts +0 -397
- package/cli/client/agentRunTaskRunRecorder.ts +0 -176
- package/cli/customCodingAgentFlow.ts +0 -208
- package/cli/customCodingAgentRecord.ts +0 -179
- package/cli/dialogDataAccess.ts +0 -186
- package/cli/dialogInternalCommandEntries.ts +0 -11
- package/cli/dialogReadCommands.ts +0 -180
- package/cli/dialogReadHelpers.ts +0 -226
- package/cli/dialogStatusCommands.ts +0 -123
- package/cli/docInternalCommandEntries.ts +0 -20
- package/cli/hybridReadHelpers.ts +0 -109
- package/cli/machineCommandPrompts.ts +0 -79
- package/cli/machineCommandResolution.ts +0 -43
- package/cli/noloReadBridgePrompt.ts +0 -16
- package/cli/pageCreateCommands.ts +0 -219
- package/cli/pageDeleteCommands.ts +0 -167
- package/cli/pageReadCommands.ts +0 -151
- package/cli/pageUpdateCommands.ts +0 -249
- package/cli/pageWriteHelpers.ts +0 -209
- package/cli/publishPackage.ts +0 -36
- package/cli/runtimeInternalCommandEntries.ts +0 -15
- package/cli/runtimePassthroughCommands.ts +0 -22
- package/cli/scriptPassthroughHelpers.ts +0 -28
- package/cli/secretScanHelpers.ts +0 -31
- package/cli/spaceAttachCommands.ts +0 -134
- package/cli/spaceCategoryCommands.ts +0 -263
- package/cli/spaceCommands.ts +0 -295
- package/cli/spaceDeleteCommands.ts +0 -312
- package/cli/spaceInternalCommandEntries.ts +0 -21
- package/cli/spaceMutationHelpers.ts +0 -135
- package/cli/spaceReadCommands.ts +0 -323
- package/cli/tableDataOutput.ts +0 -41
- package/cli/tableDataSafety.ts +0 -26
- package/cli/tableMetaCommands.ts +0 -307
- package/cli/tableMutationCommands.ts +0 -266
- package/cli/tableQueryParsing.ts +0 -90
- package/cli/tableQueryRequest.ts +0 -53
- package/cli/taskRunActions.ts +0 -122
- package/cli/taskRunParsing.ts +0 -86
- package/cli/taskRunPromptShared.ts +0 -55
- package/cli/tui/tuiCatalog.ts +0 -22
- package/cli/tui/tuiCommandInterpreter.ts +0 -253
- package/cli/tui/tuiPresentation.ts +0 -146
- package/cliIoTypes.ts +0 -3
- package/cliRuntimeDoctorReport.ts +0 -193
- package/client/agentRunInput.ts +0 -10
- package/client/agentRunLocalExecution.test.ts +0 -123
- package/client/agentRunLocalExecution.ts +0 -124
- package/client/agentRunLocalExecutor.ts +0 -179
- package/client/agentRunRuntimeSelection.test.ts +0 -159
- package/client/agentRunRuntimeSelection.ts +0 -145
- package/client/agentRunServerTransport.ts +0 -397
- package/client/agentRunTaskRunRecorder.ts +0 -176
- package/connector-experimental/daemonLauncher.ts +0 -223
- package/create/space/spaceKeys.ts +0 -65
- package/create/types.ts +0 -21
- package/customCodingAgentFlow.ts +0 -208
- package/customCodingAgentRecord.ts +0 -179
- package/database/keys.ts +0 -765
- package/database/server/authorityStoreTypes.ts +0 -31
- package/database/server/legacyServerDb.ts +0 -58
- package/database/server/levelAuthorityStore.ts +0 -75
- package/database/server/memoryAuthorityStore.ts +0 -133
- package/database/server/serverStoreFactory.ts +0 -124
- package/database/tombstones.ts +0 -52
- package/database/utils/ulid.ts +0 -1
- package/dialogDataAccess.ts +0 -186
- package/dialogInternalCommandEntries.ts +0 -11
- package/dialogReadCommands.ts +0 -180
- package/dialogReadHelpers.ts +0 -226
- package/dialogStatusCommands.ts +0 -123
- package/docInternalCommandEntries.ts +0 -20
- package/hybridReadHelpers.ts +0 -109
- package/machineCommandPrompts.ts +0 -79
- package/machineCommandResolution.ts +0 -43
- package/noloReadBridgePrompt.ts +0 -16
- package/pageCreateCommands.ts +0 -219
- package/pageDeleteCommands.ts +0 -167
- package/pageReadCommands.ts +0 -151
- package/pageUpdateCommands.ts +0 -249
- package/pageWriteHelpers.ts +0 -209
- package/publishPackage.ts +0 -36
- package/runtimeInternalCommandEntries.ts +0 -15
- package/runtimePassthroughCommands.ts +0 -22
- package/scriptPassthroughHelpers.ts +0 -28
- package/secretScanHelpers.ts +0 -31
- package/share/helpers.ts +0 -302
- package/share/keys.ts +0 -243
- package/share/types.ts +0 -100
- package/spaceAttachCommands.ts +0 -134
- package/spaceCategoryCommands.ts +0 -263
- package/spaceCommands.ts +0 -295
- package/spaceDeleteCommands.ts +0 -312
- package/spaceInternalCommandEntries.ts +0 -21
- package/spaceMutationHelpers.ts +0 -135
- package/spaceReadCommands.ts +0 -323
- package/tableDataOutput.ts +0 -41
- package/tableDataSafety.ts +0 -26
- package/tableMetaCommands.ts +0 -307
- package/tableMutationCommands.ts +0 -266
- package/tableQueryParsing.ts +0 -90
- package/tableQueryRequest.ts +0 -53
- package/taskRunActions.ts +0 -122
- package/taskRunParsing.ts +0 -86
- package/taskRunPromptShared.ts +0 -55
- package/tui/tuiCatalog.ts +0 -22
- package/tui/tuiCommandInterpreter.test.ts +0 -169
- package/tui/tuiCommandInterpreter.ts +0 -253
- package/tui/tuiPresentation.test.ts +0 -154
- package/tui/tuiPresentation.ts +0 -146
|
@@ -7,7 +7,6 @@ import { request as httpRequest } from "node:http";
|
|
|
7
7
|
import { request as httpsRequest } from "node:https";
|
|
8
8
|
import {
|
|
9
9
|
buildLocalWorkspacePolicyToolNames,
|
|
10
|
-
resolveLocalWorkspaceShellToolExposure,
|
|
11
10
|
buildLocalWorkspaceToolset,
|
|
12
11
|
buildLocalWorkspaceOpenAiTools,
|
|
13
12
|
buildOpenAiCompatibleChatCompletionRequest,
|
|
@@ -16,11 +15,8 @@ import {
|
|
|
16
15
|
parseOpenAiCompatibleChatCompletionResponse,
|
|
17
16
|
parsePlatformChatCompletionData,
|
|
18
17
|
parsePlatformChatCompletionResponse,
|
|
19
|
-
resolveHostRuntimeConfigFromEnv,
|
|
20
18
|
resolvePlatformChatProviderConfig,
|
|
21
|
-
resolveRequestedRuntimeToolNames,
|
|
22
19
|
shouldUsePlatformChatProvider,
|
|
23
|
-
type HostRuntimeConfig,
|
|
24
20
|
} from "../agentRuntimeLocal";
|
|
25
21
|
import type { AgentRuntimeChatMessage } from "../../agent-runtime";
|
|
26
22
|
import { getDefaultCliLocalRuntimeDb } from "../localRuntimeDb";
|
|
@@ -52,29 +48,6 @@ import {
|
|
|
52
48
|
type EnvLike = Record<string, string | undefined>;
|
|
53
49
|
type FetchInput = Parameters<typeof fetch>[0];
|
|
54
50
|
type FetchInit = Parameters<typeof fetch>[1];
|
|
55
|
-
type CliLocalRuntimeCliExecution = {
|
|
56
|
-
text: string;
|
|
57
|
-
raw?: string;
|
|
58
|
-
elapsed?: number;
|
|
59
|
-
warnings?: string[];
|
|
60
|
-
};
|
|
61
|
-
type CliLocalRuntimeCliExecutor = (
|
|
62
|
-
provider: string,
|
|
63
|
-
prompt: string,
|
|
64
|
-
options: {
|
|
65
|
-
model?: string;
|
|
66
|
-
timeout?: number;
|
|
67
|
-
cwd?: string;
|
|
68
|
-
yolo?: boolean;
|
|
69
|
-
env?: EnvLike;
|
|
70
|
-
systemPrompt?: string;
|
|
71
|
-
reasoningEffort?: "low" | "medium" | "high" | "xhigh" | "max";
|
|
72
|
-
temperature?: number;
|
|
73
|
-
topP?: number;
|
|
74
|
-
frequencyPenalty?: number;
|
|
75
|
-
maxTokens?: number;
|
|
76
|
-
}
|
|
77
|
-
) => Promise<CliLocalRuntimeCliExecution>;
|
|
78
51
|
const TRANSIENT_FETCH_MAX_ATTEMPTS = 8;
|
|
79
52
|
const TRANSIENT_FETCH_RETRY_BASE_DELAY_MS = 250;
|
|
80
53
|
|
|
@@ -82,17 +55,16 @@ export type CliLocalRuntimeDb = CliKvDb;
|
|
|
82
55
|
|
|
83
56
|
export type CliLocalRuntimeAdapterDeps = {
|
|
84
57
|
env: EnvLike;
|
|
85
|
-
hostRuntimeConfig?: HostRuntimeConfig;
|
|
86
58
|
db?: CliLocalRuntimeDb;
|
|
87
59
|
store?: HybridRecordStore;
|
|
88
60
|
now?: () => number;
|
|
89
61
|
createId?: () => string;
|
|
90
62
|
fetchImpl?: typeof fetch;
|
|
91
63
|
cwd?: string;
|
|
64
|
+
useCwdAsTaskWorkspaceBase?: boolean;
|
|
92
65
|
output?: { write(chunk: string): unknown };
|
|
93
66
|
prepareTaskWorktree?: typeof prepareTaskWorktree;
|
|
94
67
|
localToolExecutors?: Record<string, (call: any) => Promise<{ content: string; metadata?: Record<string, unknown> }>>;
|
|
95
|
-
executeCli?: CliLocalRuntimeCliExecutor;
|
|
96
68
|
sleep?: (ms: number) => Promise<void>;
|
|
97
69
|
loopbackRequest?: (input: FetchInput, init?: FetchInit) => Promise<Response>;
|
|
98
70
|
};
|
|
@@ -101,15 +73,6 @@ async function defaultLocalRuntimeDb(): Promise<CliLocalRuntimeDb> {
|
|
|
101
73
|
return getDefaultCliLocalRuntimeDb();
|
|
102
74
|
}
|
|
103
75
|
|
|
104
|
-
async function defaultExecuteCli(
|
|
105
|
-
provider: string,
|
|
106
|
-
prompt: string,
|
|
107
|
-
options: Parameters<CliLocalRuntimeCliExecutor>[2]
|
|
108
|
-
) {
|
|
109
|
-
const { executeCli } = await import("../../ai/agent/cliExecutor");
|
|
110
|
-
return executeCli(provider as any, prompt, options);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
76
|
function createFallbackId() {
|
|
114
77
|
return `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`.toUpperCase();
|
|
115
78
|
}
|
|
@@ -118,6 +81,10 @@ function resolveLocalUserId(env: EnvLike) {
|
|
|
118
81
|
return env.NOLO_LOCAL_USER_ID || env.NOLO_USER_ID || "local";
|
|
119
82
|
}
|
|
120
83
|
|
|
84
|
+
function shellModeEnabled(env: EnvLike) {
|
|
85
|
+
return ["worktree", "dangerous", "1", "true"].includes(env.NOLO_LOCAL_SHELL_MODE || "");
|
|
86
|
+
}
|
|
87
|
+
|
|
121
88
|
function parseLocalToolBudgets(env: EnvLike) {
|
|
122
89
|
const raw = env.NOLO_LOCAL_TOOL_BUDGETS?.trim();
|
|
123
90
|
if (!raw) return {};
|
|
@@ -234,52 +201,32 @@ async function fetchWithTransientRetry(
|
|
|
234
201
|
throw lastError;
|
|
235
202
|
}
|
|
236
203
|
|
|
237
|
-
function buildOpenAiTools(args: {
|
|
238
|
-
|
|
239
|
-
platformToolNames?: string[];
|
|
240
|
-
hostRuntimeConfig: HostRuntimeConfig;
|
|
241
|
-
}) {
|
|
242
|
-
const toolset = buildLocalWorkspaceToolsetForHost(args);
|
|
204
|
+
function buildOpenAiTools(args: { toolNames?: string[]; env: EnvLike }) {
|
|
205
|
+
const toolset = buildLocalWorkspaceToolsetForEnv(args);
|
|
243
206
|
return [
|
|
244
207
|
...buildLocalWorkspaceOpenAiTools({
|
|
245
208
|
toolNames: toolset.toolNames,
|
|
246
209
|
exposeShellTools: toolset.exposeShellTools,
|
|
247
210
|
}),
|
|
248
|
-
...buildServerPlatformOpenAiTools({ toolNames: args.
|
|
211
|
+
...buildServerPlatformOpenAiTools({ toolNames: args.toolNames }),
|
|
249
212
|
];
|
|
250
213
|
}
|
|
251
214
|
|
|
252
|
-
function
|
|
253
|
-
requestedToolNames?: string[];
|
|
254
|
-
hostRuntimeConfig: HostRuntimeConfig;
|
|
255
|
-
}) {
|
|
256
|
-
const requestedToolNames = args.requestedToolNames ?? [];
|
|
257
|
-
const exposeShellTools = resolveLocalWorkspaceShellToolExposure({
|
|
258
|
-
declaredToolNames: requestedToolNames,
|
|
259
|
-
hostRuntimeConfig: args.hostRuntimeConfig,
|
|
260
|
-
});
|
|
215
|
+
function buildLocalWorkspaceToolsetForEnv(args: { toolNames?: string[]; env: EnvLike }) {
|
|
261
216
|
const toolset = buildLocalWorkspaceToolset({
|
|
262
|
-
declaredToolNames:
|
|
263
|
-
exposeShellTools,
|
|
217
|
+
declaredToolNames: args.toolNames,
|
|
218
|
+
exposeShellTools: shellModeEnabled(args.env),
|
|
264
219
|
});
|
|
265
220
|
return toolset;
|
|
266
221
|
}
|
|
267
222
|
|
|
268
|
-
function buildLocalPolicyToolNames(args: {
|
|
269
|
-
requestedToolNames?: string[];
|
|
270
|
-
platformToolNames?: string[];
|
|
271
|
-
hostRuntimeConfig: HostRuntimeConfig;
|
|
272
|
-
}) {
|
|
273
|
-
const exposeShellTools = resolveLocalWorkspaceShellToolExposure({
|
|
274
|
-
declaredToolNames: args.requestedToolNames,
|
|
275
|
-
hostRuntimeConfig: args.hostRuntimeConfig,
|
|
276
|
-
});
|
|
223
|
+
function buildLocalPolicyToolNames(args: { toolNames?: string[]; env: EnvLike }) {
|
|
277
224
|
return [
|
|
278
225
|
...buildLocalWorkspacePolicyToolNames({
|
|
279
|
-
declaredToolNames: args.
|
|
280
|
-
exposeShellTools,
|
|
226
|
+
declaredToolNames: args.toolNames,
|
|
227
|
+
exposeShellTools: shellModeEnabled(args.env),
|
|
281
228
|
}),
|
|
282
|
-
...((args.
|
|
229
|
+
...((args.toolNames ?? []).includes("taskRun") ? ["taskRun"] : []),
|
|
283
230
|
];
|
|
284
231
|
}
|
|
285
232
|
|
|
@@ -365,33 +312,6 @@ function readLocalWorkspaceMode(agentConfig: AgentRuntimeAgentConfig | null) {
|
|
|
365
312
|
return value === "task-worktree" ? "task-worktree" : "current";
|
|
366
313
|
}
|
|
367
314
|
|
|
368
|
-
function extractRuntimeMessageText(content: AgentRuntimeChatMessage["content"]) {
|
|
369
|
-
if (typeof content === "string") return content;
|
|
370
|
-
if (!Array.isArray(content)) return "";
|
|
371
|
-
return content
|
|
372
|
-
.filter((part): part is Extract<typeof part, { type: "text" }> => part?.type === "text")
|
|
373
|
-
.map((part) => part.text ?? "")
|
|
374
|
-
.join("");
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
function buildCliTaskPromptFromMessages(messages: AgentRuntimeChatMessage[]) {
|
|
378
|
-
const history = messages
|
|
379
|
-
.filter((message) => message.role === "user" || message.role === "assistant")
|
|
380
|
-
.map((message) => {
|
|
381
|
-
const text = extractRuntimeMessageText(message.content).trim();
|
|
382
|
-
if (!text) return null;
|
|
383
|
-
return `[${message.role === "user" ? "用户" : "助手"}]\n${text}`;
|
|
384
|
-
})
|
|
385
|
-
.filter((message): message is string => Boolean(message))
|
|
386
|
-
.slice(-6);
|
|
387
|
-
|
|
388
|
-
if (history.length === 0) return "";
|
|
389
|
-
if (history.length === 1 && history[0]?.startsWith("[用户]\n")) {
|
|
390
|
-
return history[0].slice("[用户]\n".length);
|
|
391
|
-
}
|
|
392
|
-
return `请基于以下最近对话继续完成当前任务。\n\n${history.join("\n\n")}`;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
315
|
async function resolveStore(deps: CliLocalRuntimeAdapterDeps) {
|
|
396
316
|
if (deps.store) return deps.store;
|
|
397
317
|
return createCliHybridRecordStore({
|
|
@@ -462,18 +382,12 @@ export function createCliLocalRuntimeAdapter(
|
|
|
462
382
|
const createId = deps.createId ?? createFallbackId;
|
|
463
383
|
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
464
384
|
const loopbackRequest = deps.loopbackRequest ?? (deps.fetchImpl ? undefined : defaultLoopbackRequest);
|
|
465
|
-
const executeCli = deps.executeCli ?? defaultExecuteCli;
|
|
466
385
|
const userId = resolveLocalUserId(deps.env);
|
|
467
|
-
const hostRuntimeConfig = deps.hostRuntimeConfig ?? resolveHostRuntimeConfigFromEnv({
|
|
468
|
-
env: deps.env,
|
|
469
|
-
surface: "cli-local",
|
|
470
|
-
workspaceBinding: "explicit-cwd",
|
|
471
|
-
});
|
|
472
386
|
const localToolBudgets = parseLocalToolBudgets(deps.env);
|
|
473
387
|
const localToolUsage = new Map<string, number>();
|
|
474
388
|
let activeAgentToolNames: string[] = [];
|
|
475
389
|
let workspaceSession: WorkspaceSession = createWorkspaceSession(
|
|
476
|
-
|
|
390
|
+
deps.useCwdAsTaskWorkspaceBase
|
|
477
391
|
? { defaultCwd: deps.cwd }
|
|
478
392
|
: { cwd: deps.cwd }
|
|
479
393
|
);
|
|
@@ -514,13 +428,9 @@ export function createCliLocalRuntimeAdapter(
|
|
|
514
428
|
store: await resolveStore(deps),
|
|
515
429
|
userId,
|
|
516
430
|
});
|
|
517
|
-
const requestedToolNames = agentConfig
|
|
518
|
-
? resolveRequestedRuntimeToolNames({ agentConfig })
|
|
519
|
-
: [];
|
|
520
431
|
activeAgentToolNames = buildLocalPolicyToolNames({
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
hostRuntimeConfig,
|
|
432
|
+
toolNames: agentConfig?.toolNames,
|
|
433
|
+
env: deps.env,
|
|
524
434
|
});
|
|
525
435
|
await activateAgentWorkspaceSession({ agentRef, agentConfig });
|
|
526
436
|
return agentConfig;
|
|
@@ -538,48 +448,6 @@ export function createCliLocalRuntimeAdapter(
|
|
|
538
448
|
cwd: workspaceSession.workspaceRoot,
|
|
539
449
|
}),
|
|
540
450
|
resolveProvider: async (agentConfig) => {
|
|
541
|
-
if (agentConfig.apiSource === "cli") {
|
|
542
|
-
const cliProvider = String(agentConfig.cliProvider || "copilot").trim() || "copilot";
|
|
543
|
-
return {
|
|
544
|
-
model: agentConfig.model || cliProvider,
|
|
545
|
-
complete: async (messages) => {
|
|
546
|
-
const [firstMessage, ...remainingMessages] = messages;
|
|
547
|
-
const systemPrompt = firstMessage?.role === "system"
|
|
548
|
-
? extractRuntimeMessageText(firstMessage.content).trim()
|
|
549
|
-
: "";
|
|
550
|
-
const taskPrompt = buildCliTaskPromptFromMessages(
|
|
551
|
-
firstMessage?.role === "system" ? remainingMessages : messages
|
|
552
|
-
);
|
|
553
|
-
const result = await executeCli(cliProvider, taskPrompt, {
|
|
554
|
-
...(agentConfig.model ? { model: agentConfig.model } : {}),
|
|
555
|
-
cwd: workspaceSession.workspaceRoot,
|
|
556
|
-
yolo: true,
|
|
557
|
-
env: deps.env,
|
|
558
|
-
...(systemPrompt ? { systemPrompt } : {}),
|
|
559
|
-
...(typeof agentConfig.reasoning_effort === "string"
|
|
560
|
-
? { reasoningEffort: agentConfig.reasoning_effort as "low" | "medium" | "high" | "xhigh" | "max" }
|
|
561
|
-
: {}),
|
|
562
|
-
...(typeof agentConfig.temperature === "number"
|
|
563
|
-
? { temperature: agentConfig.temperature }
|
|
564
|
-
: {}),
|
|
565
|
-
...(typeof agentConfig.top_p === "number" ? { topP: agentConfig.top_p } : {}),
|
|
566
|
-
...(typeof agentConfig.frequency_penalty === "number"
|
|
567
|
-
? { frequencyPenalty: agentConfig.frequency_penalty }
|
|
568
|
-
: {}),
|
|
569
|
-
...(typeof agentConfig.max_tokens === "number"
|
|
570
|
-
? { maxTokens: agentConfig.max_tokens }
|
|
571
|
-
: {}),
|
|
572
|
-
});
|
|
573
|
-
return {
|
|
574
|
-
content: result.text,
|
|
575
|
-
model: agentConfig.model || cliProvider,
|
|
576
|
-
provider: cliProvider,
|
|
577
|
-
trace: messages,
|
|
578
|
-
};
|
|
579
|
-
},
|
|
580
|
-
};
|
|
581
|
-
}
|
|
582
|
-
|
|
583
451
|
if (shouldUsePlatformChatProvider(deps.env, agentConfig)) {
|
|
584
452
|
const providerConfig = resolvePlatformChatProviderConfig({
|
|
585
453
|
agentConfig,
|
|
@@ -588,11 +456,9 @@ export function createCliLocalRuntimeAdapter(
|
|
|
588
456
|
return {
|
|
589
457
|
model: providerConfig.model,
|
|
590
458
|
complete: async (messages) => {
|
|
591
|
-
const requestedToolNames = resolveRequestedRuntimeToolNames({ agentConfig });
|
|
592
459
|
const tools = buildOpenAiTools({
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
hostRuntimeConfig,
|
|
460
|
+
toolNames: agentConfig.toolNames,
|
|
461
|
+
env: deps.env,
|
|
596
462
|
});
|
|
597
463
|
const request = buildPlatformChatCompletionRequest({
|
|
598
464
|
providerConfig,
|
|
@@ -623,11 +489,9 @@ export function createCliLocalRuntimeAdapter(
|
|
|
623
489
|
return {
|
|
624
490
|
model: providerConfig.model,
|
|
625
491
|
complete: async (messages) => {
|
|
626
|
-
const requestedToolNames = resolveRequestedRuntimeToolNames({ agentConfig });
|
|
627
492
|
const tools = buildOpenAiTools({
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
hostRuntimeConfig,
|
|
493
|
+
toolNames: agentConfig.toolNames,
|
|
494
|
+
env: deps.env,
|
|
631
495
|
});
|
|
632
496
|
const request = buildOpenAiCompatibleChatCompletionRequest({
|
|
633
497
|
providerConfig,
|
|
@@ -658,7 +522,6 @@ export function createCliLocalRuntimeAdapter(
|
|
|
658
522
|
});
|
|
659
523
|
const result = await executeLocalToolWithPolicy({
|
|
660
524
|
env: deps.env,
|
|
661
|
-
hostRuntimeConfig,
|
|
662
525
|
agentToolNames: activeAgentToolNames,
|
|
663
526
|
call,
|
|
664
527
|
executors: localToolExecutors,
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
export type TaskRunPromptContext = {
|
|
2
|
+
rowDbKey: string;
|
|
3
|
+
taskRunId?: string;
|
|
4
|
+
workItemId?: string;
|
|
5
|
+
artifactIds?: string[];
|
|
6
|
+
};
|
|
7
7
|
|
|
8
8
|
export function prependTaskRunPrompt(message: string, context?: TaskRunPromptContext): string {
|
|
9
|
-
|
|
9
|
+
if (!context?.rowDbKey) return message;
|
|
10
|
+
const artifactIds = context.artifactIds?.filter(Boolean) ?? [];
|
|
11
|
+
return [
|
|
12
|
+
"AI-native task-run context:",
|
|
13
|
+
"- This system is AI-native. The current task board is only the present observation and validation use case; different users, companies, and workflows may use different task owners later.",
|
|
14
|
+
"- Treat the task row meta as the durable execution context. Do not infer branch, runner, handoff, review, or blocker state from chat history alone.",
|
|
15
|
+
`- rowDbKey: ${context.rowDbKey}`,
|
|
16
|
+
...(context.taskRunId ? [`- taskRunId: ${context.taskRunId}`] : []),
|
|
17
|
+
...(context.workItemId ? [`- workItemId: ${context.workItemId}`] : []),
|
|
18
|
+
...(artifactIds.length ? [`- artifactIds: ${artifactIds.join(",")}`] : []),
|
|
19
|
+
"- Handoff rule: start from the durable task context, then inspect existing refs such as workItems.dialogIds, workItems.outcome, review.dialogId, activityRefs, agentRuns.dialogId/resultSummary, and artifactRefs. Use dialog read/search for exact evidence.",
|
|
20
|
+
"- When you create, update, hand off, block, or review work, update the task context with `bun run task:run -- ...`.",
|
|
21
|
+
"- If this turn already includes a server TaskRun preflight snapshot, use that snapshot directly for read-only reporting or planning.",
|
|
22
|
+
"- Keep long reasoning and logs in the dialog; record only resumable references in task row meta.",
|
|
23
|
+
"",
|
|
24
|
+
"User task:",
|
|
25
|
+
message,
|
|
26
|
+
].join("\n");
|
|
10
27
|
}
|
package/cli/commandRegistry.ts
CHANGED
|
@@ -55,8 +55,8 @@ export function renderHelpText() {
|
|
|
55
55
|
" nolo doctor",
|
|
56
56
|
" nolo doctor runtime",
|
|
57
57
|
" nolo update",
|
|
58
|
-
' nolo doc create --title "Trip Notes" --body "hello" --
|
|
59
|
-
' nolo skill-doc create --title "Agent Query Skill" --description "Inspect recent agent dialogs" --
|
|
58
|
+
' nolo doc create --title "Trip Notes" --body "hello" --sync local,us --dry-run',
|
|
59
|
+
' nolo skill-doc create --title "Agent Query Skill" --description "Inspect recent agent dialogs" --sync local,main,us',
|
|
60
60
|
" nolo agent list --json",
|
|
61
61
|
" nolo space list --json",
|
|
62
62
|
" nolo agent pull agent-pub-01APPBUILDER00000001YAII3I",
|
|
@@ -64,7 +64,6 @@ export function renderHelpText() {
|
|
|
64
64
|
' nolo agent run frontend-implementer --msg "polish notifications"',
|
|
65
65
|
" nolo agent bind-current agent-user-1-agent-1",
|
|
66
66
|
" nolo agent runtime-doctor agent-user-1-agent-1",
|
|
67
|
-
' nolo agent smoke-bound agent-user-1-agent-1 --msg "ping"',
|
|
68
67
|
' nolo agent smoke-current agent-user-1-agent-1 --msg "ping"',
|
|
69
68
|
' nolo chat --agent agent-pub-01APPBUILDER00000001YAII3I --msg "你好"',
|
|
70
69
|
" nolo space read 01KKY77TT0DA9NY7TNW3R7255N --content-key page-user-id --brief",
|
|
@@ -24,46 +24,22 @@ function normalizePath(value: string) {
|
|
|
24
24
|
return resolve(value.trim());
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
function resolveExistingCandidate(
|
|
28
|
-
value: string | undefined,
|
|
29
|
-
checked: string[],
|
|
30
|
-
label: string
|
|
31
|
-
) {
|
|
32
|
-
const trimmed = value?.trim();
|
|
33
|
-
if (!trimmed) return null;
|
|
34
|
-
const normalized = normalizePath(trimmed);
|
|
35
|
-
if (existsSync(normalized)) return normalized;
|
|
36
|
-
checked.push(`${label}=${normalized}`);
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
27
|
export function resolveConnectorRunCwd(args: {
|
|
41
28
|
env?: EnvLike;
|
|
42
29
|
policy: MachineRunPermissionPolicy;
|
|
43
30
|
fallbackCwd?: string;
|
|
44
31
|
}) {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
];
|
|
55
|
-
|
|
56
|
-
for (const [value, label] of candidates) {
|
|
57
|
-
const resolved = resolveExistingCandidate(value, checked, label);
|
|
58
|
-
if (resolved) return resolved;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (checked.length > 0) {
|
|
62
|
-
throw new Error(
|
|
63
|
-
`Connector run cwd does not exist. Checked: ${checked.join(", ")}`
|
|
64
|
-
);
|
|
32
|
+
const explicit =
|
|
33
|
+
args.env?.NOLO_CONNECTOR_WORKDIR ||
|
|
34
|
+
args.env?.NOLO_AGENT_WORKDIR ||
|
|
35
|
+
args.env?.NOLO_LOCAL_WORKTREE ||
|
|
36
|
+
"";
|
|
37
|
+
const candidate = explicit || args.policy.writableRoots[0] || args.fallbackCwd || process.cwd();
|
|
38
|
+
const cwd = normalizePath(candidate);
|
|
39
|
+
if (!existsSync(cwd)) {
|
|
40
|
+
throw new Error(`Connector run cwd does not exist: ${cwd}`);
|
|
65
41
|
}
|
|
66
|
-
|
|
42
|
+
return cwd;
|
|
67
43
|
}
|
|
68
44
|
|
|
69
45
|
async function runGit(
|
|
@@ -49,18 +49,14 @@ function parseRetryAfterMs(response: Response, bodyRetryAfterMs?: unknown) {
|
|
|
49
49
|
export async function resolveConnectorWebSocketTarget(input: {
|
|
50
50
|
serverUrl: string;
|
|
51
51
|
machineId: string;
|
|
52
|
-
connectorSurface?: string;
|
|
53
52
|
headers: Record<string, string>;
|
|
54
53
|
fetchImpl?: typeof fetch;
|
|
55
54
|
}) {
|
|
56
55
|
const directWsUrl = new URL(input.serverUrl);
|
|
57
56
|
directWsUrl.protocol = directWsUrl.protocol === "https:" ? "wss:" : "ws:";
|
|
58
57
|
directWsUrl.pathname = "/api/connector/ws";
|
|
59
|
-
directWsUrl.search = "";
|
|
60
|
-
directWsUrl.searchParams.set("machineId", input.machineId);
|
|
61
|
-
if (input.connectorSurface?.trim()) {
|
|
62
|
-
directWsUrl.searchParams.set("connectorSurface", input.connectorSurface.trim().toLowerCase());
|
|
63
|
-
}
|
|
58
|
+
directWsUrl.search = "";
|
|
59
|
+
directWsUrl.searchParams.set("machineId", input.machineId);
|
|
64
60
|
|
|
65
61
|
const probeUrl = new URL(input.serverUrl);
|
|
66
62
|
probeUrl.pathname = "/api/connector/ws";
|
|
@@ -103,7 +99,7 @@ export async function resolveConnectorWebSocketTarget(input: {
|
|
|
103
99
|
}
|
|
104
100
|
|
|
105
101
|
const json = await response.json().catch(() => null);
|
|
106
|
-
return typeof json?.wsUrl === "string" && json.wsUrl
|
|
107
|
-
? json.wsUrl
|
|
108
|
-
: directWsUrl.toString();
|
|
109
|
-
}
|
|
102
|
+
return typeof json?.wsUrl === "string" && json.wsUrl
|
|
103
|
+
? json.wsUrl
|
|
104
|
+
: directWsUrl.toString();
|
|
105
|
+
}
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
import { getAgentInternalCommandEntries } from "./agentInternalCommandEntries";
|
|
2
2
|
import type { CommandEntry } from "./cliCommandTypes";
|
|
3
|
-
import { getDialogInternalCommandEntries } from "./dialogInternalCommandEntries";
|
|
4
|
-
import { getDocInternalCommandEntries } from "./docInternalCommandEntries";
|
|
5
|
-
import { getRuntimeInternalCommandEntries } from "./runtimeInternalCommandEntries";
|
|
6
|
-
import { getSpaceInternalCommandEntries } from "./spaceInternalCommandEntries";
|
|
7
3
|
import { getSystemInternalCommandEntries } from "./systemInternalCommandEntries";
|
|
8
4
|
import { getWorkflowInternalCommandEntries } from "./workflowInternalCommandEntries";
|
|
9
5
|
|
|
10
6
|
export function getInternalCommandEntries(renderHelpText: () => string): CommandEntry[] {
|
|
11
7
|
return [
|
|
12
8
|
...getAgentInternalCommandEntries(),
|
|
13
|
-
...getDialogInternalCommandEntries(),
|
|
14
|
-
...getDocInternalCommandEntries(),
|
|
15
|
-
...getSpaceInternalCommandEntries(),
|
|
16
9
|
...getWorkflowInternalCommandEntries(),
|
|
17
|
-
...getRuntimeInternalCommandEntries(),
|
|
18
10
|
...getSystemInternalCommandEntries(renderHelpText),
|
|
19
11
|
];
|
|
20
12
|
}
|
package/cli/localRuntimeDb.ts
CHANGED
|
@@ -20,46 +20,9 @@ export function buildCliLocalRuntimeDbEnv(env: EnvLike = process.env) {
|
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export function isCliLocalRuntimeDbLockError(error: unknown): boolean {
|
|
24
|
-
const queue: unknown[] = [error];
|
|
25
|
-
const seen = new Set<unknown>();
|
|
26
|
-
|
|
27
|
-
while (queue.length > 0) {
|
|
28
|
-
const current = queue.shift();
|
|
29
|
-
if (!current || seen.has(current)) continue;
|
|
30
|
-
seen.add(current);
|
|
31
|
-
|
|
32
|
-
const text = `${(current as any)?.code ?? ""} ${(current as any)?.message ?? current}`;
|
|
33
|
-
if (/LEVEL_LOCKED|Resource temporarily unavailable|\/LOCK|LOCK:|db locked|locked/i.test(text)) {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if ((current as any)?.cause) queue.push((current as any).cause);
|
|
38
|
-
if (Array.isArray((current as any)?.errors)) queue.push(...(current as any).errors);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function formatCliLocalRuntimeDbOpenError(dbPath: string, error: unknown) {
|
|
45
|
-
if (!isCliLocalRuntimeDbLockError(error)) {
|
|
46
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
47
|
-
}
|
|
48
|
-
return new Error(
|
|
49
|
-
`CLI local runtime DB is locked at ${dbPath}. Another nolo local runtime is already using it. ` +
|
|
50
|
-
"Stop the other local runtime, rerun without --local, or set NOLO_SERVER_DB_PATH to a different cache path.",
|
|
51
|
-
{ cause: error instanceof Error ? error : undefined }
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
23
|
export async function getDefaultCliLocalRuntimeDb(): Promise<CliLocalRuntimeDb> {
|
|
56
|
-
|
|
57
|
-
process.env.NOLO_SERVER_DB_PATH = dbPath;
|
|
24
|
+
process.env.NOLO_SERVER_DB_PATH = buildCliLocalRuntimeDbEnv(process.env).NOLO_SERVER_DB_PATH;
|
|
58
25
|
const { default: serverDb, ensureServerDbOpen } = await import("../database/server/db");
|
|
59
|
-
|
|
60
|
-
await ensureServerDbOpen();
|
|
61
|
-
} catch (error) {
|
|
62
|
-
throw formatCliLocalRuntimeDbOpenError(dbPath, error);
|
|
63
|
-
}
|
|
26
|
+
await ensureServerDbOpen();
|
|
64
27
|
return serverDb as CliLocalRuntimeDb;
|
|
65
28
|
}
|