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.
Files changed (230) hide show
  1. package/README.md +0 -6
  2. package/agent-runtime/agentRecordConfig.ts +2 -0
  3. package/agent-runtime/hostAdapter.ts +1 -0
  4. package/agent-runtime/index.ts +0 -21
  5. package/agent-runtime/localToolPolicy.ts +6 -13
  6. package/agent-runtime/localWorkspaceTools.ts +30 -333
  7. package/agent-runtime/platformChatProvider.ts +1 -4
  8. package/agent-runtime/runtimeToolPolicy.ts +47 -32
  9. package/agentAliases.ts +14 -83
  10. package/agentCommandSupport.ts +3 -6
  11. package/agentInternalCommandEntries.ts +2 -13
  12. package/agentListCommands.ts +19 -28
  13. package/agentMachineCommands.ts +40 -336
  14. package/agentPullCommand.ts +36 -56
  15. package/agentRecordCommands.ts +3 -5
  16. package/agentRecordHelpers.ts +22 -189
  17. package/agentRunCommand.ts +438 -107
  18. package/agentRuntimeLocal.ts +0 -10
  19. package/ai/agent/cliExecutor.ts +19 -323
  20. package/authCommands.ts +2 -36
  21. package/cli/agentAliases.ts +14 -83
  22. package/cli/agentCommandSupport.ts +3 -6
  23. package/cli/agentInternalCommandEntries.ts +2 -13
  24. package/cli/agentListCommands.ts +19 -28
  25. package/cli/agentMachineCommands.ts +40 -336
  26. package/cli/agentPullCommand.ts +36 -56
  27. package/cli/agentRecordCommands.ts +3 -5
  28. package/cli/agentRecordHelpers.ts +22 -189
  29. package/cli/agentRunCommand.ts +438 -107
  30. package/cli/agentRuntimeLocal.ts +0 -10
  31. package/cli/authCommands.ts +2 -36
  32. package/cli/cliEnvHelpers.ts +21 -162
  33. package/cli/client/agentRun.ts +853 -57
  34. package/cli/client/localRuntimeAdapter.ts +22 -159
  35. package/cli/client/streamingOutput.ts +3 -1
  36. package/cli/client/taskRunPrompt.ts +24 -7
  37. package/cli/commandRegistry.ts +2 -3
  38. package/cli/connectorRunArtifact.ts +10 -34
  39. package/cli/connectorWebSocketTarget.ts +6 -10
  40. package/cli/internalCommandEntries.ts +0 -8
  41. package/cli/localRuntimeDb.ts +2 -39
  42. package/cli/machineCommands.ts +189 -190
  43. package/cli/machineDaemonCommands.ts +165 -9
  44. package/cli/machineHeartbeatCommands.ts +2 -1
  45. package/cli/machineStatusCommands.ts +13 -5
  46. package/cli/machineWatchCommands.ts +1 -1
  47. package/cli/machineWsRunDispatch.ts +14 -48
  48. package/cli/machineWsSession.ts +0 -2
  49. package/cli/offlineMarxistsAgentCommand.ts +314 -0
  50. package/cli/runtimeDoctorCommands.ts +69 -18
  51. package/cli/scriptCommandEntries.ts +45 -5
  52. package/cli/tableCommands.ts +133 -33
  53. package/cli/taskRunCommand.ts +211 -16
  54. package/cli/tui/session.ts +372 -43
  55. package/cli/workflowInternalCommandEntries.ts +0 -20
  56. package/cliEnvHelpers.ts +21 -162
  57. package/client/agentConfigResolver.test.ts +2 -0
  58. package/client/agentRun.test.ts +12 -208
  59. package/client/agentRun.ts +853 -57
  60. package/client/localRuntimeAdapter.test.ts +9 -168
  61. package/client/localRuntimeAdapter.ts +22 -159
  62. package/client/localToolPolicy.test.ts +4 -28
  63. package/client/streamingOutput.ts +3 -1
  64. package/client/taskRunPrompt.ts +24 -7
  65. package/commandRegistry.ts +2 -3
  66. package/connectorRunArtifact.ts +10 -34
  67. package/connectorWebSocketTarget.ts +6 -10
  68. package/database/server/db.ts +34 -15
  69. package/internalCommandEntries.ts +0 -8
  70. package/localRuntimeDb.ts +2 -39
  71. package/machineCommands.ts +189 -190
  72. package/machineDaemonCommands.ts +165 -9
  73. package/machineHeartbeatCommands.ts +2 -1
  74. package/machineStatusCommands.ts +13 -5
  75. package/machineWatchCommands.ts +1 -1
  76. package/machineWsRunDispatch.ts +14 -48
  77. package/machineWsSession.ts +0 -2
  78. package/offlineMarxistsAgentCommand.ts +314 -0
  79. package/package.json +49 -193
  80. package/runtimeDoctorCommands.ts +69 -18
  81. package/scriptCommandEntries.ts +45 -5
  82. package/tableCommands.ts +133 -33
  83. package/taskRunCommand.ts +211 -16
  84. package/tui/session.ts +372 -43
  85. package/workflowInternalCommandEntries.ts +0 -20
  86. package/agent-runtime/dialogStatus.ts +0 -139
  87. package/agent-runtime/hostRuntimeConfig.ts +0 -86
  88. package/agentCreateCustomCommands.ts +0 -278
  89. package/agentDialogsCommands.ts +0 -227
  90. package/agentDoctorCommands.ts +0 -203
  91. package/agentRunLocalWorkspace.ts +0 -182
  92. package/agentRunParsing.ts +0 -298
  93. package/agentSuperviseCommands.ts +0 -8
  94. package/agentUnpublishCommands.ts +0 -113
  95. package/ai/agent/agentRunDialogLineage.ts +0 -56
  96. package/ai/policy/types.ts +0 -64
  97. package/ai/skills/skillSummaryMarker.ts +0 -26
  98. package/app/types.ts +0 -358
  99. package/build.ts +0 -16
  100. package/buildPublish.ts +0 -138
  101. package/buildPublishArtifactAssembly.ts +0 -724
  102. package/buildPublishImportAnalysis.ts +0 -242
  103. package/chat/messages/fetchMessages.ts +0 -84
  104. package/chat/messages/types.ts +0 -185
  105. package/cli/agentCreateCustomCommands.ts +0 -278
  106. package/cli/agentDialogsCommands.ts +0 -227
  107. package/cli/agentDoctorCommands.ts +0 -203
  108. package/cli/agentRunLocalWorkspace.ts +0 -182
  109. package/cli/agentRunParsing.ts +0 -298
  110. package/cli/agentSuperviseCommands.ts +0 -8
  111. package/cli/agentUnpublishCommands.ts +0 -113
  112. package/cli/buildPublish.ts +0 -138
  113. package/cli/buildPublishArtifactAssembly.ts +0 -724
  114. package/cli/buildPublishImportAnalysis.ts +0 -242
  115. package/cli/cliIoTypes.ts +0 -3
  116. package/cli/cliRuntimeDoctorReport.ts +0 -193
  117. package/cli/client/agentRunInput.ts +0 -10
  118. package/cli/client/agentRunLocalExecution.ts +0 -124
  119. package/cli/client/agentRunLocalExecutor.ts +0 -179
  120. package/cli/client/agentRunRuntimeSelection.ts +0 -145
  121. package/cli/client/agentRunServerTransport.ts +0 -397
  122. package/cli/client/agentRunTaskRunRecorder.ts +0 -176
  123. package/cli/customCodingAgentFlow.ts +0 -208
  124. package/cli/customCodingAgentRecord.ts +0 -179
  125. package/cli/dialogDataAccess.ts +0 -186
  126. package/cli/dialogInternalCommandEntries.ts +0 -11
  127. package/cli/dialogReadCommands.ts +0 -180
  128. package/cli/dialogReadHelpers.ts +0 -226
  129. package/cli/dialogStatusCommands.ts +0 -123
  130. package/cli/docInternalCommandEntries.ts +0 -20
  131. package/cli/hybridReadHelpers.ts +0 -109
  132. package/cli/machineCommandPrompts.ts +0 -79
  133. package/cli/machineCommandResolution.ts +0 -43
  134. package/cli/noloReadBridgePrompt.ts +0 -16
  135. package/cli/pageCreateCommands.ts +0 -219
  136. package/cli/pageDeleteCommands.ts +0 -167
  137. package/cli/pageReadCommands.ts +0 -151
  138. package/cli/pageUpdateCommands.ts +0 -249
  139. package/cli/pageWriteHelpers.ts +0 -209
  140. package/cli/publishPackage.ts +0 -36
  141. package/cli/runtimeInternalCommandEntries.ts +0 -15
  142. package/cli/runtimePassthroughCommands.ts +0 -22
  143. package/cli/scriptPassthroughHelpers.ts +0 -28
  144. package/cli/secretScanHelpers.ts +0 -31
  145. package/cli/spaceAttachCommands.ts +0 -134
  146. package/cli/spaceCategoryCommands.ts +0 -263
  147. package/cli/spaceCommands.ts +0 -295
  148. package/cli/spaceDeleteCommands.ts +0 -312
  149. package/cli/spaceInternalCommandEntries.ts +0 -21
  150. package/cli/spaceMutationHelpers.ts +0 -135
  151. package/cli/spaceReadCommands.ts +0 -323
  152. package/cli/tableDataOutput.ts +0 -41
  153. package/cli/tableDataSafety.ts +0 -26
  154. package/cli/tableMetaCommands.ts +0 -307
  155. package/cli/tableMutationCommands.ts +0 -266
  156. package/cli/tableQueryParsing.ts +0 -90
  157. package/cli/tableQueryRequest.ts +0 -53
  158. package/cli/taskRunActions.ts +0 -122
  159. package/cli/taskRunParsing.ts +0 -86
  160. package/cli/taskRunPromptShared.ts +0 -55
  161. package/cli/tui/tuiCatalog.ts +0 -22
  162. package/cli/tui/tuiCommandInterpreter.ts +0 -253
  163. package/cli/tui/tuiPresentation.ts +0 -146
  164. package/cliIoTypes.ts +0 -3
  165. package/cliRuntimeDoctorReport.ts +0 -193
  166. package/client/agentRunInput.ts +0 -10
  167. package/client/agentRunLocalExecution.test.ts +0 -123
  168. package/client/agentRunLocalExecution.ts +0 -124
  169. package/client/agentRunLocalExecutor.ts +0 -179
  170. package/client/agentRunRuntimeSelection.test.ts +0 -159
  171. package/client/agentRunRuntimeSelection.ts +0 -145
  172. package/client/agentRunServerTransport.ts +0 -397
  173. package/client/agentRunTaskRunRecorder.ts +0 -176
  174. package/connector-experimental/daemonLauncher.ts +0 -223
  175. package/create/space/spaceKeys.ts +0 -65
  176. package/create/types.ts +0 -21
  177. package/customCodingAgentFlow.ts +0 -208
  178. package/customCodingAgentRecord.ts +0 -179
  179. package/database/keys.ts +0 -765
  180. package/database/server/authorityStoreTypes.ts +0 -31
  181. package/database/server/legacyServerDb.ts +0 -58
  182. package/database/server/levelAuthorityStore.ts +0 -75
  183. package/database/server/memoryAuthorityStore.ts +0 -133
  184. package/database/server/serverStoreFactory.ts +0 -124
  185. package/database/tombstones.ts +0 -52
  186. package/database/utils/ulid.ts +0 -1
  187. package/dialogDataAccess.ts +0 -186
  188. package/dialogInternalCommandEntries.ts +0 -11
  189. package/dialogReadCommands.ts +0 -180
  190. package/dialogReadHelpers.ts +0 -226
  191. package/dialogStatusCommands.ts +0 -123
  192. package/docInternalCommandEntries.ts +0 -20
  193. package/hybridReadHelpers.ts +0 -109
  194. package/machineCommandPrompts.ts +0 -79
  195. package/machineCommandResolution.ts +0 -43
  196. package/noloReadBridgePrompt.ts +0 -16
  197. package/pageCreateCommands.ts +0 -219
  198. package/pageDeleteCommands.ts +0 -167
  199. package/pageReadCommands.ts +0 -151
  200. package/pageUpdateCommands.ts +0 -249
  201. package/pageWriteHelpers.ts +0 -209
  202. package/publishPackage.ts +0 -36
  203. package/runtimeInternalCommandEntries.ts +0 -15
  204. package/runtimePassthroughCommands.ts +0 -22
  205. package/scriptPassthroughHelpers.ts +0 -28
  206. package/secretScanHelpers.ts +0 -31
  207. package/share/helpers.ts +0 -302
  208. package/share/keys.ts +0 -243
  209. package/share/types.ts +0 -100
  210. package/spaceAttachCommands.ts +0 -134
  211. package/spaceCategoryCommands.ts +0 -263
  212. package/spaceCommands.ts +0 -295
  213. package/spaceDeleteCommands.ts +0 -312
  214. package/spaceInternalCommandEntries.ts +0 -21
  215. package/spaceMutationHelpers.ts +0 -135
  216. package/spaceReadCommands.ts +0 -323
  217. package/tableDataOutput.ts +0 -41
  218. package/tableDataSafety.ts +0 -26
  219. package/tableMetaCommands.ts +0 -307
  220. package/tableMutationCommands.ts +0 -266
  221. package/tableQueryParsing.ts +0 -90
  222. package/tableQueryRequest.ts +0 -53
  223. package/taskRunActions.ts +0 -122
  224. package/taskRunParsing.ts +0 -86
  225. package/taskRunPromptShared.ts +0 -55
  226. package/tui/tuiCatalog.ts +0 -22
  227. package/tui/tuiCommandInterpreter.test.ts +0 -169
  228. package/tui/tuiCommandInterpreter.ts +0 -253
  229. package/tui/tuiPresentation.test.ts +0 -154
  230. package/tui/tuiPresentation.ts +0 -146
