@apolloyh/apollo-agent 0.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.
Files changed (103) hide show
  1. package/.apollo/config.example.json +37 -0
  2. package/.env.example +17 -0
  3. package/README.md +62 -0
  4. package/dist/brand.d.ts +17 -0
  5. package/dist/brand.d.ts.map +1 -0
  6. package/dist/brand.js +23 -0
  7. package/dist/cli-args.d.ts +13 -0
  8. package/dist/cli-args.d.ts.map +1 -0
  9. package/dist/cli-args.js +50 -0
  10. package/dist/config.d.ts +13 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +190 -0
  13. package/dist/constants/spinner-verbs.d.ts +7 -0
  14. package/dist/constants/spinner-verbs.d.ts.map +1 -0
  15. package/dist/constants/spinner-verbs.js +21 -0
  16. package/dist/coordinator/workflow.d.ts +20 -0
  17. package/dist/coordinator/workflow.d.ts.map +1 -0
  18. package/dist/coordinator/workflow.js +120 -0
  19. package/dist/goal/goal-mode.d.ts +26 -0
  20. package/dist/goal/goal-mode.d.ts.map +1 -0
  21. package/dist/goal/goal-mode.js +141 -0
  22. package/dist/hooks/runner.d.ts +43 -0
  23. package/dist/hooks/runner.d.ts.map +1 -0
  24. package/dist/hooks/runner.js +94 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +1716 -0
  28. package/dist/llm/anthropic.d.ts +46 -0
  29. package/dist/llm/anthropic.d.ts.map +1 -0
  30. package/dist/llm/anthropic.js +278 -0
  31. package/dist/mcp/manager.d.ts +14 -0
  32. package/dist/mcp/manager.d.ts.map +1 -0
  33. package/dist/mcp/manager.js +93 -0
  34. package/dist/memory/memdir.d.ts +19 -0
  35. package/dist/memory/memdir.d.ts.map +1 -0
  36. package/dist/memory/memdir.js +96 -0
  37. package/dist/plan/plan-mode.d.ts +14 -0
  38. package/dist/plan/plan-mode.d.ts.map +1 -0
  39. package/dist/plan/plan-mode.js +90 -0
  40. package/dist/project-instructions.d.ts +8 -0
  41. package/dist/project-instructions.d.ts.map +1 -0
  42. package/dist/project-instructions.js +33 -0
  43. package/dist/runtime/compaction.d.ts +5 -0
  44. package/dist/runtime/compaction.d.ts.map +1 -0
  45. package/dist/runtime/compaction.js +37 -0
  46. package/dist/runtime/context.d.ts +25 -0
  47. package/dist/runtime/context.d.ts.map +1 -0
  48. package/dist/runtime/context.js +75 -0
  49. package/dist/runtime/permissions.d.ts +11 -0
  50. package/dist/runtime/permissions.d.ts.map +1 -0
  51. package/dist/runtime/permissions.js +119 -0
  52. package/dist/runtime/prompt-builder.d.ts +27 -0
  53. package/dist/runtime/prompt-builder.d.ts.map +1 -0
  54. package/dist/runtime/prompt-builder.js +112 -0
  55. package/dist/runtime/query-engine.d.ts +136 -0
  56. package/dist/runtime/query-engine.d.ts.map +1 -0
  57. package/dist/runtime/query-engine.js +1182 -0
  58. package/dist/runtime/tool-policy.d.ts +13 -0
  59. package/dist/runtime/tool-policy.d.ts.map +1 -0
  60. package/dist/runtime/tool-policy.js +106 -0
  61. package/dist/sdk.d.ts +33 -0
  62. package/dist/sdk.d.ts.map +1 -0
  63. package/dist/sdk.js +41 -0
  64. package/dist/session/resume-ui.d.ts +17 -0
  65. package/dist/session/resume-ui.d.ts.map +1 -0
  66. package/dist/session/resume-ui.js +64 -0
  67. package/dist/session/store.d.ts +66 -0
  68. package/dist/session/store.d.ts.map +1 -0
  69. package/dist/session/store.js +120 -0
  70. package/dist/skillify/skillify.d.ts +12 -0
  71. package/dist/skillify/skillify.d.ts.map +1 -0
  72. package/dist/skillify/skillify.js +52 -0
  73. package/dist/skills/skills.d.ts +26 -0
  74. package/dist/skills/skills.d.ts.map +1 -0
  75. package/dist/skills/skills.js +195 -0
  76. package/dist/status-ui.d.ts +37 -0
  77. package/dist/status-ui.d.ts.map +1 -0
  78. package/dist/status-ui.js +130 -0
  79. package/dist/thought-fold.d.ts +48 -0
  80. package/dist/thought-fold.d.ts.map +1 -0
  81. package/dist/thought-fold.js +156 -0
  82. package/dist/tools/builtin.d.ts +27 -0
  83. package/dist/tools/builtin.d.ts.map +1 -0
  84. package/dist/tools/builtin.js +898 -0
  85. package/dist/tools/registry.d.ts +17 -0
  86. package/dist/tools/registry.d.ts.map +1 -0
  87. package/dist/tools/registry.js +86 -0
  88. package/dist/trace.d.ts +68 -0
  89. package/dist/trace.d.ts.map +1 -0
  90. package/dist/trace.js +600 -0
  91. package/dist/types.d.ts +202 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +1 -0
  94. package/dist/utils.d.ts +8 -0
  95. package/dist/utils.d.ts.map +1 -0
  96. package/dist/utils.js +78 -0
  97. package/docs/sdk.md +259 -0
  98. package/package.json +53 -0
  99. package/src/skills/tech-research-skill/SKILL.md +200 -0
  100. package/src/skills/tech-research-skill/agents/openai.yaml +4 -0
  101. package/src/skills/tech-research-skill/repo-analyze +435 -0
  102. package/src/skills/tech-research-skill/repo-fetch +310 -0
  103. package/src/skills/tech-research-skill/report-generate +254 -0
