neoagent 3.2.1-beta.0 → 3.2.1-beta.10

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 (175) hide show
  1. package/docs/agent-run-lifecycle.md +10 -0
  2. package/extensions/chrome-browser/background.mjs +318 -88
  3. package/extensions/chrome-browser/http.mjs +136 -0
  4. package/extensions/chrome-browser/protocol.mjs +654 -90
  5. package/flutter_app/lib/main_chat.dart +118 -739
  6. package/flutter_app/lib/main_controller.dart +111 -20
  7. package/flutter_app/lib/main_integrations.dart +607 -8
  8. package/flutter_app/lib/main_models.dart +3 -0
  9. package/flutter_app/lib/main_operations.dart +334 -321
  10. package/flutter_app/lib/main_security.dart +266 -112
  11. package/flutter_app/lib/main_settings.dart +4 -3
  12. package/flutter_app/lib/main_shared.dart +14 -11
  13. package/flutter_app/lib/src/backend_client.dart +78 -0
  14. package/flutter_app/lib/src/desktop_companion_actions.dart +185 -31
  15. package/flutter_app/lib/src/desktop_companion_io.dart +319 -86
  16. package/flutter_app/windows/runner/flutter_window.cpp +143 -32
  17. package/landing/index.html +3 -1
  18. package/lib/manager.js +106 -89
  19. package/lib/schema_migrations.js +145 -13
  20. package/package.json +30 -15
  21. package/runtime/paths.js +49 -5
  22. package/server/db/database.js +4 -4
  23. package/server/guest-agent.cli.package.json +13 -0
  24. package/server/guest_agent.js +85 -40
  25. package/server/http/middleware.js +24 -0
  26. package/server/http/routes.js +11 -6
  27. package/server/public/.last_build_id +1 -1
  28. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  29. package/server/public/flutter_bootstrap.js +2 -2
  30. package/server/public/main.dart.js +73083 -72209
  31. package/server/routes/admin.js +1 -1
  32. package/server/routes/agents.js +35 -2
  33. package/server/routes/android.js +30 -34
  34. package/server/routes/browser.js +23 -15
  35. package/server/routes/desktop.js +18 -1
  36. package/server/routes/integrations.js +107 -1
  37. package/server/routes/memory.js +1 -0
  38. package/server/routes/settings.js +16 -5
  39. package/server/routes/social_reach.js +12 -3
  40. package/server/routes/social_video.js +4 -0
  41. package/server/services/agents/manager.js +1 -1
  42. package/server/services/ai/capabilityHealth.js +62 -96
  43. package/server/services/ai/compaction.js +7 -2
  44. package/server/services/ai/history.js +45 -6
  45. package/server/services/ai/integrated_tools/http_request.js +8 -0
  46. package/server/services/ai/loop/agent_engine_core.js +496 -166
  47. package/server/services/ai/loop/blank_recovery.js +5 -4
  48. package/server/services/ai/loop/callbacks.js +1 -0
  49. package/server/services/ai/loop/completion_judge.js +121 -5
  50. package/server/services/ai/loop/conversation_loop.js +620 -340
  51. package/server/services/ai/loop/lifecycle.js +108 -0
  52. package/server/services/ai/loop/messaging_delivery.js +129 -57
  53. package/server/services/ai/loop/model_call_guard.js +91 -0
  54. package/server/services/ai/loop/model_io.js +48 -56
  55. package/server/services/ai/loop/progress_classification.js +2 -0
  56. package/server/services/ai/loop/tool_dispatch.js +28 -8
  57. package/server/services/ai/loopPolicy.js +48 -21
  58. package/server/services/ai/messagingFallback.js +17 -17
  59. package/server/services/ai/model_discovery.js +227 -0
  60. package/server/services/ai/model_failure_cache.js +108 -0
  61. package/server/services/ai/model_identity.js +71 -0
  62. package/server/services/ai/models.js +68 -163
  63. package/server/services/ai/providerRetry.js +17 -59
  64. package/server/services/ai/provider_selector.js +166 -0
  65. package/server/services/ai/providers/anthropic.js +4 -4
  66. package/server/services/ai/providers/claudeCode.js +21 -33
  67. package/server/services/ai/providers/githubCopilot.js +41 -20
  68. package/server/services/ai/providers/google.js +135 -97
  69. package/server/services/ai/providers/grok.js +6 -5
  70. package/server/services/ai/providers/grokOauth.js +19 -27
  71. package/server/services/ai/providers/nvidia.js +12 -7
  72. package/server/services/ai/providers/ollama.js +114 -86
  73. package/server/services/ai/providers/ollama_stream.js +142 -0
  74. package/server/services/ai/providers/openai.js +41 -7
  75. package/server/services/ai/providers/openaiCodex.js +13 -4
  76. package/server/services/ai/providers/openrouter.js +31 -9
  77. package/server/services/ai/providers/provider_error.js +36 -0
  78. package/server/services/ai/settings.js +26 -2
  79. package/server/services/ai/systemPrompt.js +19 -12
  80. package/server/services/ai/taskAnalysis.js +58 -10
  81. package/server/services/ai/terminal_reply.js +18 -0
  82. package/server/services/ai/toolEvidence.js +350 -29
  83. package/server/services/ai/tools.js +190 -111
  84. package/server/services/android/controller.js +770 -237
  85. package/server/services/android/process.js +140 -0
  86. package/server/services/android/sdk_download.js +143 -0
  87. package/server/services/android/uia.js +6 -5
  88. package/server/services/artifacts/store.js +24 -0
  89. package/server/services/browser/controller.js +843 -385
  90. package/server/services/browser/extension/gateway.js +40 -16
  91. package/server/services/browser/extension/protocol.js +15 -1
  92. package/server/services/browser/extension/provider.js +71 -47
  93. package/server/services/browser/extension/registry.js +155 -34
  94. package/server/services/cli/executor.js +62 -9
  95. package/server/services/credentials/bitwarden_cli.js +322 -0
  96. package/server/services/credentials/broker.js +594 -0
  97. package/server/services/desktop/gateway.js +41 -4
  98. package/server/services/desktop/protocol.js +3 -0
  99. package/server/services/desktop/provider.js +39 -42
  100. package/server/services/desktop/registry.js +137 -52
  101. package/server/services/integrations/bitwarden/constants.js +14 -0
  102. package/server/services/integrations/bitwarden/provider.js +197 -0
  103. package/server/services/integrations/bitwarden/snapshot.js +65 -0
  104. package/server/services/integrations/figma/provider.js +78 -12
  105. package/server/services/integrations/github/common.js +11 -6
  106. package/server/services/integrations/github/provider.js +52 -53
  107. package/server/services/integrations/google/provider.js +55 -19
  108. package/server/services/integrations/home_assistant/network.js +17 -20
  109. package/server/services/integrations/home_assistant/provider.js +7 -5
  110. package/server/services/integrations/home_assistant/tools.js +17 -5
  111. package/server/services/integrations/http.js +51 -0
  112. package/server/services/integrations/manager.js +159 -53
  113. package/server/services/integrations/microsoft/provider.js +80 -13
  114. package/server/services/integrations/neoarchive/provider.js +55 -29
  115. package/server/services/integrations/neorecall/client.js +17 -10
  116. package/server/services/integrations/neorecall/provider.js +20 -11
  117. package/server/services/integrations/notion/provider.js +16 -13
  118. package/server/services/integrations/oauth_provider.js +115 -51
  119. package/server/services/integrations/registry.js +2 -0
  120. package/server/services/integrations/slack/provider.js +98 -9
  121. package/server/services/integrations/spotify/provider.js +67 -71
  122. package/server/services/integrations/trello/provider.js +21 -7
  123. package/server/services/integrations/weather/provider.js +18 -12
  124. package/server/services/integrations/whatsapp/provider.js +76 -16
  125. package/server/services/manager.js +110 -1
  126. package/server/services/memory/embedding_index.js +20 -8
  127. package/server/services/memory/embeddings.js +151 -90
  128. package/server/services/memory/ingestion.js +50 -9
  129. package/server/services/memory/ingestion_documents.js +13 -3
  130. package/server/services/memory/manager.js +52 -19
  131. package/server/services/messaging/automation.js +85 -10
  132. package/server/services/messaging/formatting_guides.js +7 -4
  133. package/server/services/messaging/http_platforms.js +33 -13
  134. package/server/services/messaging/inbound_queue.js +78 -24
  135. package/server/services/messaging/inbound_store.js +224 -0
  136. package/server/services/messaging/manager.js +326 -51
  137. package/server/services/messaging/typing_keepalive.js +5 -2
  138. package/server/services/messaging/whatsapp.js +22 -14
  139. package/server/services/network/http.js +210 -0
  140. package/server/services/network/safe_request.js +307 -0
  141. package/server/services/runtime/backends/local-vm.js +227 -67
  142. package/server/services/runtime/docker-vm-manager.js +9 -0
  143. package/server/services/runtime/guest_bootstrap.js +30 -4
  144. package/server/services/runtime/guest_image.js +43 -12
  145. package/server/services/runtime/manager.js +77 -23
  146. package/server/services/runtime/validation.js +7 -6
  147. package/server/services/security/tool_categories.js +6 -0
  148. package/server/services/social_reach/channels/github.js +10 -4
  149. package/server/services/social_reach/channels/reddit.js +4 -4
  150. package/server/services/social_reach/channels/rss.js +2 -2
  151. package/server/services/social_reach/channels/social_video.js +12 -7
  152. package/server/services/social_reach/channels/v2ex.js +21 -8
  153. package/server/services/social_reach/channels/x.js +2 -2
  154. package/server/services/social_reach/channels/xueqiu.js +5 -5
  155. package/server/services/social_reach/service.js +9 -6
  156. package/server/services/social_reach/utils.js +65 -14
  157. package/server/services/social_video/service.js +160 -50
  158. package/server/services/tasks/integration_runtime.js +18 -8
  159. package/server/services/tasks/runtime.js +39 -4
  160. package/server/services/voice/agentBridge.js +17 -4
  161. package/server/services/voice/bufferedLiveRelayAdapter.js +5 -0
  162. package/server/services/voice/liveSession.js +31 -0
  163. package/server/services/voice/message.js +1 -1
  164. package/server/services/voice/openaiSpeech.js +33 -8
  165. package/server/services/voice/providers.js +233 -151
  166. package/server/services/voice/runtime.js +2 -2
  167. package/server/services/voice/runtimeManager.js +118 -20
  168. package/server/services/voice/turnRunner.js +6 -0
  169. package/server/services/wearable/firmware_manifest.js +51 -13
  170. package/server/services/wearable/service.js +1 -0
  171. package/server/utils/abort.js +96 -0
  172. package/server/utils/cloud-security.js +110 -3
  173. package/server/utils/files.js +31 -0
  174. package/server/utils/image_payload.js +95 -0
  175. package/server/utils/retry.js +107 -0
