@waishnav/devspace 1.0.0 → 1.0.1
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/LICENSE +21 -0
- package/README.md +3 -9
- package/dist/config.js +16 -7
- package/dist/review-checkpoints.js +4 -4
- package/dist/server.js +15 -15
- package/dist/ui/.vite/manifest.json +280 -280
- package/dist/ui/assets/{angular-html-Di31D1W0.js → angular-html-B_77pPm_.js} +1 -1
- package/dist/ui/assets/{angular-ts-BKuSFrBS.js → angular-ts-tGBi7sOr.js} +1 -1
- package/dist/ui/assets/{apl-DgqYbYoh.js → apl-CtVPpGgP.js} +1 -1
- package/dist/ui/assets/{astro-B19gi6Os.js → astro-CALPYvnG.js} +1 -1
- package/dist/ui/assets/{blade-BKHjA4oS.js → blade-Bh4eBXdk.js} +1 -1
- package/dist/ui/assets/{c-FjyGimBn.js → c-BGkebjQE.js} +1 -1
- package/dist/ui/assets/{cobol-DlmtgjjX.js → cobol-f7rP2PjR.js} +1 -1
- package/dist/ui/assets/{coffee-BlTKLwcf.js → coffee-E4OhMc7W.js} +1 -1
- package/dist/ui/assets/{cpp-DtVUwoaa.js → cpp-Cr_J6lB2.js} +1 -1
- package/dist/ui/assets/{crystal-C0TLGTHr.js → crystal-B_TFXhon.js} +1 -1
- package/dist/ui/assets/{css-FssmIjiX.js → css-DDMxq-4J.js} +1 -1
- package/dist/ui/assets/{edge-_m-12TBz.js → edge-Bxqhgg5I.js} +1 -1
- package/dist/ui/assets/{elixir-RKJED3b7.js → elixir-WrSbgJJ1.js} +1 -1
- package/dist/ui/assets/{elm-CzMSD9Oq.js → elm-BXBWJ4Kz.js} +1 -1
- package/dist/ui/assets/{erb-Cqpp-3vK.js → erb-D0iMw9rO.js} +1 -1
- package/dist/ui/assets/{git-rebase-DLS2r2oj.js → git-rebase-BOrZ-_iR.js} +1 -1
- package/dist/ui/assets/{glimmer-js-B1t-JGK1.js → glimmer-js-PCWk96O8.js} +1 -1
- package/dist/ui/assets/{glimmer-ts-CazygCNf.js → glimmer-ts-4pYwX8pC.js} +1 -1
- package/dist/ui/assets/{glsl-gBg2vKZ-.js → glsl-CDyKZvZX.js} +1 -1
- package/dist/ui/assets/{graphql-C8u6MNtl.js → graphql-8sIw92YT.js} +1 -1
- package/dist/ui/assets/{hack-CgKuqejW.js → hack-Ci96Zcew.js} +1 -1
- package/dist/ui/assets/{haml-I5WU4_Rg.js → haml-4uzh6End.js} +1 -1
- package/dist/ui/assets/{handlebars-DGf6O3Q6.js → handlebars-B6Eq7QV8.js} +1 -1
- package/dist/ui/assets/{heavy-payload-Bp6srDbj.js → heavy-payload--bwRtRpo.js} +1 -1
- package/dist/ui/assets/{html-BrIuweS5.js → html-C29wL7bm.js} +1 -1
- package/dist/ui/assets/{html-derivative-CflP_1S6.js → html-derivative-Cmd90ilz.js} +1 -1
- package/dist/ui/assets/{http-qgGkv9Ds.js → http-Bdr_R0Kw.js} +1 -1
- package/dist/ui/assets/{hurl-CantyQ5z.js → hurl-CiTPn-zH.js} +1 -1
- package/dist/ui/assets/{java-DqStxnBY.js → java-C03kBuJH.js} +1 -1
- package/dist/ui/assets/{javascript-CJ1ZUMNM.js → javascript-135g9Wwx.js} +1 -1
- package/dist/ui/assets/{jinja-Ta-y-8tW.js → jinja-CPpiEHqV.js} +1 -1
- package/dist/ui/assets/{jison-DZStAtdf.js → jison-qabCQzwp.js} +1 -1
- package/dist/ui/assets/{json-Bfn_pgvS.js → json-CtRj9Trp.js} +1 -1
- package/dist/ui/assets/{jsx-CFi5D1JI.js → jsx-Ccuy5Wm3.js} +1 -1
- package/dist/ui/assets/{julia-CmuPb_FV.js → julia-Fwya-MwM.js} +1 -1
- package/dist/ui/assets/{just-xoDaYyy4.js → just-c9YEH7Gf.js} +1 -1
- package/dist/ui/assets/{latex-C7jbQT4s.js → latex-D9xoD6UX.js} +1 -1
- package/dist/ui/assets/{liquid-DyVckOju.js → liquid-BKZLZSHN.js} +1 -1
- package/dist/ui/assets/{lua-CQGEo-kr.js → lua-CBD2zNyC.js} +1 -1
- package/dist/ui/assets/{marko-CF3FIlcL.js → marko-Dkgf9bj3.js} +1 -1
- package/dist/ui/assets/{mdc-DJfBh8KU.js → mdc-BUgUKiX3.js} +1 -1
- package/dist/ui/assets/{nginx-CmN5T-d3.js → nginx-CAaav4Zh.js} +1 -1
- package/dist/ui/assets/{nim-a_705mqZ.js → nim-CTjWWztL.js} +1 -1
- package/dist/ui/assets/{perl-BFxFi55O.js → perl-DTM5zgH4.js} +1 -1
- package/dist/ui/assets/{php-C9Uf0Vo_.js → php-dqfFDbWm.js} +1 -1
- package/dist/ui/assets/{pug-DQIrtlYh.js → pug-4f_clTm2.js} +1 -1
- package/dist/ui/assets/{qml-CpI_Asuw.js → qml-BFeWjFRL.js} +1 -1
- package/dist/ui/assets/{r-hYZdyIMH.js → r-ei1iNvHm.js} +1 -1
- package/dist/ui/assets/{razor-CbXx350T.js → razor-jj95jncJ.js} +1 -1
- package/dist/ui/assets/{regexp-BdfO5R2u.js → regexp-0joUf3Cn.js} +1 -1
- package/dist/ui/assets/{review-payload-CC-3-Lb9.js → review-payload-DxI2fTnP.js} +1 -1
- package/dist/ui/assets/{rst-CP6mAm3Y.js → rst-BMbcN8--.js} +1 -1
- package/dist/ui/assets/{ruby-8tjXzrRr.js → ruby-BQx0xtOB.js} +1 -1
- package/dist/ui/assets/{sas-rqWHY37U.js → sas-C_Fl1EyP.js} +1 -1
- package/dist/ui/assets/{scss-aGYgGui9.js → scss-5vaLJPJl.js} +1 -1
- package/dist/ui/assets/{shellscript-CYr5JWBI.js → shellscript-p_y7YCYP.js} +1 -1
- package/dist/ui/assets/{shellsession-CO3ljRR7.js → shellsession-ChZkMp2K.js} +1 -1
- package/dist/ui/assets/{soy-C4_rLmHV.js → soy-im25cA8U.js} +1 -1
- package/dist/ui/assets/{sql-2jcbKHJ9.js → sql-BzvG6ssm.js} +1 -1
- package/dist/ui/assets/{stata-Dbr0lM_v.js → stata-CwSzNM20.js} +1 -1
- package/dist/ui/assets/{surrealql-Cp0eMxMo.js → surrealql-BWzKhI6S.js} +1 -1
- package/dist/ui/assets/{svelte-BfsT9lcS.js → svelte-NMlQHjaa.js} +1 -1
- package/dist/ui/assets/{templ-BBOwNqeW.js → templ-1W11KGSL.js} +1 -1
- package/dist/ui/assets/{tex-CPmn_RsX.js → tex-CTxN8q2c.js} +1 -1
- package/dist/ui/assets/{ts-tags-DMILlUz_.js → ts-tags-B6prphu-.js} +1 -1
- package/dist/ui/assets/{tsx-CUP2Lfiz.js → tsx-Daks24y9.js} +1 -1
- package/dist/ui/assets/{twig-DEZ_7SDX.js → twig-C0KeCxch.js} +1 -1
- package/dist/ui/assets/{typescript-DhaMQEhQ.js → typescript-37-dkCwp.js} +1 -1
- package/dist/ui/assets/{useFileDiffInstance-Bo6irrE6.js → useFileDiffInstance--R0_ywL_.js} +3 -3
- package/dist/ui/assets/{vue-CAaS6wtt.js → vue-Ba-v02vP.js} +1 -1
- package/dist/ui/assets/{vue-html-D3Etensv.js → vue-html-D2UmbuN7.js} +1 -1
- package/dist/ui/assets/{vue-vine-DNRKj0Lh.js → vue-vine-ZftUW_ID.js} +1 -1
- package/dist/ui/assets/{workspace-app-BLeU1qC_.js → workspace-app-CsMiGtz9.js} +4 -4
- package/dist/ui/assets/{xml-M-X6I2aP.js → xml-DrhRYxTS.js} +1 -1
- package/dist/ui/assets/{xsl-CR0ZlrL7.js → xsl-DvbIvBcQ.js} +1 -1
- package/dist/ui/assets/{yaml-pI4xDDgj.js → yaml-oktUYAzQ.js} +1 -1
- package/dist/ui/workspace-app.html +1 -1
- package/docs/chatgpt-coding-workflow.md +22 -22
- package/docs/configuration.md +13 -10
- package/docs/gotchas.md +5 -4
- package/package.json +2 -4
- package/scripts/dev-server.mjs +120 -0
- package/scripts/build-release.mjs +0 -89
- package/scripts/ensure-native-deps.mjs +0 -29
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Waishnav
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -65,12 +65,12 @@ After the MCP client connects, ChatGPT can open a project with
|
|
|
65
65
|
DevSpace provides tools for:
|
|
66
66
|
|
|
67
67
|
- reading, writing, and editing files inside the opened workspace
|
|
68
|
-
-
|
|
68
|
+
- running shell-backed search and directory inspection in the default minimal tool mode
|
|
69
69
|
- running shell commands for tests, builds, git, and package scripts
|
|
70
70
|
- opening isolated Git worktrees when you want parallel work
|
|
71
71
|
- loading `AGENTS.md` and `CLAUDE.md` instructions
|
|
72
72
|
- exposing local agent skills from your skill folders
|
|
73
|
-
- showing ChatGPT Apps
|
|
73
|
+
- showing ChatGPT Apps tool cards, with an opt-in aggregate `show_changes` card
|
|
74
74
|
|
|
75
75
|
The default local endpoint is:
|
|
76
76
|
|
|
@@ -132,15 +132,9 @@ For working on DevSpace itself:
|
|
|
132
132
|
|
|
133
133
|
```bash
|
|
134
134
|
npm install --include=dev
|
|
135
|
+
npm run dev
|
|
135
136
|
npm run typecheck
|
|
136
137
|
npm test
|
|
137
138
|
npm run build
|
|
138
139
|
npm run start
|
|
139
140
|
```
|
|
140
|
-
|
|
141
|
-
For long-running local server processes, build an immutable release copy:
|
|
142
|
-
|
|
143
|
-
```bash
|
|
144
|
-
npm run release:build
|
|
145
|
-
npm run release:start
|
|
146
|
-
```
|
package/dist/config.js
CHANGED
|
@@ -45,7 +45,16 @@ function parseBoolean(value) {
|
|
|
45
45
|
return ["1", "true", "yes", "on"].includes(value?.toLowerCase() ?? "");
|
|
46
46
|
}
|
|
47
47
|
function parseMinimalTools(env) {
|
|
48
|
-
|
|
48
|
+
if (env.DEVSPACE_TOOL_MODE === "minimal")
|
|
49
|
+
return true;
|
|
50
|
+
if (env.DEVSPACE_TOOL_MODE === "full")
|
|
51
|
+
return false;
|
|
52
|
+
if (env.DEVSPACE_TOOL_MODE) {
|
|
53
|
+
throw new Error(`Invalid DEVSPACE_TOOL_MODE: ${env.DEVSPACE_TOOL_MODE}`);
|
|
54
|
+
}
|
|
55
|
+
if (env.DEVSPACE_MINIMAL_TOOLS !== undefined)
|
|
56
|
+
return parseBoolean(env.DEVSPACE_MINIMAL_TOOLS);
|
|
57
|
+
return true;
|
|
49
58
|
}
|
|
50
59
|
function parseLogLevel(value) {
|
|
51
60
|
if (!value || value === "info")
|
|
@@ -85,10 +94,10 @@ function parsePositiveInteger(value, fallback, name) {
|
|
|
85
94
|
return parsed;
|
|
86
95
|
}
|
|
87
96
|
function parseToolNaming(value) {
|
|
88
|
-
if (!value || value === "
|
|
89
|
-
return "legacy";
|
|
90
|
-
if (value === "short")
|
|
97
|
+
if (!value || value === "short")
|
|
91
98
|
return "short";
|
|
99
|
+
if (value === "legacy")
|
|
100
|
+
return "legacy";
|
|
92
101
|
throw new Error(`Invalid DEVSPACE_TOOL_NAMING: ${value}`);
|
|
93
102
|
}
|
|
94
103
|
function parseLoggingConfig(env) {
|
|
@@ -103,9 +112,9 @@ function parseLoggingConfig(env) {
|
|
|
103
112
|
};
|
|
104
113
|
}
|
|
105
114
|
function parseWidgetMode(value) {
|
|
106
|
-
if (!value || value === "
|
|
107
|
-
return "
|
|
108
|
-
if (value === "off" || value === "
|
|
115
|
+
if (!value || value === "full")
|
|
116
|
+
return "full";
|
|
117
|
+
if (value === "off" || value === "changes")
|
|
109
118
|
return value;
|
|
110
119
|
throw new Error(`Invalid DEVSPACE_WIDGETS: ${value}`);
|
|
111
120
|
}
|
|
@@ -13,7 +13,7 @@ export function createReviewCheckpointManager() {
|
|
|
13
13
|
try {
|
|
14
14
|
const eligibility = await getGitEligibility(root);
|
|
15
15
|
if (!eligibility.ok || !eligibility.gitRoot) {
|
|
16
|
-
state.diagnostic = eligibility.message ?? "
|
|
16
|
+
state.diagnostic = eligibility.message ?? "show_changes requires a Git workspace in this version.";
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
state.gitRoot = eligibility.gitRoot;
|
|
@@ -25,14 +25,14 @@ export function createReviewCheckpointManager() {
|
|
|
25
25
|
state.diagnostic = error instanceof Error ? error.message : String(error);
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
|
-
async reviewChanges({ workspaceId, root, since = "
|
|
28
|
+
async reviewChanges({ workspaceId, root, since = "last_shown", markReviewed = true }) {
|
|
29
29
|
let state = states.get(workspaceId);
|
|
30
30
|
if (!state) {
|
|
31
31
|
await this.initializeWorkspace({ workspaceId, root });
|
|
32
32
|
state = states.get(workspaceId);
|
|
33
33
|
}
|
|
34
34
|
if (!state?.gitRoot) {
|
|
35
|
-
throw new Error(state?.diagnostic ?? "
|
|
35
|
+
throw new Error(state?.diagnostic ?? "show_changes requires a Git workspace in this version.");
|
|
36
36
|
}
|
|
37
37
|
const baselineRef = since === "workspace_open" ? state.openRef : state.baselineRef;
|
|
38
38
|
const baseline = (await git(state.gitRoot, ["rev-parse", "--verify", `${baselineRef}^{commit}`])).stdout.trim();
|
|
@@ -50,7 +50,7 @@ export function createReviewCheckpointManager() {
|
|
|
50
50
|
}
|
|
51
51
|
return {
|
|
52
52
|
result: summary.files === 0
|
|
53
|
-
? `No changes since ${since === "workspace_open" ? "workspace open" : "last
|
|
53
|
+
? `No changes since ${since === "workspace_open" ? "workspace open" : "last shown changes"}.`
|
|
54
54
|
: `Changed ${summary.files} ${summary.files === 1 ? "file" : "files"} (+${summary.additions} -${summary.removals}).`,
|
|
55
55
|
summary,
|
|
56
56
|
files,
|
package/dist/server.js
CHANGED
|
@@ -45,7 +45,7 @@ function shouldAttachWidget(mode, kind) {
|
|
|
45
45
|
case "off":
|
|
46
46
|
return false;
|
|
47
47
|
case "changes":
|
|
48
|
-
return kind === "workspace" || kind === "
|
|
48
|
+
return kind === "workspace" || kind === "show_changes";
|
|
49
49
|
case "full":
|
|
50
50
|
return true;
|
|
51
51
|
}
|
|
@@ -93,10 +93,10 @@ function serverInstructions(config, toolNames) {
|
|
|
93
93
|
? `When ${toolNames.openWorkspace} returns available skills and a task matches a skill, use ${toolNames.read} to read that skill's path before proceeding. Skill paths may be outside the workspace, but ${toolNames.read} only permits advertised SKILL.md files and files under already-loaded skill directories. `
|
|
94
94
|
: "";
|
|
95
95
|
const agentsMd = `Follow instructions returned by ${toolNames.openWorkspace}. Before working under a path listed in availableAgentsFiles, use ${toolNames.read} to inspect that instruction file and follow it. `;
|
|
96
|
-
const
|
|
97
|
-
? " After
|
|
96
|
+
const showChanges = config.widgets === "changes"
|
|
97
|
+
? " After creating, editing, or overwriting files, call show_changes once after the related file changes are complete so the user can see the aggregate diff."
|
|
98
98
|
: "";
|
|
99
|
-
return `Use DevSpace as a local coding workspace. Call ${toolNames.openWorkspace} once per project folder or worktree to obtain a workspaceId. Reuse that same workspaceId for all later file, search, edit, write,
|
|
99
|
+
return `Use DevSpace as a local coding workspace. Call ${toolNames.openWorkspace} once per project folder or worktree to obtain a workspaceId. Reuse that same workspaceId for all later file, search, edit, write, show-changes, and shell tools in that folder; do not call ${toolNames.openWorkspace} again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. ${agentsMd}${skills}${inspection}Prefer ${toolNames.edit} for targeted modifications, ${toolNames.write} only for new files or complete rewrites, and ${toolNames.shell} for tests, builds, git inspection, package scripts, and commands that are better executed by the shell. Do not create or modify files with ${toolNames.shell}; avoid shell redirection, heredocs, tee, sed -i, perl -i, node/python/ruby scripts, or any command whose purpose is to write project files.${showChanges}`;
|
|
100
100
|
}
|
|
101
101
|
function resultOutputSchema(extra = {}) {
|
|
102
102
|
return {
|
|
@@ -328,7 +328,7 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
|
|
|
328
328
|
});
|
|
329
329
|
registerAppTool(server, "open_workspace", {
|
|
330
330
|
title: "Open workspace",
|
|
331
|
-
description: "Open a local project directory as a coding workspace. Call this once per project folder or worktree before reading, editing, searching, writing,
|
|
331
|
+
description: "Open a local project directory as a coding workspace. Call this once per project folder or worktree before reading, editing, searching, writing, showing changes, or running commands. Reuse the returned workspaceId for later calls in the same folder; do not call open_workspace again unless switching folders/worktrees, changing checkout/worktree mode, the workspaceId is rejected as unknown, or the user explicitly asks to reopen. By default this opens the actual checkout; set mode=\"worktree\" when the user asks for an isolated or parallel coding session. Returns a workspaceId, loaded root project instructions, and nested instruction file paths the model should read before working in those directories.",
|
|
332
332
|
inputSchema: {
|
|
333
333
|
path: z
|
|
334
334
|
.string()
|
|
@@ -669,24 +669,24 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
|
|
|
669
669
|
};
|
|
670
670
|
});
|
|
671
671
|
if (config.widgets === "changes") {
|
|
672
|
-
registerAppTool(server, "
|
|
673
|
-
title: "
|
|
674
|
-
description: "
|
|
672
|
+
registerAppTool(server, "show_changes", {
|
|
673
|
+
title: "Show changes",
|
|
674
|
+
description: "Show aggregate file changes in an open workspace since the last shown checkpoint or since the workspace was opened. After you create, edit, or overwrite files, call this once when the related file changes are complete so the user can inspect the combined diff.",
|
|
675
675
|
inputSchema: {
|
|
676
676
|
workspaceId: z
|
|
677
677
|
.string()
|
|
678
678
|
.describe("Workspace identifier returned by open_workspace."),
|
|
679
679
|
since: z
|
|
680
|
-
.enum(["
|
|
680
|
+
.enum(["last_shown", "workspace_open"])
|
|
681
681
|
.optional()
|
|
682
|
-
.describe("Defaults to
|
|
682
|
+
.describe("Defaults to last_shown. Use workspace_open to compare against the initial open_workspace checkpoint."),
|
|
683
683
|
markReviewed: z
|
|
684
684
|
.boolean()
|
|
685
685
|
.optional()
|
|
686
|
-
.describe("Defaults to true. When true, advances the
|
|
686
|
+
.describe("Defaults to true. When true, advances the last shown checkpoint to the current workspace state."),
|
|
687
687
|
},
|
|
688
688
|
outputSchema: resultOutputSchema(),
|
|
689
|
-
...toolWidgetDescriptorMeta(config, "
|
|
689
|
+
...toolWidgetDescriptorMeta(config, "show_changes"),
|
|
690
690
|
annotations: { readOnlyHint: true },
|
|
691
691
|
}, async ({ workspaceId, since, markReviewed }) => {
|
|
692
692
|
const startedAt = performance.now();
|
|
@@ -694,12 +694,12 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
|
|
|
694
694
|
const review = await reviewCheckpoints.reviewChanges({
|
|
695
695
|
workspaceId,
|
|
696
696
|
root: workspace.root,
|
|
697
|
-
since: since ?? "
|
|
697
|
+
since: since ?? "last_shown",
|
|
698
698
|
markReviewed: markReviewed ?? true,
|
|
699
699
|
});
|
|
700
700
|
const content = [textBlock(review.result)];
|
|
701
701
|
logToolCall(config, {
|
|
702
|
-
tool: "
|
|
702
|
+
tool: "show_changes",
|
|
703
703
|
workspaceId,
|
|
704
704
|
success: true,
|
|
705
705
|
durationMs: Math.round(performance.now() - startedAt),
|
|
@@ -707,7 +707,7 @@ function createMcpServer(config, workspaces, reviewCheckpoints) {
|
|
|
707
707
|
return {
|
|
708
708
|
content,
|
|
709
709
|
_meta: {
|
|
710
|
-
tool: "
|
|
710
|
+
tool: "show_changes",
|
|
711
711
|
card: {
|
|
712
712
|
workspaceId,
|
|
713
713
|
summary: review.summary,
|