@@ -0,0 +1,17 @@
1
+ import type { AnthropicTool, JsonObject, ToolDefinition, ToolExecutionContext, ToolResult } from "../types.js";
2
+ import type { HookRunner } from "../hooks/runner.js";
3
+ export declare const MAX_TOOL_RESULT_CHARS = 30000;
4
+ export declare class ToolRegistry {
5
+ private readonly tools;
6
+ private hooks?;
7
+ private planMode;
8
+ setHooks(hooks: HookRunner | undefined): void;
9
+ setPlanMode(active: boolean): void;
10
+ register(tool: ToolDefinition): void;
11
+ has(name: string): boolean;
12
+ pick(names: string[]): ToolRegistry;
13
+ definitions(): AnthropicTool[];
14
+ riskOf(name: string): import("../types.js").ToolRisk | undefined;
15
+ execute(name: string, input: JsonObject, context: ToolExecutionContext): Promise<ToolResult>;
16
+ }
17
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAE3C,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,KAAK,CAAC,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAS;IAEzB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAI7C,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIlC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY;IAWnC,WAAW,IAAI,aAAa,EAAE;IAQ9B,MAAM,CAAC,IAAI,EAAE,MAAM;IAIb,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;CA+CnG"}
@@ -0,0 +1,86 @@
1
+ import { truncateMiddle } from "../utils.js";
2
+ export const MAX_TOOL_RESULT_CHARS = 30000;
3
+ export class ToolRegistry {
4
+ tools = new Map();
5
+ hooks;
6
+ planMode = false;
7
+ setHooks(hooks) {
8
+ this.hooks = hooks;
9
+ }
10
+ setPlanMode(active) {
11
+ this.planMode = active;
12
+ }
13
+ register(tool) {
14
+ if (this.tools.has(tool.name))
15
+ throw new Error(`Duplicate tool: ${tool.name}`);
16
+ this.tools.set(tool.name, tool);
17
+ }
18
+ has(name) {
19
+ return this.tools.has(name);
20
+ }
21
+ pick(names) {
22
+ const next = new ToolRegistry();
23
+ next.hooks = this.hooks;
24
+ next.planMode = this.planMode;
25
+ const allow = new Set(names);
26
+ for (const [name, tool] of this.tools) {
27
+ if (allow.has(name))
28
+ next.register(tool);
29
+ }
30
+ return next;
31
+ }
32
+ definitions() {
33
+ return Array.from(this.tools.values()).map(({ name, description, input_schema }) => ({
34
+ name,
35
+ description,
36
+ input_schema,
37
+ }));
38
+ }
39
+ riskOf(name) {
40
+ return this.tools.get(name)?.risk;
41
+ }
42
+ async execute(name, input, context) {
43
+ const tool = this.tools.get(name);
44
+ if (!tool)
45
+ return { content: `Unknown tool: ${name}`, isError: true };
46
+ // Plan-mode gate (CC EnterPlanMode style)
47
+ if (this.planMode || context.planMode) {
48
+ const { isPlanModeToolAllowed } = await import("../plan/plan-mode.js");
49
+ if (!isPlanModeToolAllowed(name, input, context.workspaceRoot)) {
50
+ return {
51
+ content: `Plan mode: tool "${name}" is blocked. Only write .apollo/plan.md (or use read-only tools). Tell the user to /approve when the plan is ready.`,
52
+ isError: true,
53
+ };
54
+ }
55
+ }
56
+ let effectiveInput = input;
57
+ if (this.hooks) {
58
+ const pre = await this.hooks.preToolUse(name, tool.risk, input);
59
+ if (!pre.allow) {
60
+ context.emit({ type: "tool_call", tool: name, input, risk: tool.risk });
61
+ return { content: pre.message ?? `Hook denied tool: ${name}`, isError: true };
62
+ }
63
+ if (pre.input)
64
+ effectiveInput = pre.input;
65
+ }
66
+ context.emit({ type: "tool_call", tool: name, input: effectiveInput, risk: tool.risk });
67
+ const approved = await context.requestApproval({
68
+ toolName: name,
69
+ risk: tool.risk,
70
+ reason: `Tool ${name} requested by the model.`,
71
+ input: effectiveInput,
72
+ });
73
+ if (!approved) {
74
+ return { content: `Permission denied for tool ${name}`, isError: true };
75
+ }
76
+ const rawResult = await tool.execute(effectiveInput, context);
77
+ const result = {
78
+ ...rawResult,
79
+ content: truncateMiddle(rawResult.content, MAX_TOOL_RESULT_CHARS),
80
+ };
81
+ if (this.hooks) {
82
+ await this.hooks.postToolUse(name, tool.risk, effectiveInput, result);
83
+ }
84
+ return result;
85
+ }
86
+ }
@@ -0,0 +1,68 @@
1
+ import type { TraceEvent, TraceSink } from "./types.js";
2
+ export type CliTraceOptions = {
3
+ verbose: boolean;
4
+ stream: boolean;
5
+ color: boolean;
6
+ status: boolean;
7
+ stdout?: NodeJS.WriteStream;
8
+ stderr?: NodeJS.WriteStream;
9
+ beforeOutput?: () => void;
10
+ afterOutput?: (text: string) => void;
11
+ suspendLiveStatus?: () => boolean;
12
+ /**
13
+ * Interactive CLI owns the wait spinner + green/red outcome line (index.ts).
14
+ * When true, this renderer must NOT print its own “Thought …” status lines
15
+ * (avoids double ● Thought for Xs).
16
+ */
17
+ staticStatus?: boolean;
18
+ };
19
+ export declare class CliTraceRenderer {
20
+ private readonly options;
21
+ private spinner?;
22
+ private spinnerIndex;
23
+ private statusText;
24
+ private statusDetail;
25
+ private statusLines;
26
+ private statusStartedAt;
27
+ private wroteAssistantText;
28
+ private thoughtStartedAt;
29
+ private turnStartedAt;
30
+ private hasPrintedTurn;
31
+ private turnSpacingPrinted;
32
+ private staticStatusActive;
33
+ private assistantLineBuffer;
34
+ private insideCodeFence;
35
+ private activeTasks;
36
+ constructor(options: CliTraceOptions);
37
+ sink(): TraceSink;
38
+ resetTurn(): void;
39
+ finishTurn(): void;
40
+ render(event: TraceEvent): void;
41
+ private startStatus;
42
+ private stopStatus;
43
+ /**
44
+ * @param silent When true, clear internal status without printing a bullet
45
+ * (used in interactive mode where index.ts owns the outcome line).
46
+ */
47
+ private completeStatus;
48
+ /** Non-interactive: Claude Code–style morphing glyph + shimmer label. */
49
+ private renderStatus;
50
+ private bullet;
51
+ private subBullet;
52
+ private renderFileChange;
53
+ private renderInteractiveToolResult;
54
+ private renderCodeChange;
55
+ private paint;
56
+ private elapsedThought;
57
+ private elapsedSince;
58
+ private writeAssistantDelta;
59
+ private flushAssistantLine;
60
+ private renderMarkdownLine;
61
+ private ensureTurnSpacing;
62
+ private clearStatusLines;
63
+ private out;
64
+ }
65
+ export declare function renderTraceEvent(event: TraceEvent): void;
66
+ export declare function createCliTraceSink(verbose: boolean): TraceSink;
67
+ export declare function stripTerminalEscapes(value: string): string;
68
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAiBxD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,qBAAa,gBAAgB;IAiBf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhBpC,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAoE;gBAE1D,OAAO,EAAE,eAAe;IAErD,IAAI,IAAI,SAAS;IAIjB,SAAS,IAAI,IAAI;IAajB,UAAU,IAAI,IAAI;IAelB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IA6H/B,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,UAAU;IAUlB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB,yEAAyE;IACzE,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,2BAA2B;IAgBnC,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,kBAAkB;IAmC1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,GAAG;CAKZ;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAOxD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAO9D;AA4ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAY1D"}