@aexol/opencode-wizard 0.1.16 → 0.2.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.
@@ -106,7 +106,8 @@ const run = async () => {
106
106
  frontmatterName: 'backend-auth',
107
107
  frontmatterDescription: 'JWT auth skill',
108
108
  checksum: 'checksum-1',
109
- publishedAt: '2026-04-22T00:00:00.000Z'
109
+ publishedAt: '2026-04-22T00:00:00.000Z',
110
+ fileCount: 2
110
111
  }
111
112
  }],
112
113
  catalogSkills: [],
@@ -121,7 +122,24 @@ const run = async () => {
121
122
  publishedArtifact: {
122
123
  ...payload.skills[0].publishedArtifact,
123
124
  markdownBody: '## Mock skill\n\nThis is a mock published skill.',
124
- renderedContent: '<h2>Mock skill</h2>'
125
+ renderedContent: '<h2>Mock skill</h2>',
126
+ files: [{
127
+ id: 'artifact-file-1',
128
+ relativePath: 'SKILL.md',
129
+ contentType: 'text/markdown; charset=utf-8',
130
+ content: '---\nname: "backend-auth"\ndescription: "JWT auth skill"\n---\n\n## Mock skill\n',
131
+ checksum: 'file-checksum-1',
132
+ size: 74,
133
+ sortOrder: 0
134
+ }, {
135
+ id: 'artifact-file-2',
136
+ relativePath: 'resource.md',
137
+ contentType: 'text/markdown; charset=utf-8',
138
+ content: '# Resource\n',
139
+ checksum: 'file-checksum-2',
140
+ size: 11,
141
+ sortOrder: 1
142
+ }]
125
143
  }
126
144
  };
127
145
  const config = await resolveConfig(process.cwd());
@@ -142,6 +160,7 @@ const run = async () => {
142
160
  selectedSkillSlug: detail?.skillSlug ?? null,
143
161
  selectedSkillTags: detail?.tags ?? [],
144
162
  markdownDocumentIncludesFrontmatter: detail?.markdownDocument.startsWith('---') ?? false,
163
+ resourceFileCount: detail?.resources.length ?? 0,
145
164
  preview,
146
165
  markdownBodyIncludesContent: detail?.markdownBody.includes('This is a mock published skill.') ?? false
147
166
  }, null, 2));
