Skip to content

feat(cli): migrate ui + inference-session to thin IPC wrappers#30244

Merged
noanflaherty merged 2 commits into
mainfrom
cli-ipc-migration/pr-1-ui-inference-session
May 11, 2026
Merged

feat(cli): migrate ui + inference-session to thin IPC wrappers#30244
noanflaherty merged 2 commits into
mainfrom
cli-ipc-migration/pr-1-ui-inference-session

Conversation

@noanflaherty
Copy link
Copy Markdown
Contributor

@noanflaherty noanflaherty commented May 11, 2026

Part of plan: cli-ipc-migration.md (PR 1 of 11)


Open in Devin Review

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ce093823cc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +90 to +92
endpoint: "inference/send",
method: "POST",
policyKey: "inference/send",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Register auth policy for inference send route

Adding inference/send to the shared route table exposes it over HTTP, but this commit does not add a matching entry in assistant/src/runtime/auth/route-policy.ts. Because unregistered endpoints are treated as unprotected by enforcePolicy, any authenticated token (regardless of scopes like chat.write/settings.write) can call this LLM-send endpoint, which is a scope bypass for a write/compute-costing operation.

Useful? React with 👍 / 👎.

Comment on lines 189 to +190
const effectiveTtlSeconds =
ttlSeconds !== undefined ? ttlSeconds : defaultTtlSeconds;
ttlSeconds !== undefined ? ttlSeconds : DEFAULT_TTL_SECONDS;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep profile-session default TTL configurable

This hard-codes the no---ttl path to 1800 seconds and stops reading llm.profileSession.defaultTtlSeconds, so user config no longer affects assistant inference session open defaults. In workspaces that intentionally set a different default TTL (for example 2h), the command now silently opens 30-minute sessions instead of honoring configured behavior.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 3 potential issues.

View 4 additional findings in Devin Review.

Open in Devin Review

* Default session TTL in seconds when --ttl is not specified.
* Matches the documented default of 30 minutes.
*/
const DEFAULT_TTL_SECONDS = 1800;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 User-configured defaultTtlSeconds silently ignored after IPC migration

The old CLI code read the user's configured default session TTL from llm.profileSession.defaultTtlSeconds via getConfigReadOnly(), but the new code replaces it with a hardcoded DEFAULT_TTL_SECONDS = 1800. This means any user who customized their default TTL (e.g. set it to 3600 for 1-hour sessions) will now silently get 30-minute sessions when --ttl is omitted. The config schema at assistant/src/config/schemas/llm.ts:378-380 still documents defaultTtlSeconds as "read by the CLI" and the field remains in the schema, so users have no indication their setting is now dead. The daemon-side handler (setInferenceProfileSession) doesn't apply a default — it only clamps to maxTtlSeconds — so the CLI was the sole consumer of this setting. This violates the backwards compatibility rule in AGENTS.md: "Never ship a change that silently breaks existing behavior."

Prompt for agents
The CLI can no longer read config directly because it is now an ipc-tagged command (the cli/no-daemon-internals ESLint rule forbids importing from config/loader.js). The defaultTtlSeconds config setting is now silently ignored.

To fix this properly, the responsibility for applying the default TTL should move to the daemon-side handler in assistant/src/runtime/routes/inference-profile-session-handler.ts. Specifically:

1. In setInferenceProfileSession(), when ttlSeconds is undefined, instead of treating it as sticky/no-expiry, read llm.profileSession.defaultTtlSeconds from config and use that value.
2. In the CLI (inference-session.ts), when --ttl is not specified, do NOT send ttlSeconds at all (let it be undefined in the IPC body) so the daemon can apply the configured default.
3. Update the config schema comment at assistant/src/config/schemas/llm.ts:378-380 to reflect that the daemon handler (not the CLI) now reads defaultTtlSeconds.

This preserves backwards compatibility for users who have customized the setting while keeping the CLI as a thin IPC wrapper.
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines 202 to 203
const llm = program
.command("llm")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 llm alias command not wrapped in registerCommand()

