cowork-server 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cowork_server-0.1.1/.github/workflows/publish.yml +51 -0
- cowork_server-0.1.1/.gitignore +219 -0
- cowork_server-0.1.1/.python-version +1 -0
- cowork_server-0.1.1/LICENSE +5 -0
- cowork_server-0.1.1/PKG-INFO +134 -0
- cowork_server-0.1.1/README.md +107 -0
- cowork_server-0.1.1/alembic/README +1 -0
- cowork_server-0.1.1/alembic/env.py +92 -0
- cowork_server-0.1.1/alembic/script.py.mako +28 -0
- cowork_server-0.1.1/alembic/versions/93375a6617f4_init.py +197 -0
- cowork_server-0.1.1/alembic.ini +149 -0
- cowork_server-0.1.1/cowork/__init__.py +0 -0
- cowork_server-0.1.1/cowork/__main__.py +4 -0
- cowork_server-0.1.1/cowork/api/__init__.py +0 -0
- cowork_server-0.1.1/cowork/api/v1/__init__.py +0 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/__init__.py +0 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/artifacts.py +161 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/compat/__init__.py +0 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/compat/stubs.py +153 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/connectors/__init__.py +0 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/connectors/connections.py +27 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/connectors/oauth.py +26 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/connectors/specs.py +29 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/connectors/submissions.py +95 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/conversations.py +116 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/files.py +52 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/health.py +20 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/memory.py +180 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/pins.py +45 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/project_files.py +257 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/projects.py +43 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/publish.py +55 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/responses.py +138 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/schedules.py +123 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/search.py +124 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/settings.py +252 -0
- cowork_server-0.1.1/cowork/api/v1/endpoints/skills.py +72 -0
- cowork_server-0.1.1/cowork/api/v1/router.py +69 -0
- cowork_server-0.1.1/cowork/cli.py +22 -0
- cowork_server-0.1.1/cowork/common/__init__.py +0 -0
- cowork_server-0.1.1/cowork/common/encryption.py +29 -0
- cowork_server-0.1.1/cowork/common/logger.py +214 -0
- cowork_server-0.1.1/cowork/common/settings/__init__.py +23 -0
- cowork_server-0.1.1/cowork/common/settings/app_settings.py +113 -0
- cowork_server-0.1.1/cowork/common/settings/user_settings.py +310 -0
- cowork_server-0.1.1/cowork/db/__init__.py +0 -0
- cowork_server-0.1.1/cowork/db/session.py +125 -0
- cowork_server-0.1.1/cowork/dev_setup.py +60 -0
- cowork_server-0.1.1/cowork/handlers/__init__.py +0 -0
- cowork_server-0.1.1/cowork/handlers/probe.py +397 -0
- cowork_server-0.1.1/cowork/handlers/responses.py +260 -0
- cowork_server-0.1.1/cowork/harnesses/__init__.py +6 -0
- cowork_server-0.1.1/cowork/harnesses/anton_harness/__init__.py +1 -0
- cowork_server-0.1.1/cowork/harnesses/anton_harness/harness.py +416 -0
- cowork_server-0.1.1/cowork/harnesses/anton_harness/scratchpad_cell_replay.py +60 -0
- cowork_server-0.1.1/cowork/harnesses/anton_harness/settings.py +30 -0
- cowork_server-0.1.1/cowork/harnesses/anton_harness/stream_formatter.py +241 -0
- cowork_server-0.1.1/cowork/harnesses/anton_harness/tools.py +958 -0
- cowork_server-0.1.1/cowork/harnesses/base.py +96 -0
- cowork_server-0.1.1/cowork/harnesses/hermes_harness/__init__.py +1 -0
- cowork_server-0.1.1/cowork/harnesses/hermes_harness/harness.py +365 -0
- cowork_server-0.1.1/cowork/harnesses/hermes_harness/settings.py +13 -0
- cowork_server-0.1.1/cowork/harnesses/hermes_harness/stream_formatter.py +132 -0
- cowork_server-0.1.1/cowork/harnesses/hermes_harness/tools.py +66 -0
- cowork_server-0.1.1/cowork/models/__init__.py +1 -0
- cowork_server-0.1.1/cowork/models/base.py +46 -0
- cowork_server-0.1.1/cowork/models/conversation.py +21 -0
- cowork_server-0.1.1/cowork/models/file.py +13 -0
- cowork_server-0.1.1/cowork/models/message.py +49 -0
- cowork_server-0.1.1/cowork/models/message_event.py +20 -0
- cowork_server-0.1.1/cowork/models/pin.py +16 -0
- cowork_server-0.1.1/cowork/models/project.py +15 -0
- cowork_server-0.1.1/cowork/models/schedule.py +61 -0
- cowork_server-0.1.1/cowork/models/setting.py +10 -0
- cowork_server-0.1.1/cowork/models/skill.py +16 -0
- cowork_server-0.1.1/cowork/scheduler.py +190 -0
- cowork_server-0.1.1/cowork/schemas/__init__.py +0 -0
- cowork_server-0.1.1/cowork/schemas/base.py +30 -0
- cowork_server-0.1.1/cowork/schemas/connectors.py +146 -0
- cowork_server-0.1.1/cowork/schemas/conversations.py +32 -0
- cowork_server-0.1.1/cowork/schemas/files.py +15 -0
- cowork_server-0.1.1/cowork/schemas/memory.py +53 -0
- cowork_server-0.1.1/cowork/schemas/pins.py +9 -0
- cowork_server-0.1.1/cowork/schemas/projects.py +12 -0
- cowork_server-0.1.1/cowork/schemas/responses.py +157 -0
- cowork_server-0.1.1/cowork/schemas/schedules.py +75 -0
- cowork_server-0.1.1/cowork/schemas/settings.py +15 -0
- cowork_server-0.1.1/cowork/schemas/skills.py +33 -0
- cowork_server-0.1.1/cowork/server.py +68 -0
- cowork_server-0.1.1/cowork/services/__init__.py +0 -0
- cowork_server-0.1.1/cowork/services/artifacts.py +443 -0
- cowork_server-0.1.1/cowork/services/connectors/__init__.py +0 -0
- cowork_server-0.1.1/cowork/services/connectors/connections.py +62 -0
- cowork_server-0.1.1/cowork/services/connectors/oauth/__init__.py +0 -0
- cowork_server-0.1.1/cowork/services/connectors/oauth/config.py +73 -0
- cowork_server-0.1.1/cowork/services/connectors/oauth/google.py +317 -0
- cowork_server-0.1.1/cowork/services/connectors/oauth/pkce.py +18 -0
- cowork_server-0.1.1/cowork/services/connectors/oauth/state.py +66 -0
- cowork_server-0.1.1/cowork/services/connectors/probe.py +515 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/_registry.py +163 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/accuweather.json +124 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/airtable.json +97 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/alphavantage.json +83 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/amplitude.json +76 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/apollo.json +90 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/appdynamics.json +118 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/asana.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/ashby.json +52 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/attio.json +87 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws.json +333 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws_aurora_mysql.json +207 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws_aurora_postgres.json +195 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws_cloudwatch.json +289 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws_rds_mysql.json +163 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws_rds_postgres.json +163 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/aws_rds_sqlserver.json +116 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/azure.json +140 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/azure_cosmos_db.json +141 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/azure_monitor.json +181 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/azure_mysql.json +95 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/azure_postgres.json +109 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/azure_sql.json +231 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/bamboohr.json +62 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/basecamp.json +67 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/better_stack.json +65 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/bigquery.json +222 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/bitbucket.json +107 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/bolt.json +101 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/braze.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/bugsnag.json +100 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/calendly.json +84 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/cassandra.json +135 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/census.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/chargebee.json +60 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/checkly.json +62 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/chili_piper.json +97 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/chorus_ai.json +61 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/chroma.json +122 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/churnzero.json +69 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/circleci.json +102 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/clari.json +60 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/clay.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/clearbit.json +63 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/clickhouse.json +155 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/clickup.json +86 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/close.json +88 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/cloudflare.json +105 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/cockroachdb.json +129 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/coda.json +53 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/coingecko.json +93 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/confluence.json +146 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/copper.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/coralogix.json +90 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/couchbase.json +104 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/customer_io.json +125 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/databricks.json +147 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/datadog.json +96 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/deel.json +101 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/digitalocean.json +92 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/discord.json +111 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/docusign.json +149 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/doordash.json +107 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/dynamodb.json +277 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/dynatrace.json +111 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/easypost.json +74 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/elastic_apm.json +127 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/elasticsearch.json +100 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/etherscan.json +83 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/fathom.json +61 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/fifteen_five.json +60 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/figma.json +91 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/firestore.json +128 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/fly_io.json +64 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/folk.json +50 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/freshbooks.json +66 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/freshdesk.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/front.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gainsight.json +60 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gcp.json +125 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gcp_cloud_monitoring.json +115 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gcp_cloudsql_mysql.json +165 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gcp_cloudsql_postgres.json +216 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gcp_spanner.json +142 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/github.json +139 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gitlab.json +113 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gmail.json +135 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gong.json +66 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/google_ads.json +104 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/google_analytics_4.json +104 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/google_calendar.json +108 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/google_drive.json +110 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/google_maps.json +100 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/google_search_console.json +104 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/grab.json +94 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/grafana.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/graylog.json +95 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/greenhouse.json +89 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/gusto.json +95 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/heap.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/helpscout.json +94 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/here_maps.json +100 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/heroku.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/heroku_postgres.json +150 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/hibob.json +71 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/hightouch.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/honeycomb.json +71 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/hubspot.json +91 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/influxdb.json +136 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/instacart.json +79 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/instana.json +61 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/instantly.json +50 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/intercom.json +130 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/iterable.json +71 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/jaeger.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/jira.json +117 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/klaviyo.json +52 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/lattice.json +62 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/launchdarkly.json +93 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/lemlist.json +51 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/lever.json +110 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/linear.json +104 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/linkedin_ads.json +81 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/logz_io.json +152 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/loki.json +131 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/lusha.json +51 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/lyft.json +71 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mailchimp.json +86 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mapbox.json +62 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mariadb.json +115 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/marketo.json +114 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/meta_ads.json +112 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/microsoft_teams.json +120 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mixpanel.json +86 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/monday.json +100 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mongodb.json +139 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mongodb_atlas.json +122 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mssql.json +217 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/mysql.json +134 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/neo4j.json +105 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/neon.json +114 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/netlify.json +86 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/netsuite.json +93 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/newrelic.json +82 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/newsapi.json +53 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/notion.json +101 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/openstreetmap.json +153 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/openweather.json +94 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/opsgenie.json +76 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/oracle.json +174 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/otel_collector.json +147 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/outlook.json +141 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/outreach.json +76 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/pagerduty.json +99 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/pandadoc.json +87 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/personio.json +73 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/pinecone.json +76 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/pingdom.json +63 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/pipedrive.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/planetscale.json +113 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/plausible.json +69 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/polygon_io.json +68 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/postgres.json +116 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/posthog.json +88 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/prometheus.json +113 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/qdrant.json +79 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/quickbooks.json +91 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/recurly.json +58 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/redis.json +118 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/redshift.json +95 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/render.json +64 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/reply_io.json +55 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/rippling_hris.json +72 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/rollbar.json +88 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/rudderstack.json +106 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/sage_intacct.json +104 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/salesforce.json +122 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/salesloft.json +65 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/segment.json +125 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/sentry.json +119 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/shipbob.json +59 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/shippo.json +70 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/shipstation.json +68 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/slack.json +113 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/smartlead.json +60 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/snowflake.json +102 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/splunk.json +123 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/spotify.json +109 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/statuspage.json +64 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/stripe.json +126 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/sumo_logic.json +105 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/supabase.json +161 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/tempo.json +131 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/todoist.json +89 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/tomorrow_io.json +63 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/tomtom.json +95 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/trello.json +101 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/typeform.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/uber.json +98 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/upstash.json +81 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/uptimerobot.json +80 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/vercel.json +96 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/victoriametrics.json +116 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/vitally.json +60 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/weaviate.json +103 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/workable.json +96 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/xero.json +72 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/youtube_data.json +97 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/zendesk.json +114 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/zipkin.json +146 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/zoho_books.json +111 -0
- cowork_server-0.1.1/cowork/services/connectors/specs/zoominfo.json +87 -0
- cowork_server-0.1.1/cowork/services/connectors/submissions.py +55 -0
- cowork_server-0.1.1/cowork/services/conversations.py +181 -0
- cowork_server-0.1.1/cowork/services/files.py +87 -0
- cowork_server-0.1.1/cowork/services/memory.py +56 -0
- cowork_server-0.1.1/cowork/services/pins.py +40 -0
- cowork_server-0.1.1/cowork/services/projects.py +161 -0
- cowork_server-0.1.1/cowork/services/providers.py +212 -0
- cowork_server-0.1.1/cowork/services/publish.py +202 -0
- cowork_server-0.1.1/cowork/services/schedules.py +139 -0
- cowork_server-0.1.1/cowork/services/settings.py +148 -0
- cowork_server-0.1.1/cowork/services/skills.py +82 -0
- cowork_server-0.1.1/docs/DESIGN.md +27 -0
- cowork_server-0.1.1/docs/SERVER_MIGRATION.md +70 -0
- cowork_server-0.1.1/pyproject.toml +49 -0
- cowork_server-0.1.1/tests/__init__.py +0 -0
- cowork_server-0.1.1/uv.lock +1755 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
release:
|
|
8
|
+
types: [published]
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: release
|
|
12
|
+
cancel-in-progress: false
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
publish:
|
|
16
|
+
name: Build and publish to PyPI
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
environment: pypi
|
|
19
|
+
permissions:
|
|
20
|
+
contents: read # required to checkout private repo
|
|
21
|
+
id-token: write # required for trusted publisher (OIDC)
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Setup uv
|
|
26
|
+
uses: astral-sh/setup-uv@v5
|
|
27
|
+
with:
|
|
28
|
+
python-version: "3.12"
|
|
29
|
+
|
|
30
|
+
- name: Verify tag matches package version
|
|
31
|
+
run: |
|
|
32
|
+
PKG_VERSION=$(python -c "
|
|
33
|
+
import re
|
|
34
|
+
with open('pyproject.toml') as f:
|
|
35
|
+
m = re.search(r'version\s*=\s*\"(.+?)\"', f.read())
|
|
36
|
+
print(m.group(1))
|
|
37
|
+
")
|
|
38
|
+
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
39
|
+
if [ "$PKG_VERSION" != "$TAG_VERSION" ]; then
|
|
40
|
+
echo "ERROR: Tag version ($TAG_VERSION) does not match pyproject.toml version ($PKG_VERSION)"
|
|
41
|
+
exit 1
|
|
42
|
+
fi
|
|
43
|
+
echo "Version check passed: $PKG_VERSION"
|
|
44
|
+
|
|
45
|
+
- name: Build package
|
|
46
|
+
run: uv build
|
|
47
|
+
|
|
48
|
+
- name: Publish to PyPI
|
|
49
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
50
|
+
# Uses trusted publisher (OIDC) — no API token needed.
|
|
51
|
+
# Configure at: https://pypi.org/manage/project/cowork-server/settings/publishing/
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
#Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
#uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
#poetry.lock
|
|
109
|
+
#poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
#pdm.lock
|
|
116
|
+
#pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
#pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# SageMath parsed files
|
|
135
|
+
*.sage.py
|
|
136
|
+
|
|
137
|
+
# Environments
|
|
138
|
+
.env
|
|
139
|
+
.envrc
|
|
140
|
+
.venv
|
|
141
|
+
env/
|
|
142
|
+
venv/
|
|
143
|
+
ENV/
|
|
144
|
+
env.bak/
|
|
145
|
+
venv.bak/
|
|
146
|
+
|
|
147
|
+
# Spyder project settings
|
|
148
|
+
.spyderproject
|
|
149
|
+
.spyproject
|
|
150
|
+
|
|
151
|
+
# Rope project settings
|
|
152
|
+
.ropeproject
|
|
153
|
+
|
|
154
|
+
# mkdocs documentation
|
|
155
|
+
/site
|
|
156
|
+
|
|
157
|
+
# mypy
|
|
158
|
+
.mypy_cache/
|
|
159
|
+
.dmypy.json
|
|
160
|
+
dmypy.json
|
|
161
|
+
|
|
162
|
+
# Pyre type checker
|
|
163
|
+
.pyre/
|
|
164
|
+
|
|
165
|
+
# pytype static type analyzer
|
|
166
|
+
.pytype/
|
|
167
|
+
|
|
168
|
+
# Cython debug symbols
|
|
169
|
+
cython_debug/
|
|
170
|
+
|
|
171
|
+
# PyCharm
|
|
172
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
173
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
174
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
175
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
176
|
+
#.idea/
|
|
177
|
+
|
|
178
|
+
# Abstra
|
|
179
|
+
# Abstra is an AI-powered process automation framework.
|
|
180
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
181
|
+
# Learn more at https://abstra.io/docs
|
|
182
|
+
.abstra/
|
|
183
|
+
|
|
184
|
+
# Visual Studio Code
|
|
185
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
186
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
188
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
189
|
+
# .vscode/
|
|
190
|
+
|
|
191
|
+
# Ruff stuff:
|
|
192
|
+
.ruff_cache/
|
|
193
|
+
|
|
194
|
+
# PyPI configuration file
|
|
195
|
+
.pypirc
|
|
196
|
+
|
|
197
|
+
# Cursor
|
|
198
|
+
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
|
|
199
|
+
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
|
|
200
|
+
# refer to https://docs.cursor.com/context/ignore-files
|
|
201
|
+
.cursorignore
|
|
202
|
+
.cursorindexingignore
|
|
203
|
+
|
|
204
|
+
# IDE
|
|
205
|
+
.idea/
|
|
206
|
+
.vscode/
|
|
207
|
+
*.swp
|
|
208
|
+
*.swo
|
|
209
|
+
|
|
210
|
+
# Marimo
|
|
211
|
+
marimo/_static/
|
|
212
|
+
marimo/_lsp/
|
|
213
|
+
__marimo__/
|
|
214
|
+
|
|
215
|
+
# Misc
|
|
216
|
+
.DS_Store
|
|
217
|
+
|
|
218
|
+
deployment/**/charts
|
|
219
|
+
deployment/**/requirements.lock
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cowork-server
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: FastAPI backend for the Minds Cowork desktop app
|
|
5
|
+
Project-URL: Homepage, https://github.com/mindsdb/cowork-server
|
|
6
|
+
Project-URL: Repository, https://github.com/mindsdb/cowork-server
|
|
7
|
+
Project-URL: Issues, https://github.com/mindsdb/cowork-server/issues
|
|
8
|
+
Author-email: MindsDB Inc <admin@mindsdb.com>
|
|
9
|
+
License-Expression: LicenseRef-Proprietary
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Classifier: Framework :: FastAPI
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Requires-Python: >=3.12
|
|
16
|
+
Requires-Dist: anton
|
|
17
|
+
Requires-Dist: cryptography>=48.0.0
|
|
18
|
+
Requires-Dist: fastapi>=0.136.1
|
|
19
|
+
Requires-Dist: pydantic-settings>=2.14.1
|
|
20
|
+
Requires-Dist: pydantic>=2.12.5
|
|
21
|
+
Requires-Dist: python-multipart>=0.0.28
|
|
22
|
+
Requires-Dist: sqlmodel>=0.0.38
|
|
23
|
+
Requires-Dist: uvicorn>=0.47.0
|
|
24
|
+
Provides-Extra: hermes
|
|
25
|
+
Requires-Dist: hermes-agent; extra == 'hermes'
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# Cowork Server
|
|
29
|
+
|
|
30
|
+
FastAPI backend for the [Anton](https://github.com/mindsdb/cowork) desktop app. Manages projects, conversations, files, scheduling, memory, and agent orchestration with a SQLite-backed data layer.
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
Requires Python 3.12+ and [uv](https://docs.astral.sh/uv/).
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
# Install and run
|
|
38
|
+
uv tool install cowork-server
|
|
39
|
+
cowork-server
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The server starts on `http://127.0.0.1:26866`. Confirm with:
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
curl http://127.0.0.1:26866/api/v1/health/
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Development
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
# Run from source (auto-manages virtualenv + deps)
|
|
52
|
+
uv run cowork-server
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
When running alongside the Electron app in dev mode, the app spawns the server automatically — no manual start needed.
|
|
56
|
+
|
|
57
|
+
### Dev setup helper
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
uv run cowork-dev-setup
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Initializes the database and validates configuration.
|
|
64
|
+
|
|
65
|
+
## Architecture
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
cowork/
|
|
69
|
+
api/v1/endpoints/ # FastAPI route handlers
|
|
70
|
+
services/ # Business logic
|
|
71
|
+
models/ # SQLModel / DB models
|
|
72
|
+
schemas/ # Pydantic request/response schemas
|
|
73
|
+
db/ # Database session and migrations
|
|
74
|
+
common/ # Shared utilities, settings
|
|
75
|
+
harnesses/ # Agent adapters (Anton, Hermes, etc.)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The server is designed to be **agent-agnostic** — core features (projects, conversations, files) are shared across agents, while agent-specific behavior lives in harness adapters. See [docs/DESIGN.md](docs/DESIGN.md) for the full architectural rationale.
|
|
79
|
+
|
|
80
|
+
## API
|
|
81
|
+
|
|
82
|
+
All endpoints live under `/api/v1/`. Key resource groups:
|
|
83
|
+
|
|
84
|
+
| Path | Description |
|
|
85
|
+
|------|-------------|
|
|
86
|
+
| `/health` | Readiness probe |
|
|
87
|
+
| `/projects` | Project CRUD and working-folder management |
|
|
88
|
+
| `/conversations` | Conversation threads and message history |
|
|
89
|
+
| `/responses` | Streaming agent responses (SSE) |
|
|
90
|
+
| `/files` | OpenAI-compatible file uploads |
|
|
91
|
+
| `/schedules` | Recurring task scheduling |
|
|
92
|
+
| `/skills` | Agent skill definitions |
|
|
93
|
+
| `/memory` | Persistent agent memory |
|
|
94
|
+
| `/artifacts` | Agent-produced file previews |
|
|
95
|
+
| `/publish` | Publish HTML artifacts to 4nton.ai |
|
|
96
|
+
| `/connectors` | Third-party service connections and OAuth |
|
|
97
|
+
| `/settings` | User preferences and API keys |
|
|
98
|
+
|
|
99
|
+
## Configuration
|
|
100
|
+
|
|
101
|
+
Configuration is read from the database (`UserSettings` table) and can be managed through the Settings UI in the desktop app or via `PUT /api/v1/settings/`.
|
|
102
|
+
|
|
103
|
+
Environment variables fall into two namespaces:
|
|
104
|
+
|
|
105
|
+
**Server-level** (`COWORK_*`) — control the cowork-server process itself:
|
|
106
|
+
|
|
107
|
+
| Variable | Default | Description |
|
|
108
|
+
|----------|---------|-------------|
|
|
109
|
+
| `COWORK_SERVER_PORT` | `26866` | Server port |
|
|
110
|
+
| `COWORK_SERVER_HOST` | `127.0.0.1` | Bind address |
|
|
111
|
+
| `COWORK_PROJECTS_DIR` | `~/.cowork/projects` | Project storage root |
|
|
112
|
+
| `COWORK_FILES_DIR` | `~/.cowork/files` | Uploaded files root |
|
|
113
|
+
| `COWORK_VAULT_DIR` | `~/.cowork/data-vault` | Connector credential vault |
|
|
114
|
+
|
|
115
|
+
**Harness-level** (`ANTON_*`, `HERMES_*`) — configure a specific agent harness. These are read by the harness adapter, not by cowork-server core. They use the harness prefix because the upstream agent libraries (anton, hermes-agent) define them:
|
|
116
|
+
|
|
117
|
+
| Variable | Harness | Description |
|
|
118
|
+
|----------|---------|-------------|
|
|
119
|
+
| `ANTON_PUBLISH_URL` | Anton | Artifact publish endpoint |
|
|
120
|
+
| `ANTON_SKILLS_ROOT_DIR` | Anton | Skill file storage |
|
|
121
|
+
| `ANTON_GLOBAL_MEMORY_ROOT_DIR` | Anton | Global memory files |
|
|
122
|
+
| `HERMES_HOME` / `HERMES_ROOT_DIR` | Hermes | Hermes data root |
|
|
123
|
+
|
|
124
|
+
In Docker/Lightsail deployments, the container also receives `ANTON_MINDS_API_KEY`, `ANTON_OPENAI_API_KEY`, etc. — these are consumed by the Anton agent library directly (not by cowork-server settings), and are injected by the provisioning lambda via cloud-init user-data.
|
|
125
|
+
|
|
126
|
+
## Docs
|
|
127
|
+
|
|
128
|
+
- [docs/DESIGN.md](docs/DESIGN.md) — Architectural overview and design decisions
|
|
129
|
+
- [docs/MIGRATION.md](docs/MIGRATION.md) — Migration guide from the legacy server
|
|
130
|
+
- [docs/MIGRATION_PROGRESS.md](docs/MIGRATION_PROGRESS.md) — Migration status tracker
|
|
131
|
+
|
|
132
|
+
## License
|
|
133
|
+
|
|
134
|
+
See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Cowork Server
|
|
2
|
+
|
|
3
|
+
FastAPI backend for the [Anton](https://github.com/mindsdb/cowork) desktop app. Manages projects, conversations, files, scheduling, memory, and agent orchestration with a SQLite-backed data layer.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
Requires Python 3.12+ and [uv](https://docs.astral.sh/uv/).
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# Install and run
|
|
11
|
+
uv tool install cowork-server
|
|
12
|
+
cowork-server
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The server starts on `http://127.0.0.1:26866`. Confirm with:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
curl http://127.0.0.1:26866/api/v1/health/
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Development
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
# Run from source (auto-manages virtualenv + deps)
|
|
25
|
+
uv run cowork-server
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
When running alongside the Electron app in dev mode, the app spawns the server automatically — no manual start needed.
|
|
29
|
+
|
|
30
|
+
### Dev setup helper
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
uv run cowork-dev-setup
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Initializes the database and validates configuration.
|
|
37
|
+
|
|
38
|
+
## Architecture
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
cowork/
|
|
42
|
+
api/v1/endpoints/ # FastAPI route handlers
|
|
43
|
+
services/ # Business logic
|
|
44
|
+
models/ # SQLModel / DB models
|
|
45
|
+
schemas/ # Pydantic request/response schemas
|
|
46
|
+
db/ # Database session and migrations
|
|
47
|
+
common/ # Shared utilities, settings
|
|
48
|
+
harnesses/ # Agent adapters (Anton, Hermes, etc.)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
The server is designed to be **agent-agnostic** — core features (projects, conversations, files) are shared across agents, while agent-specific behavior lives in harness adapters. See [docs/DESIGN.md](docs/DESIGN.md) for the full architectural rationale.
|
|
52
|
+
|
|
53
|
+
## API
|
|
54
|
+
|
|
55
|
+
All endpoints live under `/api/v1/`. Key resource groups:
|
|
56
|
+
|
|
57
|
+
| Path | Description |
|
|
58
|
+
|------|-------------|
|
|
59
|
+
| `/health` | Readiness probe |
|
|
60
|
+
| `/projects` | Project CRUD and working-folder management |
|
|
61
|
+
| `/conversations` | Conversation threads and message history |
|
|
62
|
+
| `/responses` | Streaming agent responses (SSE) |
|
|
63
|
+
| `/files` | OpenAI-compatible file uploads |
|
|
64
|
+
| `/schedules` | Recurring task scheduling |
|
|
65
|
+
| `/skills` | Agent skill definitions |
|
|
66
|
+
| `/memory` | Persistent agent memory |
|
|
67
|
+
| `/artifacts` | Agent-produced file previews |
|
|
68
|
+
| `/publish` | Publish HTML artifacts to 4nton.ai |
|
|
69
|
+
| `/connectors` | Third-party service connections and OAuth |
|
|
70
|
+
| `/settings` | User preferences and API keys |
|
|
71
|
+
|
|
72
|
+
## Configuration
|
|
73
|
+
|
|
74
|
+
Configuration is read from the database (`UserSettings` table) and can be managed through the Settings UI in the desktop app or via `PUT /api/v1/settings/`.
|
|
75
|
+
|
|
76
|
+
Environment variables fall into two namespaces:
|
|
77
|
+
|
|
78
|
+
**Server-level** (`COWORK_*`) — control the cowork-server process itself:
|
|
79
|
+
|
|
80
|
+
| Variable | Default | Description |
|
|
81
|
+
|----------|---------|-------------|
|
|
82
|
+
| `COWORK_SERVER_PORT` | `26866` | Server port |
|
|
83
|
+
| `COWORK_SERVER_HOST` | `127.0.0.1` | Bind address |
|
|
84
|
+
| `COWORK_PROJECTS_DIR` | `~/.cowork/projects` | Project storage root |
|
|
85
|
+
| `COWORK_FILES_DIR` | `~/.cowork/files` | Uploaded files root |
|
|
86
|
+
| `COWORK_VAULT_DIR` | `~/.cowork/data-vault` | Connector credential vault |
|
|
87
|
+
|
|
88
|
+
**Harness-level** (`ANTON_*`, `HERMES_*`) — configure a specific agent harness. These are read by the harness adapter, not by cowork-server core. They use the harness prefix because the upstream agent libraries (anton, hermes-agent) define them:
|
|
89
|
+
|
|
90
|
+
| Variable | Harness | Description |
|
|
91
|
+
|----------|---------|-------------|
|
|
92
|
+
| `ANTON_PUBLISH_URL` | Anton | Artifact publish endpoint |
|
|
93
|
+
| `ANTON_SKILLS_ROOT_DIR` | Anton | Skill file storage |
|
|
94
|
+
| `ANTON_GLOBAL_MEMORY_ROOT_DIR` | Anton | Global memory files |
|
|
95
|
+
| `HERMES_HOME` / `HERMES_ROOT_DIR` | Hermes | Hermes data root |
|
|
96
|
+
|
|
97
|
+
In Docker/Lightsail deployments, the container also receives `ANTON_MINDS_API_KEY`, `ANTON_OPENAI_API_KEY`, etc. — these are consumed by the Anton agent library directly (not by cowork-server settings), and are injected by the provisioning lambda via cloud-init user-data.
|
|
98
|
+
|
|
99
|
+
## Docs
|
|
100
|
+
|
|
101
|
+
- [docs/DESIGN.md](docs/DESIGN.md) — Architectural overview and design decisions
|
|
102
|
+
- [docs/MIGRATION.md](docs/MIGRATION.md) — Migration guide from the legacy server
|
|
103
|
+
- [docs/MIGRATION_PROGRESS.md](docs/MIGRATION_PROGRESS.md) — Migration status tracker
|
|
104
|
+
|
|
105
|
+
## License
|
|
106
|
+
|
|
107
|
+
See [LICENSE](LICENSE).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Generic single-database configuration.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
from logging.config import fileConfig
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from sqlalchemy import create_engine, pool
|
|
5
|
+
from sqlalchemy.engine import make_url
|
|
6
|
+
from sqlmodel import SQLModel
|
|
7
|
+
|
|
8
|
+
from alembic import context
|
|
9
|
+
from cowork.common.settings.app_settings import get_app_settings
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _ensure_sqlite_dir(url: str) -> None:
|
|
13
|
+
parsed = make_url(url)
|
|
14
|
+
if not parsed.drivername.startswith("sqlite"):
|
|
15
|
+
return
|
|
16
|
+
db_path = parsed.database
|
|
17
|
+
if db_path and db_path != ":memory:":
|
|
18
|
+
Path(db_path).parent.mkdir(parents=True, exist_ok=True)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# this is the Alembic Config object, which provides
|
|
22
|
+
# access to the values within the .ini file in use.
|
|
23
|
+
config = context.config
|
|
24
|
+
|
|
25
|
+
# Interpret the config file for Python logging.
|
|
26
|
+
# This line sets up loggers basically.
|
|
27
|
+
if config.config_file_name is not None:
|
|
28
|
+
fileConfig(config.config_file_name)
|
|
29
|
+
|
|
30
|
+
# add your model's MetaData object here
|
|
31
|
+
# for 'autogenerate' support
|
|
32
|
+
# from myapp import mymodel
|
|
33
|
+
# target_metadata = mymodel.Base.metadata
|
|
34
|
+
# target_metadata = None
|
|
35
|
+
target_metadata = SQLModel.metadata
|
|
36
|
+
|
|
37
|
+
# other values from the config, defined by the needs of env.py,
|
|
38
|
+
# can be acquired:
|
|
39
|
+
# my_important_option = config.get_main_option("my_important_option")
|
|
40
|
+
# ... etc.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def run_migrations_offline() -> None:
|
|
44
|
+
"""Run migrations in 'offline' mode.
|
|
45
|
+
|
|
46
|
+
This configures the context with just a URL
|
|
47
|
+
and not an Engine, though an Engine is acceptable
|
|
48
|
+
here as well. By skipping the Engine creation
|
|
49
|
+
we don't even need a DBAPI to be available.
|
|
50
|
+
|
|
51
|
+
Calls to context.execute() here emit the given string to the
|
|
52
|
+
script output.
|
|
53
|
+
|
|
54
|
+
"""
|
|
55
|
+
database_uri = get_app_settings().database.uri
|
|
56
|
+
url = database_uri or config.get_main_option("sqlalchemy.url", database_uri)
|
|
57
|
+
_ensure_sqlite_dir(url)
|
|
58
|
+
context.configure(
|
|
59
|
+
url=url,
|
|
60
|
+
target_metadata=target_metadata,
|
|
61
|
+
literal_binds=True,
|
|
62
|
+
dialect_opts={"paramstyle": "named"},
|
|
63
|
+
render_as_batch=True,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
with context.begin_transaction():
|
|
67
|
+
context.run_migrations()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def run_migrations_online() -> None:
|
|
71
|
+
"""Run migrations in 'online' mode.
|
|
72
|
+
|
|
73
|
+
In this scenario we need to create an Engine
|
|
74
|
+
and associate a connection with the context.
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
database_uri = get_app_settings().database.uri
|
|
78
|
+
url = database_uri or config.get_main_option("sqlalchemy.url", database_uri)
|
|
79
|
+
_ensure_sqlite_dir(url)
|
|
80
|
+
connectable = create_engine(url, poolclass=pool.NullPool)
|
|
81
|
+
|
|
82
|
+
with connectable.connect() as connection:
|
|
83
|
+
context.configure(connection=connection, target_metadata=target_metadata, render_as_batch=True)
|
|
84
|
+
|
|
85
|
+
with context.begin_transaction():
|
|
86
|
+
context.run_migrations()
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
if context.is_offline_mode():
|
|
90
|
+
run_migrations_offline()
|
|
91
|
+
else:
|
|
92
|
+
run_migrations_online()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""${message}
|
|
2
|
+
|
|
3
|
+
Revision ID: ${up_revision}
|
|
4
|
+
Revises: ${down_revision | comma,n}
|
|
5
|
+
Create Date: ${create_date}
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
${imports if imports else ""}
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = ${repr(up_revision)}
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)}
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
${upgrades if upgrades else "pass"}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
"""Downgrade schema."""
|
|
28
|
+
${downgrades if downgrades else "pass"}
|