@oar-sh/oar 0.9.15 → 0.9.16

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 (52) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +9 -9
  3. package/package.json +1 -1
  4. package/server/claude-worker/claude-remote-relay-tool.mjs +36 -1
  5. package/server/claude-worker/claude-session-process.mjs +4 -4
  6. package/server/copilot-worker/copilot-sdk-session-process.mjs +2 -2
  7. package/server/db-schema.mjs +52 -0
  8. package/server/migrations/0019-relay-event-subscription-options.mjs +106 -0
  9. package/server/migrations/0020-conversation-may-create-sessions.mjs +67 -0
  10. package/server/migrations/0021-conversation-group-agent-marks.mjs +77 -0
  11. package/server/migrations/0022-relay-schedules.mjs +142 -0
  12. package/server/migrations/0023-relay-asks.mjs +141 -0
  13. package/server/public/app/ask-user-view.js +3 -0
  14. package/server/public/app/bootstrap.js +61 -3
  15. package/server/public/app/context-usage-view.mjs +17 -0
  16. package/server/public/app/conversation-group-order.mjs +35 -0
  17. package/server/public/app/inbox-ui.js +356 -0
  18. package/server/public/app/inbox-view.mjs +370 -0
  19. package/server/public/app/journal-view.js +23 -2
  20. package/server/public/app/relay-event-subscriptions-ui.js +4 -2
  21. package/server/public/app/relay-event-view.mjs +33 -7
  22. package/server/public/app/relay-schedule-view.mjs +119 -0
  23. package/server/public/app/relay-schedules-ui.js +172 -0
  24. package/server/public/app/socket-handlers.js +27 -3
  25. package/server/public/app/store.js +18 -5
  26. package/server/public/index.html +159 -2
  27. package/server/relay-tools.md +18 -3
  28. package/server/repositories/conversation-group-repository.mjs +97 -11
  29. package/server/repositories/remote-relay-repository.mjs +20 -2
  30. package/server/repositories/session-repository.mjs +7 -1
  31. package/server/routes/ask-user-routes.mjs +57 -3
  32. package/server/routes/cache-routes.mjs +6 -0
  33. package/server/routes/conversation-group-routes.mjs +17 -2
  34. package/server/routes/messages-routes.mjs +3 -3
  35. package/server/routes/relay-ask-routes.mjs +387 -0
  36. package/server/routes/relay-event-routes.mjs +3 -1
  37. package/server/routes/relay-schedule-routes.mjs +57 -0
  38. package/server/routes/sessions-routes.mjs +568 -42
  39. package/server/server-runtime.mjs +80 -1
  40. package/server/services/cache-rebuild-service.mjs +19 -2
  41. package/server/services/conversation-preferences-service.mjs +17 -0
  42. package/server/services/relay-ask-link-service.mjs +174 -0
  43. package/server/services/relay-ask-service.mjs +604 -0
  44. package/server/services/relay-event-service.mjs +589 -73
  45. package/server/services/relay-schedule-service.mjs +596 -0
  46. package/server/services/remote-relay-caller-context.mjs +89 -20
  47. package/server/services/remote-relay-dispatcher.mjs +956 -30
  48. package/shared/relay-asks.mjs +145 -0
  49. package/shared/relay-events.mjs +268 -18
  50. package/shared/relay-schedules.mjs +128 -0
  51. package/shared/remote-relay-contract.mjs +553 -25
  52. package/shared/remote-relay-tool-core.mjs +16 -5
@@ -162,21 +162,32 @@ export async function executeRemoteRelayTool(input, { api, conversationId = '',
162
162
  }
163
163
  const parsed = validateRemoteRelayToolInput(input);
164
164
  if (!parsed.ok) return parsed;
165
- if (signal?.aborted) return remoteRelayCancelledResult();
165
+ // Only this check sees what the agent wrote: the relay gets the arguments
166
+ // the action takes, so the ones it does not take are named here.
167
+ const withIgnored = (result) => withIgnoredArguments(result, parsed.ignored);
168
+ if (signal?.aborted) return withIgnored(remoteRelayCancelledResult());
166
169
  try {
167
170
  const response = await api('POST', REMOTE_RELAY_TOOL_ENDPOINT, {
168
171
  conversationId: conversation,
169
172
  action: parsed.action,
170
173
  args: parsed.args,
171
174
  }, { longCall: true, ...(signal ? { signal } : {}) });
172
- if (response && typeof response === 'object' && !Array.isArray(response)) return response;
173
- return { ok: true, result: response ?? null };
175
+ if (response && typeof response === 'object' && !Array.isArray(response)) return withIgnored(response);
176
+ return withIgnored({ ok: true, result: response ?? null });
174
177
  } catch (error) {
175
- if (signal?.aborted || isAbortError(error)) return remoteRelayCancelledResult();
176
- return remoteRelayErrorResult(error);
178
+ if (signal?.aborted || isAbortError(error)) return withIgnored(remoteRelayCancelledResult());
179
+ return withIgnored(remoteRelayErrorResult(error));
177
180
  }
178
181
  }
179
182
 
183
+ /** `result` with `ignored` (the arguments the action did not take) merged in. */
184
+ export function withIgnoredArguments(result, ignored) {
185
+ const extra = Array.isArray(ignored) ? ignored.map(toText).filter(Boolean) : [];
186
+ if (!extra.length || !result || typeof result !== 'object' || Array.isArray(result)) return result;
187
+ const known = Array.isArray(result.ignored) ? result.ignored.map(toText).filter(Boolean) : [];
188
+ return { ...result, ignored: [...new Set([...known, ...extra])].sort() };
189
+ }
190
+
180
191
  /**
181
192
  * Whether a worker should register the tool: at least one remote is paired,
182
193
  * or this relay lets agents start and use sessions on it (the local target).