apex-code 0.0.1-alpha.10 → 0.0.1-alpha.11

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 (130) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +9 -8
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +24 -5
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +26 -0
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +77 -1
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/bash-executor.d.ts.map +1 -1
  11. package/dist/core/bash-executor.js +7 -0
  12. package/dist/core/bash-executor.js.map +1 -1
  13. package/dist/core/checkpoints/git-checkpoints.d.ts +33 -0
  14. package/dist/core/checkpoints/git-checkpoints.d.ts.map +1 -0
  15. package/dist/core/checkpoints/git-checkpoints.js +230 -0
  16. package/dist/core/checkpoints/git-checkpoints.js.map +1 -0
  17. package/dist/core/checkpoints/session-checkpoints.d.ts +23 -0
  18. package/dist/core/checkpoints/session-checkpoints.d.ts.map +1 -0
  19. package/dist/core/checkpoints/session-checkpoints.js +29 -0
  20. package/dist/core/checkpoints/session-checkpoints.js.map +1 -0
  21. package/dist/core/exec.d.ts.map +1 -1
  22. package/dist/core/exec.js +5 -2
  23. package/dist/core/exec.js.map +1 -1
  24. package/dist/core/extensions/loader.d.ts.map +1 -1
  25. package/dist/core/extensions/loader.js +7 -1
  26. package/dist/core/extensions/loader.js.map +1 -1
  27. package/dist/core/mcp/config.d.ts +16 -0
  28. package/dist/core/mcp/config.d.ts.map +1 -0
  29. package/dist/core/mcp/config.js +152 -0
  30. package/dist/core/mcp/config.js.map +1 -0
  31. package/dist/core/mcp/connector.d.ts +10 -0
  32. package/dist/core/mcp/connector.d.ts.map +1 -0
  33. package/dist/core/mcp/connector.js +70 -0
  34. package/dist/core/mcp/connector.js.map +1 -0
  35. package/dist/core/mcp/contract.d.ts +19 -0
  36. package/dist/core/mcp/contract.d.ts.map +1 -0
  37. package/dist/core/mcp/contract.js +89 -0
  38. package/dist/core/mcp/contract.js.map +1 -0
  39. package/dist/core/mcp/mcp-tool.d.ts +32 -0
  40. package/dist/core/mcp/mcp-tool.d.ts.map +1 -0
  41. package/dist/core/mcp/mcp-tool.js +165 -0
  42. package/dist/core/mcp/mcp-tool.js.map +1 -0
  43. package/dist/core/mcp/metadata-cache.d.ts +29 -0
  44. package/dist/core/mcp/metadata-cache.d.ts.map +1 -0
  45. package/dist/core/mcp/metadata-cache.js +99 -0
  46. package/dist/core/mcp/metadata-cache.js.map +1 -0
  47. package/dist/core/mcp/runtime.d.ts +18 -0
  48. package/dist/core/mcp/runtime.d.ts.map +1 -0
  49. package/dist/core/mcp/runtime.js +35 -0
  50. package/dist/core/mcp/runtime.js.map +1 -0
  51. package/dist/core/mcp/schema.d.ts +22 -0
  52. package/dist/core/mcp/schema.d.ts.map +1 -0
  53. package/dist/core/mcp/schema.js +20 -0
  54. package/dist/core/mcp/schema.js.map +1 -0
  55. package/dist/core/mcp/server-manager.d.ts +43 -0
  56. package/dist/core/mcp/server-manager.d.ts.map +1 -0
  57. package/dist/core/mcp/server-manager.js +142 -0
  58. package/dist/core/mcp/server-manager.js.map +1 -0
  59. package/dist/core/mcp/types.d.ts +98 -0
  60. package/dist/core/mcp/types.d.ts.map +1 -0
  61. package/dist/core/mcp/types.js +8 -0
  62. package/dist/core/mcp/types.js.map +1 -0
  63. package/dist/core/sdk.d.ts.map +1 -1
  64. package/dist/core/sdk.js +14 -1
  65. package/dist/core/sdk.js.map +1 -1
  66. package/dist/core/session-manager.d.ts +13 -1
  67. package/dist/core/session-manager.d.ts.map +1 -1
  68. package/dist/core/session-manager.js +30 -3
  69. package/dist/core/session-manager.js.map +1 -1
  70. package/dist/core/settings-manager.d.ts +7 -0
  71. package/dist/core/settings-manager.d.ts.map +1 -1
  72. package/dist/core/settings-manager.js +3 -0
  73. package/dist/core/settings-manager.js.map +1 -1
  74. package/dist/core/slash-commands.d.ts.map +1 -1
  75. package/dist/core/slash-commands.js +1 -0
  76. package/dist/core/slash-commands.js.map +1 -1
  77. package/dist/core/tools/contract-snapshot.d.ts +58 -0
  78. package/dist/core/tools/contract-snapshot.d.ts.map +1 -0
  79. package/dist/core/tools/contract-snapshot.js +51 -0
  80. package/dist/core/tools/contract-snapshot.js.map +1 -0
  81. package/dist/core/tools/contract.d.ts +4 -2
  82. package/dist/core/tools/contract.d.ts.map +1 -1
  83. package/dist/core/tools/contract.js +4 -2
  84. package/dist/core/tools/contract.js.map +1 -1
  85. package/dist/core/tools/index.d.ts +9 -0
  86. package/dist/core/tools/index.d.ts.map +1 -1
  87. package/dist/core/tools/index.js +3 -0
  88. package/dist/core/tools/index.js.map +1 -1
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +2 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/main.d.ts.map +1 -1
  94. package/dist/main.js +6 -6
  95. package/dist/main.js.map +1 -1
  96. package/dist/modes/interactive/components/assistant-message.d.ts +29 -0
  97. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  98. package/dist/modes/interactive/components/assistant-message.js +182 -23
  99. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  100. package/dist/modes/interactive/components/bash-execution.d.ts +7 -0
  101. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  102. package/dist/modes/interactive/components/bash-execution.js +20 -0
  103. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  104. package/dist/modes/interactive/components/footer.d.ts +8 -0
  105. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/footer.js +29 -9
  107. package/dist/modes/interactive/components/footer.js.map +1 -1
  108. package/dist/modes/interactive/components/tool-execution.d.ts +12 -0
  109. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  110. package/dist/modes/interactive/components/tool-execution.js +31 -0
  111. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  112. package/dist/modes/interactive/interactive-mode.d.ts +29 -0
  113. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  114. package/dist/modes/interactive/interactive-mode.js +88 -4
  115. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  116. package/dist/package-manager-cli.d.ts.map +1 -1
  117. package/dist/package-manager-cli.js +0 -6
  118. package/dist/package-manager-cli.js.map +1 -1
  119. package/dist/utils/version-check.d.ts.map +1 -1
  120. package/dist/utils/version-check.js +6 -4
  121. package/dist/utils/version-check.js.map +1 -1
  122. package/docs/compaction.md +2 -0
  123. package/docs/environment-variables.md +1 -1
  124. package/examples/extensions/git-checkpoint.ts +24 -36
  125. package/npm-shrinkwrap.json +176 -28
  126. package/package.json +10 -8
  127. package/dist/server/create-harness.d.ts +0 -26
  128. package/dist/server/create-harness.d.ts.map +0 -1
  129. package/dist/server/create-harness.js +0 -107
  130. package/dist/server/create-harness.js.map +0 -1
