syntaqxAn agent can put an image in a pull request, an issue or a comment without committing it: on flagon-io/session-lab #2 a cloud session asked to show a screenshot of its preview in the pull request's description found no way to upload one (not in g1t --help, g1t api --list or the docs), so it committed the PNG, linked it at that commit and removed it in a second commit. The site has no comment-image upload either; images only ever came from repository files. Now upload_attachment (POST /repos/{owner}/{repo}/attachments, issues:write, the issue tool's attach action over MCP) takes name, data (the file base64-encoded, as upload_sarif takes its file) and an optional content_type, and answers in snake_case with id, name, url, markdown (, ready to paste), content_type and size. The work service decides, as add_comment does: a confirmed account that can read the repository, which is not archived. The type is read from the bytes (PNG, JPEG, GIF or WebP; a content_type that says otherwise is refused), at most 10 MB; too large is the new FailureCode too_large (413), another type the new unsupported_type (415), in Rust and TS contracts and the OpenAPI error codes. The bytes go in the usercontent namespace (AVATARS, now bound to work) under attachments/<id>, where the id is 256 random bits so the address is its permission, as Docs files' is; a row in the new attachments table (migration 0048) names the repository, and repo.purged deletes the bytes, then the rows. The usercontent origin serves /attachments/<id> as it serves avatars (stored type, nosniff, sandboxed). The API forms url from USERCONTENT_URL as the site does (g1tusercontent.com for g1t.sh, SITE_URL/-/usercontent elsewhere; the self-host config now passes it to the API). The CLI has g1t attach FILE... (prints each image's Markdown; --json the fields, a list for several) and --attach FILE (repeatable) on g1t issue create, issue comment, pr create, pr comment and pr ready, which uploads and appends the Markdown after the text. A session's run credential gets upload_attachment through issues:write, bound to its own repository (tested), and the cloud session's system prompt says to upload screenshots with g1t attach and never commit images just to link them. Docs: the CLI guide (Images in descriptions and comments), pull requests (Images), sessions, the MCP reference, self-hosting's USERCONTENT_URL row, reference.json and the regenerated openapi.json, CLI ops table and CLI reference. Deploy order: apply work migration 0048 and deploy work (new AVATARS binding), then the site (usercontent serves /attachments), then api, then integrations (prompt) and the docs; g1t attach and --attach ship with the next CLI release, which cloud sessions need before the prompt's advice works. Checked: cargo test -p g1t-contracts (319), -p g1t-work (209), -p g1t-api (211; openapi regenerated with G1T_WRITE_OPENAPI), -p g1t (112 + 51; ops_table and cli_reference regenerated with G1T_WRITE_OPS and G1T_WRITE_DOCS), -p g1t-integrations (76); cargo check -p g1t-api, -p g1t-work and -p g1t-integrations --target wasm32-unknown-unknown; node --test apps/web/app/lib/token-scopes.test.ts.5011621History
- ..
- about.server.ts
- about.test.ts
- about.ts
- access-tokens.server.ts
- access-tokens.test.ts
- access-tokens.ts
- access.server.ts
- access.ts
- account-deletion.test.ts
- account-deletion.ts
- account-settings.test.ts
- account-settings.ts
- add-ci.server.ts
- addresses.server.ts
- addresses.test.ts
- addresses.ts
- advisories.test.ts
- advisories.ts
- agent-setup.test.ts
- agent-setup.ts
- ai-providers.test.ts
- ai-providers.ts
- analytics-consent.test.ts
- analytics-consent.ts
- analytics-scrub.test.ts
- analytics-scrub.ts
- analytics.client.ts
- ansi.test.ts
- ansi.ts
- apps.test.ts
- apps.ts
- art.test.ts
- art.ts
- ask-model.test.ts
- ask-model.ts
- ask.test.ts
- ask.ts
- attempts.test.ts
- attempts.ts
- audit.server.ts
- audit.test.ts
- audit.ts
- avatar-upload.test.ts
- avatar-upload.ts
- badge.test.ts
- badge.ts
- billing-return.test.ts
- billing-return.ts
- billing.test.ts
- billing.ts
- branch-redirect.server.ts
- branches.server.ts
- branches.test.ts
- branches.ts
- brand-icons.ts
- busy.test.ts
- busy.ts
- cache.server.ts
- card-actions.test.ts
- card-actions.ts
- chat-cache.test.ts
- chat-cache.ts
- chat-compose.test.ts
- chat-compose.ts
- chat-sounds.test.ts
- chat-sounds.ts
- chat.server.ts
- chat.test.ts
- chat.ts
- chrome.test.ts
- chrome.ts
- cn.ts
- comments.test.ts
- comments.ts
- commit-checks.server.ts
- commit-checks.test.ts
- commit-checks.ts
- commit-comments.ts
- commit-message.test.ts
- commit-message.ts
- commit-people.server.ts
- commit-people.test.ts
- commit-people.ts
- compute.server.ts
- compute.test.ts
- compute.ts
- confirm-gate.test.ts
- confirm-gate.ts
- connected.server.ts
- connectors.test.ts
- connectors.ts
- content-cache.test.ts
- content-cache.ts
- content-safety.test.ts
- content-safety.ts
- contribution-calendar.test.ts
- contribution-calendar.ts
- coordination.test.ts
- coordination.ts
- current-workspace.server.ts
- deadline.test.ts
- deadline.ts
- dependency-updates.test.ts
- dependency-updates.ts
- deploy-kind.test.ts
- deploy-kind.ts
- deployments.server.ts
- deployments.test.ts
- deployments.ts
- desktop-runner.test.ts
- desktop-runner.ts
- desktop-settings.test.ts
- desktop-settings.ts
- desktop.test.ts
- desktop.ts
- developer-mode.test.ts
- developer-mode.ts
- diff-files.test.ts
- diff-files.ts
- diff.test.ts
- diff.ts
- dock.server.ts
- download-platform.test.ts
- download-platform.ts
- emails.server.ts
- emails.test.ts
- emails.ts
- emoji.test.ts
- emoji.ts
- environments.test.ts
- environments.ts
- folios.test.ts
- folios.ts
- forks.server.ts
- front-door-limits.test.ts
- front-door-limits.ts
- g1t-chat.test.ts
- g1t-chat.ts
- github.server.ts
- github.test.ts
- github.ts
- go-get.test.ts
- go-get.ts
- guardrails.test.ts
- guardrails.ts
- highlight.server.ts
- home-live.test.ts
- home-live.ts
- home.server.ts
- home.test.ts
- home.ts
- hovercard.test.ts
- hovercard.ts
- immutable.server.ts
- inbox.test.ts
- inbox.ts
- inline-markdown.test.ts
- inline-markdown.ts
- integration-sections.ts
- invitations.server.ts
- invitations.ts
- invites.server.ts
- invites.test.ts
- invites.ts
- labels.test.ts
- labels.ts
- last-commits.server.ts
- legal.test.ts
- legal.ts
- line-anchor.test.ts
- line-anchor.ts
- live-socket.ts
- log-download.server.ts
- log-follow.test.ts
- log-follow.ts
- log-lines.test.ts
- log-lines.ts
- log-poll.test.ts
- log-poll.ts
- log-window.test.ts
- log-window.ts
- markdown-plugins.test.ts
- markdown-plugins.ts
- markdown-tree.test.ts
- markdown-tree.ts
- member-invitations.server.ts
- mention.test.ts
- mention.ts
- merge.test.ts
- merge.ts
- meta.test.ts
- meta.ts
- milestones.server.ts
- mission-control.server.ts
- mission-control.test.ts
- mission-control.ts
- mission.test.ts
- mission.ts
- money.test.ts
- money.ts
- next.test.ts
- next.ts
- no-native-title.test.ts
- nonce.ts
- not-found.server.ts
- not-found.test.ts
- not-found.ts
- notify-client.ts
- notify-store.test.ts
- notify-store.ts
- observability-live.ts
- observability-trace.ts
- observability-words.ts
- observability.server.ts
- observability.test.ts
- observability.ts
- onboarding.server.ts
- onboarding.test.ts
- onboarding.ts
- one-tab.test.ts
- one-tab.ts
- opened-by.test.ts
- opened-by.ts
- otp.test.ts
- otp.ts
- packages.test.ts
- packages.ts
- page-headers.test.ts
- page-headers.ts
- pending.test.ts
- pending.ts
- people-search.test.ts
- people-search.ts
- people.test.ts
- people.ts
- perf.server.ts
- perf.test.ts
- perf.ts
- phone.test.ts
- phone.ts
- pins.test.ts
- pins.ts
- presence.test.ts
- presence.ts
- production-image.test.ts
- production-image.ts
- project-kind.test.ts
- project-kind.ts
- project-list.test.ts
- project-list.ts
- project-nav.test.ts
- project-nav.ts
- provenance.server.ts
- public-cache.test.ts
- public-cache.ts
- pull-detail.test.ts
- reconcile.test.ts
- refresh.ts
- registration.server.ts
- registration.ts
- registry-paths.test.ts
- registry-paths.ts
- renamed.server.ts
- repo-lifecycle.test.ts
- repo-lifecycle.ts
- repo-live.test.ts
- repo-live.ts
- roadmap.ts
- robots.test.ts
- robots.ts
- rules.test.ts
- rules.ts
- run-artifacts.server.ts
- run-artifacts.test.ts
- run-artifacts.ts
- run-controls.test.ts
- run-controls.ts
- run-graph.test.ts
- run-graph.ts
- runners.server.ts
- runners.test.ts
- runners.ts
- same-origin.ts
- search.test.ts
- search.ts
- secrets.server.ts
- security-alerts.test.ts
- security-alerts.ts
- security-overview.test.ts
- security-overview.ts
- security-suite.server.ts
- security-suite.test.ts
- security-suite.ts
- services.server.ts
- session-card.test.ts
- session-card.ts
- session-entries.test.ts
- session-entries.ts
- session.server.ts
- shiki.ts
- shortcut.test.ts
- shortcut.ts
- socket-ticket.server.ts
- socket-ticket.test.ts
- socket-ticket.ts
- sound-events.ts
- sound-synth.test.ts
- sound-synth.ts
- sounds.ts
- stale-build.test.ts
- stale-build.ts
- starter-workflow.test.ts
- starter-workflow.ts
- status.test.ts
- status.ts
- structured-data.ts
- stuck.test.ts
- stuck.ts
- tab-paths.test.ts
- tab-paths.ts
- tar.test.ts
- tar.ts
- teams.test.ts
- teams.ts
- theme.test.ts
- theme.ts
- time-ago.test.ts
- time-ago.ts
- time-zone.test.ts
- time-zone.ts
- token-scopes.test.ts
- token-scopes.ts
- tokens.test.ts
- tour.test.ts
- tour.ts
- turnstile.server.ts
- turnstile.test.ts
- turnstile.ts
- two-factor.server.ts
- usage.test.ts
- usage.ts
- use-arrived.ts
- use-home-live.ts
- use-repo-live.ts
- usercontent.test.ts
- usercontent.ts
- webhooks.server.ts
- website-token.test.ts
- website-token.ts
- workspace-choice.test.ts
- workspace-choice.ts
- workspace-deletion.test.ts
- workspace-deletion.ts
- workspace-gate.test.ts
- workspace-gate.ts
- workspace-insights.test.ts
- workspace-insights.ts
- workspace-nav.test.ts
- workspace-nav.ts
- workspace-projects.server.ts
- workspace-usage.server.ts
- write-up.test.ts
- write-up.ts
- zip.test.ts
- zip.ts