funolio-agent 1.0.75 → 1.1.65

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 (236) hide show
  1. package/dist/auth/credential-reader.d.ts.map +1 -1
  2. package/dist/auth/credential-reader.js +4 -3
  3. package/dist/auth/credential-reader.js.map +1 -1
  4. package/dist/auth/token-refresh.d.ts +8 -0
  5. package/dist/auth/token-refresh.d.ts.map +1 -1
  6. package/dist/auth/token-refresh.js +82 -52
  7. package/dist/auth/token-refresh.js.map +1 -1
  8. package/dist/auto-organizer.d.ts.map +1 -1
  9. package/dist/auto-organizer.js +6 -7
  10. package/dist/auto-organizer.js.map +1 -1
  11. package/dist/bench-prefix.d.ts +16 -0
  12. package/dist/bench-prefix.d.ts.map +1 -0
  13. package/dist/bench-prefix.js +25 -0
  14. package/dist/bench-prefix.js.map +1 -0
  15. package/dist/bot-manager.d.ts.map +1 -1
  16. package/dist/bot-manager.js +23 -14
  17. package/dist/bot-manager.js.map +1 -1
  18. package/dist/chat-sync.d.ts +42 -0
  19. package/dist/chat-sync.d.ts.map +1 -0
  20. package/dist/chat-sync.js +95 -0
  21. package/dist/chat-sync.js.map +1 -0
  22. package/dist/clerk-model.d.ts +7 -0
  23. package/dist/clerk-model.d.ts.map +1 -1
  24. package/dist/clerk-model.js +42 -8
  25. package/dist/clerk-model.js.map +1 -1
  26. package/dist/cli-bootstrap-history.d.ts +10 -0
  27. package/dist/cli-bootstrap-history.d.ts.map +1 -0
  28. package/dist/cli-bootstrap-history.js +112 -0
  29. package/dist/cli-bootstrap-history.js.map +1 -0
  30. package/dist/cli-models.d.ts +8 -0
  31. package/dist/cli-models.d.ts.map +1 -0
  32. package/dist/cli-models.js +91 -0
  33. package/dist/cli-models.js.map +1 -0
  34. package/dist/cli-session-epoch.d.ts +13 -3
  35. package/dist/cli-session-epoch.d.ts.map +1 -1
  36. package/dist/cli-session-epoch.js +53 -4
  37. package/dist/cli-session-epoch.js.map +1 -1
  38. package/dist/codex-app-server-manager.d.ts +64 -4
  39. package/dist/codex-app-server-manager.d.ts.map +1 -1
  40. package/dist/codex-app-server-manager.js +755 -55
  41. package/dist/codex-app-server-manager.js.map +1 -1
  42. package/dist/commands/pool.d.ts +32 -0
  43. package/dist/commands/pool.d.ts.map +1 -1
  44. package/dist/commands/pool.js +145 -66
  45. package/dist/commands/pool.js.map +1 -1
  46. package/dist/commands/start.d.ts +21 -0
  47. package/dist/commands/start.d.ts.map +1 -1
  48. package/dist/commands/start.js +484 -63
  49. package/dist/commands/start.js.map +1 -1
  50. package/dist/commands/status.d.ts.map +1 -1
  51. package/dist/commands/status.js +5 -2
  52. package/dist/commands/status.js.map +1 -1
  53. package/dist/config.d.ts +1 -0
  54. package/dist/config.d.ts.map +1 -1
  55. package/dist/config.js +170 -58
  56. package/dist/config.js.map +1 -1
  57. package/dist/context-window.d.ts +37 -1
  58. package/dist/context-window.d.ts.map +1 -1
  59. package/dist/context-window.js +202 -16
  60. package/dist/context-window.js.map +1 -1
  61. package/dist/live-activity.d.ts +3 -1
  62. package/dist/live-activity.d.ts.map +1 -1
  63. package/dist/live-activity.js.map +1 -1
  64. package/dist/local-chat-execution.d.ts +114 -0
  65. package/dist/local-chat-execution.d.ts.map +1 -0
  66. package/dist/local-chat-execution.js +349 -0
  67. package/dist/local-chat-execution.js.map +1 -0
  68. package/dist/local-cli-pty-manager.d.ts +138 -3
  69. package/dist/local-cli-pty-manager.d.ts.map +1 -1
  70. package/dist/local-cli-pty-manager.js +1415 -111
  71. package/dist/local-cli-pty-manager.js.map +1 -1
  72. package/dist/local-conversation-gateway.d.ts +110 -0
  73. package/dist/local-conversation-gateway.d.ts.map +1 -0
  74. package/dist/local-conversation-gateway.js +175 -0
  75. package/dist/local-conversation-gateway.js.map +1 -0
  76. package/dist/local-data.d.ts +235 -5
  77. package/dist/local-data.d.ts.map +1 -1
  78. package/dist/local-data.js +1066 -87
  79. package/dist/local-data.js.map +1 -1
  80. package/dist/local-db.d.ts +6 -0
  81. package/dist/local-db.d.ts.map +1 -1
  82. package/dist/local-db.js +376 -4
  83. package/dist/local-db.js.map +1 -1
  84. package/dist/local-funnel.d.ts.map +1 -1
  85. package/dist/local-funnel.js +6 -5
  86. package/dist/local-funnel.js.map +1 -1
  87. package/dist/local-server.d.ts +30 -0
  88. package/dist/local-server.d.ts.map +1 -1
  89. package/dist/local-server.js +2898 -319
  90. package/dist/local-server.js.map +1 -1
  91. package/dist/managed-process-registry.d.ts +59 -0
  92. package/dist/managed-process-registry.d.ts.map +1 -0
  93. package/dist/managed-process-registry.js +390 -0
  94. package/dist/managed-process-registry.js.map +1 -0
  95. package/dist/mcp/claude-config-writer.d.ts +5 -5
  96. package/dist/mcp/claude-config-writer.d.ts.map +1 -1
  97. package/dist/mcp/claude-config-writer.js +19 -11
  98. package/dist/mcp/claude-config-writer.js.map +1 -1
  99. package/dist/mcp/index.d.ts +4 -2
  100. package/dist/mcp/index.d.ts.map +1 -1
  101. package/dist/mcp/index.js.map +1 -1
  102. package/dist/mcp/sync-cli-config.d.ts +42 -4
  103. package/dist/mcp/sync-cli-config.d.ts.map +1 -1
  104. package/dist/mcp/sync-cli-config.js +497 -17
  105. package/dist/mcp/sync-cli-config.js.map +1 -1
  106. package/dist/message-loop.d.ts.map +1 -1
  107. package/dist/message-loop.js +43 -1
  108. package/dist/message-loop.js.map +1 -1
  109. package/dist/mqtt-client.d.ts +34 -0
  110. package/dist/mqtt-client.d.ts.map +1 -1
  111. package/dist/mqtt-client.js +270 -45
  112. package/dist/mqtt-client.js.map +1 -1
  113. package/dist/mqtt-data-relay.d.ts +44 -0
  114. package/dist/mqtt-data-relay.d.ts.map +1 -0
  115. package/dist/mqtt-data-relay.js +106 -0
  116. package/dist/mqtt-data-relay.js.map +1 -0
  117. package/dist/orchestration/capabilities.d.ts +13 -0
  118. package/dist/orchestration/capabilities.d.ts.map +1 -0
  119. package/dist/orchestration/capabilities.js +152 -0
  120. package/dist/orchestration/capabilities.js.map +1 -0
  121. package/dist/orchestration/dispatch-executor.d.ts +83 -0
  122. package/dist/orchestration/dispatch-executor.d.ts.map +1 -0
  123. package/dist/orchestration/dispatch-executor.js +266 -0
  124. package/dist/orchestration/dispatch-executor.js.map +1 -0
  125. package/dist/orchestration/dispatch-hint.d.ts +134 -0
  126. package/dist/orchestration/dispatch-hint.d.ts.map +1 -0
  127. package/dist/orchestration/dispatch-hint.js +247 -0
  128. package/dist/orchestration/dispatch-hint.js.map +1 -0
  129. package/dist/orchestration/dispatch-runner.d.ts +106 -0
  130. package/dist/orchestration/dispatch-runner.d.ts.map +1 -0
  131. package/dist/orchestration/dispatch-runner.js +604 -0
  132. package/dist/orchestration/dispatch-runner.js.map +1 -0
  133. package/dist/orchestration/dispatch-tools.d.ts +167 -0
  134. package/dist/orchestration/dispatch-tools.d.ts.map +1 -0
  135. package/dist/orchestration/dispatch-tools.js +328 -0
  136. package/dist/orchestration/dispatch-tools.js.map +1 -0
  137. package/dist/orchestration/front-door-policy.d.ts +35 -10
  138. package/dist/orchestration/front-door-policy.d.ts.map +1 -1
  139. package/dist/orchestration/front-door-policy.js +30 -267
  140. package/dist/orchestration/front-door-policy.js.map +1 -1
  141. package/dist/orchestration/orchestrator-dispatch-prompt.d.ts +43 -0
  142. package/dist/orchestration/orchestrator-dispatch-prompt.d.ts.map +1 -0
  143. package/dist/orchestration/orchestrator-dispatch-prompt.js +267 -0
  144. package/dist/orchestration/orchestrator-dispatch-prompt.js.map +1 -0
  145. package/dist/orchestration/orchestrator-operating-prompt.d.ts +14 -0
  146. package/dist/orchestration/orchestrator-operating-prompt.d.ts.map +1 -1
  147. package/dist/orchestration/orchestrator-operating-prompt.js +157 -31
  148. package/dist/orchestration/orchestrator-operating-prompt.js.map +1 -1
  149. package/dist/orchestration/plan-import.d.ts +39 -0
  150. package/dist/orchestration/plan-import.d.ts.map +1 -0
  151. package/dist/orchestration/plan-import.js +547 -0
  152. package/dist/orchestration/plan-import.js.map +1 -0
  153. package/dist/orchestration/worker-operating-prompt.d.ts +2 -0
  154. package/dist/orchestration/worker-operating-prompt.d.ts.map +1 -1
  155. package/dist/orchestration/worker-operating-prompt.js +36 -46
  156. package/dist/orchestration/worker-operating-prompt.js.map +1 -1
  157. package/dist/orchestrator.d.ts +195 -3
  158. package/dist/orchestrator.d.ts.map +1 -1
  159. package/dist/orchestrator.js +1970 -432
  160. package/dist/orchestrator.js.map +1 -1
  161. package/dist/providers/anthropic.d.ts.map +1 -1
  162. package/dist/providers/anthropic.js +8 -4
  163. package/dist/providers/anthropic.js.map +1 -1
  164. package/dist/providers/claude-cli.d.ts.map +1 -1
  165. package/dist/providers/claude-cli.js +28 -3
  166. package/dist/providers/claude-cli.js.map +1 -1
  167. package/dist/providers/codex-cli.d.ts +10 -6
  168. package/dist/providers/codex-cli.d.ts.map +1 -1
  169. package/dist/providers/codex-cli.js +190 -17
  170. package/dist/providers/codex-cli.js.map +1 -1
  171. package/dist/providers/google.d.ts.map +1 -1
  172. package/dist/providers/google.js +15 -5
  173. package/dist/providers/google.js.map +1 -1
  174. package/dist/providers/index.d.ts +15 -1
  175. package/dist/providers/index.d.ts.map +1 -1
  176. package/dist/providers/index.js.map +1 -1
  177. package/dist/providers/openai.d.ts +1 -1
  178. package/dist/providers/openai.d.ts.map +1 -1
  179. package/dist/providers/openai.js +13 -5
  180. package/dist/providers/openai.js.map +1 -1
  181. package/dist/server-adapter.d.ts +8 -0
  182. package/dist/server-adapter.d.ts.map +1 -1
  183. package/dist/server-adapter.js +7 -0
  184. package/dist/server-adapter.js.map +1 -1
  185. package/dist/service-mode.d.ts +1 -1
  186. package/dist/service-mode.d.ts.map +1 -1
  187. package/dist/service-mode.js +64 -1
  188. package/dist/service-mode.js.map +1 -1
  189. package/dist/service-setup-only.d.ts +8 -0
  190. package/dist/service-setup-only.d.ts.map +1 -0
  191. package/dist/service-setup-only.js +37 -0
  192. package/dist/service-setup-only.js.map +1 -0
  193. package/dist/slash-commands.d.ts +21 -0
  194. package/dist/slash-commands.d.ts.map +1 -0
  195. package/dist/slash-commands.js +99 -0
  196. package/dist/slash-commands.js.map +1 -0
  197. package/dist/subagent/index.d.ts +4 -2
  198. package/dist/subagent/index.d.ts.map +1 -1
  199. package/dist/subagent/index.js.map +1 -1
  200. package/dist/summarization-pipeline.d.ts.map +1 -1
  201. package/dist/summarization-pipeline.js +1 -9
  202. package/dist/summarization-pipeline.js.map +1 -1
  203. package/dist/token-counter.d.ts.map +1 -1
  204. package/dist/token-counter.js +11 -4
  205. package/dist/token-counter.js.map +1 -1
  206. package/dist/tool-filter.d.ts.map +1 -1
  207. package/dist/tool-filter.js +10 -6
  208. package/dist/tool-filter.js.map +1 -1
  209. package/dist/tools/admin-tools.d.ts.map +1 -1
  210. package/dist/tools/admin-tools.js +13 -4
  211. package/dist/tools/admin-tools.js.map +1 -1
  212. package/dist/tools/run-command.d.ts.map +1 -1
  213. package/dist/tools/run-command.js +5 -1
  214. package/dist/tools/run-command.js.map +1 -1
  215. package/dist/tools/search-conversation-history.d.ts.map +1 -1
  216. package/dist/tools/search-conversation-history.js +12 -2
  217. package/dist/tools/search-conversation-history.js.map +1 -1
  218. package/dist/tools/todo-tasks.d.ts.map +1 -1
  219. package/dist/tools/todo-tasks.js +77 -5
  220. package/dist/tools/todo-tasks.js.map +1 -1
  221. package/dist/usage-log.d.ts +62 -0
  222. package/dist/usage-log.d.ts.map +1 -0
  223. package/dist/usage-log.js +98 -0
  224. package/dist/usage-log.js.map +1 -0
  225. package/dist/wizard-state.d.ts +13 -0
  226. package/dist/wizard-state.d.ts.map +1 -1
  227. package/dist/wizard-state.js +61 -3
  228. package/dist/wizard-state.js.map +1 -1
  229. package/dist/wizard-support.d.ts.map +1 -1
  230. package/dist/wizard-support.js +27 -1
  231. package/dist/wizard-support.js.map +1 -1
  232. package/dist/workflow-engine.d.ts +40 -1
  233. package/dist/workflow-engine.d.ts.map +1 -1
  234. package/dist/workflow-engine.js +753 -93
  235. package/dist/workflow-engine.js.map +1 -1
  236. package/package.json +2 -2
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -6,6 +39,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.AgentMqttClient = void 0;
7
40
  const mqtt_1 = __importDefault(require("mqtt"));
