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
- ..
- 0001_init.sql
- 0002_own_provider.sql
- 0003_subscriptions.sql
- 0004_sandbox_time.sql
- 0005_limits.sql
- 0006_prices.sql
- 0007_pending_usage.sql
- 0008_accounts.sql
- 0009_autopay.sql
- 0010_month_close.sql
- 0011_limit_warnings.sql
- 0012_stripe_webhooks.sql
- 0013_invoices_trust_sales.sql
- 0014_custom_domain_price.sql
- 0015_sandbox_at_cost.sql
- 0016_plans_and_pools.sql
- 0017_flagon_comped.sql
- 0018_one_plan.sql
- 0019_closed_workspaces.sql
- 0020_syntaqx_standard.sql
- 0021_no_quotas.sql
- 0022_costs_and_margin.sql
- 0023_one_operation_mapping.sql
- 0024_spend_caps.sql
- 0025_run_tier.sql
- 0026_ledger_by_workspace_time.sql
- 0027_stripe_cache.sql
- 0028_drop_stripe_webhooks.sql
- 0029_audit_retention.sql
- 0030_token_usage.sql
- 0031_package_storage.sql
- 0032_workspace_value.sql
- 0033_given_away.sql
- 0034_given_by_why.sql
- 0035_cf_subscriptions.sql
- 0036_model_costs_in_full.sql
- 0037_security_activation.sql
- 0038_staff_credits.sql
- 0039_discounts_not_comped.sql
- 0040_ai_credit.sql
- 0041_agent_rate_own_key.sql
- 0042_agent_rate_weights.sql
- 0043_tax_and_card_fees.sql
- 0044_cache_reads_count_a_tenth.sql
- 0045_gateway.sql
- 0046_reset_costs.sql
- 0047_gateway_formats.sql
- 0048_model_catalogue.sql
- 0049_superseded_proposals.sql
- 0050_ledger_usage_by_time.sql
- 0051_platform_guardrails.sql
- 0052_cloudflare_cycle.sql
- 0053_models_at_cost.sql
- 0054_agent_attribution.sql
- 0055_app_containers.sql
- 0056_sandbox_standard_3.sql
- 0057_runner_minutes.sql
- 0058_payment_safety.sql
- 0059_telemetry_ingest.sql
- 0060_pending_baselines.sql
- 0061_measured_months.sql
- 0062_invoice_attempts.sql
- 0063_enterprise_attempts.sql
- 0064_complimentary.sql
- 0065_free_except_flagon.sql