subconscious-cli 6.0.1 → 6.1.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/README.md +119 -0
- package/bin/agent-data.js +242 -0
- package/bin/agent-help.js +106 -0
- package/bin/agent-install.js +354 -0
- package/bin/agent-launch.js +199 -0
- package/bin/agent-spawn.js +137 -0
- package/bin/agents.js +236 -932
- package/bin/auth.js +9 -1
- package/bin/claude-picker.js +143 -0
- package/bin/cli.js +60 -1
- package/bin/clipboard-image.js +2 -0
- package/bin/feedback.js +14 -3
- package/bin/harness-manifest.js +286 -0
- package/bin/headless-args.js +35 -0
- package/bin/launch-values.js +25 -0
- package/bin/model-capabilities.js +10 -9
- package/bin/models.js +13 -13
- package/bin/native/subc-tui-darwin-amd64 +0 -0
- package/bin/native/subc-tui-darwin-arm64 +0 -0
- package/bin/native/subc-tui-linux-amd64 +0 -0
- package/bin/native/subc-tui-linux-arm64 +0 -0
- package/bin/native/subc-tui-windows-amd64.exe +0 -0
- package/bin/native/subc-tui-windows-arm64.exe +0 -0
- package/bin/opencode-provider.js +21 -0
- package/bin/profile-settings.js +129 -0
- package/bin/profiles.js +29 -424
- package/bin/runbook/README.md +66 -23
- package/bin/runbook/claude-code/agent.json +300 -0
- package/bin/runbook/claude-code/install.sh +9 -252
- package/bin/runbook/codex/agent.json +461 -0
- package/bin/runbook/codex/hooks-lib.sh +17 -4
- package/bin/runbook/codex/install.sh +0 -4
- package/bin/runbook/codex/run.sh +16 -235
- package/bin/runbook/copilot/agent.json +185 -0
- package/bin/runbook/copilot/install.sh +45 -63
- package/bin/runbook/cursor/agent.json +137 -0
- package/bin/runbook/cursor/install.sh +8 -35
- package/bin/runbook/deepseek-harness/agent.json +163 -0
- package/bin/runbook/deepseek-harness/run.sh +20 -59
- package/bin/runbook/image-window/index.ts +14 -0
- package/bin/runbook/image-window/window.d.ts +19 -0
- package/bin/runbook/image-window/window.js +140 -0
- package/bin/runbook/lib.sh +41 -0
- package/bin/runbook/opencode/agent.json +158 -0
- package/bin/runbook/opencode/install.sh +9 -183
- package/bin/runbook/opencode/opencode-plugin.d.ts +10 -3
- package/bin/runbook/opencode/subconscious-image-window.ts +24 -0
- package/bin/runbook/pi/agent.json +216 -0
- package/bin/runbook/pi/install.sh +18 -44
- package/bin/runbook/pi/run.sh +6 -18
- package/bin/runbook/pi/subconscious-compaction.ts +3 -1
- package/bin/runbook/shared.json +58 -0
- package/bin/runbook/subconscious-code/agent.json +156 -0
- package/bin/sessions.js +52 -22
- package/bin/tui.js +13 -0
- package/bin/update-check.js +5 -1
- package/bin/upgrade.js +24 -31
- package/bin/usage.js +21 -10
- package/bin/windows/agents.js +18 -17
- package/bin/windows/common.js +2 -28
- package/bin/windows/install.js +11 -17
- package/bin/windows/launch.js +252 -231
- package/bin/windows/process.js +12 -1
- package/bin/windows/setup.js +29 -9
- package/package.json +2 -3
- package/bin/registry.generated.json +0 -406
- package/bin/runbook/claude-code/run.sh +0 -254
- package/bin/runbook/model-capabilities.generated.sh +0 -9
- package/bin/runbook/opencode/provider.sh +0 -93
- package/bin/runbook/opencode/run.sh +0 -99
- package/bin/runbook/opencode/subconscious-compaction.ts +0 -100
- package/bin/runbook/subconscious-code/run.sh +0 -21
- package/bin/windows/claude.js +0 -100
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "claude-code",
|
|
3
|
+
"command": "claude",
|
|
4
|
+
"aliases": ["claude-code", "claudecode"],
|
|
5
|
+
"name": "Claude Code",
|
|
6
|
+
"description": "Run Claude Code on your hosted Subconscious model with gateway env, context limits, and telemetry.",
|
|
7
|
+
"protocol": "anthropic",
|
|
8
|
+
"homepage": "https://docs.anthropic.com/en/docs/claude-code",
|
|
9
|
+
"install": {
|
|
10
|
+
"commands": {
|
|
11
|
+
"darwin": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
12
|
+
"linux": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
13
|
+
"win32": "powershell -ExecutionPolicy Bypass -Command \"irm https://claude.ai/install.ps1 | iex\"",
|
|
14
|
+
"fallback": "npm i -g {package}"
|
|
15
|
+
},
|
|
16
|
+
"method": "script",
|
|
17
|
+
"package": "@anthropic-ai/claude-code",
|
|
18
|
+
"version": null,
|
|
19
|
+
"channel": "installer default (unpinned)",
|
|
20
|
+
"minimum_version": "2.1.242",
|
|
21
|
+
"verified": true,
|
|
22
|
+
"note": "subc warns, and does not block, below minimum_version."
|
|
23
|
+
},
|
|
24
|
+
"runbook": {
|
|
25
|
+
"mode": "launch",
|
|
26
|
+
"setup_script": "install.sh",
|
|
27
|
+
"setup_actions": ["status", "uninstall"]
|
|
28
|
+
},
|
|
29
|
+
"help": {
|
|
30
|
+
"usage": "subc [-p NAME] claude [help|status|uninstall] [Claude arguments...]",
|
|
31
|
+
"behavior": "Launches Claude Code with the active Subconscious profile and model picker. Persistent files are leftover-only: subc claude uninstall.",
|
|
32
|
+
"options": [
|
|
33
|
+
["help", "Show this help"],
|
|
34
|
+
["status", "Inspect leftover ~/.claude/subconscious-gateway.env"],
|
|
35
|
+
["uninstall", "Remove leftover ~/.claude/subconscious-gateway.env"],
|
|
36
|
+
["--model MODEL", "Override the profile model for this launch"]
|
|
37
|
+
],
|
|
38
|
+
"args": ["-- ARGS...", "Pass remaining arguments to Claude Code"]
|
|
39
|
+
},
|
|
40
|
+
"sessions": { "key": "claude", "portable": true },
|
|
41
|
+
"prerequisites": [],
|
|
42
|
+
"launch": {
|
|
43
|
+
"argv": ["claude", "--settings", "${SUBC_CLAUDE_SETTINGS}", "{args}"],
|
|
44
|
+
"headless_argv": [
|
|
45
|
+
"claude",
|
|
46
|
+
"--settings",
|
|
47
|
+
"${SUBC_CLAUDE_SETTINGS}",
|
|
48
|
+
"{args}",
|
|
49
|
+
"-p",
|
|
50
|
+
"--",
|
|
51
|
+
"{prompt}"
|
|
52
|
+
],
|
|
53
|
+
"headless_platforms": ["darwin", "linux"],
|
|
54
|
+
"resume": ["--resume", "{sessionId}"],
|
|
55
|
+
"handoff": ["{prompt}"],
|
|
56
|
+
"persistent_setup": false
|
|
57
|
+
},
|
|
58
|
+
"inputs": [
|
|
59
|
+
{
|
|
60
|
+
"name": "GATEWAY_URL",
|
|
61
|
+
"flag": "--gateway-url",
|
|
62
|
+
"metavar": "URL"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "CLAUDE_GATEWAY_URL",
|
|
66
|
+
"label": "Claude gateway override",
|
|
67
|
+
"description": "Optional Claude-only gateway origin; blank uses GATEWAY_URL.",
|
|
68
|
+
"type": "url",
|
|
69
|
+
"comment": "Leave CLAUDE_GATEWAY_URL blank to use GATEWAY_URL above."
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "CLAUDE_CODE_API_KEY",
|
|
73
|
+
"flag": "--api-key",
|
|
74
|
+
"metavar": "KEY",
|
|
75
|
+
"label": "Claude API key",
|
|
76
|
+
"description": "Claude-specific credential override; blank uses API_KEY.",
|
|
77
|
+
"type": "secret"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "CLAUDE_CODE_SUBAGENT_MODEL",
|
|
81
|
+
"default": "{model}",
|
|
82
|
+
"unset_words": true,
|
|
83
|
+
"export": true,
|
|
84
|
+
"label": "Subagent model",
|
|
85
|
+
"description": "Model used by Claude Code subagents. UNSET follows the default model.",
|
|
86
|
+
"type": "model",
|
|
87
|
+
"comment": "CLAUDE_CODE_SUBAGENT_MODEL=UNSET follows MODEL above."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "CLAUDE_CODE_AUTO_COMPACT_WINDOW",
|
|
91
|
+
"default": 1000000,
|
|
92
|
+
"aliases": ["COMPACT_WINDOW"],
|
|
93
|
+
"export": true,
|
|
94
|
+
"flag": "--compact-window",
|
|
95
|
+
"metavar": "N",
|
|
96
|
+
"help": "Override the Claude auto-compact window",
|
|
97
|
+
"label": "Auto-compact window",
|
|
98
|
+
"description": "Claude token window before compaction (100000–1000000).",
|
|
99
|
+
"type": "integer",
|
|
100
|
+
"min": 100000,
|
|
101
|
+
"max": 1000000
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "CLAUDE_CODE_MAX_CONTEXT_TOKENS",
|
|
105
|
+
"default": 3000000,
|
|
106
|
+
"aliases": ["MAX_CONTEXT_TOKENS"],
|
|
107
|
+
"export": true,
|
|
108
|
+
"flag": "--max-context-tokens",
|
|
109
|
+
"metavar": "N",
|
|
110
|
+
"help": "Override the maximum context tokens",
|
|
111
|
+
"label": "Maximum context tokens",
|
|
112
|
+
"description": "Maximum context advertised to Claude Code.",
|
|
113
|
+
"type": "integer",
|
|
114
|
+
"min": 1
|
|
115
|
+
},
|
|
116
|
+
{ "name": "MAX_CONCURRENT_SUBAGENTS" },
|
|
117
|
+
{
|
|
118
|
+
"name": "MAX_SUBAGENT_SPAWN_DEPTH",
|
|
119
|
+
"default": 1,
|
|
120
|
+
"label": "Subagent spawn depth",
|
|
121
|
+
"description": "Maximum Claude subagent nesting depth.",
|
|
122
|
+
"type": "integer",
|
|
123
|
+
"min": 0
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"env": [
|
|
127
|
+
{
|
|
128
|
+
"name": "ANTHROPIC_BASE_URL",
|
|
129
|
+
"value": "{baseUrl}",
|
|
130
|
+
"override": ["CLAUDE_GATEWAY_URL"],
|
|
131
|
+
"description": "Anthropic Messages endpoint origin."
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "ANTHROPIC_AUTH_TOKEN",
|
|
135
|
+
"value": "{apiKey}",
|
|
136
|
+
"description": "Bearer credential. ANTHROPIC_API_KEY is not set."
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"name": "ANTHROPIC_MODEL",
|
|
140
|
+
"value": "{model}",
|
|
141
|
+
"override": ["ANTHROPIC_MODEL"],
|
|
142
|
+
"description": "Main model."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "ANTHROPIC_SMALL_FAST_MODEL",
|
|
146
|
+
"value": "{model}",
|
|
147
|
+
"override": ["ANTHROPIC_SMALL_FAST_MODEL"],
|
|
148
|
+
"description": "Small/fast background model."
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"name": "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY",
|
|
152
|
+
"value": "0",
|
|
153
|
+
"description": "Turns off gateway model discovery; the picker comes from --settings."
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "CLAUDE_CODE_AUTO_MODE_SERVER",
|
|
157
|
+
"value": "0",
|
|
158
|
+
"description": "Runs the auto-mode classifier locally: gateway upstreams cannot perform Anthropic's server-side check (https://code.claude.com/docs/en/auto-mode-classifier-billing)."
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"name": "CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS",
|
|
162
|
+
"value": "${MAX_CONCURRENT_SUBAGENTS}",
|
|
163
|
+
"description": "Concurrent subagents."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH",
|
|
167
|
+
"value": "${MAX_SUBAGENT_SPAWN_DEPTH}",
|
|
168
|
+
"description": "Subagent nesting depth."
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"name": "CLAUDE_CODE_ENABLE_TELEMETRY",
|
|
172
|
+
"value": "1",
|
|
173
|
+
"override": ["CLAUDE_CODE_ENABLE_TELEMETRY"],
|
|
174
|
+
"description": "Enables OTEL api_request logs, which the gateway uses for purpose attribution (https://code.claude.com/docs/en/monitoring-usage#api-request-event)."
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"name": "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC",
|
|
178
|
+
"value": "1",
|
|
179
|
+
"override": ["CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC"],
|
|
180
|
+
"description": "Disables non-essential network traffic."
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"name": "ENABLE_CLAUDEAI_MCP_SERVERS",
|
|
184
|
+
"value": "false",
|
|
185
|
+
"description": "Disables claude.ai connectors, which need subscription OAuth and cannot run against the gateway."
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "OTEL_LOGS_EXPORTER",
|
|
189
|
+
"value": "otlp",
|
|
190
|
+
"override": ["OTEL_LOGS_EXPORTER"],
|
|
191
|
+
"description": "Log exporter. OTEL_TRACES_EXPORTER and OTEL_METRICS_EXPORTER are never set: Claude's telemetry init can abort on an exporter type it does not know."
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"name": "OTEL_EXPORTER_OTLP_PROTOCOL",
|
|
195
|
+
"value": "http/json",
|
|
196
|
+
"override": ["OTEL_EXPORTER_OTLP_PROTOCOL"],
|
|
197
|
+
"description": "OTLP protocol."
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT",
|
|
201
|
+
"value": "${ANTHROPIC_BASE_URL}/v1/logs",
|
|
202
|
+
"description": "Gateway log endpoint."
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "OTEL_EXPORTER_OTLP_HEADERS",
|
|
206
|
+
"value": "x-api-key={apiKey}",
|
|
207
|
+
"description": "Credential on log export."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"name": "OTEL_EXPORTER_OTLP_TIMEOUT",
|
|
211
|
+
"value": "2000",
|
|
212
|
+
"override": ["OTEL_EXPORTER_OTLP_TIMEOUT"],
|
|
213
|
+
"description": "Export timeout in ms."
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"name": "OTEL_LOGS_EXPORT_INTERVAL",
|
|
217
|
+
"value": "2000",
|
|
218
|
+
"override": ["OTEL_LOGS_EXPORT_INTERVAL"],
|
|
219
|
+
"description": "Export interval in ms."
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
"config": [
|
|
223
|
+
{
|
|
224
|
+
"kind": "cli-flag",
|
|
225
|
+
"name": "--settings",
|
|
226
|
+
"lifetime": "launch",
|
|
227
|
+
"value": {
|
|
228
|
+
"availableModels": "{catalog}",
|
|
229
|
+
"modelPicker": {
|
|
230
|
+
"replaceBuiltInOptions": true,
|
|
231
|
+
"options": "one entry per catalog model"
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
"description": "Replaces the built-in model picker with the live catalog and allowlists only those models."
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"kind": "file",
|
|
238
|
+
"path": "~/.claude/subconscious-gateway.env",
|
|
239
|
+
"lifetime": "legacy",
|
|
240
|
+
"description": "Written only by older persistent setup. subc claude uninstall removes it; launch never writes it."
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
"capabilities": {
|
|
244
|
+
"compaction": {
|
|
245
|
+
"default": "on",
|
|
246
|
+
"on": {
|
|
247
|
+
"set_by_subc": true,
|
|
248
|
+
"kind": "env",
|
|
249
|
+
"name": "CLAUDE_CODE_AUTO_COMPACT_WINDOW",
|
|
250
|
+
"value": "${CLAUDE_CODE_AUTO_COMPACT_WINDOW}",
|
|
251
|
+
"verified": true,
|
|
252
|
+
"note": "Auto-compaction stays on; subc only moves the window."
|
|
253
|
+
},
|
|
254
|
+
"off": {
|
|
255
|
+
"set_by_subc": false,
|
|
256
|
+
"kind": "env",
|
|
257
|
+
"name": "DISABLE_AUTO_COMPACT",
|
|
258
|
+
"value": "1",
|
|
259
|
+
"verified": false,
|
|
260
|
+
"note": "Upstream Claude Code variable. subc never sets it, and this repo does not confirm its behaviour."
|
|
261
|
+
},
|
|
262
|
+
"threshold": {
|
|
263
|
+
"set_by_subc": true,
|
|
264
|
+
"kind": "env",
|
|
265
|
+
"name": "CLAUDE_CODE_AUTO_COMPACT_WINDOW",
|
|
266
|
+
"value": "${CLAUDE_CODE_AUTO_COMPACT_WINDOW}",
|
|
267
|
+
"verified": true,
|
|
268
|
+
"semantics": "window",
|
|
269
|
+
"range": {
|
|
270
|
+
"verified": false,
|
|
271
|
+
"note": "The bounds of the profile setting, from the Claude Code docs (https://code.claude.com/docs/en/context-window#set-the-auto-compact-window). A launch value is not clamped."
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
"mcp": {
|
|
276
|
+
"configured_by_subc": false,
|
|
277
|
+
"transports": null,
|
|
278
|
+
"verified": false,
|
|
279
|
+
"note": "subc adds no MCP servers. It disables claude.ai connectors with ENABLE_CLAUDEAI_MCP_SERVERS=false. User MCP config is left alone."
|
|
280
|
+
},
|
|
281
|
+
"headers": [
|
|
282
|
+
{
|
|
283
|
+
"name": "x-api-key",
|
|
284
|
+
"value": "{apiKey}",
|
|
285
|
+
"on": "OTLP log export to {baseUrl}/v1/logs",
|
|
286
|
+
"set_by_subc": true,
|
|
287
|
+
"verified": true
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"name": "x-claude-code-session-id",
|
|
291
|
+
"value": "session ID",
|
|
292
|
+
"on": "model requests",
|
|
293
|
+
"set_by_subc": false,
|
|
294
|
+
"verified": false,
|
|
295
|
+
"note": "Sent by Claude Code itself, per a comment in install.sh. Not set by subc."
|
|
296
|
+
}
|
|
297
|
+
],
|
|
298
|
+
"hooks": []
|
|
299
|
+
}
|
|
300
|
+
}
|
|
@@ -1,125 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# ── Subconscious API Gateway — Claude Code
|
|
3
|
-
#
|
|
4
|
-
# writes
|
|
2
|
+
# ── Subconscious API Gateway — Claude Code leftovers ──────────────────────────
|
|
3
|
+
# Claude Code is launch-only: `subc claude` passes everything as env and flags
|
|
4
|
+
# and writes nothing. Older persistent setups wrote
|
|
5
|
+
# ~/.claude/subconscious-gateway.env; this script reports and removes it.
|
|
5
6
|
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
# ./install.sh use # launches claude with gateway env loaded
|
|
9
|
-
# ./install.sh use -- --continue # pass args through to claude
|
|
10
|
-
#
|
|
11
|
-
# Or source env into your shell:
|
|
12
|
-
# source <(./install.sh env) # load ANTHROPIC_BASE_URL etc.
|
|
13
|
-
# source <(./install.sh unset) # remove ANTHROPIC_BASE_URL etc.
|
|
14
|
-
#
|
|
15
|
-
# ./install.sh status # show current config
|
|
16
|
-
# ./install.sh uninstall # remove env file
|
|
17
|
-
#
|
|
18
|
-
# ── What this does under the hood ────────────────────────────────────────────
|
|
19
|
-
# Equivalent manual setup (no script needed):
|
|
20
|
-
#
|
|
21
|
-
# export ANTHROPIC_BASE_URL=https://your-gateway.example
|
|
22
|
-
# export ANTHROPIC_AUTH_TOKEN=sk-gw-...
|
|
23
|
-
# export ANTHROPIC_MODEL=subconscious/glm-5.3-marathon
|
|
24
|
-
# export ANTHROPIC_SMALL_FAST_MODEL=subconscious/glm-5.3-marathon
|
|
25
|
-
# export CLAUDE_CODE_SUBAGENT_MODEL=subconscious/glm-5.3-marathon
|
|
26
|
-
# export CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS=4
|
|
27
|
-
# export CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH=1
|
|
28
|
-
# export CLAUDE_CODE_AUTO_COMPACT_WINDOW=1000000
|
|
29
|
-
# export CLAUDE_CODE_MAX_CONTEXT_TOKENS=3000000
|
|
30
|
-
# # AUTO_COMPACT_WINDOW range 100000–1000000 (leave on; TIMRUN keys rarely hit it):
|
|
31
|
-
# # https://code.claude.com/docs/en/env-vars
|
|
32
|
-
# # https://code.claude.com/docs/en/context-window#set-the-auto-compact-window
|
|
33
|
-
# export CLAUDE_CODE_ENABLE_TELEMETRY=1
|
|
34
|
-
# export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
|
|
35
|
-
# export OTEL_LOGS_EXPORTER=otlp
|
|
36
|
-
# export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
|
|
37
|
-
# export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://your-gateway.example/v1/logs
|
|
38
|
-
# export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=sk-gw-..."
|
|
39
|
-
# export OTEL_EXPORTER_OTLP_TIMEOUT=2000
|
|
40
|
-
# export OTEL_LOGS_EXPORT_INTERVAL=2000
|
|
41
|
-
# claude
|
|
7
|
+
# subc claude status
|
|
8
|
+
# subc claude uninstall
|
|
42
9
|
#
|
|
43
10
|
# Claude Code sends native x-claude-code-session-id headers, so the gateway
|
|
44
|
-
# correlates requests
|
|
45
|
-
# POST /v1/logs back-fill query_source (not a general logs API):
|
|
46
|
-
# https://code.claude.com/docs/en/monitoring-usage#api-request-event
|
|
11
|
+
# correlates requests without help from subc.
|
|
47
12
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
48
13
|
|
|
49
14
|
set -euo pipefail
|
|
50
15
|
|
|
51
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
52
|
-
|
|
53
|
-
# Load shared env from SUBC_ENV_FILE, or a sibling .env / env.example.
|
|
54
|
-
SHARED_ENV="${SUBC_ENV_FILE:-${SCRIPT_DIR}/../.env}"
|
|
55
|
-
[[ -f "$SHARED_ENV" ]] || SHARED_ENV="${SCRIPT_DIR}/../env.example"
|
|
56
|
-
if [[ -f "$SHARED_ENV" ]]; then set -a; source "$SHARED_ENV"; set +a; fi
|
|
57
|
-
|
|
58
16
|
CLAUDE_DIR="${HOME}/.claude"
|
|
59
17
|
ENV_FILE="${CLAUDE_DIR}/subconscious-gateway.env"
|
|
60
|
-
|
|
61
|
-
DEFAULT_COMPACT_WINDOW="1000000"
|
|
62
|
-
DEFAULT_MAX_CONTEXT_TOKENS="3000000"
|
|
63
|
-
DEFAULT_MAX_CONCURRENT_SUBAGENTS="4"
|
|
64
|
-
DEFAULT_MAX_SUBAGENT_SPAWN_DEPTH="1"
|
|
65
|
-
|
|
66
|
-
GATEWAY_URL="${GATEWAY_URL:-}"
|
|
67
|
-
API_KEY="${CLAUDE_CODE_API_KEY:-${API_KEY:-}}"
|
|
68
|
-
MODEL="${MODEL:-$DEFAULT_MODEL}"
|
|
69
|
-
COMPACT_WINDOW="${CLAUDE_CODE_AUTO_COMPACT_WINDOW:-${COMPACT_WINDOW:-$DEFAULT_COMPACT_WINDOW}}"
|
|
70
|
-
MAX_CONTEXT_TOKENS="${CLAUDE_CODE_MAX_CONTEXT_TOKENS:-${MAX_CONTEXT_TOKENS:-$DEFAULT_MAX_CONTEXT_TOKENS}}"
|
|
71
|
-
MAX_CONCURRENT_SUBAGENTS="${MAX_CONCURRENT_SUBAGENTS:-$DEFAULT_MAX_CONCURRENT_SUBAGENTS}"
|
|
72
|
-
MAX_SUBAGENT_SPAWN_DEPTH="${MAX_SUBAGENT_SPAWN_DEPTH:-$DEFAULT_MAX_SUBAGENT_SPAWN_DEPTH}"
|
|
73
|
-
|
|
74
|
-
PICKER_MODELS=()
|
|
75
|
-
if [[ -n "${SUBCONSCIOUS_MODELS:-}" ]]; then
|
|
76
|
-
while IFS= read -r picker_model; do
|
|
77
|
-
[[ -n "$picker_model" ]] && PICKER_MODELS+=("$picker_model")
|
|
78
|
-
done <<< "$SUBCONSCIOUS_MODELS"
|
|
79
|
-
fi
|
|
80
|
-
|
|
81
|
-
picker_model_at() {
|
|
82
|
-
local index="$1"
|
|
83
|
-
local count="${#PICKER_MODELS[@]}"
|
|
84
|
-
if [[ "$count" -eq 0 ]]; then
|
|
85
|
-
printf '%s' "$MODEL"
|
|
86
|
-
return
|
|
87
|
-
fi
|
|
88
|
-
if [[ "$index" -ge "$count" ]]; then
|
|
89
|
-
index=$((count - 1))
|
|
90
|
-
fi
|
|
91
|
-
printf '%s' "${PICKER_MODELS[$index]}"
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
in_picker_catalog() {
|
|
95
|
-
local candidate="$1" existing
|
|
96
|
-
[[ -z "$candidate" ]] && return 1
|
|
97
|
-
[[ "${#PICKER_MODELS[@]}" -eq 0 ]] && return 0
|
|
98
|
-
for existing in "${PICKER_MODELS[@]}"; do
|
|
99
|
-
[[ "$existing" == "$candidate" ]] && return 0
|
|
100
|
-
done
|
|
101
|
-
return 1
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if [[ "${#PICKER_MODELS[@]}" -gt 0 ]]; then
|
|
105
|
-
in_picker_catalog "${ANTHROPIC_DEFAULT_OPUS_MODEL:-}" || ANTHROPIC_DEFAULT_OPUS_MODEL=""
|
|
106
|
-
in_picker_catalog "${ANTHROPIC_DEFAULT_SONNET_MODEL:-}" || ANTHROPIC_DEFAULT_SONNET_MODEL=""
|
|
107
|
-
in_picker_catalog "${ANTHROPIC_DEFAULT_HAIKU_MODEL:-}" || ANTHROPIC_DEFAULT_HAIKU_MODEL=""
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
DEFAULT_OPUS_MODEL="$(picker_model_at 0)"
|
|
111
|
-
DEFAULT_SONNET_MODEL="$(picker_model_at 1)"
|
|
112
|
-
DEFAULT_HAIKU_MODEL="$(picker_model_at 2)"
|
|
113
|
-
OPUS_MODEL="${ANTHROPIC_DEFAULT_OPUS_MODEL:-$DEFAULT_OPUS_MODEL}"
|
|
114
|
-
OPUS_MODEL_NAME="${ANTHROPIC_DEFAULT_OPUS_MODEL_NAME:-$OPUS_MODEL}"
|
|
115
|
-
OPUS_MODEL_DESCRIPTION="${ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION:-Subconscious model ${OPUS_MODEL}}"
|
|
116
|
-
SONNET_MODEL="${ANTHROPIC_DEFAULT_SONNET_MODEL:-$DEFAULT_SONNET_MODEL}"
|
|
117
|
-
SONNET_MODEL_NAME="${ANTHROPIC_DEFAULT_SONNET_MODEL_NAME:-$SONNET_MODEL}"
|
|
118
|
-
SONNET_MODEL_DESCRIPTION="${ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION:-Subconscious model ${SONNET_MODEL}}"
|
|
119
|
-
HAIKU_MODEL="${ANTHROPIC_DEFAULT_HAIKU_MODEL:-$DEFAULT_HAIKU_MODEL}"
|
|
120
|
-
HAIKU_MODEL_NAME="${ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME:-$HAIKU_MODEL}"
|
|
121
|
-
HAIKU_MODEL_DESCRIPTION="${ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION:-Subconscious model ${HAIKU_MODEL}}"
|
|
122
|
-
COMMAND="install"
|
|
18
|
+
COMMAND="status"
|
|
123
19
|
|
|
124
20
|
usage() {
|
|
125
21
|
cat <<'EOF'
|
|
@@ -135,38 +31,14 @@ EOF
|
|
|
135
31
|
|
|
136
32
|
while [[ $# -gt 0 ]]; do
|
|
137
33
|
case "$1" in
|
|
138
|
-
|
|
34
|
+
uninstall|status|help)
|
|
139
35
|
COMMAND="$1"
|
|
140
36
|
shift
|
|
141
37
|
;;
|
|
142
|
-
--gateway-url)
|
|
143
|
-
GATEWAY_URL="${2:-}"
|
|
144
|
-
shift 2
|
|
145
|
-
;;
|
|
146
|
-
--api-key)
|
|
147
|
-
API_KEY="${2:-}"
|
|
148
|
-
shift 2
|
|
149
|
-
;;
|
|
150
|
-
--model)
|
|
151
|
-
MODEL="${2:-}"
|
|
152
|
-
shift 2
|
|
153
|
-
;;
|
|
154
|
-
--compact-window)
|
|
155
|
-
COMPACT_WINDOW="${2:-}"
|
|
156
|
-
shift 2
|
|
157
|
-
;;
|
|
158
|
-
--max-context-tokens)
|
|
159
|
-
MAX_CONTEXT_TOKENS="${2:-}"
|
|
160
|
-
shift 2
|
|
161
|
-
;;
|
|
162
38
|
-h|--help)
|
|
163
39
|
usage
|
|
164
40
|
exit 0
|
|
165
41
|
;;
|
|
166
|
-
--)
|
|
167
|
-
shift
|
|
168
|
-
break
|
|
169
|
-
;;
|
|
170
42
|
*)
|
|
171
43
|
echo "unknown argument: $1" >&2
|
|
172
44
|
usage >&2
|
|
@@ -175,92 +47,6 @@ while [[ $# -gt 0 ]]; do
|
|
|
175
47
|
esac
|
|
176
48
|
done
|
|
177
49
|
|
|
178
|
-
# Optional CLAUDE_GATEWAY_URL in shared .env overrides GATEWAY_URL for Claude only.
|
|
179
|
-
resolve_claude_gateway_url() {
|
|
180
|
-
printf '%s' "${CLAUDE_GATEWAY_URL:-$GATEWAY_URL}"
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
write_env() {
|
|
184
|
-
local effective_gateway_url
|
|
185
|
-
effective_gateway_url="$(resolve_claude_gateway_url)"
|
|
186
|
-
mkdir -p "$CLAUDE_DIR"
|
|
187
|
-
umask 077
|
|
188
|
-
cat >"$ENV_FILE" <<EOF
|
|
189
|
-
# Generated by subc — do not commit secrets.
|
|
190
|
-
export ANTHROPIC_BASE_URL="${effective_gateway_url}"
|
|
191
|
-
export ANTHROPIC_AUTH_TOKEN="${API_KEY}"
|
|
192
|
-
export ANTHROPIC_MODEL="${MODEL}"
|
|
193
|
-
export ANTHROPIC_SMALL_FAST_MODEL="${MODEL}"
|
|
194
|
-
export ANTHROPIC_DEFAULT_OPUS_MODEL="${OPUS_MODEL}"
|
|
195
|
-
export ANTHROPIC_DEFAULT_OPUS_MODEL_NAME="${OPUS_MODEL_NAME}"
|
|
196
|
-
export ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION="${OPUS_MODEL_DESCRIPTION}"
|
|
197
|
-
export ANTHROPIC_DEFAULT_SONNET_MODEL="${SONNET_MODEL}"
|
|
198
|
-
export ANTHROPIC_DEFAULT_SONNET_MODEL_NAME="${SONNET_MODEL_NAME}"
|
|
199
|
-
export ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION="${SONNET_MODEL_DESCRIPTION}"
|
|
200
|
-
export ANTHROPIC_DEFAULT_HAIKU_MODEL="${HAIKU_MODEL}"
|
|
201
|
-
export ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME="${HAIKU_MODEL_NAME}"
|
|
202
|
-
export ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION="${HAIKU_MODEL_DESCRIPTION}"
|
|
203
|
-
export CLAUDE_CODE_SUBAGENT_MODEL="${CLAUDE_CODE_SUBAGENT_MODEL:-$MODEL}"
|
|
204
|
-
export CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS="${MAX_CONCURRENT_SUBAGENTS}"
|
|
205
|
-
export CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH="${MAX_SUBAGENT_SPAWN_DEPTH}"
|
|
206
|
-
export CLAUDE_CODE_AUTO_COMPACT_WINDOW="${COMPACT_WINDOW}"
|
|
207
|
-
export CLAUDE_CODE_MAX_CONTEXT_TOKENS="${MAX_CONTEXT_TOKENS}"
|
|
208
|
-
export CLAUDE_CODE_ENABLE_TELEMETRY=1
|
|
209
|
-
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
|
|
210
|
-
export ENABLE_CLAUDEAI_MCP_SERVERS=false
|
|
211
|
-
# Claude Code purpose attribution only (api_request → /v1/logs):
|
|
212
|
-
# https://code.claude.com/docs/en/monitoring-usage#api-request-event
|
|
213
|
-
export OTEL_LOGS_EXPORTER=otlp
|
|
214
|
-
export OTEL_EXPORTER_OTLP_PROTOCOL=http/json
|
|
215
|
-
export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT="${effective_gateway_url%/}/v1/logs"
|
|
216
|
-
export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=${API_KEY}"
|
|
217
|
-
export OTEL_EXPORTER_OTLP_TIMEOUT=2000
|
|
218
|
-
export OTEL_LOGS_EXPORT_INTERVAL=2000
|
|
219
|
-
EOF
|
|
220
|
-
chmod 600 "$ENV_FILE"
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
print_env_exports() {
|
|
224
|
-
if [[ ! -f "$ENV_FILE" ]]; then
|
|
225
|
-
echo "env file not found: $ENV_FILE" >&2
|
|
226
|
-
echo "Launch Claude with: subc claude" >&2
|
|
227
|
-
return 1
|
|
228
|
-
fi
|
|
229
|
-
cat "$ENV_FILE"
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
print_env_unsets() {
|
|
233
|
-
cat <<'EOF'
|
|
234
|
-
unset ANTHROPIC_BASE_URL
|
|
235
|
-
unset ANTHROPIC_AUTH_TOKEN
|
|
236
|
-
unset ANTHROPIC_MODEL
|
|
237
|
-
unset ANTHROPIC_SMALL_FAST_MODEL
|
|
238
|
-
unset ANTHROPIC_DEFAULT_OPUS_MODEL
|
|
239
|
-
unset ANTHROPIC_DEFAULT_OPUS_MODEL_NAME
|
|
240
|
-
unset ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION
|
|
241
|
-
unset ANTHROPIC_DEFAULT_SONNET_MODEL
|
|
242
|
-
unset ANTHROPIC_DEFAULT_SONNET_MODEL_NAME
|
|
243
|
-
unset ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION
|
|
244
|
-
unset ANTHROPIC_DEFAULT_HAIKU_MODEL
|
|
245
|
-
unset ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME
|
|
246
|
-
unset ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION
|
|
247
|
-
unset CLAUDE_CODE_SUBAGENT_MODEL
|
|
248
|
-
unset CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS
|
|
249
|
-
unset CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH
|
|
250
|
-
unset CLAUDE_CODE_AUTO_COMPACT_WINDOW
|
|
251
|
-
unset CLAUDE_CODE_MAX_CONTEXT_TOKENS
|
|
252
|
-
unset CLAUDE_CODE_ENABLE_TELEMETRY
|
|
253
|
-
unset CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC
|
|
254
|
-
unset ENABLE_CLAUDEAI_MCP_SERVERS
|
|
255
|
-
unset OTEL_LOGS_EXPORTER
|
|
256
|
-
unset OTEL_EXPORTER_OTLP_PROTOCOL
|
|
257
|
-
unset OTEL_EXPORTER_OTLP_LOGS_ENDPOINT
|
|
258
|
-
unset OTEL_EXPORTER_OTLP_HEADERS
|
|
259
|
-
unset OTEL_EXPORTER_OTLP_TIMEOUT
|
|
260
|
-
unset OTEL_LOGS_EXPORT_INTERVAL
|
|
261
|
-
EOF
|
|
262
|
-
}
|
|
263
|
-
|
|
264
50
|
status() {
|
|
265
51
|
echo "scope: user"
|
|
266
52
|
echo "claude dir: $CLAUDE_DIR"
|
|
@@ -287,35 +73,6 @@ status() {
|
|
|
287
73
|
}
|
|
288
74
|
|
|
289
75
|
case "$COMMAND" in
|
|
290
|
-
install)
|
|
291
|
-
if [[ -z "$GATEWAY_URL" || -z "$API_KEY" ]]; then
|
|
292
|
-
echo "--gateway-url and --api-key are required for install" >&2
|
|
293
|
-
exit 1
|
|
294
|
-
fi
|
|
295
|
-
write_env
|
|
296
|
-
echo "Wrote leftover env file $ENV_FILE"
|
|
297
|
-
echo "Launch Claude with: subc claude"
|
|
298
|
-
;;
|
|
299
|
-
use)
|
|
300
|
-
if [[ ! -f "$ENV_FILE" ]]; then
|
|
301
|
-
echo "env file not found: $ENV_FILE" >&2
|
|
302
|
-
echo "Launch Claude with: subc claude" >&2
|
|
303
|
-
exit 1
|
|
304
|
-
fi
|
|
305
|
-
# shellcheck disable=SC1090
|
|
306
|
-
source "$ENV_FILE"
|
|
307
|
-
if ! command -v claude >/dev/null 2>&1; then
|
|
308
|
-
echo "claude CLI not found in PATH" >&2
|
|
309
|
-
exit 1
|
|
310
|
-
fi
|
|
311
|
-
exec claude "$@"
|
|
312
|
-
;;
|
|
313
|
-
env)
|
|
314
|
-
print_env_exports
|
|
315
|
-
;;
|
|
316
|
-
unset)
|
|
317
|
-
print_env_unsets
|
|
318
|
-
;;
|
|
319
76
|
uninstall)
|
|
320
77
|
rm -f "$ENV_FILE"
|
|
321
78
|
echo "Removed $ENV_FILE"
|