v0.9.12: Power BI integration, library articles, chat fork speedups - #8589
waleedlatif1 wants to merge 18 commits into
Conversation
… clients (#8562) * fix(mothership): leave desktop tool calls to the desktop app in other clients * test(mothership): drop the mock-call routing test; the integration suite owns the regression
* feat(powerbi): add Power BI actions * fix(powerbi): harden partial results and selector hydration * fix(powerbi): compact retained failures and reuse rotated fixture tokens * fix(powerbi): use standard workflow failure handling * fix(powerbi): preserve nested query diagnostics * fix(powerbi): generate docs entirely from source * fix(powerbi): keep generated catalog descriptions complete * fix(powerbi): validate resource grants in account selector --------- Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
…aging (#8578) - replace the non-null assertions in the Power BI tests with named guards - drop export from Power BI types and constants used only in their own file - inline the refresh-attempt output properties at their one use, so the docs generator (which only resolves exported consts) renders them without a dead export
…release review (#8571) * fix(audits): close guardrail detector gaps and correct guidance from release review * fix(audits): detect partialize and .with by AST instead of regex * fix(audits): exempt only the imported OpenTelemetry context from the .with rule; unwrap cast partialize * fix(audits): drop the OTel exemption for rebound names, catch optional .with calls and defaulted partialize params * fix(audits): treat logical and conditional partialize returns of the whole state as leaks * improvement(audits): let tsc guard ES2023 methods, tighten ratchet hints, fix && partialize false positive - check:utils drops the ES2023 call-site detector; every tsconfig keeps lib at ES2022 so tsc rejects toSorted/with by type, and the check now fails a tsconfig that raises lib past it (the #5340 cause) - check:zustand-v5 treats only the right side of && as a returned value - check:explicit-any counts group-level and bare lint biome-ignore suppressions, and no longer pairs a deleted file with an unrelated new one as a rename - check:file-names drops its rule-matched rename hint, which pointed new violations at old baseline entries - check:comment-hygiene skips the parse for files with no possible hit and scans untracked files - inline the single-consumer source-kind helper and two leftover ref aliases - CLAUDE.md naming states the check:file-names scope; /ship runs type-check * chore(guidance): state the tsconfig lib invariant as at or below ES2022 * fix(audits): keep matching toSorted/toReversed/toSpliced in source for any receivers * chore(guidance): scope the ES2023 tsc guarantee to typed receivers
* fix(knowledge): scope list counts to selected knowledge bases * fix(knowledge): avoid count-query fan-out for unpaged lists
…ropdown (#8582) * fix(integrations): list tools for integrations without an operation dropdown The catalog generator only read operations from a block's own 'operation' dropdown, so single-tool blocks and provider pickers (DuckDuckGo, SMTP, Twilio SMS, Embeddings, ...) emitted zero operations, and Notion v2 lost its dropdown because it spreads NotionBlock.subBlocks instead of the whole config. Resolve operations through same-file subBlocks spreads, and fall back to the block's tools.access ids named from the client-safe tool metadata. * fix(docs): drop the any cast and only follow plain subBlocks spreads in the catalog generator
* fix(sdk): default both SDKs to the www.sim.ai host The apex https://sim.ai answers every request with a 301 to https://www.sim.ai, and fetch and requests replay a 301 POST as a GET with no body, so a default-configured execute call never reaches the API. Both SDKs now default to https://www.sim.ai. Patch-bump both to 0.2.1 so the publish workflows release the new default on merge to main, and note in the API reference that earlier versions still default to the apex. * test(ts-sdk): cover the default www host * test(ts-sdk): use a typed Response in the default-host test
* feat(search): browse Lucid folders and Notion pages * fix(search): preserve discovery query boundaries
#8583) * fix(core): treat EHOSTUNREACH as a retryable network failure An unreachable host is a connection that never opened, so the request never reached its destination and one more attempt is as safe as after ECONNREFUSED or ENETUNREACH. * fix(mothership): pass typed fork refusals through and stop overlapping retries The worker refuses a fork it cannot make with 404 (the chat or message is gone), 409 (the response has not finished) or 413 (the cut is above its ceiling), but every non-2xx became a generic error and a 500. Those are now classified and passed through by the fork route with a message the person can act on. The retry loop's own catch swallowed every first-attempt failure, so a 400, a 500, a malformed receipt and a timed-out attempt were all sent again. A timed-out attempt may still be copying, so only a recognized socket failure or a 502/503/504 gets one more attempt now. The per-attempt timeout is sized from measured copy latency at the worker's ceiling with headroom, so a legitimate fork finishes inside one attempt and a timed-out one is abandoned (the worker rolls back a copy whose caller left). * fix(mothership): show a fork refusal's own message A 409 or 413 from the fork route tells the person what to do (wait for the response to finish, or fork from an earlier message), so the toast shows that message instead of a generic failure. * fix(mothership): discard the worker copy of a fork that is not published When anything after the worker copy failed, most often the final transaction that publishes the chat, the worker kept a conversation Sim had no chat for. The fork now asks the worker to clean that chat up, through the same cleanup endpoint chat deletion uses. It is best effort and a no-op when the worker never committed. * fix(mothership): point every reference a fork copies at what the fork holds - A file whose blob copy failed is never published, yet the fork's messages and the worker's history were rewritten to its id and key. References to it now stay on the source file, and its resource tab is dropped as before. - In-app /workspace/<id>/files/<fileId> links were left on the source file; the fork stays in the same workspace, so only the file id moves. - Tool-call arguments and display titles kept the source file's id or key. - A Sources tab for a response past the cut was copied, pointing at a message the fork does not have. * fix(cleanup): purge a chat's inline images and only its own attachments - Chat images are stored under the chat's id but were never deleted with the chat. Their keys are rebuilt from the assistant messages that published them, the same way a fork finds them to copy. - Message attachments were deleted as copilot storage whatever their key. Attachments in Chat are workspace-bucket files owned by their workspace_files row, which a fork can share with its source (a failed copy, a deleted file), and the copilot bucket falls back to the workspace bucket on GCS and can be configured to it on S3. Only copilot keys are deleted from messages now. * fix(cleanup): delete an organization attachment once no chat references it Organization Chat attachments (assistant/ keys) have no workspace_files row and a fork carries the same key, so the purge now deletes one under its own storage context only after confirming no remaining chat of that organization still references it. * fix(mothership): order fork publication against a purge of its source A fork can share keys with its source (organization attachments, files whose copy failed), and chat cleanup deletes a shared key once no remaining chat references it, checking after it deletes the source row. The fork's publish transaction now holds the source row with FOR KEY SHARE: a purge that already removed it refuses the fork (404, worker copy discarded), and one that has not waits for the commit and then sees the fork's references. * chore(mothership): quote the final copy latency behind the fork attempt timeout
* feat(youcom): add You.com integration * fix(youcom): unique subblock ids, nullable outputs, reject non-array contents * fix(youcom): share field ids across operations so agent tool rows expose them * fix(youcom): validate per-endpoint values in tools, live-verified fields * fix(youcom): normalize country and language codes
…l, and author slugs (#8587) * fix(landing): return 404 for unknown library, blog, integration, model, and author slugs * fix(landing): pre-render reseller model pages so they keep resolving
…8588) * fix(files): read offset 0 as the first line instead of rejecting it * test(files): cover the agent CLI forwarding --offset 0
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
There was a problem hiding this comment.
10 issues found across 167 files
Confidence score: 3/5
- In
fork.ts, a committed fork can have its worker conversation deleted if the commit acknowledgement is lost, because cleanup trustspublished. Check whethernewIdcommitted before deleting. - Browse-only native queries are still rejected by
/api/knowledge/searchbecause the body refinement only acceptsquery.query. Update the refinement to acceptquery.browsetoo. inlineChatImageReferencestreats thinking and subagent text as image sources even thoughprepareStreamImagesnever materializes images from those lanes. Exclude those blocks so they don't produce unusable image references.utils.tscan silently drop the structured-output contract for array schemas, while whitespace-only optional schemas fail parsing. Handle both inputs explicitly so Research requests preserve the requested schema or report invalid input.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name=".cursor/rules/sim-settings-pages.mdc">
<violation number="1" location=".cursor/rules/sim-settings-pages.mdc:95">
P2: This standalone-only exception conflicts with the checklist below, which still requires every new page to have a `unified.description` and unified section id. Following that checklist can add standalone-only pages to the unified catalog; update the checklist to preserve this exception.</violation>
</file>
<file name="packages/deployment-config/src/integrations.json">
<violation number="1" location="packages/deployment-config/src/integrations.json:850">
P3: All 8 You.com operations ship with an empty `description`. This is a brand-new integration whose operations list will render with blank tool descriptions in the integration/tool UI, while every other operation added in this PR has a full description. Fill each in (e.g., Use the longDescription: Search, Get Contents, Answer, Research, Get Research Task, Finance Research, Search Images, Get Account Balance).</violation>
<violation number="2" location="packages/deployment-config/src/integrations.json:4382">
P2: This catalog description claims notification and channel-confirmation features that the Clay action does not provide. Replace it with a summary of the webhook-based table-population behavior.</violation>
</file>
<file name="apps/sim/blocks/blocks/youcom.ts">
<violation number="1" location="apps/sim/blocks/blocks/youcom.ts:508">
P2: Switching from background Research to exhaustive Finance Research can leave the hidden `background` value set, causing this branch to omit the extended timeout for a synchronous request. Apply the timeout to exhaustive effort regardless of the stale background flag; background Research returns its task ID immediately.</violation>
</file>
<file name="apps/sim/lib/api/contracts/mothership-assistant-tools.ts">
<violation number="1" location="apps/sim/lib/api/contracts/mothership-assistant-tools.ts:52">
P2: `browse` makes a native query valid here, but `/api/knowledge/search` still rejects browse-only requests because its body refinement checks only `query.query`. Update that refinement to treat `query.browse` as a valid native request.</violation>
</file>
<file name="apps/sim/lib/mothership/chat/inline-image-key.ts">
<violation number="1" location="apps/sim/lib/mothership/chat/inline-image-key.ts:36">
P2: `inlineChatImageReferences` treats thinking and subagent text as published image sources, but `prepareStreamImages` deliberately never materializes images from those lanes. Exclude `thinking` and `subagent` blocks so forks and cleanup do not process blobs that were never stored.</violation>
</file>
<file name="apps/sim/tools/youcom/utils.ts">
<violation number="1" location="apps/sim/tools/youcom/utils.ts:97">
P2: `parseJsonSchema` treats only `''` as unset, so whitespace left in the optional Output Schema field makes Research requests fail. Trim string values before the empty check and parsing.</violation>
<violation number="2" location="apps/sim/tools/youcom/utils.ts:129">
P2: An already-parsed array is silently treated as no schema, unlike the equivalent string form, so a malformed JSON input loses the requested structured-output contract. Reject arrays here instead of omitting `output_schema`.</violation>
</file>
<file name="apps/sim/lib/mothership/chat/application/fork.ts">
<violation number="1" location="apps/sim/lib/mothership/chat/application/fork.ts:227">
P2: If the transaction commits but its acknowledgement is lost, `published` stays false and this cleanup deletes the worker conversation for a fork whose chat row is already committed. Check whether `newId` was committed before discarding the worker copy.</violation>
</file>
<file name="apps/sim/lib/sim-search/live/providers.ts">
<violation number="1" location="apps/sim/lib/sim-search/live/providers.ts:67">
P2: This continuation recipe omits `kind`, but the cursor is bound to `native.kind`; paging a folder search started with `kind: lucidchart` or `lucidspark` is rejected if the next query omits it. Include `kind` among the unchanged fields.</violation>
</file>
| "operations": [ | ||
| { | ||
| "name": "Clay Populate", | ||
| "description": "Populate Clay with data from a JSON file. Enables direct communication and notifications with timestamp tracking and channel confirmation." |
There was a problem hiding this comment.
P2: This catalog description claims notification and channel-confirmation features that the Clay action does not provide. Replace it with a summary of the webhook-based table-population behavior.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At packages/deployment-config/src/integrations.json, line 4382:
<comment>This catalog description claims notification and channel-confirmation features that the Clay action does not provide. Replace it with a summary of the webhook-based table-population behavior.</comment>
<file context>
@@ -4366,8 +4376,13 @@
+ "operations": [
+ {
+ "name": "Clay Populate",
+ "description": "Populate Clay with data from a JSON file. Enables direct communication and notifications with timestamp tracking and channel confirmation."
+ }
+ ],
</file context>
| "description": "Populate Clay with data from a JSON file. Enables direct communication and notifications with timestamp tracking and channel confirmation." | |
| "description": "Populate a Clay table by sending JSON data to a Clay webhook." |
| "operations": [], | ||
| "operationCount": 0, | ||
| "operations": [ | ||
| { |
There was a problem hiding this comment.
P3: All 8 You.com operations ship with an empty description. This is a brand-new integration whose operations list will render with blank tool descriptions in the integration/tool UI, while every other operation added in this PR has a full description. Fill each in (e.g., Use the longDescription: Search, Get Contents, Answer, Research, Get Research Task, Finance Research, Search Images, Get Account Balance).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At packages/deployment-config/src/integrations.json, line 850:
<comment>All 8 You.com operations ship with an empty `description`. This is a brand-new integration whose operations list will render with blank tool descriptions in the integration/tool UI, while every other operation added in this PR has a full description. Fill each in (e.g., Use the longDescription: Search, Get Contents, Answer, Research, Get Research Task, Finance Research, Search Images, Get Account Balance).</comment>
<file context>
@@ -846,8 +846,13 @@
- "operations": [],
- "operationCount": 0,
+ "operations": [
+ {
+ "name": "Airweave Search",
+ "description": "Search your synced data collections using Airweave. Supports semantic search with hybrid, neural, or keyword retrieval strategies. Optionally generate AI-powered answers from search results."
</file context>
* feat(forks): compare last synced source deployments * fix(workflows): simplify comparison headings and badges * fix(forks): track admitted deployment outcomes accurately
…s checklist with the standalone description rule (#8591) * fix(audits): apply browser-runtime rules to @sim/utils; align settings checklist with the standalone description rule * test(audits): pin which check:utils rules helper sources are exempt from
* chore(pi): upgrade agent to 1.0.0 * chore(pi): narrow upgrade regression coverage --------- Co-authored-by: Bill Leoutsakos <billleoutsakos@Bills-MacBook-Pro.local>
Uh oh!
There was an error while loading. Please reload this page.