8
41
  const chalk_1 = __importDefault(require("chalk"));
42
+ const crypto = __importStar(require("crypto"));
43
+ const os = __importStar(require("os"));
44
+ /** Convert an MQTT topic pattern (with `+` / `#` wildcards) to a RegExp. */
45
+ function topicPatternToRegExp(pattern) {
46
+ const escaped = pattern
47
+ .split('/')
48
+ .map((seg) => {
49
+ if (seg === '+')
50
+ return '[^/]+';
51
+ if (seg === '#')
52
+ return '.*';
53
+ return seg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
54
+ })
55
+ .join('/');
56
+ return new RegExp('^' + escaped + '$');
57
+ }
9
58
  class AgentMqttClient {
10
59
  client = null;
11
60
  options;
@@ -15,8 +64,14 @@ class AgentMqttClient {
15
64
  approvalHandler = null;
16
65
  integrationTokenHandler = null;
17
66
  reconnectCount = 0;
67
+ reconnectRebuildInFlight = false;
68
+ rebuildRetryCount = 0;
69
+ refreshInFlight = null;
18
70
  chunkSeqByCommand = new Map();
71
+ extraSubscriptions = [];
19
72
  static MAX_RECONNECT_ATTEMPTS = 10;
73
+ static BASE_RECONNECT_MS = 5000;
74
+ static MAX_RECONNECT_MS = 60000;
20
75
  static REFRESH_BEFORE_EXPIRY_MS = 5 * 60 * 1000; // 5 minutes
21
76
  static JWT_TTL_MS = 60 * 60 * 1000; // 1 hour
22
77
  constructor(options) {
@@ -31,7 +86,8 @@ class AgentMqttClient {
31
86
  throw new Error('Cannot connect to MQTT: mqttJwt is missing or empty. Please run \'funolio-agent login\' to set up your credentials.');
32
87
  }
33
88
  return new Promise((resolve, reject) => {
34
- const clientId = `funolio-agent-${this.options.userId}-${Date.now()}`;
89
+ const clientId = this.buildStableClientId();
90
+ let initialConnectSettled = false;
35
91
  const isTls = this.options.brokerUrl.startsWith('mqtts://');
36
92
  console.log(chalk_1.default.blue(`🔌 Connecting to MQTT broker: ${this.options.brokerUrl} (TLS: ${isTls ? 'yes' : 'no'})`));
37
93
  const mqttOptions = {
@@ -40,7 +96,7 @@ class AgentMqttClient {
40
96
  password: this.options.mqttJwt,
41
97
  clean: true,
42
98
  keepalive: 60,
43
- reconnectPeriod: 5000,
99
+ reconnectPeriod: AgentMqttClient.BASE_RECONNECT_MS,
44
100
  connectTimeout: 10000,
45
101
  rejectUnauthorized: false, // EMQX uses self-signed TLS cert
46
102
  will: {
@@ -53,28 +109,72 @@ class AgentMqttClient {
53
109
  retain: true,
54
110
  },
55
111
  };
56
- this.client = mqtt_1.default.connect(this.options.brokerUrl, mqttOptions);
57
- this.client.on('connect', () => {
58
- this.reconnectCount = 0;
112
+ const client = mqtt_1.default.connect(this.options.brokerUrl, mqttOptions);
113
+ this.client = client;
114
+ client.on('connect', () => {
115
+ if (this.client !== client)
116
+ return;
117
+ const reconnectAttempts = this.reconnectCount;
59
118
  // Subscribe to commands, approval responses, and integration tokens
60
119
  const commandTopic = `funolio/${this.options.userId}/agent/commands`;
61
120
  const approvalTopic = `funolio/${this.options.userId}/agent/approval_response`;
62
121
  const integrationTokensTopic = `funolio/${this.options.userId}/agent/integration_tokens`;
63
- this.client.subscribe([commandTopic, approvalTopic, integrationTokensTopic], { qos: 1 }, (err) => {
122
+ const topics = [
123
+ commandTopic,
124
+ approvalTopic,
125
+ integrationTokensTopic,
126
+ ...this.extraSubscriptions.map((sub) => sub.topic),
127
+ ];
128
+ client.subscribe([...new Set(topics)], { qos: 1 }, (err) => {
129
+ if (this.client !== client)
130
+ return;
64
131
  if (err) {
65
- reject(new Error(`Failed to subscribe: ${err.message}`));
132
+ if (!initialConnectSettled) {
133
+ initialConnectSettled = true;
134
+ reject(new Error(`Failed to subscribe: ${err.message}`));
135
+ }
136
+ else {
137
+ console.error(chalk_1.default.red(` Failed to re-subscribe after reconnect: ${err.message}`));
138
+ }
66
139
  return;
67
140
  }
141
+ if (reconnectAttempts > 0) {
142
+ console.log(chalk_1.default.green(` Reconnected after ${reconnectAttempts} attempt(s)`));
143
+ }
68
144
  // Publish online status
69
145
  this.publishStatus('online');
70
146
  // Start heartbeat
71
147
  this.startHeartbeat();
72
148
  // Start JWT refresh timer
73
149
  this.startRefreshTimer();
74
- resolve();
150
+ this.reconnectCount = 0;
151
+ this.reconnectRebuildInFlight = false;
152
+ this.rebuildRetryCount = 0;
153
+ client.options.reconnectPeriod = AgentMqttClient.BASE_RECONNECT_MS;
154
+ if (!initialConnectSettled) {
155
+ initialConnectSettled = true;
156
+ resolve();
157
+ }
75
158
  });
76
159
  });
77
- this.client.on('message', (topic, payload) => {
160
+ client.on('message', (topic, payload) => {
161
+ if (this.client !== client)
162
+ return;
163
+ // Dispatch extra pattern-based subscriptions first (pool request topics etc.)
164
+ let handledByExtra = false;
165
+ for (const sub of this.extraSubscriptions) {
166
+ if (sub.regex.test(topic)) {
167
+ handledByExtra = true;
168
+ try {
169
+ sub.handler(topic, payload);
170
+ }
171
+ catch (err) {
172
+ console.error(chalk_1.default.red(`Topic handler error for ${topic}:`), err);
173
+ }
174
+ }
175
+ }
176
+ if (handledByExtra)
177
+ return;
78
178
  try {
79
179
  const message = JSON.parse(payload.toString());
80
180
  if (topic.endsWith('/approval_response') && this.approvalHandler) {
@@ -91,8 +191,12 @@ class AgentMqttClient {
91
191
  console.error(chalk_1.default.red('Failed to parse message:'), error);
92
192
  }
93
193
  });
94
- this.client.on('reconnect', async () => {
194
+ client.on('reconnect', async () => {
195
+ if (this.client !== client)
196
+ return;
95
197
  this.reconnectCount++;
198
+ const nextReconnectMs = this.computeReconnectPeriodMs(this.reconnectCount);
199
+ client.options.reconnectPeriod = nextReconnectMs;
96
200
  console.log(chalk_1.default.yellow(`⟳ Reconnecting to MQTT broker... (attempt ${this.reconnectCount}/${AgentMqttClient.MAX_RECONNECT_ATTEMPTS})`));
97
201
  // On reconnect attempt, try refreshing JWT in case it expired
98
202
  if (this.reconnectCount === 2 || this.reconnectCount === 5) {
@@ -100,8 +204,8 @@ class AgentMqttClient {
100
204
  try {
101
205
  await this.refreshMqttJwt();
102
206
  // Update the client's password with the new JWT for the next reconnect attempt
103
- if (this.client) {
104
- this.client.options.password = this.options.mqttJwt;
207
+ if (this.client === client) {
208
+ client.options.password = this.options.mqttJwt;
105
209
  }
106
210
  console.log(chalk_1.default.green(' ✓ JWT refreshed, retrying connection'));
107
211
  }
@@ -111,54 +215,43 @@ class AgentMqttClient {
111
215
  }
112
216
  if (this.reconnectCount >= AgentMqttClient.MAX_RECONNECT_ATTEMPTS) {
113
217
  console.error(chalk_1.default.red(`\n✗ Max reconnect attempts (${AgentMqttClient.MAX_RECONNECT_ATTEMPTS}) reached.`));
114
- // Last resort: try one more JWT refresh before giving up
218
+ // Last resort: refresh the token, then rebuild the MQTT client. Keeping
219
+ // the same mqtt.js client can leave local HTTP healthy while the cloud
220
+ // relay times out forever.
115
221
  try {
116
222
  await this.refreshMqttJwt();
117
- if (this.client) {
118
- this.client.options.password = this.options.mqttJwt;
223
+ if (this.client === client) {
224
+ client.options.password = this.options.mqttJwt;
119
225
  }
120
- this.reconnectCount = 0;
121
- console.log(chalk_1.default.green(' ✓ JWT refreshed, resetting reconnect counter'));
226
+ console.log(chalk_1.default.green(' ✓ JWT refreshed before MQTT client rebuild'));
122
227
  }
123
228
  catch {
124
- console.error(chalk_1.default.red(' Authentication failed. Please run \'funolio-agent login\' to set up your credentials.'));
125
- this.client?.end(true);
229
+ console.error(chalk_1.default.red(' MQTT JWT refresh failed before client rebuild; rebuilding with the current token.'));
126
230
  }
231
+ this.rebuildConnectionAfterReconnectFailure('max_reconnect_attempts');
127
232
  }
128
233
  });
129
- this.client.on('offline', () => {
130
- console.log(chalk_1.default.gray(' MQTT client went offline — will attempt JWT refresh'));
234
+ client.on('offline', () => {
235
+ if (this.client !== client)
236
+ return;
237
+ console.log(chalk_1.default.gray(' MQTT client went offline; reconnect will continue with the current JWT'));
131
238
  this.stopHeartbeat();
132
- // Proactively refresh JWT so the auto-reconnect has a valid token
133
- this.refreshMqttJwt().catch(() => { });
134
239
  });
135
- // Re-subscribe and restore state after successful reconnection
136
- this.client.on('connect', () => {
137
- if (this.reconnectCount > 0) {
138
- console.log(chalk_1.default.green(` ✓ Reconnected after ${this.reconnectCount} attempt(s)`));
139
- const commandTopic = `funolio/${this.options.userId}/agent/commands`;
140
- const approvalTopic = `funolio/${this.options.userId}/agent/approval_response`;
141
- const integrationTokensTopic = `funolio/${this.options.userId}/agent/integration_tokens`;
142
- this.client.subscribe([commandTopic, approvalTopic, integrationTokensTopic], { qos: 1 }, (err) => {
143
- if (err) {
144
- console.error(chalk_1.default.red(` ✗ Failed to re-subscribe after reconnect: ${err.message}`));
145
- }
146
- else {
147
- console.log(chalk_1.default.green(' ✓ Re-subscribed to command + approval topics'));
148
- }
149
- });
150
- this.publishStatus('online');
151
- this.startHeartbeat();
152
- this.reconnectCount = 0;
240
+ client.on('error', (error) => {
241
+ if (this.client !== client) {
242
+ console.warn(chalk_1.default.yellow(`[mqtt] Ignored stale MQTT client error: ${error.message}`));
243
+ return;
153
244
  }
154
- });
155
- this.client.on('error', (error) => {
156
245
  console.error(chalk_1.default.red(`MQTT error: ${error.message}`));
157
- if (this.reconnectCount === 0) {
246
+ if (!initialConnectSettled && this.reconnectCount === 0) {
247
+ initialConnectSettled = true;
158
248
  reject(error);
159
249
  }
160
250
  });
161
- this.client.on('close', () => {
251
+ client.on('close', () => {
252
+ if (this.client !== client)
253
+ return;
254
+ console.log(chalk_1.default.gray(` MQTT connection closed for ${clientId}`));
162
255
  this.stopHeartbeat();
163
256
  });
164
257
  });
@@ -172,6 +265,33 @@ class AgentMqttClient {
172
265
  onIntegrationTokens(handler) {
173
266
  this.integrationTokenHandler = handler;
174
267
  }
268
+ /**
269
+ * Subscribe to an arbitrary MQTT topic (may include `+` / `#` wildcards).
270
+ * The handler is invoked with the raw payload on every matching message.
271
+ *
272
+ * The subscription is remembered and re-established automatically after a
273
+ * reconnect. Safe to call before or after {@link connect}; if the client is
274
+ * not yet connected, the subscription is registered and will be sent once
275
+ * the client connects.
276
+ */
277
+ subscribeTopic(topic, handler, opts) {
278
+ const qos = (opts?.qos ?? 1);
279
+ const regex = topicPatternToRegExp(topic);
280
+ const existingIndex = this.extraSubscriptions.findIndex((sub) => sub.topic === topic);
281
+ if (existingIndex >= 0) {
282
+ this.extraSubscriptions[existingIndex] = { topic, qos, regex, handler };
283
+ }
284
+ else {
285
+ this.extraSubscriptions.push({ topic, qos, regex, handler });
286
+ }
287
+ if (this.client?.connected) {
288
+ this.client.subscribe(topic, { qos }, (err) => {
289
+ if (err) {
290
+ console.error(chalk_1.default.red(`Failed to subscribe to ${topic}: ${err.message}`));
291
+ }
292
+ });
293
+ }
294
+ }
175
295
  async publishResult(result) {
176
296
  if (!this.client?.connected) {
177
297
  throw new Error('Not connected to MQTT broker');
@@ -216,6 +336,7 @@ class AgentMqttClient {
216
336
  this.client.publish(topic, payload, { qos: 1, retain: true });
217
337
  }
218
338
  startHeartbeat() {
339
+ this.stopHeartbeat();
219
340
  this.heartbeatTimer = setInterval(() => {
220
341
  this.publishStatus('online');
221
342
  }, this.options.heartbeatIntervalMs);
@@ -250,6 +371,17 @@ class AgentMqttClient {
250
371
  }
251
372
  }
252
373
  async refreshMqttJwt(attempt = 0) {
374
+ if (this.refreshInFlight && attempt === 0)
375
+ return this.refreshInFlight;
376
+ if (attempt === 0) {
377
+ this.refreshInFlight = this.refreshMqttJwtInner(0).finally(() => {
378
+ this.refreshInFlight = null;
379
+ });
380
+ return this.refreshInFlight;
381
+ }
382
+ return this.refreshMqttJwtInner(attempt);
383
+ }
384
+ async refreshMqttJwtInner(attempt = 0) {
253
385
  const maxRetries = 3;
254
386
  const refreshUrl = this.options.refreshUrl || 'https://www.funolio.com/api/v1/agent/auth/refresh';
255
387
  try {
@@ -321,6 +453,99 @@ class AgentMqttClient {
321
453
  get connected() {
322
454
  return this.client?.connected ?? false;
323
455
  }
456
+ rebuildConnectionAfterReconnectFailure(reason) {
457
+ if (this.reconnectRebuildInFlight)
458
+ return;
459
+ this.reconnectRebuildInFlight = true;
460
+ const staleClient = this.client;
461
+ this.client = null;
462
+ this.reconnectCount = 0;
463
+ this.stopHeartbeat();
464
+ this.stopRefreshTimer();
465
+ console.warn(chalk_1.default.yellow(`[mqtt] Rebuilding MQTT client after reconnect failure: ${reason}`));
466
+ if (staleClient) {
467
+ const staleErrorSink = (err) => {
468
+ console.warn(chalk_1.default.yellow(`[mqtt] Ignored stale MQTT client error during rebuild: ${err.message}`));
469
+ };
470
+ staleClient.on('error', staleErrorSink);
471
+ try {
472
+ staleClient.options.reconnectPeriod = 0;
473
+ staleClient.end(true, {}, () => {
474
+ staleClient.removeListener('error', staleErrorSink);
475
+ staleClient.removeAllListeners();
476
+ });
477
+ }
478
+ catch (err) {
479
+ console.warn(chalk_1.default.yellow(`[mqtt] Failed to close stale MQTT client cleanly: ${err?.message || err}`));
480
+ try {
481
+ staleClient.removeListener('error', staleErrorSink);
482
+ staleClient.removeAllListeners();
483
+ }
484
+ catch { }
485
+ }
486
+ }
487
+ const retryDelayMs = this.computeRebuildRetryDelayMs();
488
+ setTimeout(() => {
489
+ this.connect()
490
+ .then(() => {
491
+ console.log(chalk_1.default.green('[mqtt] MQTT client rebuilt and reconnected'));
492
+ })
493
+ .catch((err) => {
494
+ console.error(chalk_1.default.red(`[mqtt] MQTT client rebuild failed: ${err?.message || err}`));
495
+ this.destroyCurrentClientAfterFailedRebuild();
496
+ this.reconnectRebuildInFlight = false;
497
+ this.rebuildConnectionAfterReconnectFailure('rebuild_connect_failed');
498
+ });
499
+ }, retryDelayMs);
500
+ }
501
+ destroyCurrentClientAfterFailedRebuild() {
502
+ const failedClient = this.client;
503
+ this.client = null;
504
+ this.stopHeartbeat();
505
+ this.stopRefreshTimer();
506
+ if (!failedClient)
507
+ return;
508
+ const failedErrorSink = (err) => {
509
+ console.warn(chalk_1.default.yellow(`[mqtt] Ignored failed rebuild client error: ${err.message}`));
510
+ };
511
+ try {
512
+ failedClient.on('error', failedErrorSink);
513
+ failedClient.options.reconnectPeriod = 0;
514
+ failedClient.end(true, {}, () => {
515
+ failedClient.removeListener('error', failedErrorSink);
516
+ failedClient.removeAllListeners();
517
+ });
518
+ }
519
+ catch (err) {
520
+ console.warn(chalk_1.default.yellow(`[mqtt] Failed to destroy MQTT rebuild client: ${err?.message || err}`));
521
+ try {
522
+ failedClient.removeListener('error', failedErrorSink);
523
+ failedClient.removeAllListeners();
524
+ }
525
+ catch { }
526
+ }
527
+ }
528
+ buildStableClientId() {
529
+ const safeUser = this.options.userId.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 48) || 'user';
530
+ const fingerprint = crypto
531
+ .createHash('sha256')
532
+ .update(`${os.hostname()}|${os.homedir()}|${process.execPath}`)
533
+ .digest('hex')
534
+ .slice(0, 12);
535
+ return `funolio-agent-${safeUser}-${fingerprint}`;
536
+ }
537
+ computeReconnectPeriodMs(attempt) {
538
+ const exponent = Math.max(0, Math.min(attempt - 1, 5));
539
+ const base = Math.min(AgentMqttClient.MAX_RECONNECT_MS, AgentMqttClient.BASE_RECONNECT_MS * Math.pow(2, exponent));
540
+ const jitter = Math.floor(Math.random() * 1000);
541
+ return Math.min(AgentMqttClient.MAX_RECONNECT_MS, base + jitter);
542
+ }
543
+ computeRebuildRetryDelayMs() {
544
+ const attempt = this.rebuildRetryCount++;
545
+ const base = Math.min(30000, 1000 * Math.pow(2, Math.min(attempt, 5)));
546
+ const jitter = Math.floor(Math.random() * 1000);
547
+ return base + jitter;
548
+ }
324
549
  }
325
550
  exports.AgentMqttClient = AgentMqttClient;
326
551
  //# sourceMappingURL=mqtt-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt-client.js","sourceRoot":"","sources":["../src/mqtt-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mqtt-client.js","sourceRoot":"","sources":["../src/mqtt-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Agent-side MQTT data-request relay.
3
+ *
4
+ * Receives `data_request` messages from the cloud over MQTT and dispatches
5
+ * them to the agent's existing local HTTP server (127.0.0.1:18420) via
6
+ * self-loopback fetch. The HTTP response is captured and published back to
7
+ * the cloud as a `data_response` result, correlated by commandId.
8
+ *
9
+ * This is the agent half of the local-DB read relay described in
10
+ * mobile1.txt. Lets `personal-desktop` users see their local SQLite data
11
+ * from any client (mobile, web) without any data leaving their machine —
12
+ * the cloud is purely a transport.
13
+ *
14
+ * NEVER touched: the existing local HTTP server, its routes, or any of
15
+ * the data layer. We are a thin shim that forwards MQTT messages to
16
+ * already-existing endpoints. If a route works for the desktop UI today,
17
+ * it works through the relay tomorrow.
18
+ *
19
+ * Failure-mode contract (mirrored on the cloud side):
20
+ * - Local HTTP fetch fails → publish data_response with status 502
21
+ * - Local HTTP returns non-2xx → publish data_response with that status
22
+ * and the upstream body
23
+ * - Local HTTP times out (>= 10s) → abort and publish 504
24
+ * - JSON-parse failure on agent's response → wrap as text content
25
+ */
26
+ import { AgentMqttClient } from './mqtt-client';
27
+ export interface DataRequestMessage {
28
+ type: 'data_request';
29
+ id: string;
30
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
31
+ path: string;
32
+ query?: Record<string, string>;
33
+ body?: unknown;
34
+ headers?: Record<string, string>;
35
+ }
36
+ /**
37
+ * Handle one data_request message. Always publishes some data_response so
38
+ * the cloud's awaiting promise is never orphaned.
39
+ *
40
+ * Returns true when the message was a data_request (handled), false
41
+ * otherwise — caller can use this as a dispatch discriminator.
42
+ */
43
+ export declare function handleDataRequestMessage(message: any, mqttClient: AgentMqttClient): Promise<boolean>;
44
+ //# sourceMappingURL=mqtt-data-relay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mqtt-data-relay.d.ts","sourceRoot":"","sources":["../src/mqtt-data-relay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAqDD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,OAAO,CAAC,CAsDlB"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleDataRequestMessage = handleDataRequestMessage;
4
+ const LOCAL_PORT = Number(process.env.FUNOLIO_LOCAL_PORT || 18420);
5
+ const LOCAL_FETCH_TIMEOUT_MS = 10_000;
6
+ function isDataRequest(message) {
7
+ if (!message || typeof message !== 'object')
8
+ return false;
9
+ if (message.type !== 'data_request')
10
+ return false;
11
+ if (typeof message.id !== 'string' || message.id.length === 0)
12
+ return false;
13
+ if (typeof message.path !== 'string' || !message.path.startsWith('/api/'))
14
+ return false;
15
+ const m = String(message.method || '').toUpperCase();
16
+ if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(m))
17
+ return false;
18
+ return true;
19
+ }
20
+ function buildLocalUrl(path, query) {
21
+ const url = new URL(`http://127.0.0.1:${LOCAL_PORT}${path}`);
22
+ if (query) {
23
+ for (const [k, v] of Object.entries(query)) {
24
+ if (v !== undefined && v !== null)
25
+ url.searchParams.set(k, String(v));
26
+ }
27
+ }
28
+ return url.toString();
29
+ }
30
+ async function publishDataResponse(mqttClient, commandId, status, body, contentType) {
31
+ const payload = {
32
+ type: 'data_response',
33
+ requestId: commandId,
34
+ status,
35
+ contentType: contentType || 'application/json',
36
+ body,
37
+ };
38
+ const result = {
39
+ commandId,
40
+ type: 'data_response',
41
+ content: JSON.stringify(payload),
42
+ timestamp: Date.now(),
43
+ };
44
+ await mqttClient.publishResult(result);
45
+ }
46
+ /**
47
+ * Handle one data_request message. Always publishes some data_response so
48
+ * the cloud's awaiting promise is never orphaned.
49
+ *
50
+ * Returns true when the message was a data_request (handled), false
51
+ * otherwise — caller can use this as a dispatch discriminator.
52
+ */
53
+ async function handleDataRequestMessage(message, mqttClient) {
54
+ if (!isDataRequest(message))
55
+ return false;
56
+ const requestId = message.id;
57
+ const url = buildLocalUrl(message.path, message.query);
58
+ const method = message.method.toUpperCase();
59
+ const headers = {
60
+ 'content-type': 'application/json',
61
+ ...(message.headers || {}),
62
+ // Mark the request so the local HTTP server can identify relay
63
+ // traffic if it ever wants to (e.g. log differently, skip CORS,
64
+ // skip rate-limit). Today no route checks this; future-proofing.
65
+ 'x-funolio-relay': '1',
66
+ };
67
+ const controller = new AbortController();
68
+ const timer = setTimeout(() => controller.abort(), LOCAL_FETCH_TIMEOUT_MS);
69
+ try {
70
+ const init = {
71
+ method,
72
+ headers,
73
+ signal: controller.signal,
74
+ };
75
+ if (method !== 'GET' && method !== 'DELETE' && message.body !== undefined && message.body !== null) {
76
+ init.body = typeof message.body === 'string' ? message.body : JSON.stringify(message.body);
77
+ }
78
+ const response = await fetch(url, init);
79
+ const responseContentType = response.headers.get('content-type') || 'application/json';
80
+ const text = await response.text();
81
+ let bodyValue = text;
82
+ if (responseContentType.includes('application/json') && text.length > 0) {
83
+ try {
84
+ bodyValue = JSON.parse(text);
85
+ }
86
+ catch {
87
+ // Leave as text if upstream lied about content-type.
88
+ }
89
+ }
90
+ await publishDataResponse(mqttClient, requestId, response.status, bodyValue, responseContentType);
91
+ return true;
92
+ }
93
+ catch (err) {
94
+ const isAbort = err?.name === 'AbortError' || controller.signal.aborted;
95
+ const status = isAbort ? 504 : 502;
96
+ const errorMessage = isAbort
97
+ ? `Agent local HTTP timed out after ${LOCAL_FETCH_TIMEOUT_MS}ms`
98
+ : `Agent local HTTP failed: ${err?.message || String(err)}`;
99
+ await publishDataResponse(mqttClient, requestId, status, { error: errorMessage });
100
+ return true;
101
+ }
102
+ finally {
103
+ clearTimeout(timer);
104
+ }
105
+ }
106
+ //# sourceMappingURL=mqtt-data-relay.js.map