@@ -1 +1 @@
1
- {"version":3,"names":["buildSkillMarkdown","resolveConfig","selectPublishedSkills","toPublishedSkillCatalog","toPublishedSkillDetail","fs","os","path","DEPLOY_BACKEND_ORIGIN","LOCAL_OVERRIDE_BACKEND_ORIGIN","BACKEND_ENV_KEYS","withBackendEnv","env","callback","previousValues","Map","key","set","process","value","Object","entries","undefined","assertBackendOriginResolution","isolatedWorktree","mkdtemp","join","tmpdir","defaultConfig","backendOrigin","Error","portOnlyConfig","PORT","appUrlPlaceholderConfig","APP_URL","overrideConfig","OPENCODE_WIZARD_BACKEND_ORIGIN","defaultBackendOrigin","portOnlyBackendOrigin","appUrlPlaceholderBackendOrigin","explicitOverrideBackendOrigin","run","payload","workspace","id","slug","name","repositoryUrl","defaultBranch","status","directoryPath","skills","assignmentSource","assignmentType","scopePath","includeChildren","skill","summary","whenToUse","installPolicy","tags","label","description","facet","skillVersion","version","title","publishedArtifact","frontmatterName","frontmatterDescription","checksum","publishedAt","catalogSkills","userPreferences","scopeKey","userKey","ignoredSkills","detailItem","markdownBody","renderedContent","config","cwd","backendOriginSmoke","catalog","selection","detail","selectedItems","preview","split","slice","console","log","JSON","stringify","runtimeMode","graphqlUrl","publishedSkillCount","availableTools","facets","selectedSkillCount","length","missingSkills","missingIdentifiers","selectedSkillSlug","skillSlug","selectedSkillTags","markdownDocumentIncludesFrontmatter","markdownDocument","startsWith","markdownBodyIncludesContent","includes"],"sources":["../src/smoke-published-skills.ts"],"sourcesContent":["import {\n buildSkillMarkdown,\n resolveConfig,\n selectPublishedSkills,\n toPublishedSkillCatalog,\n toPublishedSkillDetail,\n type PublishedSkillCatalogPayload,\n type PublishedSkillDetailItem,\n} from './server.js';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst DEPLOY_BACKEND_ORIGIN = 'https://opencode-wizard.aexol.work';\nconst LOCAL_OVERRIDE_BACKEND_ORIGIN = 'http://localhost:19876';\n\ntype BackendEnvKey = 'OPENCODE_WIZARD_BACKEND_ORIGIN' | 'APP_URL' | 'PORT';\n\nconst BACKEND_ENV_KEYS: BackendEnvKey[] = ['OPENCODE_WIZARD_BACKEND_ORIGIN', 'APP_URL', 'PORT'];\n\nconst withBackendEnv = async <TResult>(\n env: Partial<Record<BackendEnvKey, string>>,\n callback: () => Promise<TResult>,\n): Promise<TResult> => {\n const previousValues = new Map<BackendEnvKey, string | undefined>();\n\n for (const key of BACKEND_ENV_KEYS) {\n previousValues.set(key, process.env[key]);\n delete process.env[key];\n }\n\n for (const [key, value] of Object.entries(env)) {\n process.env[key as BackendEnvKey] = value;\n }\n\n try {\n return await callback();\n } finally {\n for (const [key, value] of previousValues) {\n if (value === undefined) {\n delete process.env[key];\n continue;\n }\n\n process.env[key] = value;\n }\n }\n};\n\nconst assertBackendOriginResolution = async () => {\n const isolatedWorktree = await fs.mkdtemp(path.join(os.tmpdir(), 'opencode-wizard-plugin-smoke-'));\n\n const defaultConfig = await withBackendEnv({}, () => resolveConfig(isolatedWorktree));\n if (defaultConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected default backend origin ${DEPLOY_BACKEND_ORIGIN}, received ${defaultConfig.backendOrigin}`);\n }\n\n const portOnlyConfig = await withBackendEnv({ PORT: '19876' }, () => resolveConfig(isolatedWorktree));\n if (portOnlyConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected PORT-only backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${portOnlyConfig.backendOrigin}`);\n }\n\n const appUrlPlaceholderConfig = await withBackendEnv({ APP_URL: 'https://yourdomain.com' }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (appUrlPlaceholderConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(\n `Expected APP_URL placeholder backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${appUrlPlaceholderConfig.backendOrigin}`,\n );\n }\n\n const overrideConfig = await withBackendEnv({ OPENCODE_WIZARD_BACKEND_ORIGIN: LOCAL_OVERRIDE_BACKEND_ORIGIN }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (overrideConfig.backendOrigin !== LOCAL_OVERRIDE_BACKEND_ORIGIN) {\n throw new Error(`Expected explicit backend override ${LOCAL_OVERRIDE_BACKEND_ORIGIN}, received ${overrideConfig.backendOrigin}`);\n }\n\n return {\n defaultBackendOrigin: defaultConfig.backendOrigin,\n portOnlyBackendOrigin: portOnlyConfig.backendOrigin,\n appUrlPlaceholderBackendOrigin: appUrlPlaceholderConfig.backendOrigin,\n explicitOverrideBackendOrigin: overrideConfig.backendOrigin,\n };\n};\n\nconst run = async () => {\n const payload: PublishedSkillCatalogPayload = {\n workspace: {\n id: 'workspace-1',\n slug: 'opencode-wizard',\n name: 'opencode-wizard',\n repositoryUrl: 'https://example.com/opencode-wizard.git',\n defaultBranch: 'main',\n status: 'ACTIVE',\n },\n directoryPath: '.',\n skills: [\n {\n assignmentSource: 'WORKSPACE',\n assignmentType: 'PATH',\n scopePath: '.',\n includeChildren: true,\n skill: {\n id: 'skill-1',\n slug: 'backend-auth',\n name: 'backend-auth',\n summary: 'Backend auth skill',\n whenToUse: 'Use for JWT cookie sessions and protected backend resolver work.',\n status: 'ACTIVE',\n installPolicy: 'PROJECT_INSTALLABLE',\n tags: [\n {\n id: 'tag-1',\n slug: 'auth',\n label: 'Auth',\n description: null,\n facet: {\n id: 'facet-1',\n slug: 'capability',\n label: 'Capability',\n description: null,\n },\n },\n ],\n },\n skillVersion: {\n id: 'version-1',\n version: '1.0.0',\n title: 'Initial',\n summary: 'Initial publish',\n status: 'PUBLISHED',\n },\n publishedArtifact: {\n id: 'artifact-1',\n frontmatterName: 'backend-auth',\n frontmatterDescription: 'JWT auth skill',\n checksum: 'checksum-1',\n publishedAt: '2026-04-22T00:00:00.000Z',\n },\n },\n ],\n catalogSkills: [],\n userPreferences: {\n scopeKey: 'workspace:workspace-1',\n userKey: 'user-1',\n ignoredSkills: [],\n },\n };\n const detailItem: PublishedSkillDetailItem = {\n ...payload.skills[0],\n publishedArtifact: {\n ...payload.skills[0].publishedArtifact,\n markdownBody: '## Mock skill\\n\\nThis is a mock published skill.',\n renderedContent: '<h2>Mock skill</h2>',\n },\n };\n\n const config = await resolveConfig(process.cwd());\n const backendOriginSmoke = await assertBackendOriginResolution();\n\n const catalog = toPublishedSkillCatalog(payload);\n const selection = selectPublishedSkills(payload, ['backend-auth', 'missing-skill']);\n const detail = selection.selectedItems[0] ? toPublishedSkillDetail(detailItem) : null;\n const preview = buildSkillMarkdown(detailItem).split('\\n').slice(0, 6);\n\n console.log(\n JSON.stringify(\n {\n runtimeMode: catalog.runtimeMode,\n graphqlUrl: config.graphqlUrl,\n backendOriginSmoke,\n publishedSkillCount: catalog.publishedSkillCount,\n availableTools: catalog.availableTools,\n facets: catalog.facets,\n selectedSkillCount: selection.selectedItems.length,\n missingSkills: selection.missingIdentifiers,\n selectedSkillSlug: detail?.skillSlug ?? null,\n selectedSkillTags: detail?.tags ?? [],\n markdownDocumentIncludesFrontmatter: detail?.markdownDocument.startsWith('---') ?? false,\n preview,\n markdownBodyIncludesContent: detail?.markdownBody.includes('This is a mock published skill.') ?? false,\n },\n null,\n 2,\n ),\n );\n};\n\nvoid run();\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["buildSkillMarkdown","resolveConfig","selectPublishedSkills","toPublishedSkillCatalog","toPublishedSkillDetail","fs","os","path","DEPLOY_BACKEND_ORIGIN","LOCAL_OVERRIDE_BACKEND_ORIGIN","BACKEND_ENV_KEYS","withBackendEnv","env","callback","previousValues","Map","key","set","process","value","Object","entries","undefined","assertBackendOriginResolution","isolatedWorktree","mkdtemp","join","tmpdir","defaultConfig","backendOrigin","Error","portOnlyConfig","PORT","appUrlPlaceholderConfig","APP_URL","overrideConfig","OPENCODE_WIZARD_BACKEND_ORIGIN","defaultBackendOrigin","portOnlyBackendOrigin","appUrlPlaceholderBackendOrigin","explicitOverrideBackendOrigin","run","payload","workspace","id","slug","name","repositoryUrl","defaultBranch","status","directoryPath","skills","assignmentSource","assignmentType","scopePath","includeChildren","skill","summary","whenToUse","installPolicy","tags","label","description","facet","skillVersion","version","title","publishedArtifact","frontmatterName","frontmatterDescription","checksum","publishedAt","fileCount","catalogSkills","userPreferences","scopeKey","userKey","ignoredSkills","detailItem","markdownBody","renderedContent","files","relativePath","contentType","content","size","sortOrder","config","cwd","backendOriginSmoke","catalog","selection","detail","selectedItems","preview","split","slice","console","log","JSON","stringify","runtimeMode","graphqlUrl","publishedSkillCount","availableTools","facets","selectedSkillCount","length","missingSkills","missingIdentifiers","selectedSkillSlug","skillSlug","selectedSkillTags","markdownDocumentIncludesFrontmatter","markdownDocument","startsWith","resourceFileCount","resources","markdownBodyIncludesContent","includes"],"sources":["../src/smoke-published-skills.ts"],"sourcesContent":["import {\n buildSkillMarkdown,\n resolveConfig,\n selectPublishedSkills,\n toPublishedSkillCatalog,\n toPublishedSkillDetail,\n type PublishedSkillCatalogPayload,\n type PublishedSkillDetailItem,\n} from './server.js';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst DEPLOY_BACKEND_ORIGIN = 'https://opencode-wizard.aexol.work';\nconst LOCAL_OVERRIDE_BACKEND_ORIGIN = 'http://localhost:19876';\n\ntype BackendEnvKey = 'OPENCODE_WIZARD_BACKEND_ORIGIN' | 'APP_URL' | 'PORT';\n\nconst BACKEND_ENV_KEYS: BackendEnvKey[] = ['OPENCODE_WIZARD_BACKEND_ORIGIN', 'APP_URL', 'PORT'];\n\nconst withBackendEnv = async <TResult>(\n env: Partial<Record<BackendEnvKey, string>>,\n callback: () => Promise<TResult>,\n): Promise<TResult> => {\n const previousValues = new Map<BackendEnvKey, string | undefined>();\n\n for (const key of BACKEND_ENV_KEYS) {\n previousValues.set(key, process.env[key]);\n delete process.env[key];\n }\n\n for (const [key, value] of Object.entries(env)) {\n process.env[key as BackendEnvKey] = value;\n }\n\n try {\n return await callback();\n } finally {\n for (const [key, value] of previousValues) {\n if (value === undefined) {\n delete process.env[key];\n continue;\n }\n\n process.env[key] = value;\n }\n }\n};\n\nconst assertBackendOriginResolution = async () => {\n const isolatedWorktree = await fs.mkdtemp(path.join(os.tmpdir(), 'opencode-wizard-plugin-smoke-'));\n\n const defaultConfig = await withBackendEnv({}, () => resolveConfig(isolatedWorktree));\n if (defaultConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected default backend origin ${DEPLOY_BACKEND_ORIGIN}, received ${defaultConfig.backendOrigin}`);\n }\n\n const portOnlyConfig = await withBackendEnv({ PORT: '19876' }, () => resolveConfig(isolatedWorktree));\n if (portOnlyConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(`Expected PORT-only backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${portOnlyConfig.backendOrigin}`);\n }\n\n const appUrlPlaceholderConfig = await withBackendEnv({ APP_URL: 'https://yourdomain.com' }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (appUrlPlaceholderConfig.backendOrigin !== DEPLOY_BACKEND_ORIGIN) {\n throw new Error(\n `Expected APP_URL placeholder backend origin to stay ${DEPLOY_BACKEND_ORIGIN}, received ${appUrlPlaceholderConfig.backendOrigin}`,\n );\n }\n\n const overrideConfig = await withBackendEnv({ OPENCODE_WIZARD_BACKEND_ORIGIN: LOCAL_OVERRIDE_BACKEND_ORIGIN }, () =>\n resolveConfig(isolatedWorktree),\n );\n if (overrideConfig.backendOrigin !== LOCAL_OVERRIDE_BACKEND_ORIGIN) {\n throw new Error(`Expected explicit backend override ${LOCAL_OVERRIDE_BACKEND_ORIGIN}, received ${overrideConfig.backendOrigin}`);\n }\n\n return {\n defaultBackendOrigin: defaultConfig.backendOrigin,\n portOnlyBackendOrigin: portOnlyConfig.backendOrigin,\n appUrlPlaceholderBackendOrigin: appUrlPlaceholderConfig.backendOrigin,\n explicitOverrideBackendOrigin: overrideConfig.backendOrigin,\n };\n};\n\nconst run = async () => {\n const payload: PublishedSkillCatalogPayload = {\n workspace: {\n id: 'workspace-1',\n slug: 'opencode-wizard',\n name: 'opencode-wizard',\n repositoryUrl: 'https://example.com/opencode-wizard.git',\n defaultBranch: 'main',\n status: 'ACTIVE',\n },\n directoryPath: '.',\n skills: [\n {\n assignmentSource: 'WORKSPACE',\n assignmentType: 'PATH',\n scopePath: '.',\n includeChildren: true,\n skill: {\n id: 'skill-1',\n slug: 'backend-auth',\n name: 'backend-auth',\n summary: 'Backend auth skill',\n whenToUse: 'Use for JWT cookie sessions and protected backend resolver work.',\n status: 'ACTIVE',\n installPolicy: 'PROJECT_INSTALLABLE',\n tags: [\n {\n id: 'tag-1',\n slug: 'auth',\n label: 'Auth',\n description: null,\n facet: {\n id: 'facet-1',\n slug: 'capability',\n label: 'Capability',\n description: null,\n },\n },\n ],\n },\n skillVersion: {\n id: 'version-1',\n version: '1.0.0',\n title: 'Initial',\n summary: 'Initial publish',\n status: 'PUBLISHED',\n },\n publishedArtifact: {\n id: 'artifact-1',\n frontmatterName: 'backend-auth',\n frontmatterDescription: 'JWT auth skill',\n checksum: 'checksum-1',\n publishedAt: '2026-04-22T00:00:00.000Z',\n fileCount: 2,\n },\n },\n ],\n catalogSkills: [],\n userPreferences: {\n scopeKey: 'workspace:workspace-1',\n userKey: 'user-1',\n ignoredSkills: [],\n },\n };\n const detailItem: PublishedSkillDetailItem = {\n ...payload.skills[0],\n publishedArtifact: {\n ...payload.skills[0].publishedArtifact,\n markdownBody: '## Mock skill\\n\\nThis is a mock published skill.',\n renderedContent: '<h2>Mock skill</h2>',\n files: [\n {\n id: 'artifact-file-1',\n relativePath: 'SKILL.md',\n contentType: 'text/markdown; charset=utf-8',\n content: '---\\nname: \"backend-auth\"\\ndescription: \"JWT auth skill\"\\n---\\n\\n## Mock skill\\n',\n checksum: 'file-checksum-1',\n size: 74,\n sortOrder: 0,\n },\n {\n id: 'artifact-file-2',\n relativePath: 'resource.md',\n contentType: 'text/markdown; charset=utf-8',\n content: '# Resource\\n',\n checksum: 'file-checksum-2',\n size: 11,\n sortOrder: 1,\n },\n ],\n },\n };\n\n const config = await resolveConfig(process.cwd());\n const backendOriginSmoke = await assertBackendOriginResolution();\n\n const catalog = toPublishedSkillCatalog(payload);\n const selection = selectPublishedSkills(payload, ['backend-auth', 'missing-skill']);\n const detail = selection.selectedItems[0] ? toPublishedSkillDetail(detailItem) : null;\n const preview = buildSkillMarkdown(detailItem).split('\\n').slice(0, 6);\n\n console.log(\n JSON.stringify(\n {\n runtimeMode: catalog.runtimeMode,\n graphqlUrl: config.graphqlUrl,\n backendOriginSmoke,\n publishedSkillCount: catalog.publishedSkillCount,\n availableTools: catalog.availableTools,\n facets: catalog.facets,\n selectedSkillCount: selection.selectedItems.length,\n missingSkills: selection.missingIdentifiers,\n selectedSkillSlug: detail?.skillSlug ?? null,\n selectedSkillTags: detail?.tags ?? [],\n markdownDocumentIncludesFrontmatter: detail?.markdownDocument.startsWith('---') ?? false,\n resourceFileCount: detail?.resources.length ?? 0,\n preview,\n markdownBodyIncludesContent: detail?.markdownBody.includes('This is a mock published skill.') ?? false,\n },\n null,\n 2,\n ),\n );\n};\n\nvoid run();\n"],"mappings":"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","ignoreList":[]}
package/dist/tui.js CHANGED
@@ -214,11 +214,30 @@ const getSkillTags = skill => {
214
214
  if (tagLabels.length === 0) return 'no tags';
215
215
  return tagLabels.join(', ');
216
216
  };
217
- const getSkillMeta = (skill, state) => `${skill.policyLabel} · ${state} · ${getSkillTags(skill)}`;
217
+ const isUserScopeAssignment = assignmentSource => assignmentSource === 'USER' || assignmentSource === 'USER_GLOBAL' || assignmentSource === 'USER_WORKSPACE';
218
+ const getSkillScopeLabel = (skill, state) => {
219
+ if (state === 'installable') return 'AVAILABLE';
220
+ if (isUserScopeAssignment(skill.assignmentSource) || state === 'user-scope') return 'USER SCOPE';
221
+ if (state === 'global-scope' || skill.contextKind === 'global') return 'GLOBAL SCOPE';
222
+ return 'PROJECT SCOPE';
223
+ };
224
+ const getSkillPreferenceScope = skill => {
225
+ if (skill.assignmentSource === 'USER_GLOBAL') return 'global';
226
+ if (skill.assignmentSource === 'USER_WORKSPACE') return 'project';
227
+ if (skill.contextKind === 'global') return 'global';
228
+ return 'project';
229
+ };
230
+ const getSkillMeta = (skill, state) => `${getSkillScopeLabel(skill, state)} · ${skill.assignmentLabel} · ${skill.policyLabel} · ${getSkillTags(skill)}`;
218
231
  const getRowStateLabel = row => {
219
- if (row.ignored) return 'ignored';
232
+ const scopeLabel = getSkillScopeLabel(row.skill, row.state);
233
+ if (row.ignored) return `ignored · ${scopeLabel}`;
220
234
  if (row.state === 'installable') return 'not installed';
221
- return row.state === 'installed-global' ? 'installed global' : 'installed project';
235
+ return `active · ${scopeLabel}`;
236
+ };
237
+ const getSkillRowState = skill => {
238
+ if (isUserScopeAssignment(skill.assignmentSource)) return 'user-scope';
239
+ if (skill.contextKind === 'global') return 'global-scope';
240
+ return 'project-scope';
222
241
  };
223
242
  const getErrorMessage = error => {
224
243
  if (error instanceof Error && error.message) return error.message;
@@ -266,7 +285,7 @@ const SkillCatalogRow = props => {
266
285
  _$insertNode(_el$27, _el$28);
267
286
  _$setProp(_el$27, "onMouseUp", () => props.onInstall(props.row, 'global'));
268
287
  _$setProp(_el$27, "flexShrink", 0);
269
- _$insertNode(_el$28, _$createTextNode(`Global`));
288
+ _$insertNode(_el$28, _$createTextNode(`GLOBAL SCOPE`));
270
289
  _$setProp(_el$28, "wrapMode", "none");
271
290
  _$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
272
291
  return _el$27;
@@ -282,7 +301,7 @@ const SkillCatalogRow = props => {
282
301
  _$insertNode(_el$32, _el$33);
283
302
  _$setProp(_el$32, "onMouseUp", () => props.onInstall(props.row, 'project'));
284
303
  _$setProp(_el$32, "flexShrink", 0);
285
- _$insertNode(_el$33, _$createTextNode(`Project`));
304
+ _$insertNode(_el$33, _$createTextNode(`PROJECT SCOPE`));
286
305
  _$setProp(_el$33, "wrapMode", "none");
287
306
  _$effect(_$p => _$setProp(_el$33, "fg", props.theme.textMuted, _$p));
288
307
  return _el$32;
@@ -384,11 +403,11 @@ const WizardSkillsDialogContent = props => {
384
403
  const rows = [...catalog.skills.map(skill => ({
385
404
  skill,
386
405
  ignored: false,
387
- state: skill.contextKind === 'global' ? 'installed-global' : 'installed-project'
406
+ state: getSkillRowState(skill)
388
407
  })), ...currentStatus.snapshot.ignoredPublishedSkills.skills.map(skill => ({
389
408
  skill,
390
409
  ignored: true,
391
- state: skill.contextKind === 'global' ? 'installed-global' : 'installed-project'
410
+ state: getSkillRowState(skill)
392
411
  })), ...(currentStatus.snapshot.installableCatalog?.skills ?? []).filter(skill => !activeSkillSlugs.has(skill.skillSlug) && !ignoredSkillSlugs.has(skill.skillSlug)).map(skill => ({
393
412
  skill,
394
413
  ignored: false,
@@ -416,29 +435,30 @@ const WizardSkillsDialogContent = props => {
416
435
  _el$52 = _$createElement("b"),
417
436
  _el$53 = _$createTextNode(` skills`),
418
437
  _el$54 = _$createTextNode(`&nbsp;· `),
419
- _el$55 = _$createTextNode(` global · `),
420
- _el$56 = _$createTextNode(` workspace &nbsp;· `),
421
- _el$57 = _$createTextNode(` ignored &nbsp;· `),
422
- _el$58 = _$createTextNode(` installable`),
423
- _el$59 = _$createElement("text"),
424
- _el$60 = _$createTextNode(`page `),
425
- _el$61 = _$createTextNode(`/`),
426
- _el$62 = _$createElement("box"),
438
+ _el$55 = _$createTextNode(` GLOBAL SCOPE · `),
439
+ _el$56 = _$createTextNode(` PROJECT SCOPE &nbsp;· `),
440
+ _el$57 = _$createTextNode(` USER SCOPE &nbsp;· `),
441
+ _el$58 = _$createTextNode(` ignored &nbsp;· `),
442
+ _el$59 = _$createTextNode(` installable`),
443
+ _el$60 = _$createElement("text"),
444
+ _el$61 = _$createTextNode(`page `),
445
+ _el$62 = _$createTextNode(`/`),
427
446
  _el$63 = _$createElement("box"),
428
447
  _el$64 = _$createElement("box"),
429
- _el$65 = _$createElement("text"),
430
- _el$67 = _$createElement("text"),
431
- _el$68 = _$createTextNode(` shown`),
432
- _el$69 = _$createElement("box"),
433
- _el$70 = _$createElement("text");
448
+ _el$65 = _$createElement("box"),
449
+ _el$66 = _$createElement("text"),
450
+ _el$68 = _$createElement("text"),
451
+ _el$69 = _$createTextNode(` shown`),
452
+ _el$70 = _$createElement("box"),
453
+ _el$71 = _$createElement("text");
434
454
  _$insertNode(_el$49, _el$50);
435
- _$insertNode(_el$49, _el$62);
436
455
  _$insertNode(_el$49, _el$63);
456
+ _$insertNode(_el$49, _el$64);
437
457
  _$setProp(_el$49, "width", "100%");
438
458
  _$setProp(_el$49, "flexDirection", "column");
439
459
  _$setProp(_el$49, "overflow", "hidden");
440
460
  _$insertNode(_el$50, _el$51);
441
- _$insertNode(_el$50, _el$59);
461
+ _$insertNode(_el$50, _el$60);
442
462
  _$setProp(_el$50, "width", "100%");
443
463
  _$setProp(_el$50, "flexDirection", "row");
444
464
  _$setProp(_el$50, "justifyContent", "space-between");
@@ -449,24 +469,26 @@ const WizardSkillsDialogContent = props => {
449
469
  _$insertNode(_el$51, _el$56);
450
470
  _$insertNode(_el$51, _el$57);
451
471
  _$insertNode(_el$51, _el$58);
472
+ _$insertNode(_el$51, _el$59);
452
473
  _$setProp(_el$51, "wrapMode", "none");
453
474
  _$setProp(_el$51, "overflow", "hidden");
454
475
  _$insertNode(_el$52, _el$53);
455
476
  _$insert(_el$52, () => catalog.publishedSkillCount, _el$53);
456
477
  _$insert(_el$51, () => catalog.assignmentCounts.global, _el$55);
457
478
  _$insert(_el$51, () => catalog.assignmentCounts.project, _el$56);
458
- _$insert(_el$51, () => currentStatus.snapshot.ignoredPublishedSkills.count, _el$57);
459
- _$insert(_el$51, () => currentStatus.snapshot.installableCatalog?.count ?? 0, _el$58);
460
- _$insertNode(_el$59, _el$60);
461
- _$insertNode(_el$59, _el$61);
462
- _$setProp(_el$59, "wrapMode", "none");
463
- _$insert(_el$59, currentPage + 1, _el$61);
464
- _$insert(_el$59, totalPages, null);
465
- _$setProp(_el$62, "width", "100%");
466
- _$setProp(_el$62, "flexDirection", "column");
467
- _$setProp(_el$62, "marginTop", 1);
468
- _$setProp(_el$62, "overflow", "hidden");
469
- _$insert(_el$62, () => visibleRows.map(row => _$createComponent(SkillCatalogRow, {
479
+ _$insert(_el$51, () => catalog.assignmentCounts.user, _el$57);
480
+ _$insert(_el$51, () => currentStatus.snapshot.ignoredPublishedSkills.count, _el$58);
481
+ _$insert(_el$51, () => currentStatus.snapshot.installableCatalog?.count ?? 0, _el$59);
482
+ _$insertNode(_el$60, _el$61);
483
+ _$insertNode(_el$60, _el$62);
484
+ _$setProp(_el$60, "wrapMode", "none");
485
+ _$insert(_el$60, currentPage + 1, _el$62);
486
+ _$insert(_el$60, totalPages, null);
487
+ _$setProp(_el$63, "width", "100%");
488
+ _$setProp(_el$63, "flexDirection", "column");
489
+ _$setProp(_el$63, "marginTop", 1);
490
+ _$setProp(_el$63, "overflow", "hidden");
491
+ _$insert(_el$63, () => visibleRows.map(row => _$createComponent(SkillCatalogRow, {
470
492
  row: row,
471
493
  get theme() {
472
494
  return props.theme;
@@ -481,27 +503,27 @@ const WizardSkillsDialogContent = props => {
481
503
  return props.onUninstallSkill;
482
504
  }
483
505
  })));
484
- _$insertNode(_el$63, _el$64);
485
- _$insertNode(_el$63, _el$67);
486
- _$insertNode(_el$63, _el$69);
487
- _$setProp(_el$63, "width", "100%");
488
- _$setProp(_el$63, "flexDirection", "row");
489
- _$setProp(_el$63, "justifyContent", "space-between");
490
- _$setProp(_el$63, "overflow", "hidden");
491
506
  _$insertNode(_el$64, _el$65);
492
- _$setProp(_el$64, "onMouseUp", goBack);
493
- _$setProp(_el$64, "flexShrink", 0);
494
- _$insertNode(_el$65, _$createTextNode(`← Prev`));
495
- _$setProp(_el$65, "wrapMode", "none");
496
- _$insertNode(_el$67, _el$68);
497
- _$setProp(_el$67, "wrapMode", "none");
498
- _$setProp(_el$67, "overflow", "hidden");
499
- _$insert(_el$67, () => visibleRows.length, _el$68);
500
- _$insertNode(_el$69, _el$70);
501
- _$setProp(_el$69, "onMouseUp", goForward);
502
- _$setProp(_el$69, "flexShrink", 0);
503
- _$insertNode(_el$70, _$createTextNode(`Next →`));
504
- _$setProp(_el$70, "wrapMode", "none");
507
+ _$insertNode(_el$64, _el$68);
508
+ _$insertNode(_el$64, _el$70);
509
+ _$setProp(_el$64, "width", "100%");
510
+ _$setProp(_el$64, "flexDirection", "row");
511
+ _$setProp(_el$64, "justifyContent", "space-between");
512
+ _$setProp(_el$64, "overflow", "hidden");
513
+ _$insertNode(_el$65, _el$66);
514
+ _$setProp(_el$65, "onMouseUp", goBack);
515
+ _$setProp(_el$65, "flexShrink", 0);
516
+ _$insertNode(_el$66, _$createTextNode(`← Prev`));
517
+ _$setProp(_el$66, "wrapMode", "none");
518
+ _$insertNode(_el$68, _el$69);
519
+ _$setProp(_el$68, "wrapMode", "none");
520
+ _$setProp(_el$68, "overflow", "hidden");
521
+ _$insert(_el$68, () => visibleRows.length, _el$69);
522
+ _$insertNode(_el$70, _el$71);
523
+ _$setProp(_el$70, "onMouseUp", goForward);
524
+ _$setProp(_el$70, "flexShrink", 0);
525
+ _$insertNode(_el$71, _$createTextNode(`Next →`));
526
+ _$setProp(_el$71, "wrapMode", "none");
505
527
  _$effect(_p$ => {
506
528
  var _v$8 = props.theme.text,
507
529
  _v$9 = props.theme.textMuted,
@@ -509,10 +531,10 @@ const WizardSkillsDialogContent = props => {
509
531
  _v$1 = props.theme.textMuted,
510
532
  _v$10 = canGoForward ? props.theme.text : props.theme.textMuted;
511
533
  _v$8 !== _p$.e && (_p$.e = _$setProp(_el$51, "fg", _v$8, _p$.e));
512
- _v$9 !== _p$.t && (_p$.t = _$setProp(_el$59, "fg", _v$9, _p$.t));
513
- _v$0 !== _p$.a && (_p$.a = _$setProp(_el$65, "fg", _v$0, _p$.a));
514
- _v$1 !== _p$.o && (_p$.o = _$setProp(_el$67, "fg", _v$1, _p$.o));
515
- _v$10 !== _p$.i && (_p$.i = _$setProp(_el$70, "fg", _v$10, _p$.i));
534
+ _v$9 !== _p$.t && (_p$.t = _$setProp(_el$60, "fg", _v$9, _p$.t));
535
+ _v$0 !== _p$.a && (_p$.a = _$setProp(_el$66, "fg", _v$0, _p$.a));
536
+ _v$1 !== _p$.o && (_p$.o = _$setProp(_el$68, "fg", _v$1, _p$.o));
537
+ _v$10 !== _p$.i && (_p$.i = _$setProp(_el$71, "fg", _v$10, _p$.i));
516
538
  return _p$;
517
539
  }, {
518
540
  e: undefined,
@@ -525,11 +547,11 @@ const WizardSkillsDialogContent = props => {
525
547
  })();
526
548
  };
527
549
  return (() => {
528
- var _el$72 = _$createElement("box");
529
- _$setProp(_el$72, "width", "100%");
530
- _$setProp(_el$72, "flexDirection", "column");
531
- _$setProp(_el$72, "overflow", "hidden");
532
- _$insert(_el$72, _$createComponent(PreferenceActionNoticeRow, {
550
+ var _el$73 = _$createElement("box");
551
+ _$setProp(_el$73, "width", "100%");
552
+ _$setProp(_el$73, "flexDirection", "column");
553
+ _$setProp(_el$73, "overflow", "hidden");
554
+ _$insert(_el$73, _$createComponent(PreferenceActionNoticeRow, {
533
555
  get notice() {
534
556
  return props.actionNotice();
535
557
  },
@@ -537,19 +559,19 @@ const WizardSkillsDialogContent = props => {
537
559
  return props.theme;
538
560
  }
539
561
  }), null);
540
- _$insert(_el$72, content, null);
541
- return _el$72;
562
+ _$insert(_el$73, content, null);
563
+ return _el$73;
542
564
  })();
543
565
  };
544
566
  const PreferenceActionNoticeRow = props => {
545
567
  if (props.notice.kind === 'idle') return null;
546
568
  return (() => {
547
- var _el$73 = _$createElement("text");
548
- _$setProp(_el$73, "wrapMode", "none");
549
- _$setProp(_el$73, "overflow", "hidden");
550
- _$insert(_el$73, () => compactStatusMessage(props.notice.message));
551
- _$effect(_$p => _$setProp(_el$73, "fg", props.notice.kind === 'error' ? props.theme.warning : props.theme.textMuted, _$p));
552
- return _el$73;
569
+ var _el$74 = _$createElement("text");
570
+ _$setProp(_el$74, "wrapMode", "none");
571
+ _$setProp(_el$74, "overflow", "hidden");
572
+ _$insert(_el$74, () => compactStatusMessage(props.notice.message));
573
+ _$effect(_$p => _$setProp(_el$74, "fg", props.notice.kind === 'error' ? props.theme.warning : props.theme.textMuted, _$p));
574
+ return _el$74;
553
575
  })();
554
576
  };
555
577
  const ReadyRows = props => {
@@ -578,12 +600,12 @@ const ReadyRows = props => {
578
600
  })];
579
601
  if (!props.snapshot.catalog) {
580
602
  return (() => {
581
- var _el$74 = _$createElement("box");
582
- _$setProp(_el$74, "width", "100%");
583
- _$setProp(_el$74, "flexDirection", "column");
584
- _$setProp(_el$74, "overflow", "hidden");
585
- _$insert(_el$74, statusRows, null);
586
- _$insert(_el$74, _$createComponent(Row, {
603
+ var _el$75 = _$createElement("box");
604
+ _$setProp(_el$75, "width", "100%");
605
+ _$setProp(_el$75, "flexDirection", "column");
606
+ _$setProp(_el$75, "overflow", "hidden");
607
+ _$insert(_el$75, statusRows, null);
608
+ _$insert(_el$75, _$createComponent(Row, {
587
609
  label: "catalog",
588
610
  get value() {
589
611
  return formatSkillsCatalogUnavailableMessage(props.snapshot);
@@ -595,22 +617,22 @@ const ReadyRows = props => {
595
617
  return props.theme.text;
596
618
  }
597
619
  }), null);
598
- return _el$74;
620
+ return _el$75;
599
621
  })();
600
622
  }
601
623
  const counts = props.snapshot.catalog.assignmentCounts;
602
624
  return (() => {
603
- var _el$75 = _$createElement("box"),
604
- _el$76 = _$createElement("text");
605
- _$insertNode(_el$75, _el$76);
606
- _$setProp(_el$75, "width", "100%");
607
- _$setProp(_el$75, "flexDirection", "column");
608
- _$setProp(_el$75, "overflow", "hidden");
609
- _$insert(_el$75, statusRows, _el$76);
610
- _$insertNode(_el$76, _$createTextNode(`catalog:`));
611
- _$setProp(_el$76, "wrapMode", "none");
625
+ var _el$76 = _$createElement("box"),
626
+ _el$77 = _$createElement("text");
627
+ _$insertNode(_el$76, _el$77);
628
+ _$setProp(_el$76, "width", "100%");
629
+ _$setProp(_el$76, "flexDirection", "column");
612
630
  _$setProp(_el$76, "overflow", "hidden");
613
- _$insert(_el$75, _$createComponent(CatalogBullet, {
631
+ _$insert(_el$76, statusRows, _el$77);
632
+ _$insertNode(_el$77, _$createTextNode(`catalog:`));
633
+ _$setProp(_el$77, "wrapMode", "none");
634
+ _$setProp(_el$77, "overflow", "hidden");
635
+ _$insert(_el$76, _$createComponent(CatalogBullet, {
614
636
  get value() {
615
637
  return `${props.snapshot.catalog.publishedSkillCount} loaded`;
616
638
  },
@@ -618,23 +640,31 @@ const ReadyRows = props => {
618
640
  return props.theme;
619
641
  }
620
642
  }), null);
621
- _$insert(_el$75, _$createComponent(CatalogBullet, {
643
+ _$insert(_el$76, _$createComponent(CatalogBullet, {
644
+ get value() {
645
+ return `${counts.global} GLOBAL SCOPE`;
646
+ },
647
+ get theme() {
648
+ return props.theme;
649
+ }
650
+ }), null);
651
+ _$insert(_el$76, _$createComponent(CatalogBullet, {
622
652
  get value() {
623
- return `${counts.global} global`;
653
+ return `${counts.project} PROJECT SCOPE`;
624
654
  },
625
655
  get theme() {
626
656
  return props.theme;
627
657
  }
628
658
  }), null);
629
- _$insert(_el$75, _$createComponent(CatalogBullet, {
659
+ _$insert(_el$76, _$createComponent(CatalogBullet, {
630
660
  get value() {
631
- return `${counts.project} workspace`;
661
+ return `${counts.user} USER SCOPE`;
632
662
  },
633
663
  get theme() {
634
664
  return props.theme;
635
665
  }
636
666
  }), null);
637
- _$insert(_el$75, _$createComponent(CatalogBullet, {
667
+ _$insert(_el$76, _$createComponent(CatalogBullet, {
638
668
  get value() {
639
669
  return `${props.snapshot.ignoredPublishedSkills.count} ignored`;
640
670
  },
@@ -642,8 +672,8 @@ const ReadyRows = props => {
642
672
  return props.theme;
643
673
  }
644
674
  }), null);
645
- _$effect(_$p => _$setProp(_el$76, "fg", props.theme.textMuted, _$p));
646
- return _el$75;
675
+ _$effect(_$p => _$setProp(_el$77, "fg", props.theme.textMuted, _$p));
676
+ return _el$76;
647
677
  })();
648
678
  };
649
679
  const WizardSkillsDialog = props => {
@@ -686,7 +716,7 @@ const WizardSkillsDialog = props => {
686
716
  scopeKey,
687
717
  skillSlug: row.skill.skillSlug,
688
718
  ignored: !row.ignored,
689
- preferenceScope: row.state === 'installed-global' ? 'global' : 'project'
719
+ preferenceScope: getSkillPreferenceScope(row.skill)
690
720
  }).then(() => refreshAfterPreferenceChange(row.ignored ? 'Skill is no longer ignored.' : 'Skill ignored.')).catch(showPreferenceFailure);
691
721
  };
692
722
  const installSkill = (row, preferenceScope) => {
@@ -695,7 +725,7 @@ const WizardSkillsDialog = props => {
695
725
  const scopeKey = currentStatus.snapshot.ignoredPublishedSkills.scopeKey;
696
726
  setActionNotice({
697
727
  kind: 'pending',
698
- message: `Installing skill for ${preferenceScope}…`
728
+ message: `Installing skill for ${preferenceScope.toUpperCase()} SCOPE…`
699
729
  });
700
730
  requestRender(props.api);
701
731
  void setPublishedSkillInstalled({
@@ -705,7 +735,7 @@ const WizardSkillsDialog = props => {
705
735
  skillSlug: row.skill.skillSlug,
706
736
  installed: true,
707
737
  preferenceScope
708
- }).then(() => refreshAfterPreferenceChange(`Skill installed for ${preferenceScope}.`)).catch(showPreferenceFailure);
738
+ }).then(() => refreshAfterPreferenceChange(`Skill installed for ${preferenceScope.toUpperCase()} SCOPE.`)).catch(showPreferenceFailure);
709
739
  };
710
740
  const uninstallSkill = row => {
711
741
  const currentStatus = props.status();
@@ -722,46 +752,46 @@ const WizardSkillsDialog = props => {
722
752
  scopeKey,
723
753
  skillSlug: row.skill.skillSlug,
724
754
  installed: false,
725
- preferenceScope: row.state === 'installed-global' ? 'global' : 'project'
755
+ preferenceScope: getSkillPreferenceScope(row.skill)
726
756
  }).then(() => refreshAfterPreferenceChange('Skill uninstalled.')).catch(showPreferenceFailure);
727
757
  };
728
758
  createEffect(() => {
729
759
  props.api.ui?.dialog?.setSize?.('xlarge');
730
760
  });
731
761
  return (() => {
732
- var _el$78 = _$createElement("box"),
733
- _el$79 = _$createElement("box"),
734
- _el$80 = _$createElement("text"),
735
- _el$81 = _$createElement("b"),
736
- _el$83 = _$createElement("box"),
737
- _el$84 = _$createElement("text"),
738
- _el$86 = _$createElement("box");
739
- _$insertNode(_el$78, _el$79);
740
- _$insertNode(_el$78, _el$86);
741
- _$setProp(_el$78, "width", "100%");
742
- _$setProp(_el$78, "flexDirection", "column");
743
- _$setProp(_el$78, "paddingLeft", 1);
744
- _$setProp(_el$78, "paddingRight", 1);
745
- _$setProp(_el$78, "paddingBottom", 1);
762
+ var _el$79 = _$createElement("box"),
763
+ _el$80 = _$createElement("box"),
764
+ _el$81 = _$createElement("text"),
765
+ _el$82 = _$createElement("b"),
766
+ _el$84 = _$createElement("box"),
767
+ _el$85 = _$createElement("text"),
768
+ _el$87 = _$createElement("box");
746
769
  _$insertNode(_el$79, _el$80);
747
- _$insertNode(_el$79, _el$83);
770
+ _$insertNode(_el$79, _el$87);
748
771
  _$setProp(_el$79, "width", "100%");
749
- _$setProp(_el$79, "flexDirection", "row");
750
- _$setProp(_el$79, "justifyContent", "space-between");
751
- _$setProp(_el$79, "overflow", "hidden");
772
+ _$setProp(_el$79, "flexDirection", "column");
773
+ _$setProp(_el$79, "paddingLeft", 1);
774
+ _$setProp(_el$79, "paddingRight", 1);
775
+ _$setProp(_el$79, "paddingBottom", 1);
752
776
  _$insertNode(_el$80, _el$81);
753
- _$setProp(_el$80, "wrapMode", "none");
777
+ _$insertNode(_el$80, _el$84);
778
+ _$setProp(_el$80, "width", "100%");
779
+ _$setProp(_el$80, "flexDirection", "row");
780
+ _$setProp(_el$80, "justifyContent", "space-between");
754
781
  _$setProp(_el$80, "overflow", "hidden");
755
- _$insertNode(_el$81, _$createTextNode(`Wizard Skills`));
756
- _$insertNode(_el$83, _el$84);
757
- _$setProp(_el$83, "flexShrink", 0);
758
- _$insertNode(_el$84, _$createTextNode(`Close`));
759
- _$setProp(_el$84, "wrapMode", "none");
760
- _$setProp(_el$86, "width", "100%");
761
- _$setProp(_el$86, "flexDirection", "column");
762
- _$setProp(_el$86, "marginTop", 1);
763
- _$setProp(_el$86, "overflow", "hidden");
764
- _$insert(_el$86, _$createComponent(WizardSkillsDialogContent, {
782
+ _$insertNode(_el$81, _el$82);
783
+ _$setProp(_el$81, "wrapMode", "none");
784
+ _$setProp(_el$81, "overflow", "hidden");
785
+ _$insertNode(_el$82, _$createTextNode(`Wizard Skills`));
786
+ _$insertNode(_el$84, _el$85);
787
+ _$setProp(_el$84, "flexShrink", 0);
788
+ _$insertNode(_el$85, _$createTextNode(`Close`));
789
+ _$setProp(_el$85, "wrapMode", "none");
790
+ _$setProp(_el$87, "width", "100%");
791
+ _$setProp(_el$87, "flexDirection", "column");
792
+ _$setProp(_el$87, "marginTop", 1);
793
+ _$setProp(_el$87, "overflow", "hidden");
794
+ _$insert(_el$87, _$createComponent(WizardSkillsDialogContent, {
765
795
  get status() {
766
796
  return props.status;
767
797
  },
@@ -777,16 +807,16 @@ const WizardSkillsDialog = props => {
777
807
  var _v$11 = theme().text,
778
808
  _v$12 = props.onClose,
779
809
  _v$13 = theme().textMuted;
780
- _v$11 !== _p$.e && (_p$.e = _$setProp(_el$80, "fg", _v$11, _p$.e));
781
- _v$12 !== _p$.t && (_p$.t = _$setProp(_el$83, "onMouseUp", _v$12, _p$.t));
782
- _v$13 !== _p$.a && (_p$.a = _$setProp(_el$84, "fg", _v$13, _p$.a));
810
+ _v$11 !== _p$.e && (_p$.e = _$setProp(_el$81, "fg", _v$11, _p$.e));
811
+ _v$12 !== _p$.t && (_p$.t = _$setProp(_el$84, "onMouseUp", _v$12, _p$.t));
812
+ _v$13 !== _p$.a && (_p$.a = _$setProp(_el$85, "fg", _v$13, _p$.a));
783
813
  return _p$;
784
814
  }, {
785
815
  e: undefined,
786
816
  t: undefined,
787
817
  a: undefined
788
818
  });
789
- return _el$78;
819
+ return _el$79;
790
820
  })();
791
821
  };
792
822
  const openWizardSkillsDialog = (api, status, refreshStatus) => {