@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.
- package/dist/{chunk-MLIZJSMO.js → chunk-5QRKU3BR.js} +133 -66
- package/dist/index.js +308 -63
- package/dist/products.d.ts +4 -0
- package/dist/products.js +1 -1
- package/dist/{src-QYXD7WXR.js → src-RYECJN5I.js} +23 -2
- package/package.json +1 -1
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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-
|
|
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.
|
|
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-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1087
|
-
|
|
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
|
|
1090
|
-
|
|
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
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
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
|
-
|
|
1131
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
2522
|
-
console.log(`Joined ${
|
|
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
|
|
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
|
|
3092
|
-
|
|
3093
|
-
|
|
3094
|
-
if (
|
|
3095
|
-
|
|
3096
|
-
|
|
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
|
-
|
|
3099
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
)
|
package/dist/products.d.ts
CHANGED
|
@@ -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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
external_exports,
|
|
3
3
|
messagePartSchema
|
|
4
|
-
} from "./chunk-
|
|
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 };
|