@git.zone/tsdoc 2.0.5 → 2.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/.smartconfig.json CHANGED
@@ -33,12 +33,31 @@
33
33
  "legal": "\n## License and Legal Information\n\nThis repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./license) file.\n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.\n\nUse of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District Court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
34
34
  },
35
35
  "@git.zone/cli": {
36
+ "schemaVersion": 2,
37
+ "projectType": "npm",
36
38
  "release": {
37
39
  "registries": [
38
40
  "https://verdaccio.lossless.digital",
39
41
  "https://registry.npmjs.org"
40
42
  ],
41
- "accessLevel": "public"
43
+ "accessLevel": "public",
44
+ "targets": {
45
+ "git": {
46
+ "enabled": true,
47
+ "remote": "origin",
48
+ "pushBranch": true,
49
+ "pushTags": true
50
+ },
51
+ "npm": {
52
+ "enabled": true,
53
+ "registries": [
54
+ "https://verdaccio.lossless.digital",
55
+ "https://registry.npmjs.org"
56
+ ],
57
+ "accessLevel": "public",
58
+ "alreadyPublished": "success"
59
+ }
60
+ }
42
61
  }
43
62
  }
44
- }
63
+ }
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/tsdoc',
6
- version: '2.0.5',
6
+ version: '2.1.0',
7
7
  description: 'A comprehensive TypeScript documentation tool that leverages AI to generate and enhance project documentation, including dynamic README creation, API docs via TypeDoc, and smart commit message generation.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDhNQUE4TTtDQUM1TixDQUFBIn0=
@@ -7,6 +7,9 @@ export interface INextCommitObject {
7
7
  recommendedNextVersion: string;
8
8
  changelog?: string;
9
9
  }