@@ -0,0 +1,136 @@
1
+ export const DEFAULT_EXTENSION_HTTP_TIMEOUT_MS = 10000;
2
+ export const DEFAULT_MAX_SERVER_RESPONSE_BYTES = 1024 * 1024;
3
+
4
+ function abortError(signal, fallback = 'NeoAgent server request was aborted.') {
5
+ if (signal?.reason instanceof Error) return signal.reason;
6
+ const error = new Error(String(signal?.reason || fallback));
7
+ error.name = 'AbortError';
8
+ error.code = 'ABORT_ERR';
9
+ return error;
10
+ }
11
+
12
+ function throwIfAborted(signal) {
13
+ if (signal?.aborted) throw abortError(signal);
14
+ }
15
+
16
+ function responseTooLargeError(maxResponseBytes) {
17
+ const error = new Error(
18
+ `NeoAgent server response exceeded the ${maxResponseBytes}-byte safety limit.`,
19
+ );
20
+ error.code = 'EXTENSION_RESPONSE_TOO_LARGE';
21
+ return error;
22
+ }
23
+
24
+ function waitForAbortable(promise, signal) {
25
+ throwIfAborted(signal);
26
+ if (!signal) return Promise.resolve(promise);
27
+ return new Promise((resolve, reject) => {
28
+ const onAbort = () => reject(abortError(signal));
29
+ signal.addEventListener('abort', onAbort, { once: true });
30
+ Promise.resolve(promise).then(resolve, reject).finally(() => {
31
+ signal.removeEventListener('abort', onAbort);
32
+ });
33
+ });
34
+ }
35
+
36
+ export async function readJsonResponse(response, options = {}) {
37
+ const signal = options.signal || null;
38
+ const maxResponseBytes = Math.max(
39
+ 1,
40
+ Number(options.maxResponseBytes) || DEFAULT_MAX_SERVER_RESPONSE_BYTES,
41
+ );
42
+ throwIfAborted(signal);
43
+ const contentLength = Number(response?.headers?.get?.('content-length'));
44
+ if (Number.isFinite(contentLength) && contentLength > maxResponseBytes) {
45
+ await Promise.resolve(response?.body?.cancel?.()).catch(() => {});
46
+ throw responseTooLargeError(maxResponseBytes);
47
+ }
48
+
49
+ const reader = response?.body?.getReader?.();
50
+ let text = '';
51
+ if (!reader) {
52
+ text = await waitForAbortable(response.text(), signal);
53
+ if (new TextEncoder().encode(text).byteLength > maxResponseBytes) {
54
+ throw responseTooLargeError(maxResponseBytes);
55
+ }
56
+ } else {
57
+ const decoder = new TextDecoder();
58
+ let totalBytes = 0;
59
+ const cancelReader = () => {
60
+ try {
61
+ Promise.resolve(reader.cancel(signal?.reason)).catch(() => {});
62
+ } catch {}
63
+ };
64
+ signal?.addEventListener('abort', cancelReader, { once: true });
65
+ try {
66
+ while (true) {
67
+ const { done, value } = await waitForAbortable(reader.read(), signal);
68
+ if (done) break;
69
+ const chunk = value instanceof Uint8Array ? value : new Uint8Array(value || []);
70
+ totalBytes += chunk.byteLength;
71
+ if (totalBytes > maxResponseBytes) {
72
+ await Promise.resolve(reader.cancel()).catch(() => {});
73
+ throw responseTooLargeError(maxResponseBytes);
74
+ }
75
+ text += decoder.decode(chunk, { stream: true });
76
+ }
77
+ text += decoder.decode();
78
+ } finally {
79
+ signal?.removeEventListener('abort', cancelReader);
80
+ reader.releaseLock?.();
81
+ }
82
+ }
83
+
84
+ if (!text.trim()) return {};
85
+ try {
86
+ return JSON.parse(text);
87
+ } catch {
88
+ throw new Error('NeoAgent server returned invalid JSON.');
89
+ }
90
+ }
91
+
92
+ export async function fetchJsonWithTimeout(url, options = {}, config = {}) {
93
+ const timeoutMs = Math.max(
94
+ 1,
95
+ Number(config.timeoutMs) || DEFAULT_EXTENSION_HTTP_TIMEOUT_MS,
96
+ );
97
+ const maxResponseBytes = Math.max(
98
+ 1,
99
+ Number(config.maxResponseBytes) || DEFAULT_MAX_SERVER_RESPONSE_BYTES,
100
+ );
101
+ const fetchImpl = typeof config.fetchImpl === 'function' ? config.fetchImpl : fetch;
102
+ const callerSignal = options.signal || null;
103
+ throwIfAborted(callerSignal);
104
+
105
+ const controller = new AbortController();
106
+ const onCallerAbort = () => controller.abort(callerSignal.reason);
107
+ callerSignal?.addEventListener('abort', onCallerAbort, { once: true });
108
+ const timer = setTimeout(() => {
109
+ const error = new Error(`NeoAgent server request timed out after ${timeoutMs}ms.`);
110
+ error.code = 'EXTENSION_HTTP_TIMEOUT';
111
+ controller.abort(error);
112
+ }, timeoutMs);
113
+
114
+ const { signal: _signal, ...fetchOptions } = options;
115
+ try {
116
+ const response = await waitForAbortable(
117
+ fetchImpl(url, {
118
+ ...fetchOptions,
119
+ signal: controller.signal,
120
+ }),
121
+ controller.signal,
122
+ );
123
+ const payload = await readJsonResponse(response, {
124
+ signal: controller.signal,
125
+ maxResponseBytes,
126
+ });
127
+ return { response, payload };
128
+ } catch (error) {
129
+ if (callerSignal?.aborted) throw abortError(callerSignal);
130
+ if (controller.signal.aborted) throw abortError(controller.signal);
131
+ throw error;
132
+ } finally {
133
+ clearTimeout(timer);
134
+ callerSignal?.removeEventListener('abort', onCallerAbort);
135
+ }
136
+ }