The llm command at inference.ts:202-204 is created directly with program.command('llm') rather than via registerCommand({ transport: 'ipc', ... }). The CLI AGENTS.md states "Every command file declares its transport class via registerCommand()". However, llm is a lightweight alias that only attaches send (which is shared with the inference command that IS registered properly). The registerCommand function itself only creates the command and calls build — the transport field has no runtime effect. The llm alias also doesn't appear in COMMAND_INVENTORY.md as a separate entry. This is borderline but likely intentional since llm is just a namespace alias, not a standalone command.

(Refers to lines 202-204)

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines 307 to 311
process.stdout.write(JSON.stringify({ ok: true }) + "\n");
} else {
process.stdout.write(`Deleted connection "${name}"\n`);
if (referencingProfiles.length > 0 && opts.force) {
process.stdout.write(
`Warning: ${referencingProfiles.length} profile(s) now reference a missing connection: ` +
`${referencingProfiles.join(", ")}\n`,
);
}
}
});
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Delete subcommand lost --force flag and profile-reference warning

The delete subcommand in inference-providers.ts removed the --force flag and the client-side check for profiles referencing the connection being deleted. The server-side handler at inference-provider-connection-routes.ts:122-163 now handles this logic entirely: it checks for referencing profiles and call sites and returns a ConflictError (409) if any exist. The server provides no --force bypass — deletion is simply rejected when references exist. This is a behavioral change (no more force-delete), but the server-side approach is arguably safer. Users who relied on --force to delete referenced connections will now get an error telling them to update the references first.

(Refers to lines 288-311)

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

…ation/pr-1

# Conflicts:
#	assistant/src/cli/COMMAND_INVENTORY.md
@noanflaherty noanflaherty merged commit 361ea4f into main May 11, 2026
8 of 12 checks passed
@noanflaherty noanflaherty deleted the cli-ipc-migration/pr-1-ui-inference-session branch May 11, 2026 02:47
noanflaherty pushed a commit that referenced this pull request May 11, 2026
)

The CLI IPC refactor PRs (#30238#30247) added new shared routes without
matching policy entries in route-policy.ts. The route-policy coverage
guard test fails on main with 29 missing endpoints:

  - audit, auth/info
  - conversations/cli/{list,create,export,clear}
  - inference/send
  - internal/mcp/{list,add,remove}
  - oauth/apps.upsert, oauth/apps/lookup
  - oauth/providers.{register,update,delete}
  - platform/{status,connect,disconnect,callback-routes/register,callback-routes}
  - sequences/{list,get,pause,resume,cancel-enrollment,stats,guardrails}
  - user-routes/{list,inspect}

http-router.ts treats unregistered endpoints as unprotected (enforcePolicy
no-ops on missing keys), so any authenticated principal could hit these
over HTTP without the intended scope/principal-type gates. The IPC dispatch
path bypasses enforcePolicy entirely, so the existing CLI flows are
unaffected by these additions.

Scope/principal assignments mirror sibling routes:
  - oauth/apps mutations use ACTOR_ENDPOINTS settings.write (matches
    oauth/apps.create/.delete already present)
  - oauth/providers mutations use ACTOR_ENDPOINTS settings.write
  - oauth/apps/lookup uses ACTOR_ENDPOINTS settings.read
  - auth/info uses ACTOR_ENDPOINTS settings.read
  - internal/mcp/{list,add,remove} join INTERNAL_ENDPOINTS (gateway-only,
    internal.write) alongside the existing internal/mcp/reload entry
  - CLI-driven routes (audit, conversations/cli/*, inference/send,
    platform/*, sequences/*, user-routes/*) are local-only with
    settings.read or settings.write, mirroring tasks/*, cache/*, defer/*,
    domain/*, email/* — destructive 'conversations/cli/clear' elevates
    to settings.write to match conversations/clear-all
  - inference/send uses chat.write (LLM dispatch on behalf of caller),
    aligned with tts/synthesize-cli + stt/transcribe-file

Closes route-policy coverage findings on PRs #30241 (sequences,
user-routes), #30242 (conversations/cli/clear), #30244 (inference/send),
#30245 (internal/mcp), #30246 (oauth/providers, oauth/apps), #30247
(platform/*).

Co-authored-by: credence-the-bot[bot] <credence-the-bot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant