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
- ..
- ai-elements
- chat
- emoji
- folios
- notifications
- ui
- access.tsx
- account-settings.tsx
- actions.tsx
- add-ci.tsx
- agent-avatar.tsx
- agent-setup.tsx
- analytics-consent.tsx
- apps.tsx
- art.tsx
- ask-button.tsx
- ask-composer.tsx
- ask-steps.tsx
- attempts.tsx
- audit.tsx
- auth-card.tsx
- avatar-field.tsx
- base-branch.tsx
- billing-settings.tsx
- billing.tsx
- blame-view.tsx
- branch-list.tsx
- branches.tsx
- checks.tsx
- clone-box.tsx
- code-lines.tsx
- codeowners.tsx
- coding-agent.tsx
- command-palette-dialog.tsx
- command-palette.tsx
- commit-checks.tsx
- commit-message.tsx
- commit-person.tsx
- connectors.tsx
- contribution-calendar.tsx
- coordination.tsx
- danger-zone.tsx
- debug-details.tsx
- delete-account.tsx
- dependency-updates.tsx
- deploy.tsx
- deployments-panel.tsx
- desktop-app.tsx
- desktop-runner-link.tsx
- desktop-runner-menu.tsx
- desktop-runners.tsx
- desktop-settings.tsx
- details-disclosure.tsx
- developer-mode-switch.tsx
- diff-view.tsx
- emails-section.tsx
- footer.tsx
- fork-bar.tsx
- fork-button.tsx
- github.tsx
- guardrails.tsx
- home-ask.tsx
- home-summary.tsx
- home.tsx
- honeypot.tsx
- inbox.tsx
- inline-markdown.tsx
- invitation-list.tsx
- invite-dialog.tsx
- invites-section.tsx
- labels.tsx
- landing-home.tsx
- landing.tsx
- landmark.tsx
- legal-doc.tsx
- logo.tsx
- markdown.tsx
- mention-textarea.tsx
- merge-actions.tsx
- merge-box.tsx
- merge-queue.tsx
- merge-settings.tsx
- milestones.tsx
- mission-control.tsx
- mission.tsx
- mobile.tsx
- model-providers.tsx
- not-found.tsx
- notifications.tsx
- observability-logs.tsx
- observability.tsx
- onboarding.tsx
- package-icon.tsx
- package-settings.tsx
- people-picker.tsx
- people.tsx
- pin-button.tsx
- platform-mark.tsx
- policies-draft.tsx
- policy-notice.tsx
- presence.tsx
- product-tour.tsx
- production-image-field.tsx
- production-shot.tsx
- profile-form.tsx
- project-about.tsx
- project-head.tsx
- project-icon.tsx
- public-header.tsx
- qr-code.tsx
- rail.tsx
- reactions.tsx
- releases.tsx
- repo-about.tsx
- repo-lifecycle.tsx
- repo-live.tsx
- repo-settings-heading.tsx
- repo-view.tsx
- rules.tsx
- run-graph.tsx
- runners-page.tsx
- runners.tsx
- search.tsx
- secrets.tsx
- security-suite.tsx
- security.tsx
- session-entries.tsx
- settings-section.tsx
- shell.tsx
- spike-banner.tsx
- standalone.tsx
- star-button.tsx
- start-plan.tsx
- statement.tsx
- teams.tsx
- theme-switch.tsx
- token-form.tsx
- token-list.tsx
- token-regenerate.tsx
- token-scopes.tsx
- topics.tsx
- trust-page.tsx
- usage-card.tsx
- usage.tsx
- user-card.tsx
- webhooks.tsx
- welcome.tsx
- work-icons.tsx
- work.tsx
- workspace-security-tabs.tsx
- workspace-skeletons.tsx