@apolloyh/apollo-agent 0.1.0 → 0.1.2
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 +1 -1
- package/dist/brand.d.ts +2 -2
- package/dist/brand.js +2 -2
- package/dist/config.d.ts +9 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -8
- package/dist/index.js +10 -2
- package/docs/sdk.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ apollo -r # pick a saved project session
|
|
|
33
33
|
apollo -r <session-id>
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
Apollo
|
|
36
|
+
Apollo loads project `.apollo/.env`, project `.env`, then user-level `~/.apollo/.env`; use `--env-file <path>` to override discovery.
|
|
37
37
|
|
|
38
38
|
Optional project configuration lives at `.apollo/config.json`; Apollo also reads the legacy
|
|
39
39
|
`agent.config.json` during migration. Copy `.apollo/config.example.json` to get started.
|
package/dist/brand.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/** Product identity — single source of truth for display strings. */
|
|
2
2
|
export declare const PRODUCT: {
|
|
3
3
|
readonly name: "Apollo";
|
|
4
|
-
readonly version: "0.1.
|
|
4
|
+
readonly version: "0.1.2";
|
|
5
5
|
readonly tagline: "Your personal agent — answer first, act when needed.";
|
|
6
|
-
readonly packageName: "apollo-agent";
|
|
6
|
+
readonly packageName: "@apolloyh/apollo-agent";
|
|
7
7
|
readonly userAgent: "ApolloAgent/0.1";
|
|
8
8
|
readonly prompt: "apollo";
|
|
9
9
|
};
|
package/dist/brand.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/** Product identity — single source of truth for display strings. */
|
|
2
2
|
export const PRODUCT = {
|
|
3
3
|
name: "Apollo",
|
|
4
|
-
version: "0.1.
|
|
4
|
+
version: "0.1.2",
|
|
5
5
|
tagline: "Your personal agent — answer first, act when needed.",
|
|
6
|
-
packageName: "apollo-agent",
|
|
6
|
+
packageName: "@apolloyh/apollo-agent",
|
|
7
7
|
userAgent: "ApolloAgent/0.1",
|
|
8
8
|
prompt: "apollo",
|
|
9
9
|
};
|
package/dist/config.d.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { AgentConfig, LlmConfig, SubagentConfig } from "./types.js";
|
|
2
2
|
/** Default subagents — Claude Code–style Task roles. */
|
|
3
3
|
export declare const DEFAULT_AGENTS: SubagentConfig[];
|
|
4
|
+
export declare const MISSING_AUTH_TOKEN_MESSAGE = "Missing ANTHROPIC_AUTH_TOKEN. Add it to ~/.apollo/.env, .apollo/.env, .env, or your shell, then restart Apollo.";
|
|
5
|
+
export declare function ensureUserEnvFile(): {
|
|
6
|
+
path: string;
|
|
7
|
+
created: boolean;
|
|
8
|
+
};
|
|
4
9
|
export declare function loadAgentConfig(configPath?: string): Promise<AgentConfig>;
|
|
5
10
|
/**
|
|
6
|
-
* Load an explicit env file, or discover
|
|
11
|
+
* Load an explicit env file, or discover project env then ~/.apollo/.env.
|
|
7
12
|
* By default **overrides** existing shell vars so local agent config wins.
|
|
8
13
|
*/
|
|
9
14
|
export declare function loadEnvFile(envPath?: string, options?: {
|
|
10
15
|
override?: boolean;
|
|
11
16
|
}): boolean;
|
|
12
|
-
export declare function loadLlmConfig(
|
|
17
|
+
export declare function loadLlmConfig(options?: {
|
|
18
|
+
allowMissingAuth?: boolean;
|
|
19
|
+
}): LlmConfig;
|
|
13
20
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE,wDAAwD;AACxD,eAAO,MAAM,cAAc,EAAE,cAAc,EA4B1C,CAAC;AAsBF,eAAO,MAAM,0BAA0B,oHAC4E,CAAC;AAWpH,wBAAgB,iBAAiB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAatE;AAED,wBAAsB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0B/E;AAiBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAwB3F;AAYD,wBAAgB,aAAa,CAAC,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,SAAS,CAiCrF"}
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fsSync from "node:fs";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
/** Default subagents — Claude Code–style Task roles. */
|
|
5
6
|
export const DEFAULT_AGENTS = [
|
|
@@ -47,6 +48,31 @@ const defaultConfig = {
|
|
|
47
48
|
};
|
|
48
49
|
const DEFAULT_CONFIG_PATH = ".apollo/config.json";
|
|
49
50
|
const LEGACY_CONFIG_PATH = "agent.config.json";
|
|
51
|
+
export const MISSING_AUTH_TOKEN_MESSAGE = "Missing ANTHROPIC_AUTH_TOKEN. Add it to ~/.apollo/.env, .apollo/.env, .env, or your shell, then restart Apollo.";
|
|
52
|
+
const USER_ENV_TEMPLATE = `# Apollo uses Anthropic-compatible environment variable names.
|
|
53
|
+
# Add your provider token below, then restart Apollo.
|
|
54
|
+
ANTHROPIC_AUTH_TOKEN=
|
|
55
|
+
|
|
56
|
+
# Optional provider settings:
|
|
57
|
+
# ANTHROPIC_BASE_URL=https://api.anthropic.com
|
|
58
|
+
# ANTHROPIC_MODEL=claude-haiku-4-5
|
|
59
|
+
`;
|
|
60
|
+
export function ensureUserEnvFile() {
|
|
61
|
+
const directory = path.join(os.homedir(), ".apollo");
|
|
62
|
+
const envPath = path.join(directory, ".env");
|
|
63
|
+
if (fsSync.existsSync(envPath))
|
|
64
|
+
return { path: envPath, created: false };
|
|
65
|
+
fsSync.mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
66
|
+
try {
|
|
67
|
+
fsSync.writeFileSync(envPath, USER_ENV_TEMPLATE, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
68
|
+
return { path: envPath, created: true };
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === "EEXIST")
|
|
72
|
+
return { path: envPath, created: false };
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
50
76
|
export async function loadAgentConfig(configPath) {
|
|
51
77
|
const discoveredPath = configPath ?? [DEFAULT_CONFIG_PATH, LEGACY_CONFIG_PATH].find(fsSync.existsSync);
|
|
52
78
|
if (!discoveredPath) {
|
|
@@ -84,17 +110,18 @@ function normalizeAgents(list) {
|
|
|
84
110
|
}));
|
|
85
111
|
}
|
|
86
112
|
/**
|
|
87
|
-
* Load an explicit env file, or discover
|
|
113
|
+
* Load an explicit env file, or discover project env then ~/.apollo/.env.
|
|
88
114
|
* By default **overrides** existing shell vars so local agent config wins.
|
|
89
115
|
*/
|
|
90
116
|
export function loadEnvFile(envPath, options = {}) {
|
|
91
|
-
const
|
|
117
|
+
const userEnvPath = path.join(os.homedir(), ".apollo", ".env");
|
|
118
|
+
const selectedPath = envPath ?? [".apollo/.env", ".env", userEnvPath].find(fsSync.existsSync);
|
|
92
119
|
if (!selectedPath)
|
|
93
120
|
return false;
|
|
94
121
|
const resolvedPath = path.resolve(selectedPath);
|
|
95
122
|
if (!fsSync.existsSync(resolvedPath))
|
|
96
123
|
return false;
|
|
97
|
-
const override = options.override ??
|
|
124
|
+
const override = options.override ?? (envPath !== undefined || path.resolve(selectedPath) !== userEnvPath);
|
|
98
125
|
const raw = fsSync.readFileSync(resolvedPath, "utf8");
|
|
99
126
|
for (const line of raw.split(/\r?\n/)) {
|
|
100
127
|
const trimmed = line.trim();
|
|
@@ -120,7 +147,7 @@ function unwrapEnvValue(value) {
|
|
|
120
147
|
}
|
|
121
148
|
return value;
|
|
122
149
|
}
|
|
123
|
-
export function loadLlmConfig() {
|
|
150
|
+
export function loadLlmConfig(options = {}) {
|
|
124
151
|
const authToken = process.env.ANTHROPIC_AUTH_TOKEN;
|
|
125
152
|
const baseUrl = process.env.ANTHROPIC_BASE_URL ?? "https://api.anthropic.com";
|
|
126
153
|
const model = process.env.ANTHROPIC_MODEL ||
|
|
@@ -128,9 +155,8 @@ export function loadLlmConfig() {
|
|
|
128
155
|
process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME ||
|
|
129
156
|
process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_NAME ||
|
|
130
157
|
"claude-haiku-4-5";
|
|
131
|
-
if (!authToken)
|
|
132
|
-
throw new Error(
|
|
133
|
-
}
|
|
158
|
+
if (!authToken && !options.allowMissingAuth)
|
|
159
|
+
throw new Error(MISSING_AUTH_TOKEN_MESSAGE);
|
|
134
160
|
const cacheTtl = process.env.ANTHROPIC_CACHE_TTL ?? "5m";
|
|
135
161
|
if (cacheTtl !== "5m" && cacheTtl !== "1h") {
|
|
136
162
|
throw new Error("ANTHROPIC_CACHE_TTL must be 5m or 1h.");
|
|
@@ -148,7 +174,7 @@ export function loadLlmConfig() {
|
|
|
148
174
|
throw new Error("ANTHROPIC_BASE_URL must be a valid HTTP or HTTPS URL.");
|
|
149
175
|
}
|
|
150
176
|
return {
|
|
151
|
-
authToken,
|
|
177
|
+
authToken: authToken ?? "",
|
|
152
178
|
baseUrl,
|
|
153
179
|
model,
|
|
154
180
|
maxTokens,
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { stdin, stdout } from "node:process";
|
|
|
3
3
|
import readline from "node:readline/promises";
|
|
4
4
|
import { ASCII_LOGO, PRODUCT } from "./brand.js";
|
|
5
5
|
import { parseArgs } from "./cli-args.js";
|
|
6
|
-
import { loadAgentConfig, loadEnvFile, loadLlmConfig } from "./config.js";
|
|
6
|
+
import { ensureUserEnvFile, loadAgentConfig, loadEnvFile, loadLlmConfig, MISSING_AUTH_TOKEN_MESSAGE, } from "./config.js";
|
|
7
7
|
import { pickSpinnerVerb } from "./constants/spinner-verbs.js";
|
|
8
8
|
import { QueryEngine } from "./runtime/query-engine.js";
|
|
9
9
|
import { createCliApprovalProvider } from "./runtime/permissions.js";
|
|
@@ -56,6 +56,7 @@ function filterSlashCommands(buffer) {
|
|
|
56
56
|
}
|
|
57
57
|
async function main() {
|
|
58
58
|
const args = parseArgs(process.argv.slice(2));
|
|
59
|
+
const userEnv = ensureUserEnvFile();
|
|
59
60
|
loadEnvFile(args.envPath);
|
|
60
61
|
const task = args.task ?? (stdin.isTTY ? undefined : (await readStdin()).trim());
|
|
61
62
|
if (!task && !stdin.isTTY) {
|
|
@@ -64,8 +65,8 @@ async function main() {
|
|
|
64
65
|
return;
|
|
65
66
|
}
|
|
66
67
|
const agentConfig = await loadAgentConfig(args.configPath);
|
|
67
|
-
const llmConfig = loadLlmConfig();
|
|
68
68
|
const interactiveMode = !task && stdin.isTTY;
|
|
69
|
+
const llmConfig = loadLlmConfig({ allowMissingAuth: interactiveMode });
|
|
69
70
|
const yolo = args.yolo;
|
|
70
71
|
const thoughtFold = new ThoughtFoldManager({
|
|
71
72
|
color: args.color,
|
|
@@ -235,6 +236,9 @@ async function main() {
|
|
|
235
236
|
quiet: !traceOptions.verbose,
|
|
236
237
|
yolo: yolo || agentConfig.permissions.mode === "unrestricted",
|
|
237
238
|
}));
|
|
239
|
+
if (userEnv.created) {
|
|
240
|
+
stdout.write(`\nCreated ${shortenHome(userEnv.path)}. Add ANTHROPIC_AUTH_TOKEN there, then restart Apollo.\n`);
|
|
241
|
+
}
|
|
238
242
|
const approvalProvider = createCliApprovalProvider(agentConfig, traceSink, () => yolo, {
|
|
239
243
|
beforePrompt: () => {
|
|
240
244
|
stopLiveStatus("none");
|
|
@@ -530,6 +534,8 @@ async function main() {
|
|
|
530
534
|
activeVerb = pickSpinnerVerb(text);
|
|
531
535
|
startPinnedCliInput(traceOptions.color);
|
|
532
536
|
try {
|
|
537
|
+
if (!llmConfig.authToken)
|
|
538
|
+
throw new Error(MISSING_AUTH_TOKEN_MESSAGE);
|
|
533
539
|
const result = await runWithRenderer(renderer, () => runtime.submitMessage(text));
|
|
534
540
|
stopLiveStatus("success");
|
|
535
541
|
if (!traceOptions.stream)
|
|
@@ -1686,6 +1692,8 @@ function formatRuntimeError(error, verbose) {
|
|
|
1686
1692
|
if (isAbortError(error))
|
|
1687
1693
|
return "Interrupted by user.";
|
|
1688
1694
|
const message = error instanceof Error ? error.message : String(error);
|
|
1695
|
+
if (message === MISSING_AUTH_TOKEN_MESSAGE)
|
|
1696
|
+
return `Apollo is not configured yet. ${message}`;
|
|
1689
1697
|
if (verbose && error instanceof Error)
|
|
1690
1698
|
return error.stack ?? message;
|
|
1691
1699
|
const bounded = message.length > 1200 ? `${message.slice(0, 1200)}...` : message;
|
package/docs/sdk.md
CHANGED
|
@@ -13,7 +13,7 @@ Apollo SDK 用于把 Agent 能力嵌入 Node.js / TypeScript 系统。CLI 只是
|
|
|
13
13
|
当前使用本地 tarball:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npm install /Users/apollo/Code-YH/web-agent/agent/apolloyh-apollo-agent-0.1.
|
|
16
|
+
npm install /Users/apollo/Code-YH/web-agent/agent/apolloyh-apollo-agent-0.1.2.tgz
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
发布到 npm 后可改为:
|