@@ -1,107 +0,0 @@
1
- import { AgentHarness, createBashTool, createEditTool, createReadTool, createWriteTool, } from "apex-code-agent-core";
2
- import { setApexEnvironment } from "../core/environment.js";
3
- import { getExperimentalToolSampling } from "../core/experimental.js";
4
- import { buildSystemPrompt } from "../core/system-prompt.js";
5
- import { bashToolSystemPromptContribution } from "../core/tools/bash.js";
6
- import { editToolSystemPromptContribution } from "../core/tools/edit.js";
7
- import { readToolSystemPromptContribution } from "../core/tools/read.js";
8
- import { writeToolSystemPromptContribution } from "../core/tools/write.js";
9
- function createCodingAgentHarnessTool(tool, context, prompt) {
10
- return {
11
- ...tool,
12
- ...prompt,
13
- constrainedSampling: getExperimentalToolSampling(),
14
- execute: (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate, context),
15
- };
16
- }
17
- export function buildCodingAgentHarnessSystemPrompt(options) {
18
- const activeTools = options.activeToolNames.flatMap((name) => {
19
- const tool = options.tools.find((candidate) => candidate.name === name);
20
- return tool ? [tool] : [];
21
- });
22
- const toolSnippets = Object.fromEntries(activeTools.flatMap((tool) => {
23
- const promptSnippet = tool.promptSnippet
24
- ?.replace(/[\r\n]+/g, " ")
25
- .replace(/\s+/g, " ")
26
- .trim();
27
- return promptSnippet ? [[tool.name, promptSnippet]] : [];
28
- }));
29
- const promptGuidelines = activeTools.flatMap((tool) => tool.promptGuidelines ?? []);
30
- return buildSystemPrompt({
31
- ...options.systemPromptOptions,
32
- cwd: options.cwd,
33
- selectedTools: activeTools.map((tool) => tool.name),
34
- toolSnippets,
35
- promptGuidelines,
36
- });
37
- }
38
- export async function createCodingAgentHarness(options) {
39
- const { env, bashCommandPrefix, sessionFile, systemPromptOptions, tools: providedTools, activeToolNames: providedActiveToolNames, systemPrompt: providedSystemPrompt, ...harnessOptions } = options;
40
- let harness;
41
- const getHarness = () => {
42
- if (!harness)
43
- throw new Error("Coding-agent Harness callback ran before Harness initialization");
44
- return harness;
45
- };
46
- let tools = providedTools;
47
- if (tools === undefined) {
48
- const metadata = await options.session.getMetadata();
49
- const toolContext = { env };
50
- tools = [
51
- createCodingAgentHarnessTool(createReadTool(), toolContext, {
52
- promptSnippet: readToolSystemPromptContribution.snippet,
53
- promptGuidelines: readToolSystemPromptContribution.guidelines,
54
- }),
55
- createCodingAgentHarnessTool(createBashTool({
56
- commandPrefix: bashCommandPrefix,
57
- prepare: async (execution) => {
58
- const currentHarness = getHarness();
59
- const [model, thinkingLevel] = await Promise.all([
60
- currentHarness.getModel(),
61
- currentHarness.getThinkingLevel(),
62
- ]);
63
- setApexEnvironment("APEX_CODE_SESSION_ID", metadata.id, execution.env);
64
- setApexEnvironment("APEX_CODE_SESSION_FILE", sessionFile ?? "", execution.env);
65
- setApexEnvironment("APEX_CODE_PROVIDER", model.provider, execution.env);
66
- setApexEnvironment("APEX_CODE_MODEL", model.id, execution.env);
67
- setApexEnvironment("APEX_CODE_REASONING_LEVEL", thinkingLevel, execution.env);
68
- },
69
- }), toolContext, {
70
- promptSnippet: bashToolSystemPromptContribution.snippet,
71
- promptGuidelines: bashToolSystemPromptContribution.guidelines,
72
- }),
73
- createCodingAgentHarnessTool(createEditTool(), toolContext, {
74
- promptSnippet: editToolSystemPromptContribution.snippet,
75
- promptGuidelines: editToolSystemPromptContribution.guidelines,
76
- }),
77
- createCodingAgentHarnessTool(createWriteTool(), toolContext, {
78
- promptSnippet: writeToolSystemPromptContribution.snippet,
79
- promptGuidelines: writeToolSystemPromptContribution.guidelines,
80
- }),
81
- ];
82
- }
83
- const activeToolNames = [...(providedActiveToolNames ?? tools.map((tool) => tool.name))];
84
- const systemPrompt = providedSystemPrompt ??
85
- (async () => {
86
- const currentHarness = getHarness();
87
- const [currentTools, currentActiveToolNames] = await Promise.all([
88
- currentHarness.getTools(),
89
- currentHarness.getActiveTools(),
90
- ]);
91
- return buildCodingAgentHarnessSystemPrompt({
92
- cwd: env.cwd,
93
- tools: currentTools,
94
- activeToolNames: currentActiveToolNames,
95
- systemPromptOptions,
96
- });
97
- });
98
- const created = await AgentHarness.create({
99
- ...harnessOptions,
100
- tools,
101
- activeToolNames,
102
- systemPrompt,
103
- });
104
- harness = created.harness;
105
- return created;
106
- }
107
- //# sourceMappingURL=create-harness.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-harness.js","sourceRoot":"","sources":["../../src/server/create-harness.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tAgentHarness,\n\ttype AgentHarnessOptions,\n\ttype AgentHarnessTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateReadTool,\n\tcreateWriteTool,\n\ttype ExecutionEnv,\n\ttype ExecutionToolContext,\n\ttype HarnessTool,\n} from \"apex-code-agent-core\";\nimport type { Static, TSchema } from \"typebox\";\nimport { setApexEnvironment } from \"../core/environment.ts\";\nimport { getExperimentalToolSampling } from \"../core/experimental.ts\";\nimport { type BuildSystemPromptOptions, buildSystemPrompt } from \"../core/system-prompt.ts\";\nimport { bashToolSystemPromptContribution } from \"../core/tools/bash.ts\";\nimport { editToolSystemPromptContribution } from \"../core/tools/edit.ts\";\nimport { readToolSystemPromptContribution } from \"../core/tools/read.ts\";\nimport { writeToolSystemPromptContribution } from \"../core/tools/write.ts\";\n\nexport interface CodingAgentHarnessTool extends HarnessTool {\n\tpromptSnippet?: string;\n\tpromptGuidelines?: readonly string[];\n}\n\nfunction createCodingAgentHarnessTool<TParameters extends TSchema, TDetails>(\n\ttool: AgentHarnessTool<ExecutionToolContext, TParameters, TDetails>,\n\tcontext: ExecutionToolContext,\n\tprompt: Required<Pick<CodingAgentHarnessTool, \"promptSnippet\" | \"promptGuidelines\">>,\n): CodingAgentHarnessTool {\n\treturn {\n\t\t...tool,\n\t\t...prompt,\n\t\tconstrainedSampling: getExperimentalToolSampling(),\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\ttool.execute(toolCallId, params as Static<TParameters>, signal, onUpdate, context),\n\t};\n}\n\nexport interface CreateCodingAgentHarnessOptions extends Omit<AgentHarnessOptions, \"toolContext\" | \"tools\"> {\n\tenv: ExecutionEnv;\n\tbashCommandPrefix?: string;\n\t/** Path to the JSONL session file exposed to default bash commands as APEX_CODE_SESSION_FILE. */\n\tsessionFile?: string;\n\ttools?: CodingAgentHarnessTool[];\n\tsystemPromptOptions?: Omit<BuildSystemPromptOptions, \"cwd\" | \"promptGuidelines\" | \"selectedTools\" | \"toolSnippets\">;\n}\n\nexport interface BuildCodingAgentHarnessSystemPromptOptions {\n\tcwd: string;\n\ttools: readonly CodingAgentHarnessTool[];\n\tactiveToolNames: readonly string[];\n\tsystemPromptOptions?: CreateCodingAgentHarnessOptions[\"systemPromptOptions\"];\n}\n\nexport function buildCodingAgentHarnessSystemPrompt(options: BuildCodingAgentHarnessSystemPromptOptions): string {\n\tconst activeTools = options.activeToolNames.flatMap((name) => {\n\t\tconst tool = options.tools.find((candidate) => candidate.name === name);\n\t\treturn tool ? [tool] : [];\n\t});\n\tconst toolSnippets = Object.fromEntries(\n\t\tactiveTools.flatMap((tool) => {\n\t\t\tconst promptSnippet = tool.promptSnippet\n\t\t\t\t?.replace(/[\\r\\n]+/g, \" \")\n\t\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t\t.trim();\n\t\t\treturn promptSnippet ? [[tool.name, promptSnippet]] : [];\n\t\t}),\n\t);\n\tconst promptGuidelines = activeTools.flatMap((tool) => tool.promptGuidelines ?? []);\n\treturn buildSystemPrompt({\n\t\t...options.systemPromptOptions,\n\t\tcwd: options.cwd,\n\t\tselectedTools: activeTools.map((tool) => tool.name),\n\t\ttoolSnippets,\n\t\tpromptGuidelines,\n\t});\n}\n\nexport async function createCodingAgentHarness(options: CreateCodingAgentHarnessOptions) {\n\tconst {\n\t\tenv,\n\t\tbashCommandPrefix,\n\t\tsessionFile,\n\t\tsystemPromptOptions,\n\t\ttools: providedTools,\n\t\tactiveToolNames: providedActiveToolNames,\n\t\tsystemPrompt: providedSystemPrompt,\n\t\t...harnessOptions\n\t} = options;\n\tlet harness: AgentHarness | undefined;\n\tconst getHarness = (): AgentHarness => {\n\t\tif (!harness) throw new Error(\"Coding-agent Harness callback ran before Harness initialization\");\n\t\treturn harness;\n\t};\n\tlet tools = providedTools;\n\tif (tools === undefined) {\n\t\tconst metadata = await options.session.getMetadata();\n\t\tconst toolContext = { env } satisfies ExecutionToolContext;\n\t\ttools = [\n\t\t\tcreateCodingAgentHarnessTool(createReadTool<ExecutionToolContext>(), toolContext, {\n\t\t\t\tpromptSnippet: readToolSystemPromptContribution.snippet,\n\t\t\t\tpromptGuidelines: readToolSystemPromptContribution.guidelines,\n\t\t\t}),\n\t\t\tcreateCodingAgentHarnessTool(\n\t\t\t\tcreateBashTool<ExecutionToolContext>({\n\t\t\t\t\tcommandPrefix: bashCommandPrefix,\n\t\t\t\t\tprepare: async (execution) => {\n\t\t\t\t\t\tconst currentHarness = getHarness();\n\t\t\t\t\t\tconst [model, thinkingLevel] = await Promise.all([\n\t\t\t\t\t\t\tcurrentHarness.getModel(),\n\t\t\t\t\t\t\tcurrentHarness.getThinkingLevel(),\n\t\t\t\t\t\t]);\n\t\t\t\t\t\tsetApexEnvironment(\"APEX_CODE_SESSION_ID\", metadata.id, execution.env);\n\t\t\t\t\t\tsetApexEnvironment(\"APEX_CODE_SESSION_FILE\", sessionFile ?? \"\", execution.env);\n\t\t\t\t\t\tsetApexEnvironment(\"APEX_CODE_PROVIDER\", model.provider, execution.env);\n\t\t\t\t\t\tsetApexEnvironment(\"APEX_CODE_MODEL\", model.id, execution.env);\n\t\t\t\t\t\tsetApexEnvironment(\"APEX_CODE_REASONING_LEVEL\", thinkingLevel, execution.env);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\ttoolContext,\n\t\t\t\t{\n\t\t\t\t\tpromptSnippet: bashToolSystemPromptContribution.snippet,\n\t\t\t\t\tpromptGuidelines: bashToolSystemPromptContribution.guidelines,\n\t\t\t\t},\n\t\t\t),\n\t\t\tcreateCodingAgentHarnessTool(createEditTool<ExecutionToolContext>(), toolContext, {\n\t\t\t\tpromptSnippet: editToolSystemPromptContribution.snippet,\n\t\t\t\tpromptGuidelines: editToolSystemPromptContribution.guidelines,\n\t\t\t}),\n\t\t\tcreateCodingAgentHarnessTool(createWriteTool<ExecutionToolContext>(), toolContext, {\n\t\t\t\tpromptSnippet: writeToolSystemPromptContribution.snippet,\n\t\t\t\tpromptGuidelines: writeToolSystemPromptContribution.guidelines,\n\t\t\t}),\n\t\t];\n\t}\n\tconst activeToolNames = [...(providedActiveToolNames ?? tools.map((tool) => tool.name))];\n\tconst systemPrompt =\n\t\tprovidedSystemPrompt ??\n\t\t(async () => {\n\t\t\tconst currentHarness = getHarness();\n\t\t\tconst [currentTools, currentActiveToolNames] = await Promise.all([\n\t\t\t\tcurrentHarness.getTools(),\n\t\t\t\tcurrentHarness.getActiveTools(),\n\t\t\t]);\n\t\t\treturn buildCodingAgentHarnessSystemPrompt({\n\t\t\t\tcwd: env.cwd,\n\t\t\t\ttools: currentTools,\n\t\t\t\tactiveToolNames: currentActiveToolNames,\n\t\t\t\tsystemPromptOptions,\n\t\t\t});\n\t\t});\n\tconst created = await AgentHarness.create({\n\t\t...harnessOptions,\n\t\ttools,\n\t\tactiveToolNames,\n\t\tsystemPrompt,\n\t});\n\tharness = created.harness;\n\treturn created;\n}\n"]}