@@ -1,180 +0,0 @@
1
- import { getReadableCliDb, type AgentCommandDeps } from "./agentCommandSupport";
2
- import {
3
- resolveAuthToken,
4
- resolveServerCandidates,
5
- } from "./cliEnvHelpers";
6
- import {
7
- isLocalBaseUrl,
8
- readDialogFromLocalDb,
9
- tryHttpDialogCandidates,
10
- } from "./dialogDataAccess";
11
- import {
12
- buildDialogReadResult,
13
- parseDialogInputForCli,
14
- type DialogHttpAttempt,
15
- type DialogReadSource,
16
- } from "./dialogReadHelpers";
17
-
18
- function usage() {
19
- return [
20
- "Usage:",
21
- " nolo dialog read <dialogId|dialogUrl> [limit]",
22
- "",
23
- ].join("\n");
24
- }
25
-
26
- function isHelpArg(value?: string) {
27
- return value === "-h" || value === "--help";
28
- }
29
-
30
- function parseArgs(args: string[]) {
31
- const rawInput = args[0]?.trim();
32
- if (!rawInput || isHelpArg(rawInput)) return { help: true as const };
33
- const rawLimit = args[1]?.trim() || "50";
34
- if (!/^\d+$/.test(rawLimit)) {
35
- throw new Error("limit must be a number");
36
- }
37
- return {
38
- help: false as const,
39
- rawInput,
40
- limit: Number(rawLimit),
41
- };
42
- }
43
-
44
- export async function runDialogReadCommand(
45
- args: string[],
46
- deps: AgentCommandDeps = {}
47
- ) {
48
- const env = deps.env ?? process.env;
49
- const output = deps.output ?? process.stdout;
50
- let parsedArgs: ReturnType<typeof parseArgs>;
51
- try {
52
- parsedArgs = parseArgs(args);
53
- } catch (error) {
54
- output.write(`[nolo] dialog read failed: ${error instanceof Error ? error.message : String(error)}\n`);
55
- return 1;
56
- }
57
-
58
- if (parsedArgs.help) {
59
- output.write(`${usage()}\n`);
60
- return args[0] ? 0 : 1;
61
- }
62
-
63
- const authToken = resolveAuthToken(args, env);
64
- const fetchImpl = deps.fetchImpl ?? fetch;
65
- const fallbackFetchImpl = deps.fallbackFetchImpl;
66
-
67
- try {
68
- const { base, dialogId, userId, spaceId } = parseDialogInputForCli(parsedArgs.rawInput, env);
69
- const dialogKey = `dialog-${userId}-${dialogId}`;
70
- const candidateBases = resolveServerCandidates(
71
- args,
72
- {
73
- ...env,
74
- BASE_URL: env.READ_DIALOG_BASE?.trim() || base || env.BASE_URL,
75
- },
76
- base
77
- );
78
- let meta: any;
79
- let msgs: any;
80
- let source: DialogReadSource;
81
- let resolvedBase = base;
82
- let attempts: DialogHttpAttempt[] = [];
83
-
84
- try {
85
- ({ meta, msgs, source, resolvedBase, attempts } = await tryHttpDialogCandidates({
86
- authToken,
87
- bases: candidateBases,
88
- dialogId,
89
- dialogKey,
90
- fetchImpl,
91
- fallbackFetchImpl,
92
- limit: parsedArgs.limit,
93
- }));
94
- } catch (error) {
95
- attempts =
96
- typeof error === "object" && error !== null && "attempts" in error
97
- ? ((error as any).attempts as DialogHttpAttempt[])
98
- : attempts;
99
- const statuses = attempts
100
- .map((attempt) => attempt.status)
101
- .filter((status): status is number => typeof status === "number");
102
- const all404 =
103
- attempts.length > 0 &&
104
- statuses.length === attempts.length &&
105
- statuses.every((status) => status === 404);
106
- const any401 = statuses.includes(401);
107
- const localhostCandidate = candidateBases.find(isLocalBaseUrl);
108
-
109
- if (!localhostCandidate) {
110
- if (any401) {
111
- throw new Error(
112
- `read dialog failed across candidates (${candidateBases.join(", ")}). Hint: set AUTH_TOKEN to a current login token.`
113
- );
114
- }
115
- throw new Error(
116
- `read dialog failed across candidates: ${attempts
117
- .map((attempt) => `${attempt.base} -> ${attempt.status ?? attempt.message}`)
118
- .join("; ")}`
119
- );
120
- }
121
-
122
- if (all404) {
123
- throw new Error(
124
- `read dialog failed: dialog not found on tried servers. Tried: ${candidateBases.join(", ")}`
125
- );
126
- }
127
-
128
- try {
129
- const db = deps.db ?? await getReadableCliDb(output);
130
- ({ meta, msgs, source } = await readDialogFromLocalDb({
131
- db,
132
- dialogId,
133
- dialogKey,
134
- limit: parsedArgs.limit,
135
- }));
136
- resolvedBase = localhostCandidate;
137
- } catch (fallbackError) {
138
- const fallbackMessage =
139
- fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
140
- if (any401) {
141
- throw new Error(
142
- `read dialog failed: HTTP auth was rejected, and local DB fallback is unavailable (${fallbackMessage}). Hint: set AUTH_TOKEN to a current login token.`
143
- );
144
- }
145
- throw new Error(
146
- `read dialog failed: HTTP candidates were ${attempts
147
- .map((attempt) => `${attempt.base} -> ${attempt.status ?? attempt.message}`)
148
- .join("; ")}; local DB fallback also failed (${fallbackMessage})`
149
- );
150
- }
151
- }
152
-
153
- output.write(
154
- `${JSON.stringify(
155
- buildDialogReadResult({
156
- source,
157
- resolvedBase,
158
- candidateBases,
159
- attempts,
160
- spaceId,
161
- dialogId,
162
- dialogKey,
163
- userId,
164
- meta,
165
- msgs,
166
- }),
167
- null,
168
- 2
169
- )}\n`
170
- );
171
- return 0;
172
- } catch (error) {
173
- output.write(
174
- `[nolo] dialog read failed: ${
175
- error instanceof Error ? error.message : String(error)
176
- }\n`
177
- );
178
- return 1;
179
- }
180
- }
@@ -1,226 +0,0 @@
1
- import { normalizeSpaceId } from "../create/space/spaceKeys";
2
- import { parseUserIdFromAuthToken, resolveAuthToken, resolveServerUrl } from "./cliEnvHelpers";
3
-
4
- export type DialogReadSource = "http" | "local-db-fallback";
5
-
6
- export type DialogHttpAttempt = {
7
- base: string;
8
- ok: boolean;
9
- status?: number;
10
- message?: string;
11
- };
12
-
13
- export type ParsedDialogInput = {
14
- base: string;
15
- dialogId: string;
16
- userId: string;
17
- spaceId?: string;
18
- };
19
-
20
- const DIALOG_PATH_RE = /^\/dialog-(.+)-([0-9A-HJKMNP-TV-Z]{26})$/i;
21
- const SPACE_DIALOG_PATH_RE =
22
- /^\/space\/([^/]+)\/dialog-(.+)-([0-9A-HJKMNP-TV-Z]{26})$/i;
23
-
24
- function normalizeBaseUrl(base: string) {
25
- return base.trim().replace(/\/+$/, "");
26
- }
27
-
28
- function toToolName(value: unknown) {
29
- return typeof value === "string" ? value.trim() : "";
30
- }
31
-
32
- function countByName(values: string[]) {
33
- return values.reduce<Record<string, number>>((acc, value) => {
34
- acc[value] = (acc[value] ?? 0) + 1;
35
- return acc;
36
- }, {});
37
- }
38
-
39
- function uniq(values: string[]) {
40
- return [...new Set(values.filter(Boolean))];
41
- }
42
-
43
- function parseJsonObject(raw: unknown): Record<string, any> | null {
44
- if (typeof raw !== "string" || !raw.trim()) return null;
45
- try {
46
- const parsed = JSON.parse(raw);
47
- return parsed && typeof parsed === "object" ? parsed : null;
48
- } catch {
49
- return null;
50
- }
51
- }
52
-
53
- function deriveWrittenFiles(toolMessages: any[]) {
54
- const writeToolNames = new Set([
55
- "applyEdit",
56
- "applyLineEdits",
57
- "writeFile",
58
- "createDoc",
59
- "updateDoc",
60
- ]);
61
- const files: string[] = [];
62
- for (const message of toolMessages) {
63
- const toolName = toToolName(message?.toolName ?? message?.name);
64
- if (!writeToolNames.has(toolName)) continue;
65
- const payload = message?.toolPayload ?? {};
66
- const content = parseJsonObject(message?.content);
67
- const candidates = [
68
- payload?.input?.filePath,
69
- payload?.response?.filePath,
70
- content?.filePath,
71
- ];
72
- for (const candidate of candidates) {
73
- const normalized = typeof candidate === "string" ? candidate.trim() : "";
74
- if (normalized) files.push(normalized);
75
- }
76
- }
77
- return uniq(files);
78
- }
79
-
80
- function deriveToolErrors(toolMessages: any[]) {
81
- const errors: string[] = [];
82
- for (const message of toolMessages) {
83
- const toolName = toToolName(message?.toolName ?? message?.name);
84
- const payload = message?.toolPayload ?? {};
85
- const content = parseJsonObject(message?.content);
86
- if (payload?.status === "failed") {
87
- errors.push(toolName || "unknown-tool");
88
- continue;
89
- }
90
- if (content?.ok === false || content?.applied === false || content?.success === false) {
91
- errors.push(toolName || "unknown-tool");
92
- }
93
- }
94
- return uniq(errors);
95
- }
96
-
97
- export function parseDialogInputForCli(
98
- rawInput: string,
99
- env: Record<string, string | undefined>
100
- ): ParsedDialogInput {
101
- const authUserId = parseUserIdFromAuthToken(resolveAuthToken(env));
102
- const envUserId = env.USER_ID?.trim() || authUserId;
103
- const fallbackBase = normalizeBaseUrl(env.READ_DIALOG_BASE || resolveServerUrl(env));
104
-
105
- if (!(rawInput.startsWith("http://") || rawInput.startsWith("https://"))) {
106
- if (!envUserId) {
107
- throw new Error("dialog read could not resolve userId; set AUTH_TOKEN or USER_ID.");
108
- }
109
- return {
110
- base: fallbackBase,
111
- dialogId: rawInput.trim(),
112
- userId: envUserId,
113
- };
114
- }
115
-
116
- const url = new URL(rawInput);
117
- const spaceMatch = url.pathname.match(SPACE_DIALOG_PATH_RE);
118
- if (spaceMatch) {
119
- const [, spaceIdFromPath, userIdFromPath, dialogId] = spaceMatch;
120
- return {
121
- base: normalizeBaseUrl(env.READ_DIALOG_BASE || url.origin),
122
- dialogId,
123
- userId: env.USER_ID?.trim() || userIdFromPath || envUserId,
124
- spaceId: normalizeSpaceId(spaceIdFromPath),
125
- };
126
- }
127
-
128
- const match = url.pathname.match(DIALOG_PATH_RE);
129
- if (!match) {
130
- throw new Error(`Unsupported dialog URL path: ${url.pathname}`);
131
- }
132
-
133
- const [, userIdFromPath, dialogId] = match;
134
- return {
135
- base: normalizeBaseUrl(env.READ_DIALOG_BASE || url.origin),
136
- dialogId,
137
- userId: env.USER_ID?.trim() || userIdFromPath || envUserId,
138
- spaceId: url.searchParams.get("spaceId") ?? undefined,
139
- };
140
- }
141
-
142
- export function buildDialogReadResult(args: {
143
- source: DialogReadSource;
144
- resolvedBase: string;
145
- candidateBases: string[];
146
- attempts: DialogHttpAttempt[];
147
- spaceId?: string;
148
- dialogId: string;
149
- dialogKey: string;
150
- userId: string;
151
- meta: any;
152
- msgs: any;
153
- }) {
154
- const orderedMsgs = Array.isArray(args.msgs) ? [...args.msgs].reverse() : args.msgs;
155
- const lastAssistantMessage = Array.isArray(orderedMsgs)
156
- ? [...orderedMsgs].reverse().find(
157
- (message) => message?.role === "assistant" || message?.authorRole === "assistant"
158
- )
159
- : null;
160
- const toolMessages = Array.isArray(orderedMsgs)
161
- ? orderedMsgs.filter((message) => message?.role === "tool" || message?.authorRole === "tool")
162
- : [];
163
- const toolNamesFromMessages = toolMessages
164
- .map((message) => toToolName(message?.toolName ?? message?.name))
165
- .filter(Boolean);
166
- const toolsUsed =
167
- Array.isArray(args.meta?.toolsUsed) && args.meta.toolsUsed.length > 0
168
- ? args.meta.toolsUsed.map((tool: unknown) => toToolName(tool)).filter(Boolean)
169
- : uniq(toolNamesFromMessages);
170
- const writtenFiles =
171
- Array.isArray(args.meta?.writtenFiles) && args.meta.writtenFiles.length > 0
172
- ? uniq(
173
- args.meta.writtenFiles
174
- .map((value: unknown) => (typeof value === "string" ? value.trim() : ""))
175
- .filter(Boolean)
176
- )
177
- : deriveWrittenFiles(toolMessages);
178
- const toolErrors =
179
- Array.isArray(args.meta?.toolErrors) && args.meta.toolErrors.length > 0
180
- ? uniq(
181
- args.meta.toolErrors
182
- .map((value: unknown) => (typeof value === "string" ? value.trim() : ""))
183
- .filter(Boolean)
184
- )
185
- : deriveToolErrors(toolMessages);
186
-
187
- return {
188
- source: args.source,
189
- base: args.resolvedBase,
190
- triedBases: args.candidateBases,
191
- httpAttempts: args.attempts,
192
- spaceId: args.spaceId,
193
- dialogId: args.dialogId,
194
- dialogKey: args.dialogKey,
195
- userId: args.userId,
196
- title: args.meta?.title ?? null,
197
- cybots: Array.isArray(args.meta?.cybots) ? args.meta.cybots : [],
198
- category: args.meta?.category ?? null,
199
- inheritedFromDialogKey: args.meta?.inheritedFromDialogKey ?? null,
200
- inheritedFromDialogTitle: args.meta?.inheritedFromDialogTitle ?? null,
201
- parentDialogId: args.meta?.parentDialogId ?? null,
202
- rootDialogId: args.meta?.rootDialogId ?? null,
203
- status: args.meta?.status,
204
- errorMessage: args.meta?.errorMessage ?? null,
205
- runtimeCheckpoint: args.meta?.runtimeCheckpoint ?? null,
206
- durationMs: args.meta?.durationMs,
207
- finishedAt: args.meta?.finishedAt,
208
- createdAt: args.meta?.createdAt,
209
- updatedAt: args.meta?.updatedAt,
210
- artifacts: args.meta?.artifacts ?? null,
211
- writtenFiles,
212
- toolsUsed,
213
- toolErrors,
214
- toolSummary: {
215
- metaToolsCount: toolsUsed.length,
216
- metaToolsUnique: [...new Set(toolsUsed)],
217
- toolMessageCount: toolMessages.length,
218
- toolNamesFromMessages: [...new Set(toolNamesFromMessages)],
219
- toolMessageCountsByName: countByName(toolNamesFromMessages),
220
- },
221
- agentReply: args.meta?.agentReply ?? null,
222
- messagesCount: Array.isArray(orderedMsgs) ? orderedMsgs.length : 0,
223
- lastAssistantMessage,
224
- messages: orderedMsgs,
225
- };
226
- }
@@ -1,123 +0,0 @@
1
- import { getReadableCliDb, type AgentCommandDeps } from "./agentCommandSupport";
2
- import { resolveAuthToken, resolveServerCandidates } from "./cliEnvHelpers";
3
- import {
4
- isLocalBaseUrl,
5
- readDialogFromLocalDb,
6
- tryHttpDialogCandidates,
7
- } from "./dialogDataAccess";
8
- import {
9
- parseDialogInputForCli,
10
- type DialogHttpAttempt,
11
- } from "./dialogReadHelpers";
12
- import { renderDialogStatus } from "../agent-runtime/dialogStatus";
13
-
14
- function usage() {
15
- return [
16
- "Usage:",
17
- " nolo dialog status <dialogId|dialogUrl>",
18
- "",
19
- ].join("\n");
20
- }
21
-
22
- export async function runDialogStatusCommand(
23
- args: string[],
24
- deps: AgentCommandDeps = {}
25
- ) {
26
- const env = deps.env ?? process.env;
27
- const output = deps.output ?? process.stdout;
28
- const rawInput = args[0]?.trim();
29
- if (!rawInput || rawInput === "-h" || rawInput === "--help") {
30
- output.write(`${usage()}\n`);
31
- return rawInput ? 0 : 1;
32
- }
33
-
34
- const authToken = resolveAuthToken(args, env);
35
- const fetchImpl = deps.fetchImpl ?? fetch;
36
- const fallbackFetchImpl = deps.fallbackFetchImpl;
37
-
38
- try {
39
- const { base, dialogId, userId } = parseDialogInputForCli(rawInput, env);
40
- const dialogKey = `dialog-${userId}-${dialogId}`;
41
- const candidateBases = resolveServerCandidates(
42
- args,
43
- {
44
- ...env,
45
- BASE_URL: env.READ_DIALOG_BASE?.trim() || base || env.BASE_URL,
46
- },
47
- base
48
- );
49
-
50
- let meta: any;
51
- let resolvedBase = base;
52
-
53
- try {
54
- ({ meta, resolvedBase } = await tryHttpDialogCandidates({
55
- authToken,
56
- bases: candidateBases,
57
- dialogId,
58
- dialogKey,
59
- fetchImpl,
60
- fallbackFetchImpl,
61
- limit: 1,
62
- }));
63
- } catch (error) {
64
- const localhostCandidate = candidateBases.find(isLocalBaseUrl);
65
- if (!localhostCandidate) {
66
- const attempts =
67
- typeof error === "object" && error !== null && "attempts" in error
68
- ? ((error as any).attempts as DialogHttpAttempt[])
69
- : [];
70
- throw new Error(
71
- `read dialog status failed: ${attempts
72
- .map((attempt) => `${attempt.base} -> ${attempt.status ?? attempt.message}`)
73
- .join("; ")}`
74
- );
75
- }
76
- try {
77
- const db = deps.db ?? await getReadableCliDb(output);
78
- ({ meta } = await readDialogFromLocalDb({
79
- db,
80
- dialogId,
81
- dialogKey,
82
- limit: 1,
83
- }));
84
- resolvedBase = localhostCandidate;
85
- } catch (fallbackError) {
86
- throw new Error(
87
- `read dialog status failed: ${
88
- fallbackError instanceof Error ? fallbackError.message : String(fallbackError)
89
- }`
90
- );
91
- }
92
- }
93
-
94
- output.write(
95
- renderDialogStatus({
96
- dialogId,
97
- dialogKey,
98
- base: resolvedBase,
99
- title: meta?.title ?? null,
100
- status: meta?.status ?? null,
101
- parentDialogId: meta?.parentDialogId ?? null,
102
- rootDialogId: meta?.rootDialogId ?? null,
103
- subjectRefs: Array.isArray(meta?.subjectRefs) ? meta.subjectRefs : [],
104
- runtimeCheckpoint: meta?.runtimeCheckpoint ?? null,
105
- artifacts: meta?.artifacts ?? null,
106
- writtenFiles: Array.isArray(meta?.writtenFiles) ? meta.writtenFiles : [],
107
- toolsUsed: Array.isArray(meta?.toolsUsed) ? meta.toolsUsed : [],
108
- toolErrors: Array.isArray(meta?.toolErrors) ? meta.toolErrors : [],
109
- durationMs: typeof meta?.durationMs === "number" ? meta.durationMs : null,
110
- updatedAt: meta?.updatedAt ?? null,
111
- finishedAt: meta?.finishedAt ?? null,
112
- })
113
- );
114
- return 0;
115
- } catch (error) {
116
- output.write(
117
- `[nolo] dialog status failed: ${
118
- error instanceof Error ? error.message : String(error)
119
- }\n`
120
- );
121
- return 1;
122
- }
123
- }
@@ -1,20 +0,0 @@
1
- import { createEnvCommand } from "./cliCommandFactories";
2
- import type { CommandEntry } from "./cliCommandTypes";
3
- import { runDocCreateCommand, runSkillDocCreateCommand } from "./pageCreateCommands";
4
- import { runDocDeleteCommand, runSkillDocDeleteCommand } from "./pageDeleteCommands";
5
- import { runDocReadCommand, runSkillDocReadCommand } from "./pageReadCommands";
6
- import { runDocUpdateCommand, runSkillDocUpdateCommand } from "./pageUpdateCommands";
7
-
8
- export function getDocInternalCommandEntries(): CommandEntry[] {
9
- return [
10
- createEnvCommand(["doc", "create"], "Create a normal doc", runDocCreateCommand),
11
- createEnvCommand(["doc", "read"], "Read a normal doc", runDocReadCommand),
12
- createEnvCommand(["doc", "update"], "Update a normal doc", runDocUpdateCommand),
13
- createEnvCommand(["doc", "delete"], "Delete a normal doc", runDocDeleteCommand),
14
- createEnvCommand(["skill-doc", "create"], "Create a skill doc", runSkillDocCreateCommand),
15
- createEnvCommand(["skill-doc", "read"], "Read a skill doc", runSkillDocReadCommand),
16
- createEnvCommand(["skill-doc", "update"], "Update a skill doc", runSkillDocUpdateCommand),
17
- createEnvCommand(["skill-doc", "delete"], "Delete a skill doc", runSkillDocDeleteCommand),
18
- createEnvCommand(["skill", "create-doc"], "Create a skill-backed doc", runSkillDocCreateCommand),
19
- ];
20
- }
@@ -1,109 +0,0 @@
1
- type LocalReadableDb = {
2
- get: (key: string) => Promise<unknown>;
3
- };
4
-
5
- export type HybridReadSource = "local-cache" | "remote-cache";
6
-
7
- export type CandidateReadResult<T> = {
8
- value: T;
9
- serverUrl: string;
10
- };
11
-
12
- export type ReadThroughResult<T> = {
13
- value: T;
14
- source: HybridReadSource;
15
- serverUrl: string | null;
16
- };
17
-
18
- export async function readFromServerCandidates<T>(args: {
19
- serverCandidates: string[];
20
- readRemote: (serverUrl: string) => Promise<T>;
21
- }): Promise<CandidateReadResult<T>> {
22
- let lastError: Error | null = null;
23
- for (const serverUrl of args.serverCandidates) {
24
- try {
25
- return {
26
- value: await args.readRemote(serverUrl),
27
- serverUrl,
28
- };
29
- } catch (error) {
30
- lastError = error instanceof Error ? error : new Error(String(error));
31
- }
32
- }
33
-
34
- throw lastError ?? new Error("record not found from candidate servers");
35
- }
36
-
37
- export async function readThroughRecord<T>(args: {
38
- db: LocalReadableDb;
39
- dbKey: string;
40
- serverCandidates: string[];
41
- readRemote: (serverUrl: string, dbKey: string) => Promise<T>;
42
- cacheRemote?: (value: T, serverUrl: string) => unknown | Promise<unknown>;
43
- isReadableLocal?: (value: unknown) => value is T;
44
- }): Promise<ReadThroughResult<T>> {
45
- try {
46
- const local = await args.db.get(args.dbKey);
47
- const isReadableLocal =
48
- args.isReadableLocal ?? ((value: unknown): value is T => !!value && typeof value === "object");
49
- if (isReadableLocal(local)) {
50
- return {
51
- value: local,
52
- source: "local-cache",
53
- serverUrl: null,
54
- };
55
- }
56
- } catch {
57
- // local miss; fall through to remote candidates
58
- }
59
-
60
- const remote = await readFromServerCandidates({
61
- serverCandidates: args.serverCandidates,
62
- readRemote: (serverUrl) => args.readRemote(serverUrl, args.dbKey),
63
- });
64
- if (args.cacheRemote) {
65
- await args.cacheRemote(remote.value, remote.serverUrl);
66
- }
67
-
68
- return {
69
- value: remote.value,
70
- source: "remote-cache",
71
- serverUrl: remote.serverUrl,
72
- };
73
- }
74
-
75
- export async function readRecordWithCandidates<T>(args: {
76
- db: LocalReadableDb;
77
- dbKey: string;
78
- serverCandidates: string[];
79
- readRemote: (serverUrl: string, dbKey: string) => Promise<T>;
80
- cacheRemote?: (value: T, serverUrl: string) => unknown | Promise<unknown>;
81
- isReadableLocal?: (value: unknown) => value is T;
82
- }) {
83
- const result = await readThroughRecord(args);
84
- return result.value;
85
- }
86
-
87
- export async function readThroughList<T>(args: {
88
- readLocal: () => Promise<T[]>;
89
- readRemote: () => Promise<T[]>;
90
- isEmpty?: (items: T[]) => boolean;
91
- }): Promise<{ items: T[]; source: HybridReadSource }> {
92
- try {
93
- const items = await args.readLocal();
94
- const isEmpty = args.isEmpty ?? ((values: T[]) => values.length === 0);
95
- if (!isEmpty(items)) {
96
- return {
97
- items,
98
- source: "local-cache",
99
- };
100
- }
101
- } catch {
102
- // local cache unavailable; fall through to remote
103
- }
104
-
105
- return {
106
- items: await args.readRemote(),
107
- source: "remote-cache",
108
- };
109
- }