10
+ export declare class NoChangesError extends Error {
11
+ constructor(message?: string);
12
+ }
10
13
  export declare class Commit {
11
14
  private aiDocsRef;
12
15
  private projectDir;
@@ -1,8 +1,8 @@
1
1
  import * as plugins from '../plugins.js';
2
2
  import { AiDoc } from '../classes.aidoc.js';
3
- import { ProjectContext } from './projectcontext.js';
4
3
  import { DiffProcessor } from '../classes.diffprocessor.js';
5
4
  import { logger } from '../logging.js';
5
+ import { createReadOnlyFileSystemTools } from '../helpers.agenttools.js';
6
6
  // Token budget configuration for OpenAI API limits
7
7
  const TOKEN_BUDGET = {
8
8
  OPENAI_CONTEXT_LIMIT: 272000, // OpenAI's configured limit
@@ -20,6 +20,81 @@ function calculateMaxDiffTokens() {
20
20
  - TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
21
21
  return Math.max(available, 30000);
22
22
  }
23
+ export class NoChangesError extends Error {
24
+ constructor(message = 'No uncommitted changes found for commit recommendation.') {
25
+ super(message);
26
+ this.name = 'NoChangesError';
27
+ }
28
+ }
29
+ const normalizeLevel = (level) => {
30
+ if (level === 'fix' || level === 'feat' || level === 'BREAKING CHANGE')
31
+ return level;
32
+ throw new Error('recommendedNextVersionLevel must be fix, feat, or BREAKING CHANGE.');
33
+ };
34
+ const stripConventionalPrefix = (message) => {
35
+ return message.replace(/^(fix|feat|BREAKING CHANGE)(\([^)]*\))?:\s*/i, '').trim();
36
+ };
37
+ const extractJsonObject = (text) => {
38
+ const jsonString = text
39
+ .replace(/```json\n?/gi, '')
40
+ .replace(/```\n?/gi, '')
41
+ .match(/\{[\s\S]*\}/)?.[0];
42
+ if (!jsonString) {
43
+ throw new Error(`Could not find JSON object in result: ${text.substring(0, 100)}...`);
44
+ }
45
+ return JSON.parse(jsonString);
46
+ };
47
+ const bumpVersion = (currentVersion, level) => {
48
+ const [majorString, minorString, patchString] = currentVersion.split(/[+-]/)[0].split('.');
49
+ let major = Number.parseInt(majorString, 10);
50
+ let minor = Number.parseInt(minorString, 10);
51
+ let patch = Number.parseInt(patchString, 10);
52
+ if (!Number.isFinite(major))
53
+ major = 0;
54
+ if (!Number.isFinite(minor))
55
+ minor = 0;
56
+ if (!Number.isFinite(patch))
57
+ patch = 0;
58
+ if (level === 'BREAKING CHANGE') {
59
+ return `${major + 1}.0.0`;
60
+ }
61
+ if (level === 'feat') {
62
+ return `${major}.${minor + 1}.0`;
63
+ }
64
+ return `${major}.${minor}.${patch + 1}`;
65
+ };
66
+ const parseCommitResult = (text, currentVersion) => {
67
+ const parsed = extractJsonObject(text);
68
+ const level = normalizeLevel(parsed.recommendedNextVersionLevel);
69
+ const scope = typeof parsed.recommendedNextVersionScope === 'string'
70
+ ? parsed.recommendedNextVersionScope.trim()
71
+ : '';
72
+ const message = typeof parsed.recommendedNextVersionMessage === 'string'
73
+ ? stripConventionalPrefix(parsed.recommendedNextVersionMessage)
74
+ : '';
75
+ const details = Array.isArray(parsed.recommendedNextVersionDetails)
76
+ ? parsed.recommendedNextVersionDetails.filter((detail) => typeof detail === 'string').map(detail => detail.trim()).filter(Boolean)
77
+ : [];
78
+ if (!scope)
79
+ throw new Error('recommendedNextVersionScope must be a non-empty string.');
80
+ if (!message)
81
+ throw new Error('recommendedNextVersionMessage must be a non-empty string.');
82
+ return {
83
+ recommendedNextVersionLevel: level,
84
+ recommendedNextVersionScope: scope,
85
+ recommendedNextVersionMessage: message,
86
+ recommendedNextVersionDetails: details,
87
+ recommendedNextVersion: bumpVersion(currentVersion, level),
88
+ };
89
+ };
90
+ const buildChangelog = (commitObject, oldChangelog) => {
91
+ const dateString = new plugins.smarttime.ExtendedDate().exportToHyphedSortableDate();
92
+ const details = commitObject.recommendedNextVersionDetails.length > 0
93
+ ? `\n\n${commitObject.recommendedNextVersionDetails.map(detail => `- ${detail}`).join('\n')}`
94
+ : '';
95
+ const previous = oldChangelog.replace(/^# Changelog\n\n?/, '').replace(/^\n+/, '');
96
+ return `# Changelog\n\n## ${dateString} - ${commitObject.recommendedNextVersion} - ${commitObject.recommendedNextVersionScope}\n${commitObject.recommendedNextVersionMessage}${details}\n\n${previous}`.trimEnd() + '\n';
97
+ };
23
98
  export class Commit {
24
99
  constructor(aiDocsRef, projectDirArg) {
25
100
  this.aiDocsRef = aiDocsRef;
@@ -69,52 +144,36 @@ export class Commit {
69
144
  ];
70
145
  // Pass glob patterns directly to smartgit - it handles matching internally
71
146
  const diffStringArray = await gitRepo.getUncommittedDiff(excludePatterns);
72
- // Process diffs intelligently using DiffProcessor
73
- let processedDiffString;
74
- if (diffStringArray.length > 0) {
75
- // Diagnostic logging for raw diff statistics
76
- const totalChars = diffStringArray.join('\n\n').length;
77
- const estimatedTokens = Math.ceil(totalChars / 4);
78
- console.log(`Raw git diff statistics:`);
79
- console.log(` Files changed: ${diffStringArray.length}`);
80
- console.log(` Total characters: ${totalChars.toLocaleString()}`);
81
- console.log(` Estimated tokens: ${estimatedTokens.toLocaleString()}`);
82
- console.log(` Exclusion patterns: ${excludePatterns.length}`);
83
- // Calculate available tokens for diff based on total budget
84
- const maxDiffTokens = calculateMaxDiffTokens();
85
- console.log(`Token budget: ${maxDiffTokens.toLocaleString()} tokens for diff (limit: ${TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT.toLocaleString()}, overhead: ${(TOKEN_BUDGET.SMARTAGENT_OVERHEAD + TOKEN_BUDGET.TASK_PROMPT_OVERHEAD).toLocaleString()})`);
86
- // Use DiffProcessor to intelligently handle large diffs
87
- const diffProcessor = new DiffProcessor({
88
- maxDiffTokens, // Dynamic based on total budget
89
- smallFileLines: 300, // Most source files are under 300 lines
90
- mediumFileLines: 800, // Only very large files get head/tail treatment
91
- sampleHeadLines: 75, // When sampling, show more context
92
- sampleTailLines: 75, // When sampling, show more context
93
- });
94
- const processedDiff = diffProcessor.processDiffs(diffStringArray);
95
- processedDiffString = diffProcessor.formatForContext(processedDiff);
96
- console.log(`Processed diff statistics:`);
97
- console.log(` Full diffs: ${processedDiff.fullDiffs.length} files`);
98
- console.log(` Summarized: ${processedDiff.summarizedDiffs.length} files`);
99
- console.log(` Metadata only: ${processedDiff.metadataOnly.length} files`);
100
- console.log(` Final tokens: ${processedDiff.totalTokens.toLocaleString()}`);
101
- if (estimatedTokens > 50000) {
102
- console.log(`DiffProcessor reduced token usage: ${estimatedTokens.toLocaleString()} -> ${processedDiff.totalTokens.toLocaleString()}`);
103
- }
104
- // Validate total tokens won't exceed limit
105
- const totalEstimatedTokens = processedDiff.totalTokens
106
- + TOKEN_BUDGET.SMARTAGENT_OVERHEAD
107
- + TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
108
- if (totalEstimatedTokens > TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT - TOKEN_BUDGET.SAFETY_MARGIN) {
109
- console.log(`Warning: Estimated tokens (${totalEstimatedTokens.toLocaleString()}) approaching limit`);
110
- console.log(` Consider splitting into smaller commits`);
111
- }
147
+ if (diffStringArray.length === 0) {
148
+ throw new NoChangesError();
112
149
  }
113
- else {
114
- processedDiffString = 'No changes.';
150
+ const packageJsonPath = plugins.path.join(this.projectDir, 'package.json');
151
+ const packageJson = await plugins.fsInstance.file(packageJsonPath).exists()
152
+ ? JSON.parse(String(await plugins.fsInstance.file(packageJsonPath).encoding('utf8').read()))
153
+ : {};
154
+ const currentVersion = typeof packageJson.version === 'string' ? packageJson.version : '0.0.0';
155
+ // Process diffs intelligently using DiffProcessor
156
+ const totalChars = diffStringArray.join('\n\n').length;
157
+ const estimatedTokens = Math.ceil(totalChars / 4);
158
+ logger.log('info', `Raw git diff: ${diffStringArray.length} files, ${estimatedTokens.toLocaleString()} estimated tokens, ${excludePatterns.length} exclusions.`);
159
+ const maxDiffTokens = calculateMaxDiffTokens();
160
+ const diffProcessor = new DiffProcessor({
161
+ maxDiffTokens,
162
+ smallFileLines: 300,
163
+ mediumFileLines: 800,
164
+ sampleHeadLines: 75,
165
+ sampleTailLines: 75,
166
+ });
167
+ const processedDiff = diffProcessor.processDiffs(diffStringArray);
168
+ const processedDiffString = diffProcessor.formatForContext(processedDiff);
169
+ logger.log('info', `Processed diff: ${processedDiff.fullDiffs.length} full, ${processedDiff.summarizedDiffs.length} summarized, ${processedDiff.metadataOnly.length} metadata-only, ${processedDiff.totalTokens.toLocaleString()} tokens.`);
170
+ const totalEstimatedTokens = processedDiff.totalTokens
171
+ + TOKEN_BUDGET.SMARTAGENT_OVERHEAD
172
+ + TOKEN_BUDGET.TASK_PROMPT_OVERHEAD;
173
+ if (totalEstimatedTokens > TOKEN_BUDGET.OPENAI_CONTEXT_LIMIT - TOKEN_BUDGET.SAFETY_MARGIN) {
174
+ logger.log('warn', `Estimated tokens (${totalEstimatedTokens.toLocaleString()}) approach the model context limit. Consider splitting into smaller commits.`);
115
175
  }
116
- // Use runAgent for commit message generation with filesystem tool
117
- const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
176
+ const fsTools = await createReadOnlyFileSystemTools(this.projectDir);
118
177
  const commitSystemPrompt = `
119
178
  You create commit messages for git commits following semantic versioning conventions.
120
179
 
@@ -151,7 +210,7 @@ Here is the structure of the JSON you must return:
151
210
  "recommendedNextVersionScope": "string",
152
211
  "recommendedNextVersionMessage": "string (ONLY the description body WITHOUT the type(scope): prefix - e.g. 'bump dependency to ^1.2.6' NOT 'fix(deps): bump dependency to ^1.2.6')",
153
212
  "recommendedNextVersionDetails": ["string"],
154
- "recommendedNextVersion": "x.x.x"
213
+ "recommendedNextVersion": "x.x.x (will be verified deterministically)"
155
214
  }
156
215
 
157
216
  For recommendedNextVersionDetails, only add entries that have obvious value to the reader.
@@ -163,84 +222,32 @@ ${processedDiffString}
163
222
  Analyze these changes and output the JSON commit message object.
164
223
  `;
165
224
  logger.log('info', 'Starting commit message generation with agent...');
166
- const commitResult = await plugins.smartagent.runAgent({
167
- model: this.aiDocsRef.model,
225
+ const commitResult = await this.aiDocsRef.runAgent({
226
+ taskName: 'commit',
227
+ projectDir: this.projectDir,
168
228
  prompt: commitTaskPrompt,
169
229
  system: commitSystemPrompt,
170
230
  tools: fsTools,
171
231
  maxSteps: 10,
232
+ maxValidationRetries: 1,
233
+ validateCompletion: (result) => {
234
+ try {
235
+ parseCommitResult(result.text, currentVersion);
236
+ }
237
+ catch (error) {
238
+ return `Return only valid JSON matching the requested commit object schema. Error: ${error instanceof Error ? error.message : String(error)}`;
239
+ }
240
+ },
172
241
  onToolCall: (toolName) => logger.log('info', `[Commit] Tool call: ${toolName}`),
173
242
  });
174
- // Extract JSON from result - handle cases where AI adds text around it
175
- let jsonString = commitResult.text
176
- .replace(/```json\n?/gi, '')
177
- .replace(/```\n?/gi, '');
178
- // Try to find JSON object in the result
179
- const jsonMatch = jsonString.match(/\{[\s\S]*\}/);
180
- if (!jsonMatch) {
181
- throw new Error(`Could not find JSON object in result: ${jsonString.substring(0, 100)}...`);
182
- }
183
- jsonString = jsonMatch[0];
184
- const resultObject = JSON.parse(jsonString);
243
+ const resultObject = parseCommitResult(commitResult.text, currentVersion);
185
244
  const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
186
- let previousChangelog;
245
+ let oldChangelog = '';
187
246
  if (await plugins.fsInstance.file(previousChangelogPath).exists()) {
188
- previousChangelog = await plugins.smartfileFactory.fromFilePath(previousChangelogPath);
189
- }
190
- if (!previousChangelog) {
191
- // lets build the changelog based on that
192
- const commitMessages = await gitRepo.getAllCommitMessages();
193
- console.log(JSON.stringify(commitMessages, null, 2));
194
- const changelogSystemPrompt = `
195
- You generate changelog.md files for software projects.
196
-
197
- RULES:
198
- - Changelog must follow proper markdown format with ## headers for each version
199
- - Entries must be chronologically ordered (newest first)
200
- - Version ranges for trivial commits should be properly summarized
201
- - No duplicate or empty entries
202
- - Format: ## yyyy-mm-dd - x.x.x - scope
203
- `;
204
- const changelogTaskPrompt = `
205
- You are building a changelog.md file for the project.
206
- Omit commits and versions that lack relevant changes, but make sure to mention them as a range with a summarizing message instead.
207
-
208
- A changelog entry should look like this:
209
-
210
- ## yyyy-mm-dd - x.x.x - scope here
211
- main description here
212
-
213
- - detailed bullet points follow
214
-
215
- You are given:
216
- * the commit messages of the project
217
-
218
- Only return the changelog file content, so it can be written directly to changelog.md.
219
-
220
- Here are the commit messages:
221
-
222
- ${JSON.stringify(commitMessages, null, 2)}
223
- `;
224
- const changelogResult = await plugins.smartagent.runAgent({
225
- model: this.aiDocsRef.model,
226
- prompt: changelogTaskPrompt,
227
- system: changelogSystemPrompt,
228
- maxSteps: 1,
229
- onToolCall: (toolName) => logger.log('info', `[Changelog] Tool call: ${toolName}`),
230
- });
231
- previousChangelog = plugins.smartfileFactory.fromString(previousChangelogPath, changelogResult.text.replaceAll('```markdown', '').replaceAll('```', ''), 'utf8');
232
- }
233
- let oldChangelog = previousChangelog.contents.toString().replace('# Changelog\n\n', '');
234
- if (oldChangelog.startsWith('\n')) {
235
- oldChangelog = oldChangelog.replace('\n', '');
247
+ oldChangelog = String(await plugins.fsInstance.file(previousChangelogPath).encoding('utf8').read());
236
248
  }
237
- let newDateString = new plugins.smarttime.ExtendedDate().exportToHyphedSortableDate();
238
- let newChangelog = `# Changelog\n\n${`## ${newDateString} - {{nextVersion}} - {{nextVersionScope}}
239
- {{nextVersionMessage}}
240
-
241
- {{nextVersionDetails}}`}\n\n${oldChangelog}`;
242
- resultObject.changelog = newChangelog;
249
+ resultObject.changelog = buildChangelog(resultObject, oldChangelog);
243
250
  return resultObject;
244
251
  }
245
252
  }
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsbURBQW1EO0FBQ25ELE1BQU0sWUFBWSxHQUFHO0lBQ25CLG9CQUFvQixFQUFFLE1BQU0sRUFBSSw0QkFBNEI7SUFDNUQsYUFBYSxFQUFFLEtBQUssRUFBYSxzQ0FBc0M7SUFDdkUsbUJBQW1CLEVBQUUsTUFBTSxFQUFNLDBDQUEwQztJQUMzRSxvQkFBb0IsRUFBRSxJQUFJLEVBQU8sNEJBQTRCO0NBQ3JELENBQUM7QUFFWDs7R0FFRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxvQkFBb0I7VUFDL0MsWUFBWSxDQUFDLGFBQWE7VUFDMUIsWUFBWSxDQUFDLG1CQUFtQjtVQUNoQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7SUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBV0QsTUFBTSxPQUFPLE1BQU07SUFJakIsWUFBWSxTQUFnQixFQUFFLGFBQXFCO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENB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
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RSxtREFBbUQ7QUFDbkQsTUFBTSxZQUFZLEdBQUc7SUFDbkIsb0JBQW9CLEVBQUUsTUFBTSxFQUFJLDRCQUE0QjtJQUM1RCxhQUFhLEVBQUUsS0FBSyxFQUFhLHNDQUFzQztJQUN2RSxtQkFBbUIsRUFBRSxNQUFNLEVBQU0sMENBQTBDO0lBQzNFLG9CQUFvQixFQUFFLElBQUksRUFBTyw0QkFBNEI7Q0FDckQsQ0FBQztBQUVYOztHQUVHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLG9CQUFvQjtVQUMvQyxZQUFZLENBQUMsYUFBYTtVQUMxQixZQUFZLENBQUMsbUJBQW1CO1VBQ2hDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQztJQUN0QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFXRCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkMsWUFBWSxPQUFPLEdBQUcseURBQXlEO1FBQzdFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFjLEVBQW9ELEVBQUU7SUFD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
@@ -1,21 +1,44 @@
1
1
  import * as plugins from '../plugins.js';
2
2
  import { ProjectContext } from './projectcontext.js';
3
3
  import { logger } from '../logging.js';
4
+ import { createReadOnlyFileSystemTools } from '../helpers.agenttools.js';
5
+ const parseDescriptionJson = (text) => {
6
+ const jsonString = text
7
+ .replace(/```json\n?/gi, '')
8
+ .replace(/```\n?/gi, '')
9
+ .match(/\{[\s\S]*\}/)?.[0] ?? text;
10
+ const parsed = JSON.parse(jsonString);
11
+ if (typeof parsed.description !== 'string' || parsed.description.trim().length === 0) {
12
+ throw new Error('description must be a non-empty string.');
13
+ }
14
+ if (!Array.isArray(parsed.keywords) || parsed.keywords.some(keyword => typeof keyword !== 'string')) {
15
+ throw new Error('keywords must be an array of strings.');
16
+ }
17
+ return {
18
+ description: parsed.description.trim(),
19
+ keywords: parsed.keywords.map(keyword => keyword.trim()).filter(Boolean),
20
+ };
21
+ };
22
+ const ensureModuleConfig = (config) => {
23
+ if (!config.module || typeof config.module !== 'object') {
24
+ config.module = {};
25
+ }
26
+ return config.module;
27
+ };
4
28
  export class Description {
5
29
  constructor(aiDocsRef, projectDirArg) {
6
30
  this.aiDocsRef = aiDocsRef;
7
31
  this.projectDir = projectDirArg;
8
32
  }
9
33
  async build() {
10
- // Use runAgent with filesystem tool for agent-driven exploration
11
- const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
34
+ const fsTools = await createReadOnlyFileSystemTools(this.projectDir);
12
35
  const descriptionSystemPrompt = `
13
36
  You create project descriptions and keywords for npm packages.
14
37
 
15
38
  You have access to filesystem tools to explore the project.
16
39
 
17
40
  IMPORTANT RULES:
18
- - Only READ files (package.json, .smartconfig.json, source files in ts/)
41
+ - Only READ files (package.json, .smartconfig.json, source files in ts/ and ts_web/)
19
42
  - Do NOT write, delete, or modify any files
20
43
  - Your final response must be valid JSON only
21
44
  - Description must be a clear, concise one-sentence summary
@@ -30,7 +53,7 @@ Use the filesystem tools to explore the project and understand what it does:
30
53
  1. First, use list_directory to see the project structure
31
54
  2. Read package.json to understand the package name and current description
32
55
  3. Read .smartconfig.json if it exists for additional metadata
33
- 4. Read key source files in ts/ directory to understand the implementation
56
+ 4. Read key source files in ts/ and ts_web/ directories to understand the implementation
34
57
 
35
58
  Then generate a description and keywords based on your exploration.
36
59
 
@@ -45,32 +68,53 @@ Your answer should be parseable with JSON.parse() without modifying anything.
45
68
  Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
46
69
  `;
47
70
  logger.log('info', 'Starting description generation with agent...');
48
- const descriptionResult = await plugins.smartagent.runAgent({
49
- model: this.aiDocsRef.model,
71
+ const descriptionResult = await this.aiDocsRef.runAgent({
72
+ taskName: 'description',
73
+ projectDir: this.projectDir,
50
74
  prompt: descriptionTaskPrompt,
51
75
  system: descriptionSystemPrompt,
52
76
  tools: fsTools,
53
77
  maxSteps: 15,
78
+ useCompaction: true,
79
+ maxValidationRetries: 1,
80
+ validateCompletion: (result) => {
81
+ try {
82
+ parseDescriptionJson(result.text);
83
+ }
84
+ catch (error) {
85
+ return `Return only valid JSON matching { "description": string, "keywords": string[] }. Error: ${error instanceof Error ? error.message : String(error)}`;
86
+ }
87
+ },
54
88
  onToolCall: (toolName) => logger.log('info', `[Description] Tool call: ${toolName}`),
55
89
  });
56
- console.log(descriptionResult.text);
57
- const resultObject = JSON.parse(descriptionResult.text.replace('```json', '').replace('```', ''));
90
+ const resultObject = parseDescriptionJson(descriptionResult.text);
58
91
  // Use ProjectContext to get file handles for writing
59
92
  const projectContext = new ProjectContext(this.projectDir);
60
93
  const files = await projectContext.gatherFiles();
61
94
  // Update smartconfig.json
62
95
  const smartconfigJson = files.smartfilesSmartconfigJSON;
63
- const smartconfigJsonContent = JSON.parse(smartconfigJson.contents.toString());
64
- smartconfigJsonContent['gitzone'].module.description = resultObject.description;
65
- smartconfigJsonContent['gitzone'].module.keywords = resultObject.keywords;
66
- smartconfigJson.contents = Buffer.from(JSON.stringify(smartconfigJsonContent, null, 2));
96
+ const smartconfigJsonContent = smartconfigJson.contents.length > 0
97
+ ? JSON.parse(smartconfigJson.contents.toString())
98
+ : {};
99
+ if (!smartconfigJsonContent['@git.zone/cli'] || typeof smartconfigJsonContent['@git.zone/cli'] !== 'object') {
100
+ smartconfigJsonContent['@git.zone/cli'] = {};
101
+ }
102
+ const modernModuleConfig = ensureModuleConfig(smartconfigJsonContent['@git.zone/cli']);
103
+ modernModuleConfig.description = resultObject.description;
104
+ modernModuleConfig.keywords = resultObject.keywords;
105
+ if (smartconfigJsonContent.gitzone && typeof smartconfigJsonContent.gitzone === 'object') {
106
+ const legacyModuleConfig = ensureModuleConfig(smartconfigJsonContent.gitzone);
107
+ legacyModuleConfig.description = resultObject.description;
108
+ legacyModuleConfig.keywords = resultObject.keywords;
109
+ }
110
+ smartconfigJson.contents = Buffer.from(`${JSON.stringify(smartconfigJsonContent, null, 2)}\n`);
67
111
  await smartconfigJson.write();
68
112
  // Update package.json
69
113
  const packageJson = files.smartfilePackageJSON;
70
114
  const packageJsonContent = JSON.parse(packageJson.contents.toString());
71
115
  packageJsonContent.description = resultObject.description;
72
116
  packageJsonContent.keywords = resultObject.keywords;
73
- packageJson.contents = Buffer.from(JSON.stringify(packageJsonContent, null, 2));
117
+ packageJson.contents = Buffer.from(`${JSON.stringify(packageJsonContent, null, 2)}\n`);
74
118
  await packageJson.write();
75
119
  console.log(`\n======================\n`);
76
120
  console.log(JSON.stringify(resultObject, null, 2));
@@ -78,4 +122,4 @@ Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
78
122
  return descriptionResult.text;
79
123
  }
80
124
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9kZXNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU92QyxNQUFNLE9BQU8sV0FBVztJQUt0QixZQUFZLFNBQWdCLEVBQUUsYUFBcUI7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLGlFQUFpRTtRQUNqRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUVyRixNQUFNLHVCQUF1QixHQUFHOzs7Ozs7Ozs7Ozs7O0NBYW5DLENBQUM7UUFFRSxNQUFNLHFCQUFxQixHQUFHO3FCQUNiLElBQUksQ0FBQyxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBbUJuQyxDQUFDO1FBRUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsK0NBQStDLENBQUMsQ0FBQztRQUVwRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDMUQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztZQUMzQixNQUFNLEVBQUUscUJBQXFCO1lBQzdCLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsS0FBSyxFQUFFLE9BQU87WUFDZCxRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLFFBQVEsRUFBRSxDQUFDO1NBQ3JGLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQTBCLElBQUksQ0FBQyxLQUFLLENBQ3BELGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ2pFLENBQUM7UUFFRixxREFBcUQ7UUFDckQsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpELDBCQUEwQjtRQUMxQixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMseUJBQXlCLENBQUM7UUFDeEQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUUvRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDaEYsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBRTFFLGVBQWUsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTlCLHNCQUFzQjtRQUN0QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2RSxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQztRQUMxRCxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUNwRCxXQUFXLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxQixPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDMUMsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztDQUNGIn0=
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9kZXNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU96RSxNQUFNLG9CQUFvQixHQUFHLENBQUMsSUFBWSxFQUF5QixFQUFFO0lBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUk7U0FDcEIsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7U0FDM0IsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7U0FDdkIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUEwQixDQUFDO0lBQy9ELElBQUksT0FBTyxNQUFNLENBQUMsV0FBVyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDcEcsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFD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
@@ -1,10 +1,11 @@
1
1
  import * as plugins from '../plugins.js';
2
2
  export declare class ProjectContext {
3
- static fromDir(dirArg: string): Promise<void>;
3
+ static fromDir(dirArg: string): Promise<ProjectContext>;
4
4
  projectDir: string;
5
5
  private tokenCount;
6
6
  private contextString;
7
7
  constructor(projectDirArg: string);
8
+ private getSmartFile;
8
9
  gatherFiles(): Promise<{
9
10
  smartfilePackageJSON: plugins.smartfile.SmartFile;
10
11
  smartfilesReadme: plugins.smartfile.SmartFile;
@@ -1,18 +1,34 @@
1
1
  import * as plugins from '../plugins.js';
2
2
  export class ProjectContext {
3
- static async fromDir(dirArg) { }
3
+ static async fromDir(dirArg) {
4
+ const projectContext = new ProjectContext(dirArg);
5
+ await projectContext.update();
6
+ return projectContext;
7
+ }
4
8
  constructor(projectDirArg) {
5
9
  this.tokenCount = 0;
6
10
  this.contextString = '';
7
11
  this.projectDir = projectDirArg;
8
12
  }
13
+ async getSmartFile(fileName) {
14
+ const filePath = plugins.path.join(this.projectDir, fileName);
15
+ if (await plugins.fsInstance.file(filePath).exists()) {
16
+ return await plugins.smartfileFactory.fromFilePath(filePath, this.projectDir);
17
+ }
18
+ return plugins.smartfileFactory.fromString(filePath, '', 'utf8');
19
+ }
9
20
  async gatherFiles() {
10
- const smartfilePackageJSON = await plugins.smartfileFactory.fromFilePath(plugins.path.join(this.projectDir, 'package.json'), this.projectDir);
11
- const smartfilesReadme = await plugins.smartfileFactory.fromFilePath(plugins.path.join(this.projectDir, 'readme.md'), this.projectDir);
12
- const smartfilesReadmeHints = await plugins.smartfileFactory.fromFilePath(plugins.path.join(this.projectDir, 'readme.hints.md'), this.projectDir);
13
- const smartfilesSmartconfigJSON = await plugins.smartfileFactory.fromFilePath(plugins.path.join(this.projectDir, '.smartconfig.json'), this.projectDir);
14
- const smartfilesMod = await plugins.smartfileFactory.virtualDirectoryFromPath(this.projectDir).then(vd => vd.filter(f => f.relative.startsWith('ts') && f.relative.endsWith('.ts')).listFiles());
15
- const smartfilesTest = await plugins.smartfileFactory.virtualDirectoryFromPath(this.projectDir).then(vd => vd.filter(f => f.relative.startsWith('test/') && f.relative.endsWith('.ts')).listFiles());
21
+ const smartfilePackageJSON = await this.getSmartFile('package.json');
22
+ const smartfilesReadme = await this.getSmartFile('readme.md');
23
+ const smartfilesReadmeHints = await this.getSmartFile('readme.hints.md');
24
+ const smartfilesSmartconfigJSON = await this.getSmartFile('.smartconfig.json');
25
+ const virtualDirectory = await plugins.smartfileFactory.virtualDirectoryFromPath(this.projectDir);
26
+ const smartfilesMod = await virtualDirectory
27
+ .filter(f => (f.relative.startsWith('ts/') || f.relative.startsWith('ts_web/')) && f.relative.endsWith('.ts'))
28
+ .listFiles();
29
+ const smartfilesTest = await virtualDirectory
30
+ .filter(f => f.relative.startsWith('test/') && f.relative.endsWith('.ts'))
31
+ .listFiles();
16
32
  return {
17
33
  smartfilePackageJSON,
18
34
  smartfilesReadme,
@@ -86,4 +102,4 @@ ${smartfile.contents.toString()}
86
102
  return result;
87
103
  }
88
104
  }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9wcm9qZWN0Y29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sY0FBYztJQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjLElBQUcsQ0FBQztJQU85QyxZQUFZLGFBQXFCO1FBSHpCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFHakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBQ3RCLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUN0RSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxFQUNsRCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ2xFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQy9DLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFFRixNQUFNLHFCQUFxQixHQUFHLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FDdkUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxFQUNyRCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQzNFLE9B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
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9wcm9qZWN0Y29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sY0FBYztJQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlCLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFPRCxZQUFZLGFBQXFCO1FBSHpCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFHakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0I7UUFDekMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RCxJQUFJLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNyRCxPQUFPLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFDdEIsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLElBQUks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