@agentsky/sky 2.9.2 → 2.10.0

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.
@@ -19091,21 +19091,21 @@ var ACP_AGENTS = {
19091
19091
  "registryId": "cline",
19092
19092
  "label": "Cline",
19093
19093
  "description": "Autonomous coding agent CLI - capable of creating/editing files, running commands, using the browser, and more",
19094
- "version": "3.0.62",
19094
+ "version": "3.0.68",
19095
19095
  "website": "https://cline.bot/cli"
19096
19096
  },
19097
19097
  "codebuddy_code": {
19098
19098
  "registryId": "codebuddy-code",
19099
19099
  "label": "Codebuddy Code",
19100
19100
  "description": "Tencent Cloud's official intelligent coding tool",
19101
- "version": "2.150.0",
19101
+ "version": "2.161.4",
19102
19102
  "website": "https://www.codebuddy.cn/cli/"
19103
19103
  },
19104
19104
  "cortex_code": {
19105
19105
  "registryId": "cortex-code",
19106
19106
  "label": "Cortex Code",
19107
19107
  "description": "Snowflake's Cortex Code coding agent",
19108
- "version": "1.0.73",
19108
+ "version": "1.1.104",
19109
19109
  "website": "https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code"
19110
19110
  },
19111
19111
  "corust_agent": {
@@ -19119,77 +19119,77 @@ var ACP_AGENTS = {
19119
19119
  "registryId": "crow-cli",
19120
19120
  "label": "crow-cli",
19121
19121
  "description": "Minimal ACP Native Coding Agent",
19122
- "version": "0.1.24",
19122
+ "version": "0.1.46",
19123
19123
  "website": "https://crow-ai.dev"
19124
19124
  },
19125
19125
  "cursor": {
19126
19126
  "registryId": "cursor",
19127
19127
  "label": "Cursor",
19128
19128
  "description": "Cursor's coding agent",
19129
- "version": "2026.09.10",
19129
+ "version": "2026.10.01",
19130
19130
  "website": "https://cursor.com/docs/cli/acp"
19131
19131
  },
19132
19132
  "deepagents": {
19133
19133
  "registryId": "deepagents",
19134
19134
  "label": "DeepAgents",
19135
19135
  "description": "Batteries-included AI coding and general purpose agent powered by LangChain.",
19136
- "version": "0.1.7",
19136
+ "version": "0.1.34",
19137
19137
  "website": "https://docs.langchain.com/oss/javascript/deepagents/overview"
19138
19138
  },
19139
19139
  "devin": {
19140
19140
  "registryId": "devin",
19141
19141
  "label": "Devin",
19142
19142
  "description": "Devin CLI coding agent by Cognition",
19143
- "version": "3000.10.21",
19143
+ "version": "3000.11.3",
19144
19144
  "website": "https://docs.devin.ai/cli"
19145
19145
  },
19146
19146
  "dimcode": {
19147
19147
  "registryId": "dimcode",
19148
19148
  "label": "DimCode",
19149
19149
  "description": "A coding agent that puts leading models at your command.",
19150
- "version": "0.5.2",
19150
+ "version": "0.5.16",
19151
19151
  "website": "https://dimcode.dev/docs/acp.html"
19152
19152
  },
19153
19153
  "dirac": {
19154
19154
  "registryId": "dirac",
19155
19155
  "label": "Dirac",
19156
19156
  "description": "Reduces API costs by more than 50%, produces better and faster work. Uses Hash anchored parallel edits, AST manipulation and a whole lot of neat optimizations. Fully Open Source.",
19157
- "version": "0.5.12",
19157
+ "version": "0.5.18",
19158
19158
  "website": "https://dirac.run"
19159
19159
  },
19160
19160
  "factory_droid": {
19161
19161
  "registryId": "factory-droid",
19162
19162
  "label": "Factory Droid",
19163
19163
  "description": "Factory Droid - AI coding agent powered by Factory AI",
19164
- "version": "0.218.1",
19164
+ "version": "0.234.0",
19165
19165
  "website": "https://factory.ai/product/cli"
19166
19166
  },
19167
19167
  "fast_agent": {
19168
19168
  "registryId": "fast-agent",
19169
19169
  "label": "fast-agent",
19170
19170
  "description": "Code and build agents with comprehensive multi-provider support",
19171
- "version": "0.10.1",
19171
+ "version": "0.10.42",
19172
19172
  "website": "https://fast-agent.ai"
19173
19173
  },
19174
19174
  "gemini": {
19175
19175
  "registryId": "gemini",
19176
19176
  "label": "Gemini CLI",
19177
19177
  "description": "Google's official CLI for Gemini",
19178
- "version": "0.59.0",
19178
+ "version": "0.62.0",
19179
19179
  "website": "https://geminicli.com"
19180
19180
  },
19181
19181
  "github_copilot_cli": {
19182
19182
  "registryId": "github-copilot-cli",
19183
19183
  "label": "GitHub Copilot",
19184
19184
  "description": "GitHub's AI pair programmer",
19185
- "version": "1.0.83",
19185
+ "version": "1.0.92",
19186
19186
  "website": "https://github.com/features/copilot/cli/"
19187
19187
  },
19188
19188
  "glm_acp_agent": {
19189
19189
  "registryId": "glm-acp-agent",
19190
19190
  "label": "GLM Agent",
19191
19191
  "description": "ACP agent powered by Zhipu AI's GLM Coding Plan models (glm-5.1, glm-5-turbo, glm-4.7, glm-4.5-air). Supports streaming, tool calls, mid-session model switching, image input via Z.AI Coding Plan Vision MCP, and session load/fork/resume with on-disk persistence.",
19192
- "version": "1.8.0",
19192
+ "version": "1.14.0",
19193
19193
  "website": "https://github.com/stefandevo/glm-acp-agent"
19194
19194
  },
19195
19195
  "antigravity_acp": {
@@ -19203,49 +19203,49 @@ var ACP_AGENTS = {
19203
19203
  "registryId": "goose",
19204
19204
  "label": "goose",
19205
19205
  "description": "A local, extensible, open source AI agent that automates engineering tasks",
19206
- "version": "1.50.0",
19206
+ "version": "1.53.0",
19207
19207
  "website": "https://block.github.io/goose/"
19208
19208
  },
19209
19209
  "grok_build": {
19210
19210
  "registryId": "grok-build",
19211
19211
  "label": "Grok Build",
19212
19212
  "description": "xAI's coding agent and CLI",
19213
- "version": "1.0.30",
19213
+ "version": "1.0.49",
19214
19214
  "website": "https://x.ai/cli"
19215
19215
  },
19216
19216
  "harn": {
19217
19217
  "registryId": "harn",
19218
19218
  "label": "Harn",
19219
19219
  "description": "Harn runs .harn agent pipelines as a native ACP coding agent over stdio.",
19220
- "version": "0.10.135",
19220
+ "version": "0.10.157",
19221
19221
  "website": "https://harnlang.com"
19222
19222
  },
19223
19223
  "junie": {
19224
19224
  "registryId": "junie",
19225
19225
  "label": "Junie",
19226
19226
  "description": "AI Coding Agent by JetBrains",
19227
- "version": "3218.3.0",
19227
+ "version": "3419.24.0",
19228
19228
  "website": "https://junie.jetbrains.com"
19229
19229
  },
19230
19230
  "kilo": {
19231
19231
  "registryId": "kilo",
19232
19232
  "label": "Kilo",
19233
19233
  "description": "The open source coding agent",
19234
- "version": "7.6.2",
19234
+ "version": "7.8.3",
19235
19235
  "website": "https://kilo.ai/"
19236
19236
  },
19237
19237
  "kimchi": {
19238
19238
  "registryId": "kimchi",
19239
19239
  "label": "Kimchi",
19240
19240
  "description": "Coding agent powered by multi-model orchestration",
19241
- "version": "1.1.18",
19241
+ "version": "1.6.0",
19242
19242
  "website": "https://kimchi.dev"
19243
19243
  },
19244
19244
  "minimax_code": {
19245
19245
  "registryId": "minimax-code",
19246
19246
  "label": "MiniMax Code",
19247
19247
  "description": "MiniMax Code is an AI coding agent with Agent Client Protocol support.",
19248
- "version": "0.2.7",
19248
+ "version": "0.6.4",
19249
19249
  "website": "https://agent.minimax.io"
19250
19250
  },
19251
19251
  "minion_code": {
@@ -19259,7 +19259,7 @@ var ACP_AGENTS = {
19259
19259
  "registryId": "mistral-vibe",
19260
19260
  "label": "Mistral Vibe",
19261
19261
  "description": "Mistral's open-source coding assistant",
19262
- "version": "2.24.1",
19262
+ "version": "2.25.8",
19263
19263
  "website": "https://mistral.ai/products/vibe"
19264
19264
  },
19265
19265
  "nova": {
@@ -19280,21 +19280,21 @@ var ACP_AGENTS = {
19280
19280
  "registryId": "qoder",
19281
19281
  "label": "Qoder CLI",
19282
19282
  "description": "AI coding assistant with agentic capabilities",
19283
- "version": "0.2.14",
19283
+ "version": "1.1.65",
19284
19284
  "website": "https://qoder.com"
19285
19285
  },
19286
19286
  "qwen_code": {
19287
19287
  "registryId": "qwen-code",
19288
19288
  "label": "Qwen Code",
19289
19289
  "description": "Alibaba's Qwen coding assistant",
19290
- "version": "0.23.3",
19290
+ "version": "0.25.0",
19291
19291
  "website": "https://qwenlm.github.io/qwen-code-docs/en/users/overview"
19292
19292
  },
19293
19293
  "sigit": {
19294
19294
  "registryId": "sigit",
19295
19295
  "label": "siGit Code",
19296
19296
  "description": "Local-first coding agent. Runs entirely on your machine with optional on-device LLM inference via Onde.",
19297
- "version": "1.5.8",
19297
+ "version": "1.6.2",
19298
19298
  "website": "https://github.com/getsigit/sigit"
19299
19299
  },
19300
19300
  "stakpak": {
@@ -19308,28 +19308,28 @@ var ACP_AGENTS = {
19308
19308
  "registryId": "vtcode",
19309
19309
  "label": "VT Code",
19310
19310
  "description": "An open-source coding agent with LLM-native code understanding and robust shell safety. Supports multiple LLM providers with automatic failover and efficient context management.",
19311
- "version": "0.96.14",
19311
+ "version": "0.172.4",
19312
19312
  "website": "https://github.com/vinhnx/VTCode/blob/main/docs/guides/zed-acp.md"
19313
19313
  },
19314
19314
  "code_assistant": {
19315
19315
  "registryId": "code-assistant",
19316
19316
  "label": "Code Assistant",
19317
19317
  "description": "An ACP agent with native provider and model configuration.",
19318
- "version": "0.2.15",
19318
+ "version": "0.2.16",
19319
19319
  "website": "https://github.com/stippi/code-assistant/blob/main/docs/configuration.md"
19320
19320
  },
19321
19321
  "docker_cagent": {
19322
19322
  "registryId": "docker-cagent",
19323
19323
  "label": "Docker Agent",
19324
19324
  "description": "Docker's agent runtime configured through an agent YAML file.",
19325
- "version": "1.141.0",
19325
+ "version": "1.148.0",
19326
19326
  "website": "https://docs.docker.com/ai/docker-agent/features/acp/"
19327
19327
  },
19328
19328
  "kiro": {
19329
19329
  "registryId": "kiro-cli",
19330
19330
  "label": "Kiro CLI",
19331
19331
  "description": "Kiro's native command-line agent through ACP.",
19332
- "version": "2.22.0",
19332
+ "version": "2.27.1",
19333
19333
  "website": "https://kiro.dev/docs/cli/acp/"
19334
19334
  },
19335
19335
  "muse_code": {
@@ -19405,7 +19405,7 @@ var ACP_PLATFORM_MODELS = {
19405
19405
  goose: ["deepseek-v4-pro", "deepseek-flash", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra", "glm-5.3", "glm-5.3-flash", "kimi-k3", "kimi-k2.7-code", "grok-4.6", "claude-opus-5", "claude-fable-5-1", "claude-sonnet-5", "claude-haiku-4-5"],
19406
19406
  grok_build: ["grok-4.6", "deepseek-v4-pro", "deepseek-flash", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra", "glm-5.3", "glm-5.3-flash", "kimi-k3", "kimi-k2.7-code"],
19407
19407
  kilo: ["deepseek-v4-pro", "deepseek-flash", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-6-astra", "glm-5.3", "glm-5.3-flash", "kimi-k3", "kimi-k2.7-code", "grok-4.6", "claude-opus-5", "claude-fable-5-1", "claude-sonnet-5", "claude-haiku-4-5"],
19408
- minimax_code: ["minimax-m3", "deepseek-v4-pro", "deepseek-flash", "gpt-5.6-terra", "gpt-6-astra", "claude-fable-5-1", "claude-sonnet-5", "claude-haiku-4-5", "glm-5.3", "glm-5.3-flash", "kimi-k3", "kimi-k2.7-code", "grok-4.6", "gpt-5.5", "claude-fable-5", "claude-opus-4-8", "claude-sonnet-4-6", "deepseek-v4-flash"],
19408
+ minimax_code: ["minimax-m3", "deepseek-v4-pro", "deepseek-flash", "gpt-5.6-terra", "gpt-6-astra", "claude-fable-5-1", "claude-sonnet-5", "claude-haiku-4-5", "glm-5.3", "glm-5.3-flash", "kimi-k3", "kimi-k2.7-code", "grok-4.6", "gpt-6.1-sol", "gpt-6-sol", "gpt-6-luna", "gpt-5.6-sol", "claude-opus-5", "claude-opus-5-5", "gpt-5.5", "claude-fable-5", "claude-opus-4-8", "claude-sonnet-4-6", "deepseek-v4-flash"],
19409
19409
  minion_code: ["deepseek-v4-pro"],
19410
19410
  mistral_vibe: ["deepseek-v4-pro", "deepseek-flash", "glm-5.3", "glm-5.3-flash", "grok-4.6"],
19411
19411
  openhands: ["deepseek-v4-pro", "deepseek-flash", "glm-5.3", "glm-5.3-flash", "kimi-k3", "kimi-k2.7-code", "grok-4.6", "claude-opus-5", "claude-fable-5-1", "claude-sonnet-5", "claude-haiku-4-5"],
@@ -19526,7 +19526,7 @@ var ACP_ACCOUNT_PROFILES = {
19526
19526
  },
19527
19527
  "cline": {
19528
19528
  "name": "Cline",
19529
- "version": "3.0.61",
19529
+ "version": "3.0.68",
19530
19530
  "status": "documented",
19531
19531
  "setupModes": [
19532
19532
  {
@@ -19578,7 +19578,7 @@ var ACP_ACCOUNT_PROFILES = {
19578
19578
  },
19579
19579
  "codebuddy_code": {
19580
19580
  "name": "Codebuddy Code",
19581
- "version": "2.150.0",
19581
+ "version": "2.161.4",
19582
19582
  "status": "documented",
19583
19583
  "setupModes": [
19584
19584
  {
@@ -19619,7 +19619,7 @@ var ACP_ACCOUNT_PROFILES = {
19619
19619
  },
19620
19620
  "cortex_code": {
19621
19621
  "name": "Cortex Code",
19622
- "version": "1.0.73",
19622
+ "version": "1.1.104",
19623
19623
  "status": "documented",
19624
19624
  "setupModes": [
19625
19625
  {
@@ -19701,7 +19701,7 @@ var ACP_ACCOUNT_PROFILES = {
19701
19701
  },
19702
19702
  "crow_cli": {
19703
19703
  "name": "crow-cli",
19704
- "version": "0.1.24",
19704
+ "version": "0.1.46",
19705
19705
  "status": "documented",
19706
19706
  "setupModes": [
19707
19707
  {
@@ -19709,11 +19709,11 @@ var ACP_ACCOUNT_PROFILES = {
19709
19709
  "label": "Native configuration",
19710
19710
  "fields": [
19711
19711
  {
19712
- "key": "file:.crow/config.yaml",
19712
+ "key": "file:.agents/crow/config.yaml",
19713
19713
  "label": "Crow provider and model configuration",
19714
19714
  "kind": "yaml",
19715
19715
  "required": true,
19716
- "file": ".crow/config.yaml",
19716
+ "file": ".agents/crow/config.yaml",
19717
19717
  "source": "https://github.com/crow-cli/crow-cli/blob/main/README.md"
19718
19718
  }
19719
19719
  ],
@@ -19722,7 +19722,7 @@ var ACP_ACCOUNT_PROFILES = {
19722
19722
  ],
19723
19723
  "files": [
19724
19724
  {
19725
- "path": ".crow/config.yaml",
19725
+ "path": ".agents/crow/config.yaml",
19726
19726
  "format": "yaml",
19727
19727
  "required": true,
19728
19728
  "source": "https://github.com/crow-cli/crow-cli/blob/main/README.md"
@@ -19738,7 +19738,7 @@ var ACP_ACCOUNT_PROFILES = {
19738
19738
  },
19739
19739
  "cursor": {
19740
19740
  "name": "Cursor",
19741
- "version": "2026.09.10",
19741
+ "version": "2026.10.01",
19742
19742
  "status": "documented",
19743
19743
  "setupModes": [
19744
19744
  {
@@ -19772,7 +19772,7 @@ var ACP_ACCOUNT_PROFILES = {
19772
19772
  },
19773
19773
  "deepagents": {
19774
19774
  "name": "DeepAgents",
19775
- "version": "0.1.7",
19775
+ "version": "0.1.34",
19776
19776
  "status": "documented",
19777
19777
  "setupModes": [
19778
19778
  {
@@ -19799,7 +19799,7 @@ var ACP_ACCOUNT_PROFILES = {
19799
19799
  },
19800
19800
  "devin": {
19801
19801
  "name": "Devin",
19802
- "version": "3000.10.21",
19802
+ "version": "3000.11.3",
19803
19803
  "status": "documented",
19804
19804
  "setupModes": [
19805
19805
  {
@@ -19828,7 +19828,7 @@ var ACP_ACCOUNT_PROFILES = {
19828
19828
  },
19829
19829
  "dimcode": {
19830
19830
  "name": "DimCode",
19831
- "version": "0.5.2",
19831
+ "version": "0.5.16",
19832
19832
  "status": "documented",
19833
19833
  "setupModes": [
19834
19834
  {
@@ -19894,7 +19894,7 @@ var ACP_ACCOUNT_PROFILES = {
19894
19894
  },
19895
19895
  "dirac": {
19896
19896
  "name": "Dirac",
19897
- "version": "0.5.12",
19897
+ "version": "0.5.18",
19898
19898
  "status": "documented",
19899
19899
  "setupModes": [
19900
19900
  {
@@ -19942,7 +19942,7 @@ var ACP_ACCOUNT_PROFILES = {
19942
19942
  },
19943
19943
  "factory_droid": {
19944
19944
  "name": "Factory Droid",
19945
- "version": "0.218.1",
19945
+ "version": "0.234.0",
19946
19946
  "status": "documented",
19947
19947
  "setupModes": [
19948
19948
  {
@@ -19969,7 +19969,7 @@ var ACP_ACCOUNT_PROFILES = {
19969
19969
  },
19970
19970
  "fast_agent": {
19971
19971
  "name": "fast-agent",
19972
- "version": "0.10.1",
19972
+ "version": "0.10.42",
19973
19973
  "status": "documented",
19974
19974
  "setupModes": [
19975
19975
  {
@@ -20027,7 +20027,7 @@ var ACP_ACCOUNT_PROFILES = {
20027
20027
  },
20028
20028
  "gemini": {
20029
20029
  "name": "Gemini CLI",
20030
- "version": "0.59.0",
20030
+ "version": "0.62.0",
20031
20031
  "status": "documented",
20032
20032
  "setupModes": [
20033
20033
  {
@@ -20054,7 +20054,7 @@ var ACP_ACCOUNT_PROFILES = {
20054
20054
  },
20055
20055
  "github_copilot_cli": {
20056
20056
  "name": "GitHub Copilot",
20057
- "version": "1.0.83",
20057
+ "version": "1.0.92",
20058
20058
  "status": "documented",
20059
20059
  "setupModes": [
20060
20060
  {
@@ -20083,7 +20083,7 @@ var ACP_ACCOUNT_PROFILES = {
20083
20083
  },
20084
20084
  "glm_acp_agent": {
20085
20085
  "name": "GLM Agent",
20086
- "version": "1.8.0",
20086
+ "version": "1.14.0",
20087
20087
  "status": "documented",
20088
20088
  "setupModes": [
20089
20089
  {
@@ -20158,7 +20158,7 @@ var ACP_ACCOUNT_PROFILES = {
20158
20158
  },
20159
20159
  "goose": {
20160
20160
  "name": "goose",
20161
- "version": "1.50.0",
20161
+ "version": "1.53.0",
20162
20162
  "status": "documented",
20163
20163
  "setupModes": [
20164
20164
  {
@@ -20219,7 +20219,7 @@ var ACP_ACCOUNT_PROFILES = {
20219
20219
  },
20220
20220
  "grok_build": {
20221
20221
  "name": "Grok Build",
20222
- "version": "1.0.30",
20222
+ "version": "1.0.49",
20223
20223
  "status": "documented",
20224
20224
  "setupModes": [
20225
20225
  {
@@ -20246,7 +20246,7 @@ var ACP_ACCOUNT_PROFILES = {
20246
20246
  },
20247
20247
  "harn": {
20248
20248
  "name": "Harn",
20249
- "version": "0.10.135",
20249
+ "version": "0.10.157",
20250
20250
  "status": "documented",
20251
20251
  "setupModes": [
20252
20252
  {
@@ -20275,7 +20275,7 @@ var ACP_ACCOUNT_PROFILES = {
20275
20275
  },
20276
20276
  "junie": {
20277
20277
  "name": "Junie",
20278
- "version": "3218.3.0",
20278
+ "version": "3419.24.0",
20279
20279
  "status": "documented",
20280
20280
  "setupModes": [
20281
20281
  {
@@ -20304,7 +20304,7 @@ var ACP_ACCOUNT_PROFILES = {
20304
20304
  },
20305
20305
  "kilo": {
20306
20306
  "name": "Kilo",
20307
- "version": "7.6.2",
20307
+ "version": "7.8.3",
20308
20308
  "status": "documented",
20309
20309
  "setupModes": [
20310
20310
  {
@@ -20348,7 +20348,7 @@ var ACP_ACCOUNT_PROFILES = {
20348
20348
  },
20349
20349
  "kimchi": {
20350
20350
  "name": "Kimchi",
20351
- "version": "1.1.18",
20351
+ "version": "1.6.0",
20352
20352
  "status": "documented",
20353
20353
  "setupModes": [
20354
20354
  {
@@ -20375,7 +20375,7 @@ var ACP_ACCOUNT_PROFILES = {
20375
20375
  },
20376
20376
  "minimax_code": {
20377
20377
  "name": "MiniMax Code",
20378
- "version": "0.2.7",
20378
+ "version": "0.6.4",
20379
20379
  "status": "documented",
20380
20380
  "setupModes": [
20381
20381
  {
@@ -20465,7 +20465,7 @@ var ACP_ACCOUNT_PROFILES = {
20465
20465
  },
20466
20466
  "mistral_vibe": {
20467
20467
  "name": "Mistral Vibe",
20468
- "version": "2.24.1",
20468
+ "version": "2.25.8",
20469
20469
  "status": "documented",
20470
20470
  "setupModes": [
20471
20471
  {
@@ -20526,7 +20526,7 @@ var ACP_ACCOUNT_PROFILES = {
20526
20526
  },
20527
20527
  "qoder": {
20528
20528
  "name": "Qoder CLI",
20529
- "version": "0.2.14",
20529
+ "version": "1.1.65",
20530
20530
  "status": "documented",
20531
20531
  "setupModes": [
20532
20532
  {
@@ -20553,7 +20553,7 @@ var ACP_ACCOUNT_PROFILES = {
20553
20553
  },
20554
20554
  "qwen_code": {
20555
20555
  "name": "Qwen Code",
20556
- "version": "0.23.3",
20556
+ "version": "0.25.0",
20557
20557
  "status": "documented",
20558
20558
  "setupModes": [
20559
20559
  {
@@ -20594,7 +20594,7 @@ var ACP_ACCOUNT_PROFILES = {
20594
20594
  },
20595
20595
  "sigit": {
20596
20596
  "name": "siGit Code",
20597
- "version": "1.5.8",
20597
+ "version": "1.6.2",
20598
20598
  "status": "documented",
20599
20599
  "setupModes": [
20600
20600
  {
@@ -20643,7 +20643,7 @@ var ACP_ACCOUNT_PROFILES = {
20643
20643
  },
20644
20644
  "vtcode": {
20645
20645
  "name": "VT Code",
20646
- "version": "0.96.14",
20646
+ "version": "0.172.4",
20647
20647
  "status": "documented",
20648
20648
  "setupModes": [
20649
20649
  {
@@ -20684,7 +20684,7 @@ var ACP_ACCOUNT_PROFILES = {
20684
20684
  },
20685
20685
  "code_assistant": {
20686
20686
  "name": "Code Assistant",
20687
- "version": "0.2.15",
20687
+ "version": "0.2.16",
20688
20688
  "status": "documented",
20689
20689
  "setupModes": [
20690
20690
  {
@@ -20733,7 +20733,7 @@ var ACP_ACCOUNT_PROFILES = {
20733
20733
  },
20734
20734
  "docker_cagent": {
20735
20735
  "name": "Docker's cagent",
20736
- "version": "1.141.0",
20736
+ "version": "1.148.0",
20737
20737
  "status": "documented",
20738
20738
  "setupModes": [
20739
20739
  {
@@ -20780,7 +20780,7 @@ var ACP_ACCOUNT_PROFILES = {
20780
20780
  },
20781
20781
  "kiro": {
20782
20782
  "name": "Kiro CLI",
20783
- "version": "2.22.0",
20783
+ "version": "2.27.1",
20784
20784
  "status": "documented",
20785
20785
  "setupModes": [
20786
20786
  {
@@ -20888,7 +20888,54 @@ var ACP_RUNNABLE_AGENT_TYPES = ACP_AGENT_TYPES.filter(
20888
20888
  function isRunnableAcpAgentType(value) {
20889
20889
  return isAcpAgentType(value) && ACP_RUNNABLE_AGENT_TYPES.includes(value);
20890
20890
  }
20891
- var ACP_DISCOVERY_PROFILES = Object.entries(ACP_ACCOUNT_PROFILES).map(([agentType, account]) => {
20891
+ var ACP_POPULARITY_ORDER = [
20892
+ "github_copilot_cli",
20893
+ "cursor",
20894
+ "gemini",
20895
+ "muse_code",
20896
+ "devin",
20897
+ "antigravity_acp",
20898
+ "kiro",
20899
+ "cline",
20900
+ "openhands",
20901
+ "qwen_code",
20902
+ "grok_build",
20903
+ "junie",
20904
+ "goose",
20905
+ "amp_acp",
20906
+ "factory_droid",
20907
+ "mistral_vibe",
20908
+ "auggie",
20909
+ "kilo",
20910
+ "codebuddy_code",
20911
+ "minimax_code",
20912
+ "qoder",
20913
+ "docker_cagent",
20914
+ "cortex_code",
20915
+ "blackbox",
20916
+ "poolside",
20917
+ "deepagents",
20918
+ "glm_acp_agent",
20919
+ "fast_agent",
20920
+ "code_assistant",
20921
+ "crow_cli",
20922
+ "stakpak",
20923
+ "vtcode",
20924
+ "autohand",
20925
+ "kimchi",
20926
+ "dimcode",
20927
+ "dirac",
20928
+ "harn",
20929
+ "minion_code",
20930
+ "corust_agent",
20931
+ "sigit",
20932
+ "agoragentic_acp"
20933
+ ];
20934
+ function acpPopularityRank(agentType) {
20935
+ const rank = ACP_POPULARITY_ORDER.indexOf(agentType);
20936
+ return rank < 0 ? ACP_POPULARITY_ORDER.length : rank;
20937
+ }
20938
+ var ACP_DISCOVERY_PROFILES = Object.entries(ACP_ACCOUNT_PROFILES).sort(([a], [b]) => acpPopularityRank(a) - acpPopularityRank(b)).map(([agentType, account]) => {
20892
20939
  const catalog = isAcpAgentType(agentType) ? ACP_AGENTS[agentType] : null;
20893
20940
  return {
20894
20941
  agentType,
@@ -20985,6 +21032,16 @@ function mcpServersFromKept(kept) {
20985
21032
  return { servers, skipped };
20986
21033
  }
20987
21034
 
21035
+ // ../../packages/spec/src/interaction-mode.ts
21036
+ var interactionModeSchema = external_exports.enum(["plan", "build"]);
21037
+ var INTERACTION_MODE_METADATA_KEY = "interaction_mode";
21038
+ var sessionMetadataSchema = external_exports.record(external_exports.string(), external_exports.unknown()).superRefine((metadata, context) => {
21039
+ const mode = metadata[INTERACTION_MODE_METADATA_KEY];
21040
+ if (mode !== void 0 && mode !== null && !interactionModeSchema.safeParse(mode).success) {
21041
+ context.addIssue({ code: "custom", path: [INTERACTION_MODE_METADATA_KEY], message: "Choose plan or build" });
21042
+ }
21043
+ });
21044
+
20988
21045
  // ../../packages/spec/src/events.ts
20989
21046
  var textBlockSchema = external_exports.object({ type: external_exports.literal("text"), text: external_exports.string().min(1) }).strict();
20990
21047
  var base64SourceSchema = external_exports.object({ type: external_exports.literal("base64"), media_type: external_exports.string().min(1), data: external_exports.string().min(1) }).strict();
@@ -21006,7 +21063,7 @@ var documentBlockSchema = external_exports.object({
21006
21063
  context: external_exports.string().nullish()
21007
21064
  }).strict();
21008
21065
  var contentBlockSchema = external_exports.discriminatedUnion("type", [textBlockSchema, imageBlockSchema, documentBlockSchema]);
21009
- var userMessageEventSchema = external_exports.object({ type: external_exports.literal("user.message"), content: external_exports.array(contentBlockSchema).min(1) }).strict();
21066
+ var userMessageEventSchema = external_exports.object({ type: external_exports.literal("user.message"), content: external_exports.array(contentBlockSchema).min(1), interaction_mode: interactionModeSchema.nullish() }).strict();
21010
21067
  var systemMessageEventSchema = external_exports.object({ type: external_exports.literal("system.message"), content: external_exports.array(textBlockSchema).min(1).max(1e3) }).strict();
21011
21068
  var userInterruptEventSchema = external_exports.object({ type: external_exports.literal("user.interrupt") }).strict();
21012
21069
  var sessionEventSchema = external_exports.discriminatedUnion("type", [
@@ -21153,7 +21210,7 @@ var connectionSupportSchema = external_exports.object({
21153
21210
  }).strict();
21154
21211
 
21155
21212
  // ../../packages/spec/src/question.ts
21156
- var QUESTION_REQUEST_KINDS = ["connect_app", "connect_account", "spend"];
21213
+ var QUESTION_REQUEST_KINDS = ["connect_app", "connect_account", "spend", "start"];
21157
21214
  var questionSchema = external_exports.object({
21158
21215
  requestId: external_exports.string().min(1),
21159
21216
  question: external_exports.string().trim().min(1),
@@ -21179,7 +21236,7 @@ var questionSchema = external_exports.object({
21179
21236
  /** What the platform is asking for when the question is one of its own
21180
21237
  * requests rather than an agent's free question. Absent on an ordinary question. */
21181
21238
  kind: external_exports.enum(QUESTION_REQUEST_KINDS).optional(),
21182
- /** What the request is about: the app to connect for `connect_app`, the vendor for `connect_account`, the agent's handle for `spend`. */
21239
+ /** What the request is about: the app to connect for `connect_app`, the vendor for `connect_account`, the agent's handle for `spend`, the rule that asks for `start`. */
21183
21240
  subject: external_exports.string().trim().min(1).max(200).optional()
21184
21241
  }).superRefine((value, context) => {
21185
21242
  if (new Set(value.options.map((option) => option.id)).size !== value.options.length) {
@@ -22098,6 +22155,16 @@ var allowedLlms = {
22098
22155
  "glm-5.3",
22099
22156
  "glm-5.3-flash",
22100
22157
  "grok-4.6",
22158
+ "gpt-6-astra",
22159
+ "gpt-6.1-sol",
22160
+ "gpt-6-sol",
22161
+ "gpt-6-luna",
22162
+ "gpt-5.6-sol",
22163
+ "gpt-5.6-terra",
22164
+ "claude-opus-5-5",
22165
+ "claude-opus-5",
22166
+ "claude-fable-5-1",
22167
+ "claude-sonnet-5",
22101
22168
  "deepseek-v4-flash"
22102
22169
  ],
22103
22170
  kimi_code: [
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  skillRefSchema,
17
17
  splitMcpServers,
18
18
  supersededBy
19
- } from "./chunk-MLIZJSMO.js";
19
+ } from "./chunk-5QRKU3BR.js";
20
20
 
21
21
  // src/index.ts
22
22
  import { existsSync as existsSync7, readFileSync as readFileSync10, writeFileSync as writeFileSync6 } from "fs";
@@ -60,11 +60,11 @@ function apiToken() {
60
60
  return process.env.SKY_API_TOKEN ?? loadConfig().token;
61
61
  }
62
62
  function currentUniverse() {
63
- return process.env.SKY_UNIVERSE ?? loadConfig().currentUniverse;
63
+ return process.env.SKY_WORKSPACE ?? process.env.SKY_UNIVERSE ?? loadConfig().currentUniverse;
64
64
  }
65
65
 
66
66
  // src/version.ts
67
- var CLI_VERSION = "2.9.2";
67
+ var CLI_VERSION = "2.10.0";
68
68
  var USER_AGENT = `sky-cli/${CLI_VERSION} (${process.platform}; node/${process.versions.node})`;
69
69
 
70
70
  // src/api.ts
@@ -185,7 +185,7 @@ async function resolveSessionRef(ref) {
185
185
  return agent2.defaultSessionId;
186
186
  }
187
187
  async function* streamEvents(sessionId, signal) {
188
- const { parseSseStream } = await import("./src-QYXD7WXR.js");
188
+ const { parseSseStream } = await import("./src-RYECJN5I.js");
189
189
  const res = await fetch(
190
190
  `${apiBase()}/sessions/${encodeURIComponent(sessionId)}/stream`,
191
191
  {
@@ -939,7 +939,7 @@ function listClaudeCodeSessions(limit) {
939
939
  } catch {
940
940
  continue;
941
941
  }
942
- const workspace = decodeWorkspace(encoded);
942
+ const workspace2 = decodeWorkspace(encoded);
943
943
  for (const entry2 of entries) {
944
944
  if (!entry2.endsWith(".jsonl")) continue;
945
945
  const sessionId = entry2.slice(0, -6);
@@ -967,7 +967,7 @@ function listClaudeCodeSessions(limit) {
967
967
  sessions.push({
968
968
  harness: "claude_code",
969
969
  sessionId,
970
- workspace,
970
+ workspace: workspace2,
971
971
  title: sniffTitle(mainFile),
972
972
  mtimeMs: stat.mtimeMs,
973
973
  files: [mainFile, ...subagentFiles],
@@ -1045,6 +1045,13 @@ function agentUseBase() {
1045
1045
  if (derived.includes("localhost:3000")) return derived.replace("localhost:3000", "localhost:3002");
1046
1046
  return derived;
1047
1047
  }
1048
+ function currentSessionEnv() {
1049
+ const claudeId = process.env.CLAUDE_CODE_SESSION_ID;
1050
+ if (claudeId) return { harness: "claude_code", sessionId: claudeId };
1051
+ const codexId = process.env.CODEX_THREAD_ID;
1052
+ if (codexId) return { harness: "codex", sessionId: codexId };
1053
+ return void 0;
1054
+ }
1048
1055
  async function mintTrace(base, harness) {
1049
1056
  const token = apiToken();
1050
1057
  if (!token) throw new ApiError(401, "not_logged_in", "not logged in \u2014 run `sky auth login`");
@@ -1067,7 +1074,27 @@ async function mintTrace(base, harness) {
1067
1074
  }
1068
1075
  return await res.json();
1069
1076
  }
1070
- function prepareImport(session2) {
1077
+ function loadSummaryFile(summaryPath) {
1078
+ let raw;
1079
+ try {
1080
+ raw = readFileSync5(summaryPath, "utf8");
1081
+ } catch {
1082
+ throw new Error(`Cannot read summary file: ${summaryPath}`);
1083
+ }
1084
+ let pkg;
1085
+ try {
1086
+ pkg = JSON.parse(raw);
1087
+ } catch {
1088
+ throw new Error("Summary file is not valid JSON.");
1089
+ }
1090
+ if (!pkg || typeof pkg !== "object" || Array.isArray(pkg)) throw new Error("Summary file must be a JSON object.");
1091
+ const p = pkg;
1092
+ if (p.format !== "asteroids.session-summary") throw new Error('Summary file must have format "asteroids.session-summary".');
1093
+ if (p.format_version !== 1) throw new Error("Summary file must have format_version 1.");
1094
+ const redacted = redactLine2(raw.trimEnd());
1095
+ return redacted;
1096
+ }
1097
+ function prepareImport(session2, summaryPath) {
1071
1098
  if (session2.discoveryError) throw new Error(session2.discoveryError);
1072
1099
  const maximum = 16 * 1024 * 1024;
1073
1100
  let inputBytes = 0;
@@ -1075,19 +1102,40 @@ function prepareImport(session2) {
1075
1102
  const lines = [];
1076
1103
  const digest = createHash("sha256");
1077
1104
  let nativeId;
1105
+ let redactionCount = 0;
1106
+ let encryptedReasoningCount = 0;
1107
+ let compactionCount = 0;
1108
+ let unreadableCount = 0;
1078
1109
  for (const path of session2.files) {
1079
1110
  const stat = statSync(path);
1080
1111
  if (!stat.isFile() || (inputBytes += stat.size) > maximum) throw new Error("Selected transcript exceeds the 16 MiB limit or is not a regular file.");
1081
1112
  const text = readFileSync5(path, "utf8");
1082
1113
  for (const raw of text.split("\n")) {
1083
1114
  if (!raw.trim()) continue;
1084
- const record = JSON.parse(raw);
1115
+ let record;
1116
+ try {
1117
+ record = JSON.parse(raw);
1118
+ } catch {
1119
+ unreadableCount++;
1120
+ continue;
1121
+ }
1085
1122
  if (!record || typeof record !== "object" || Array.isArray(record)) throw new Error("Transcript records must be JSON objects.");
1086
- if (String(record.type).startsWith("import.")) throw new Error("Native transcripts cannot supply import protocol records.");
1087
- const id = record.type === "session_meta" ? record.payload?.id : record.sessionId;
1123
+ const rec = record;
1124
+ if (String(rec.type).startsWith("import.")) throw new Error("Native transcripts cannot supply import protocol records.");
1125
+ if (rec.type === "response_item") {
1126
+ const payload = rec.payload;
1127
+ if (payload?.type === "reasoning" && typeof payload?.encrypted_content === "string" && payload.encrypted_content) {
1128
+ encryptedReasoningCount++;
1129
+ }
1130
+ }
1131
+ if (rec.type === "compacted") {
1132
+ compactionCount++;
1133
+ }
1134
+ const id = rec.type === "session_meta" ? rec.payload?.id : rec.sessionId;
1088
1135
  if (!nativeId && typeof id === "string") nativeId = id;
1089
- const clean = redactLine(raw.replace(/\r$/, ""), { requireStructured: true }).line;
1090
- const line = clean + "\n";
1136
+ const result = redactLine(raw.replace(/\r$/, ""), { requireStructured: true });
1137
+ if (Object.keys(result.hits).length > 0) redactionCount++;
1138
+ const line = result.line + "\n";
1091
1139
  outputBytes += Buffer.byteLength(line);
1092
1140
  if (outputBytes > maximum) throw new Error("Redacted transcript exceeds the 16 MiB limit.");
1093
1141
  digest.update(line);
@@ -1097,27 +1145,38 @@ function prepareImport(session2) {
1097
1145
  if (!lines.length) throw new Error("The selected transcript is empty.");
1098
1146
  const sourceId = nativeId ?? session2.sessionId;
1099
1147
  if (!/^[A-Za-z0-9_-]{1,200}$/.test(sourceId) || redactLine2(JSON.stringify(sourceId)) !== JSON.stringify(sourceId)) throw new Error("The source conversation has an invalid identifier.");
1100
- const summary = {
1101
- format: "asteroids.session-summary",
1102
- format_version: 1,
1103
- source_harness: session2.harness,
1104
- source_harness_version: null,
1105
- source_session_id: sourceId,
1106
- created_at: (/* @__PURE__ */ new Date()).toISOString(),
1107
- summary: "The complete selected local conversation is attached as a transcript. Review it before continuing; this automatic handoff does not infer the user's unfinished objective or claim any work is complete.",
1108
- context: {
1109
- objective: "Review the imported conversation and continue its latest unfinished authorized objective.",
1110
- constraints: [],
1111
- decisions: [],
1112
- completed: [],
1113
- pending: ["Read the complete imported transcript, reconcile the latest human instructions and completed work, then continue."],
1114
- verification: [],
1115
- blockers: ["This handoff contains the recorded conversation only. Referenced local files, runtime state, and unreadable reasoning are not transferred."],
1116
- artifacts: [],
1117
- provenance: { native_checkpoint_sha256: digest.digest("hex"), selected_native_session_id: sourceId, context_bytes: outputBytes }
1118
- }
1119
- };
1120
- return lines.join("") + JSON.stringify({ type: "import.summary", package: summary }) + "\n" + JSON.stringify({ type: "import.end", records: lines.length + 1 }) + "\n";
1148
+ let summaryJson;
1149
+ if (summaryPath) {
1150
+ summaryJson = loadSummaryFile(summaryPath);
1151
+ } else {
1152
+ const summary = {
1153
+ format: "asteroids.session-summary",
1154
+ format_version: 1,
1155
+ source_harness: session2.harness,
1156
+ source_harness_version: null,
1157
+ source_session_id: sourceId,
1158
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
1159
+ summary: "The complete selected local conversation is attached as a transcript. Review it before continuing; this automatic handoff does not infer the user's unfinished objective or claim any work is complete.",
1160
+ context: {
1161
+ objective: "Review the imported conversation and continue its latest unfinished authorized objective.",
1162
+ constraints: [],
1163
+ decisions: [],
1164
+ completed: [],
1165
+ pending: ["Read the complete imported transcript, reconcile the latest human instructions and completed work, then continue."],
1166
+ verification: [],
1167
+ blockers: ["This handoff contains the recorded conversation only. Referenced local files, runtime state, and unreadable reasoning are not transferred."],
1168
+ artifacts: [],
1169
+ provenance: { native_checkpoint_sha256: digest.digest("hex"), selected_native_session_id: sourceId, context_bytes: outputBytes }
1170
+ }
1171
+ };
1172
+ summaryJson = JSON.stringify(summary);
1173
+ }
1174
+ const body = lines.join("") + JSON.stringify({ type: "import.summary", package: JSON.parse(summaryJson) }) + "\n" + JSON.stringify({ type: "import.end", records: lines.length + 1 }) + "\n";
1175
+ const gaps = [];
1176
+ if (encryptedReasoningCount > 0) gaps.push({ kind: "encrypted_reasoning", count: encryptedReasoningCount });
1177
+ if (compactionCount > 0) gaps.push({ kind: "compaction", count: compactionCount });
1178
+ if (unreadableCount > 0) gaps.push({ kind: "unreadable", count: unreadableCount });
1179
+ return { body, transcriptLines: lines.length, outputBytes, redactionCount, gaps };
1121
1180
  }
1122
1181
  async function importSession(opts) {
1123
1182
  const base = (opts.agentUseUrl ?? agentUseBase()).replace(/\/$/, "");
@@ -1126,9 +1185,16 @@ async function importSession(opts) {
1126
1185
  throw new Error("Import requires HTTPS, or a loopback development server.");
1127
1186
  }
1128
1187
  opts.onProgress?.("Reading transcript and redacting secrets locally\u2026");
1129
- const body = prepareImport(opts.session);
1130
- opts.onProgress?.("Minting import key\u2026");
1131
- const { traceId, key } = await mintTrace(base, opts.session.harness);
1188
+ const { body, transcriptLines, outputBytes, redactionCount, gaps } = prepareImport(opts.session, opts.summaryPath);
1189
+ let traceId;
1190
+ let key;
1191
+ if (opts.importKey && opts.grantTraceId) {
1192
+ traceId = opts.grantTraceId;
1193
+ key = opts.importKey;
1194
+ } else {
1195
+ opts.onProgress?.("Minting import key\u2026");
1196
+ ({ traceId, key } = await mintTrace(base, opts.session.harness));
1197
+ }
1132
1198
  opts.onProgress?.("Uploading the complete transcript\u2026");
1133
1199
  const response = await fetch(`${base}/api/traces/ingest`, {
1134
1200
  method: "POST",
@@ -1142,7 +1208,17 @@ async function importSession(opts) {
1142
1208
  throw new Error(typeof result2?.error === "string" ? result2.error : result2?.error?.message ?? `Upload failed (${response.status}).`);
1143
1209
  }
1144
1210
  const result = await response.json();
1145
- return { traceId: result.traceId ?? traceId, url: `${base}/playground/new?import=${encodeURIComponent(result.traceId ?? traceId)}` };
1211
+ const finalTraceId = result.traceId ?? traceId;
1212
+ return {
1213
+ traceId: finalTraceId,
1214
+ url: `${base}/playground/new?import=${encodeURIComponent(finalTraceId)}`,
1215
+ harness: opts.session.harness,
1216
+ sessionId: opts.session.sessionId,
1217
+ transcriptFiles: opts.session.files.length,
1218
+ bytes: outputBytes,
1219
+ redactionCount,
1220
+ gaps
1221
+ };
1146
1222
  }
1147
1223
 
1148
1224
  // src/login.ts
@@ -1420,12 +1496,13 @@ function renderCatalog(agents, generatedAt) {
1420
1496
  }
1421
1497
 
1422
1498
  // src/skill.ts
1499
+ var REFERENCES_DIR = "references";
1423
1500
  var SKILL_NAME = "agentsky";
1424
1501
  var SKILL_MARKER = ".agentsky.json";
1425
1502
  function skillDocument() {
1426
1503
  return `---
1427
1504
  name: ${SKILL_NAME}
1428
- description: "Hire cloud agents from the AgentSky catalog (included as ${CATALOG_FILE}) and coordinate them on one task. Use when the person names an agent by @handle, asks to have another agent (or another engine such as Codex, Claude Code, Gemini or Hermes) do, test or review part of the work, wants work to keep running in the cloud, or the work splits into independent parts that can run at the same time. Works through the agentsky MCP server, or the sky command where those tools are missing."
1505
+ description: "Hire cloud agents from the AgentSky catalog (included as ${CATALOG_FILE}) and coordinate them on one task. Use when: the person names an agent by @handle or wants to orchestrate agents; asks another engine (Codex, Claude Code, Gemini, Hermes) to do, test or review part of the work; wants to import, move or continue this conversation in AgentSky or the cloud; names a workspace; or the work splits into independent parts that can run at the same time. Works through the agentsky MCP server, or the sky command where those tools are missing."
1429
1506
  ---
1430
1507
 
1431
1508
  # Working with other agents through AgentSky
@@ -1440,6 +1517,14 @@ Everything below is a tool of the \`agentsky\` MCP server. If those tools are
1440
1517
  missing in this session, use the \`sky\` commands under "Without the MCP tools"
1441
1518
  at the end; they do the same things, one agent at a time.
1442
1519
 
1520
+ ## Workspace
1521
+
1522
+ Use the workspace the person named. If they named none, check the git root for
1523
+ \`.agentsky.json\` \u2014 if it has a \`"workspace"\` key, use that. Otherwise use the
1524
+ account default (personal). Never ask. Pass the chosen slug as \`workspace\` on
1525
+ every MCP tool that accepts it, or as \`--workspace <slug>\` on sky commands.
1526
+ Details: \`${REFERENCES_DIR}/workspaces.md\` in this skill's folder.
1527
+
1443
1528
  ## When to hire
1444
1529
 
1445
1530
  - When the person names an agent (\`@handle\`) or an engine, or asks another agent
@@ -1450,9 +1535,6 @@ at the end; they do the same things, one agent at a time.
1450
1535
  going after this conversation ends.
1451
1536
  - Do the work yourself when it is small, when it depends on what you already have
1452
1537
  in front of you, or when explaining it would take as long as doing it.
1453
- - Every hire spends the person's AgentSky balance. Say what you are about to hire
1454
- and roughly what it may cost before the first one, unless they already asked
1455
- for it.
1456
1538
 
1457
1539
  ## How to pick
1458
1540
 
@@ -1520,6 +1602,24 @@ it, and name its path in the brief.
1520
1602
  6. Tell the person what was done, which agent did which part, and what it cost
1521
1603
  (\`get_task\` reports the task's cost).
1522
1604
 
1605
+ ## Import this conversation to AgentSky
1606
+
1607
+ When the person asks to import, move, or continue this conversation in AgentSky
1608
+ or the cloud:
1609
+
1610
+ 1. Write a summary JSON file following the schema in \`${REFERENCES_DIR}/import.md\`
1611
+ (the only step that needs judgment \u2014 capture the objective, key decisions,
1612
+ completed work, and next steps).
1613
+ 2. Run:
1614
+ \`\`\`
1615
+ npx -y @agentsky/sky import --current --summary <path-to-summary.json> --yes --json
1616
+ \`\`\`
1617
+ Add \`--workspace <slug>\` when a workspace was chosen. Do NOT confirm or ask
1618
+ before running; the \`--yes --json\` flags suppress prompts.
1619
+ 3. Report the \`continueUrl\` from the JSON result. That is all.
1620
+
1621
+ Only stop (non-zero exit) on a size limit, dropped content, or redaction failure.
1622
+
1523
1623
  ## Without the MCP tools
1524
1624
 
1525
1625
  Run \`sky auth whoami\`. If it says you are not logged in, ask the person to run
@@ -1539,6 +1639,88 @@ Run \`sky auth whoami\`. If it says you are not logged in, ask the person to run
1539
1639
  read again.
1540
1640
  `;
1541
1641
  }
1642
+ function importReferenceDoc() {
1643
+ return `# Import this conversation to AgentSky
1644
+
1645
+ ## Summary schema (asteroids.session-summary v1)
1646
+
1647
+ Write a JSON file with these fields:
1648
+
1649
+ \`\`\`json
1650
+ {
1651
+ "format": "asteroids.session-summary",
1652
+ "format_version": 1,
1653
+ "source_harness": "claude_code",
1654
+ "source_harness_version": null,
1655
+ "source_session_id": "<the session id, e.g. from CLAUDE_CODE_SESSION_ID>",
1656
+ "created_at": "<ISO 8601 timestamp>",
1657
+ "summary": "<one paragraph: what this conversation accomplished>",
1658
+ "context": {
1659
+ "objective": "<what the person ultimately wants>",
1660
+ "constraints": ["<must not do X>"],
1661
+ "decisions": ["<decided to use Y approach>"],
1662
+ "completed": ["<finished task A>"],
1663
+ "pending": ["<next: do B>"],
1664
+ "verification": ["<how to confirm B is correct>"],
1665
+ "blockers": ["<needs access to X>"],
1666
+ "artifacts": [{"path": "path/to/file.ts", "description": "what it is"}]
1667
+ }
1668
+ }
1669
+ \`\`\`
1670
+
1671
+ Only \`summary\` and \`context\` require judgment. All other fields are fixed values
1672
+ or can be omitted (the CLI validates \`format\` and \`format_version\`).
1673
+
1674
+ ## Gaps
1675
+
1676
+ The import transfers the recorded conversation only. These are NOT transferred:
1677
+ - Local files not included in the transcript
1678
+ - Runtime state (variables, shell state, running processes)
1679
+ - Unrecorded tool outputs or reasoning
1680
+ - Login credentials and secrets
1681
+
1682
+ List known gaps in \`context.blockers\`.
1683
+
1684
+ ## Non-Claude/Codex harnesses
1685
+
1686
+ For harnesses that do not set \`CLAUDE_CODE_SESSION_ID\` or \`CODEX_THREAD_ID\`:
1687
+ use \`--session <id>\` instead of \`--current\`, and set \`source_harness\` to the
1688
+ harness name (e.g. \`"hermes"\`, \`"openclaw"\`).
1689
+ `;
1690
+ }
1691
+ function workspacesReferenceDoc() {
1692
+ return `# Workspaces in AgentSky
1693
+
1694
+ A workspace (also called a universe) groups agents and sessions. Every API call
1695
+ and MCP tool accepts an optional workspace slug.
1696
+
1697
+ ## How to choose
1698
+
1699
+ 1. The person named one \u2192 use it.
1700
+ 2. Check the git root for \`.agentsky.json\` with a \`"workspace"\` key \u2192 use that.
1701
+ 3. Neither \u2192 use the account default (personal workspace). Never ask.
1702
+
1703
+ ## Applying it
1704
+
1705
+ - MCP tools: pass \`workspace: "<slug>"\` on tools that accept it.
1706
+ - sky CLI: \`--workspace <slug>\` on any command, or set \`SKY_WORKSPACE=<slug>\`.
1707
+ - Tools that take a \`task_id\` or \`session_id\` inherit that task's workspace
1708
+ automatically; one task never spans workspaces.
1709
+
1710
+ ## Listing workspaces
1711
+
1712
+ \`sky workspace list\` (or \`sky universe list\`) prints your workspaces, with
1713
+ \`*\` marking the current default.
1714
+
1715
+ ## .agentsky.json
1716
+
1717
+ To set a per-repo default, create \`.agentsky.json\` at the git root:
1718
+
1719
+ \`\`\`json
1720
+ {"workspace": "my-team-slug"}
1721
+ \`\`\`
1722
+ `;
1723
+ }
1542
1724
  function installedVersion(dir) {
1543
1725
  try {
1544
1726
  const marker = JSON.parse(readFileSync6(join5(dir, SKILL_MARKER), "utf8"));
@@ -1565,6 +1747,10 @@ function installSkill(agent2, opts = {}) {
1565
1747
  mkdirSync2(dir, { recursive: true });
1566
1748
  writeFileSync4(join5(dir, CATALOG_FILE), renderCatalog(opts.catalog, opts.now ?? /* @__PURE__ */ new Date()));
1567
1749
  }
1750
+ const refsDir = join5(dir, REFERENCES_DIR);
1751
+ mkdirSync2(refsDir, { recursive: true });
1752
+ writeFileSync4(join5(refsDir, "import.md"), importReferenceDoc());
1753
+ writeFileSync4(join5(refsDir, "workspaces.md"), workspacesReferenceDoc());
1568
1754
  return { agent: agent2.id, path: dir, outcome };
1569
1755
  }
1570
1756
 
@@ -2416,7 +2602,11 @@ function printModelBilling(session2) {
2416
2602
  console.log(`Model billing: ${label} \u2014 $0 model usage`);
2417
2603
  }
2418
2604
  var program = new Command();
2419
- program.name("sky").description("Launch and talk to long-lived agents \u2014 agentsky.dev").version(CLI_VERSION);
2605
+ program.name("sky").description("Launch and talk to long-lived agents \u2014 agentsky.dev").version(CLI_VERSION).option("--workspace <slug>", "workspace to act in (overrides sky universe switch and SKY_UNIVERSE; alias of --universe on sub-commands)");
2606
+ program.hook("preAction", () => {
2607
+ const workspace2 = program.opts().workspace;
2608
+ if (workspace2) process.env.SKY_WORKSPACE = workspace2;
2609
+ });
2420
2610
  function fail(error) {
2421
2611
  if (error instanceof ApiError) console.error(`sky: ${error.message} (${error.code})`);
2422
2612
  else console.error(`sky: ${error instanceof Error ? error.message : String(error)}`);
@@ -2518,8 +2708,19 @@ universe.command("remove <member>").description("remove a member (user id or ema
2518
2708
  );
2519
2709
  universe.command("join <token>").description("accept an invitation sent to your verified email").action(
2520
2710
  run(async (token) => {
2521
- const workspace = await joinWorkspace(token);
2522
- console.log(`Joined ${workspace.slug} (${workspace.name}) \u2014 sky universe switch ${workspace.slug}`);
2711
+ const workspace2 = await joinWorkspace(token);
2712
+ console.log(`Joined ${workspace2.slug} (${workspace2.name}) \u2014 sky universe switch ${workspace2.slug}`);
2713
+ })
2714
+ );
2715
+ var workspace = program.command("workspace").description("alias of universe: grouping boundary for agents");
2716
+ workspace.command("list").action(
2717
+ run(async () => {
2718
+ const { universes } = await api("GET", "/universes");
2719
+ const current = currentUniverse();
2720
+ for (const u of universes) {
2721
+ const marker = u.slug === current || !current && u.isPersonal ? "*" : " ";
2722
+ console.log(`${marker} ${u.slug}${u.isPersonal ? " (personal)" : ""}`);
2723
+ }
2523
2724
  })
2524
2725
  );
2525
2726
  var policy = program.command("policy").description("policy rules: tool calls, spend caps, call counts, capabilities");
@@ -3081,30 +3282,54 @@ function formatRelative(msAgo) {
3081
3282
  if (hours < 48) return `${hours}h ago`;
3082
3283
  return `${Math.round(hours / 24)}d ago`;
3083
3284
  }
3084
- program.command("import").description("import a local Claude Code or Codex session to AgentSky and continue it in the cloud").option("--all", "import all found sessions up to --limit").option("-y, --yes", "confirm transfer of the selected conversations without prompting").option("--limit <n>", "maximum sessions to list or import", "10").option("--session <id>", "import one specific session by its ID").option("--harness <type>", "claude_code | codex | all (default: all)").option("--url <base>", "agent-use app URL (default: derived from SKY_API_URL or AGENT_USE_URL)").action(
3285
+ program.command("import").description("import a local Claude Code or Codex session to AgentSky and continue it in the cloud").option("--current", "import the session this agent is running in (reads CLAUDE_CODE_SESSION_ID or CODEX_THREAD_ID, then falls back to most recent session in the cwd)").option("--all", "import all found sessions up to --limit").option("-y, --yes", "confirm transfer without prompting (default when --current or --session is given in non-TTY)").option("--json", "print one JSON result object per import and nothing else to stdout").option("--limit <n>", "maximum sessions to list or import", "10").option("--session <id>", "import one specific session by its ID").option("--harness <type>", "claude_code | codex | all (default: all)").option("--summary <path>", "attach a pre-written summary JSON (asteroids.session-summary v1) instead of the auto-generated one").option("--key <importKey>", "import grant key minted by the web page (skips sky auth login)").option("--trace <traceId>", "trace id paired with --key").option("--url <base>", "agent-use app URL (default: derived from SKY_API_URL or AGENT_USE_URL)").action(
3085
3286
  run(
3086
3287
  async (opts) => {
3288
+ if (opts.key && !opts.trace) throw new Error("--key requires --trace <traceId>");
3289
+ if (opts.trace && !opts.key) throw new Error("--trace requires --key <importKey>");
3087
3290
  const limit = Math.max(1, Math.min(50, parseInt(opts.limit ?? "10", 10) || 10));
3088
3291
  if (opts.harness && !["claude_code", "codex", "all"].includes(opts.harness)) throw new Error("Use --harness claude_code, codex, or all.");
3089
3292
  const harness = opts.harness ?? "all";
3090
3293
  const base = opts.url ?? agentUseBase();
3091
- const candidates = opts.session ? listRecentSessions(harness === "all" ? void 0 : harness, Number.POSITIVE_INFINITY).filter(
3092
- (s) => s.sessionId === opts.session
3093
- ) : listRecentSessions(harness === "all" ? void 0 : harness, limit);
3094
- if (candidates.length === 0) {
3095
- if (opts.session) {
3096
- throw new Error(`Session "${opts.session}" not found in ~/.claude or ~/.codex.`);
3294
+ const nonInteractive = !process.stdin.isTTY;
3295
+ const autoConfirm = opts.yes || opts.current || !!opts.session && nonInteractive;
3296
+ let candidates;
3297
+ if (opts.current) {
3298
+ const env = currentSessionEnv();
3299
+ if (env) {
3300
+ candidates = listRecentSessions(env.harness, Number.POSITIVE_INFINITY).filter(
3301
+ (s) => s.sessionId === env.sessionId
3302
+ );
3303
+ if (candidates.length === 0) {
3304
+ const cwd = process.cwd();
3305
+ const all = listRecentSessions(env.harness, 50);
3306
+ const byCwd = all.filter((s) => s.workspace === cwd || s.workspace.startsWith(cwd + "/"));
3307
+ candidates = byCwd.length > 0 ? [byCwd[0]] : all.length > 0 ? [all[0]] : [];
3308
+ }
3309
+ } else {
3310
+ const cwd = process.cwd();
3311
+ const all = listRecentSessions(harness === "all" ? void 0 : harness, 50);
3312
+ const byCwd = all.filter((s) => s.workspace === cwd || s.workspace.startsWith(cwd + "/"));
3313
+ candidates = byCwd.length > 0 ? [byCwd[0]] : all.length > 0 ? [all[0]] : [];
3097
3314
  }
3098
- console.log(
3099
- "No recent sessions found. Make sure you have run Claude Code (sessions in ~/.claude) or Codex (sessions in ~/.codex)."
3315
+ if (candidates.length === 0) throw new Error("No local session found for the current environment. Run with --session <id> or start an agent session first.");
3316
+ } else if (opts.session) {
3317
+ candidates = listRecentSessions(harness === "all" ? void 0 : harness, Number.POSITIVE_INFINITY).filter(
3318
+ (s) => s.sessionId === opts.session
3100
3319
  );
3101
- return;
3320
+ if (candidates.length === 0) throw new Error(`Session "${opts.session}" not found in ~/.claude or ~/.codex.`);
3321
+ } else {
3322
+ candidates = listRecentSessions(harness === "all" ? void 0 : harness, limit);
3323
+ if (candidates.length === 0) {
3324
+ console.log("No recent sessions found. Make sure you have run Claude Code (sessions in ~/.claude) or Codex (sessions in ~/.codex).");
3325
+ return;
3326
+ }
3102
3327
  }
3103
3328
  let toImport;
3104
- if (opts.all || opts.session || candidates.length === 1) {
3329
+ if (opts.current || opts.all || opts.session || candidates.length === 1) {
3105
3330
  toImport = candidates;
3106
3331
  } else {
3107
- if (!process.stdin.isTTY) throw new Error("Use --session or --all to select conversations in a non-interactive terminal.");
3332
+ if (nonInteractive) throw new Error("Use --session, --current, or --all to select conversations in a non-interactive terminal.");
3108
3333
  console.log("\nRecent local sessions:\n");
3109
3334
  candidates.forEach((s, i) => {
3110
3335
  const label = s.title ? `"${s.title.slice(0, 70)}"` : "(no title)";
@@ -3137,10 +3362,12 @@ program.command("import").description("import a local Claude Code or Codex sessi
3137
3362
  }
3138
3363
  }
3139
3364
  toImport = [...new Map(toImport.map((session2) => [`${session2.harness}:${session2.sessionId}`, session2])).values()];
3140
- console.log(`Selected ${toImport.length} conversation(s), ${toImport.reduce((count, session2) => count + session2.files.length, 0)} transcript file(s). Destination: ${base}`);
3141
- console.log("The recorded conversation is redacted locally. Local project files and login credentials are not transferred.");
3142
- if (!opts.yes) {
3143
- if (!process.stdin.isTTY) throw new Error("Use --yes to confirm this transfer in a non-interactive terminal.");
3365
+ if (!opts.json) {
3366
+ console.log(`Selected ${toImport.length} conversation(s), ${toImport.reduce((count, session2) => count + session2.files.length, 0)} transcript file(s). Destination: ${base}`);
3367
+ console.log("The recorded conversation is redacted locally. Local project files and login credentials are not transferred.");
3368
+ }
3369
+ if (!autoConfirm) {
3370
+ if (nonInteractive) throw new Error("Use --yes to confirm this transfer in a non-interactive terminal.");
3144
3371
  const prompt = createInterface4({ input: process.stdin, output: process.stdout });
3145
3372
  const answer = await new Promise((resolve5) => prompt.question("Upload these selected conversations? [y/N] ", (value) => {
3146
3373
  prompt.close();
@@ -3153,18 +3380,36 @@ program.command("import").description("import a local Claude Code or Codex sessi
3153
3380
  }
3154
3381
  for (const session2 of toImport) {
3155
3382
  const label = session2.title ? `"${session2.title.slice(0, 60)}"` : session2.sessionId;
3156
- process.stdout.write(`
3383
+ if (!opts.json) process.stdout.write(`
3157
3384
  Importing ${label} \u2026
3158
3385
  `);
3159
3386
  const result = await importSession({
3160
3387
  session: session2,
3161
3388
  agentUseUrl: base,
3162
- onProgress: (msg) => process.stdout.write(` ${msg}
3389
+ summaryPath: opts.summary,
3390
+ importKey: opts.key,
3391
+ grantTraceId: opts.trace,
3392
+ onProgress: opts.json ? void 0 : (msg) => process.stdout.write(` ${msg}
3163
3393
  `)
3164
3394
  });
3165
- console.log(` \u2713 Imported. Continue here:
3395
+ if (opts.json) {
3396
+ console.log(JSON.stringify({
3397
+ traceId: result.traceId,
3398
+ url: result.url,
3399
+ workspace: currentUniverse() ?? null,
3400
+ harness: result.harness,
3401
+ sessionId: result.sessionId,
3402
+ transcriptFiles: result.transcriptFiles,
3403
+ bytes: result.bytes,
3404
+ redactionCount: result.redactionCount,
3405
+ gaps: result.gaps,
3406
+ continueUrl: result.url
3407
+ }));
3408
+ } else {
3409
+ console.log(` \u2713 Imported. Continue here:
3166
3410
  ${result.url}
3167
3411
  `);
3412
+ }
3168
3413
  }
3169
3414
  }
3170
3415
  )
@@ -463,6 +463,10 @@ declare const runEventsSchema: z.ZodObject<{
463
463
  title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
464
464
  context: z.ZodOptional<z.ZodNullable<z.ZodString>>;
465
465
  }, z.core.$strict>], "type">>;
466
+ interaction_mode: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
467
+ plan: "plan";
468
+ build: "build";
469
+ }>>>;
466
470
  }, z.core.$strict>, z.ZodObject<{
467
471
  type: z.ZodLiteral<"system.message">;
468
472
  content: z.ZodArray<z.ZodObject<{
package/dist/products.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  skillsArraySchema,
9
9
  systemMessageEventSchema,
10
10
  userMessageEventSchema
11
- } from "./chunk-MLIZJSMO.js";
11
+ } from "./chunk-5QRKU3BR.js";
12
12
 
13
13
  // ../../packages/spec/src/compatibility.ts
14
14
  var capabilityInputsSchema = capabilitiesSchema;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  external_exports,
3
3
  messagePartSchema
4
- } from "./chunk-MLIZJSMO.js";
4
+ } from "./chunk-5QRKU3BR.js";
5
5
 
6
6
  // ../../packages/chat/src/stream.ts
7
7
  async function* parseSseStream(body) {
@@ -151,6 +151,26 @@ async function sendPodMessage(baseUrl, body, options = {}) {
151
151
  if (options.idempotencyKey) headers["idempotency-key"] = options.idempotencyKey;
152
152
  let res;
153
153
  try {
154
+ const user = body.events?.find((event) => event.type === "user.message");
155
+ const mode = user?.type === "user.message" ? user.interaction_mode : body.interaction_mode;
156
+ if (mode) {
157
+ const health = await getPodHealth(baseUrl, options);
158
+ if (!health.ok) return { kind: "undelivered", reason: "unreachable", status: health.status, detail: "Planning protocol could not be observed before delivery" };
159
+ if (!health.interactionModes?.includes(mode)) {
160
+ const events = body.events?.map((event) => {
161
+ if (event.type !== "user.message") return event;
162
+ const { interaction_mode: _mode, ...legacy } = event;
163
+ return legacy;
164
+ }) ?? [];
165
+ const context = mode === "plan" ? "Interaction mode: plan. Investigate and return a reviewable plan. Do not implement, edit files, run mutating commands or cause external side effects. Wait for an explicit implementation choice." : "Interaction mode: build. Respond to the current request normally; the previous planning-only restriction no longer applies. Preserve all applicable permissions and approvals.";
166
+ const previous = events.find((event) => event.type === "system.message");
167
+ const content = [...previous?.type === "system.message" ? previous.content : [], { type: "text", text: context }];
168
+ const system = { type: "system.message", content: [{ type: "text", text: content.map((block) => block.text).join("\n\n") }] };
169
+ const forwarded = [...events.filter((event) => event.type !== "system.message"), system];
170
+ const { interaction_mode: _legacyMode, ...compatible } = body;
171
+ body = body.events ? { ...compatible, events: forwarded, parts: legacyPartsOf({ events: forwarded }) } : { ...compatible, parts: [...body.parts, { type: "text", index: body.parts.length, text: context }] };
172
+ }
173
+ }
154
174
  res = await fetch(`${baseUrl}/messages`, {
155
175
  method: "POST",
156
176
  headers,
@@ -175,7 +195,8 @@ async function getPodHealth(baseUrl, options = {}) {
175
195
  ok: res.ok,
176
196
  status: res.status,
177
197
  state: typeof body.state === "string" ? body.state : void 0,
178
- openMessageId: typeof open === "string" && open ? open : null
198
+ openMessageId: typeof open === "string" && open ? open : null,
199
+ interactionModes: Array.isArray(body.interaction_modes) ? body.interaction_modes.filter((mode) => mode === "plan" || mode === "build") : void 0
179
200
  };
180
201
  } catch {
181
202
  return { ok: false, openMessageId: null };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsky/sky",
3
- "version": "2.9.2",
3
+ "version": "2.10.0",
4
4
  "description": "sky — the AgentSky developer CLI: launch and talk to long-lived agents from your terminal.",
5
5
  "license": "MIT",
6
6
  "type": "module",