@aexol/opencode-wizard 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +9 -7
  2. package/dist/graphql-operations.d.ts +7 -0
  3. package/dist/graphql-operations.js +230 -0
  4. package/dist/graphql-operations.js.map +1 -0
  5. package/dist/plugin-tools.d.ts +90 -0
  6. package/dist/plugin-tools.js +93 -0
  7. package/dist/plugin-tools.js.map +1 -0
  8. package/dist/published-skills-system-note.d.ts +9 -0
  9. package/dist/published-skills-system-note.js +30 -0
  10. package/dist/published-skills-system-note.js.map +1 -0
  11. package/dist/published-skills-terminology.d.ts +21 -0
  12. package/dist/published-skills-terminology.js +38 -0
  13. package/dist/published-skills-terminology.js.map +1 -0
  14. package/dist/published-skills-transform.d.ts +258 -0
  15. package/dist/published-skills-transform.js +310 -0
  16. package/dist/published-skills-transform.js.map +1 -0
  17. package/dist/server/auth-bootstrap.d.ts +7 -0
  18. package/dist/server/auth-bootstrap.js +89 -0
  19. package/dist/server/auth-bootstrap.js.map +1 -0
  20. package/dist/server/auth-flow.d.ts +10 -0
  21. package/dist/server/auth-flow.js +215 -0
  22. package/dist/server/auth-flow.js.map +1 -0
  23. package/dist/server/auth-store.d.ts +19 -0
  24. package/dist/server/auth-store.js +177 -0
  25. package/dist/server/auth-store.js.map +1 -0
  26. package/dist/server/client.d.ts +80 -0
  27. package/dist/server/client.js +324 -0
  28. package/dist/server/client.js.map +1 -0
  29. package/dist/server/config.d.ts +2 -0
  30. package/dist/server/config.js +82 -0
  31. package/dist/server/config.js.map +1 -0
  32. package/dist/server/constants.d.ts +26 -0
  33. package/dist/server/constants.js +32 -0
  34. package/dist/server/constants.js.map +1 -0
  35. package/dist/server/path-utils.d.ts +2 -0
  36. package/dist/server/path-utils.js +8 -0
  37. package/dist/server/path-utils.js.map +1 -0
  38. package/dist/server/preferences.d.ts +22 -0
  39. package/dist/server/preferences.js +121 -0
  40. package/dist/server/preferences.js.map +1 -0
  41. package/dist/server/presence.d.ts +14 -0
  42. package/dist/server/presence.js +68 -0
  43. package/dist/server/presence.js.map +1 -0
  44. package/dist/server/runtime.d.ts +13 -0
  45. package/dist/server/runtime.js +1315 -0
  46. package/dist/server/runtime.js.map +1 -0
  47. package/dist/server/status.d.ts +27 -0
  48. package/dist/server/status.js +224 -0
  49. package/dist/server/status.js.map +1 -0
  50. package/dist/server/types.d.ts +396 -0
  51. package/dist/server/types.js +2 -0
  52. package/dist/server/types.js.map +1 -0
  53. package/dist/server/workspace.d.ts +15 -0
  54. package/dist/server/workspace.js +126 -0
  55. package/dist/server/workspace.js.map +1 -0
  56. package/dist/server.d.ts +4 -309
  57. package/dist/server.js +4 -2611
  58. package/dist/server.js.map +1 -1
  59. package/dist/smoke-published-skills.js +11 -9
  60. package/dist/smoke-published-skills.js.map +1 -1
  61. package/dist/tui/components/common.d.ts +15 -0
  62. package/dist/tui/components/common.js +81 -0
  63. package/dist/tui/components/common.js.map +1 -0
  64. package/dist/tui/components/preference-action-notice-row.d.ts +5 -0
  65. package/dist/tui/components/preference-action-notice-row.js +17 -0
  66. package/dist/tui/components/preference-action-notice-row.js.map +1 -0
  67. package/dist/tui/components/skill-catalog-row.d.ts +8 -0
  68. package/dist/tui/components/skill-catalog-row.js +125 -0
  69. package/dist/tui/components/skill-catalog-row.js.map +1 -0
  70. package/dist/tui/components/status-content.d.ts +14 -0
  71. package/dist/tui/components/status-content.js +131 -0
  72. package/dist/tui/components/status-content.js.map +1 -0
  73. package/dist/tui/components/wizard-skills-dialog-content.d.ts +9 -0
  74. package/dist/tui/components/wizard-skills-dialog-content.js +229 -0
  75. package/dist/tui/components/wizard-skills-dialog-content.js.map +1 -0
  76. package/dist/tui/components/wizard-skills-dialog.d.ts +7 -0
  77. package/dist/tui/components/wizard-skills-dialog.js +156 -0
  78. package/dist/tui/components/wizard-skills-dialog.js.map +1 -0
  79. package/dist/tui/constants.d.ts +8 -0
  80. package/dist/tui/constants.js +9 -0
  81. package/dist/tui/constants.js.map +1 -0
  82. package/dist/tui/formatting.d.ts +8 -0
  83. package/dist/tui/formatting.js +45 -0
  84. package/dist/tui/formatting.js.map +1 -0
  85. package/dist/tui/plugin.d.ts +2 -0
  86. package/dist/tui/plugin.js +26 -0
  87. package/dist/tui/plugin.js.map +1 -0
  88. package/dist/tui/rendering.d.ts +2 -0
  89. package/dist/tui/rendering.js +8 -0
  90. package/dist/tui/rendering.js.map +1 -0
  91. package/dist/tui/skill-helpers.d.ts +13 -0
  92. package/dist/tui/skill-helpers.js +50 -0
  93. package/dist/tui/skill-helpers.js.map +1 -0
  94. package/dist/tui/slots.d.ts +2 -0
  95. package/dist/tui/slots.js +56 -0
  96. package/dist/tui/slots.js.map +1 -0
  97. package/dist/tui/status.d.ts +2 -0
  98. package/dist/tui/status.js +21 -0
  99. package/dist/tui/status.js.map +1 -0
  100. package/dist/tui/types.d.ts +75 -0
  101. package/dist/tui/types.js +2 -0
  102. package/dist/tui/types.js.map +1 -0
  103. package/dist/tui.d.ts +1 -44
  104. package/dist/tui.js +2 -870
  105. package/dist/tui.js.map +1 -1
  106. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getPublishedSkillAssignmentLabel","getPublishedSkillPolicyLabel","isUserPublishedSkillAssignment","toFrontmatterString","value","JSON","stringify","formatSkillLabel","item","artifactName","publishedArtifact","frontmatterName","trim","length","skill","name","buildSkillMarkdown","artifactBody","markdownBody","fallbackBody","renderedContent","body","startsWith","endsWith","description","frontmatterDescription","summary","frontmatter","join","getSkillIdentifiers","candidates","slug","seen","Set","reduce","all","candidate","normalized","cacheKey","toLowerCase","has","add","push","toPublishedSkillFacetSummary","facet","label","toPublishedSkillTagSummary","tag","getPublishedSkillFacets","items","facetsBySlug","Map","tags","set","values","sort","left","right","localeCompare","getPublishedSkillAssignmentCounts","counts","assignmentSource","user","global","project","other","getSkillContextKind","toPublishedSkillSummary","contextKind","skillSlug","skillName","artifactDescription","whenToUse","version","skillVersion","assignmentType","scopePath","includeChildren","checksum","publishedAt","fileCount","identifiers","map","installPolicy","assignmentLabel","policyLabel","policy","toPublishedSkillDetail","skillId","id","skillVersionId","artifactId","markdownDocument","files","resources","filter","file","relativePath","getWizardArtifactContextKind","getWizardArtifactIdentifiers","artifact","artifactVersion","toWizardArtifactSummary","artifactKind","kind","artifactSlug","canonicalFilePath","buildWizardArtifactMarkdown","toWizardArtifactDetail","artifactVersionId","toWizardArtifactCatalog","payload","options","pluginId","runtimeMode","deliveryModel","workspace","directoryPath","availableTools","artifactCount","artifacts","catalogArtifacts","toInstallableSkillSummary","toPublishedSkillCatalog","rootSkillSeedPath","publishedSkillCount","skills","assignmentCounts","facets","normalizeSkillIdentifier","parseSkillIdentifiers","split","mergeSkillIdentifiers","parseRequestedSkillArgs","args","requestedSkills","selectPublishedSkills","itemsByIdentifier","identifier","selectedItems","selectedKeys","missingIdentifiers","matched","get"],"sources":["../src/published-skills-transform.ts"],"sourcesContent":["import {\n getPublishedSkillAssignmentLabel,\n getPublishedSkillPolicyLabel,\n isUserPublishedSkillAssignment,\n} from './published-skills-terminology.js';\n\nexport { isUserPublishedSkillAssignment } from './published-skills-terminology.js';\n\ntype PublishedSkillFacetLike = {\n slug: string;\n label: string;\n description?: string | null;\n};\n\ntype PublishedSkillTagLike = {\n slug: string;\n label: string;\n description?: string | null;\n facet?: PublishedSkillFacetLike | null;\n};\n\ntype PublishedSkillInstallPolicy = 'GLOBAL_CONTEXT' | 'PROJECT_INSTALLABLE';\n\ntype PublishedSkillCatalogItemLike = {\n assignmentSource: string;\n assignmentType: string;\n scopePath: string;\n includeChildren?: boolean | null;\n skill: {\n id: string;\n slug: string;\n name: string;\n summary?: string | null;\n whenToUse?: string | null;\n status: string;\n installPolicy: PublishedSkillInstallPolicy;\n tags: PublishedSkillTagLike[];\n };\n skillVersion: {\n id: string;\n version: string;\n title?: string | null;\n summary?: string | null;\n status: string;\n };\n publishedArtifact: {\n id: string;\n frontmatterName: string;\n frontmatterDescription: string;\n checksum: string;\n publishedAt: string;\n fileCount: number;\n };\n};\n\ntype PublishedSkillArtifactFileLike = {\n id: string;\n relativePath: string;\n contentType: string;\n content: string;\n checksum: string;\n size: number;\n sortOrder: number;\n};\n\ntype PublishedSkillDetailItemLike = PublishedSkillCatalogItemLike & {\n publishedArtifact: PublishedSkillCatalogItemLike['publishedArtifact'] & {\n markdownBody: string;\n renderedContent: string;\n files: PublishedSkillArtifactFileLike[];\n };\n};\n\ntype PublishedSkillInstallableCatalogItemLike = Pick<\n PublishedSkillCatalogItemLike,\n 'skill' | 'skillVersion' | 'publishedArtifact'\n>;\n\ntype PublishedSkillCatalogPayloadLike<TItem extends PublishedSkillCatalogItemLike = PublishedSkillCatalogItemLike> = {\n workspace: {\n id: string;\n slug: string;\n name: string;\n repositoryUrl?: string | null;\n defaultBranch?: string | null;\n status: string;\n } | null;\n directoryPath: string;\n skills: TItem[];\n catalogSkills: PublishedSkillInstallableCatalogItemLike[];\n userPreferences: {\n scopeKey: string;\n userKey: string;\n ignoredSkills: PublishedSkillCatalogItemLike[];\n };\n};\n\nexport type PublishedSkillFacetSummary = {\n slug: string;\n label: string;\n description: string | null;\n};\n\nexport type PublishedSkillTagSummary = {\n slug: string;\n label: string;\n description: string | null;\n facet: PublishedSkillFacetSummary | null;\n};\n\nexport type PublishedSkillSummary = {\n skillSlug: string;\n skillName: string;\n artifactName: string;\n artifactDescription: string;\n whenToUse: string | null;\n version: string;\n assignmentSource: string;\n assignmentType: string;\n scopePath: string;\n includeChildren: boolean | null;\n checksum: string;\n publishedAt: string;\n fileCount: number;\n identifiers: string[];\n tags: PublishedSkillTagSummary[];\n contextKind: 'global' | 'project' | 'installable';\n installPolicy: PublishedSkillInstallPolicy;\n assignmentLabel: string;\n policyLabel: string;\n};\n\nexport type PublishedSkillDetail = PublishedSkillSummary & {\n skillId: string;\n skillVersionId: string;\n artifactId: string;\n markdownDocument: string;\n markdownBody: string;\n renderedContent: string;\n files: PublishedSkillArtifactFileLike[];\n resources: PublishedSkillArtifactFileLike[];\n};\n\ntype WizardArtifactKind = 'SKILL' | 'DESIGN_DOC';\n\ntype WizardArtifactCatalogItemLike = {\n assignmentSource: string;\n assignmentType: string;\n scopePath: string;\n includeChildren?: boolean | null;\n artifact: {\n id: string;\n kind: WizardArtifactKind;\n slug: string;\n name: string;\n summary?: string | null;\n whenToUse?: string | null;\n status: string;\n installPolicy: PublishedSkillInstallPolicy;\n };\n artifactVersion: {\n id: string;\n version: string;\n title?: string | null;\n summary?: string | null;\n status: string;\n frontmatterName: string;\n frontmatterDescription: string;\n checksum: string;\n canonicalFilePath: string;\n publishedAt: string;\n fileCount: number;\n };\n};\n\ntype WizardArtifactDetailLike = WizardArtifactCatalogItemLike & {\n artifactVersion: WizardArtifactCatalogItemLike['artifactVersion'] & {\n markdownBody: string;\n renderedContent: string;\n files: PublishedSkillArtifactFileLike[];\n };\n};\n\ntype WizardArtifactCatalogPayloadLike = {\n artifactKind: WizardArtifactKind;\n workspace: PublishedSkillCatalogPayloadLike['workspace'];\n directoryPath: string;\n artifacts: WizardArtifactCatalogItemLike[];\n catalogArtifacts: Pick<WizardArtifactCatalogItemLike, 'artifact' | 'artifactVersion'>[];\n artifactPreferences: {\n scopeKey: string;\n userKey: string;\n ignoredArtifacts: WizardArtifactCatalogItemLike[];\n };\n};\n\nexport type WizardArtifactSummary = {\n artifactKind: WizardArtifactKind;\n artifactSlug: string;\n artifactName: string;\n artifactDescription: string;\n whenToUse: string | null;\n version: string;\n assignmentSource: string;\n assignmentType: string;\n scopePath: string;\n includeChildren: boolean | null;\n checksum: string;\n publishedAt: string;\n fileCount: number;\n canonicalFilePath: string;\n identifiers: string[];\n contextKind: 'global' | 'project' | 'installable';\n installPolicy: PublishedSkillInstallPolicy;\n assignmentLabel: string;\n policyLabel: string;\n};\n\nexport type WizardArtifactDetail = WizardArtifactSummary & {\n artifactId: string;\n artifactVersionId: string;\n markdownDocument: string;\n markdownBody: string;\n renderedContent: string;\n files: PublishedSkillArtifactFileLike[];\n resources: PublishedSkillArtifactFileLike[];\n};\n\nexport type WizardArtifactCatalogState = {\n pluginId: string;\n runtimeMode: 'tool_fetch_only';\n deliveryModel: 'backend_published_generic_artifacts';\n artifactKind: WizardArtifactKind;\n workspace: PublishedSkillCatalogPayloadLike['workspace'];\n directoryPath: string;\n availableTools: string[];\n artifactCount: number;\n artifacts: WizardArtifactSummary[];\n catalogArtifacts: WizardArtifactSummary[];\n};\n\nexport type PublishedSkillsSuccessState = {\n pluginId: string;\n runtimeMode: 'tool_fetch_only';\n deliveryModel: 'backend_published_installed_effective_skills';\n workspace: PublishedSkillCatalogPayloadLike['workspace'];\n directoryPath: string;\n rootSkillSeedPath: string;\n availableTools: string[];\n publishedSkillCount: number;\n assignmentCounts: {\n global: number;\n project: number;\n user: number;\n other: number;\n };\n facets: PublishedSkillFacetSummary[];\n skills: PublishedSkillSummary[];\n};\n\ntype PublishedSkillCatalogOptions = {\n pluginId: string;\n rootSkillSeedPath: string;\n availableTools: string[];\n};\n\nconst toFrontmatterString = (value: string): string => JSON.stringify(value);\n\nexport const formatSkillLabel = (item: PublishedSkillCatalogItemLike): string => {\n const artifactName = item.publishedArtifact.frontmatterName.trim();\n if (artifactName.length > 0) return artifactName;\n return item.skill.name;\n};\n\nexport const buildSkillMarkdown = (item: PublishedSkillDetailItemLike): string => {\n const artifactBody = item.publishedArtifact.markdownBody.trim();\n const fallbackBody = item.publishedArtifact.renderedContent.trim();\n const body = artifactBody || fallbackBody;\n\n if (body.startsWith('---')) {\n return body.endsWith('\\n') ? body : `${body}\\n`;\n }\n\n const name = formatSkillLabel(item);\n const description = item.publishedArtifact.frontmatterDescription.trim() || item.skill.summary?.trim() || '';\n const frontmatter = ['---', `name: ${toFrontmatterString(name)}`, `description: ${toFrontmatterString(description)}`, '---'].join(\n '\\n',\n );\n\n if (!body) {\n return `${frontmatter}\\n`;\n }\n\n return `${frontmatter}\\n\\n${body.endsWith('\\n') ? body : `${body}\\n`}`;\n};\n\nconst getSkillIdentifiers = (item: PublishedSkillCatalogItemLike): string[] => {\n const candidates = [item.skill.slug, item.publishedArtifact.frontmatterName, item.skill.name];\n const seen = new Set<string>();\n\n return candidates.reduce<string[]>((all, candidate) => {\n const normalized = candidate.trim();\n if (!normalized) return all;\n\n const cacheKey = normalized.toLowerCase();\n if (seen.has(cacheKey)) return all;\n\n seen.add(cacheKey);\n all.push(normalized);\n return all;\n }, []);\n};\n\nconst toPublishedSkillFacetSummary = (facet: PublishedSkillFacetLike): PublishedSkillFacetSummary => ({\n slug: facet.slug,\n label: facet.label,\n description: facet.description ?? null,\n});\n\nconst toPublishedSkillTagSummary = (tag: PublishedSkillTagLike): PublishedSkillTagSummary => ({\n slug: tag.slug,\n label: tag.label,\n description: tag.description ?? null,\n facet: tag.facet ? toPublishedSkillFacetSummary(tag.facet) : null,\n});\n\nconst getPublishedSkillFacets = (items: PublishedSkillCatalogItemLike[]): PublishedSkillFacetSummary[] => {\n const facetsBySlug = new Map<string, PublishedSkillFacetSummary>();\n\n for (const item of items) {\n for (const tag of item.skill.tags) {\n if (!tag.facet) continue;\n if (facetsBySlug.has(tag.facet.slug)) continue;\n facetsBySlug.set(tag.facet.slug, toPublishedSkillFacetSummary(tag.facet));\n }\n }\n\n return [...facetsBySlug.values()].sort((left, right) => left.slug.localeCompare(right.slug));\n};\n\nconst getPublishedSkillAssignmentCounts = (\n items: PublishedSkillCatalogItemLike[],\n): PublishedSkillsSuccessState['assignmentCounts'] =>\n items.reduce<PublishedSkillsSuccessState['assignmentCounts']>(\n (counts, item) => {\n if (isUserPublishedSkillAssignment(item.assignmentSource)) {\n return {\n ...counts,\n user: counts.user + 1,\n };\n }\n\n if (item.assignmentSource === 'GLOBAL') {\n return {\n ...counts,\n global: counts.global + 1,\n };\n }\n\n if (item.assignmentSource === 'WORKSPACE') {\n return {\n ...counts,\n project: counts.project + 1,\n };\n }\n\n return {\n ...counts,\n other: counts.other + 1,\n };\n },\n {\n global: 0,\n project: 0,\n user: 0,\n other: 0,\n },\n );\n\nconst getSkillContextKind = (item: PublishedSkillCatalogItemLike): PublishedSkillSummary['contextKind'] => {\n if (item.assignmentSource === 'GLOBAL') return 'global';\n return 'project';\n};\n\nexport const toPublishedSkillSummary = (item: PublishedSkillCatalogItemLike): PublishedSkillSummary => {\n const contextKind = getSkillContextKind(item);\n\n return {\n skillSlug: item.skill.slug,\n skillName: item.skill.name,\n artifactName: item.publishedArtifact.frontmatterName,\n artifactDescription: item.publishedArtifact.frontmatterDescription,\n whenToUse: item.skill.whenToUse ?? null,\n version: item.skillVersion.version,\n assignmentSource: item.assignmentSource,\n assignmentType: item.assignmentType,\n scopePath: item.scopePath,\n includeChildren: item.includeChildren ?? null,\n checksum: item.publishedArtifact.checksum,\n publishedAt: item.publishedArtifact.publishedAt,\n fileCount: item.publishedArtifact.fileCount,\n identifiers: getSkillIdentifiers(item),\n tags: item.skill.tags.map(toPublishedSkillTagSummary),\n contextKind,\n installPolicy: item.skill.installPolicy,\n assignmentLabel: getPublishedSkillAssignmentLabel(item.assignmentSource),\n policyLabel: getPublishedSkillPolicyLabel({\n assignmentSource: item.assignmentSource,\n contextKind,\n policy: item.skill.installPolicy,\n }),\n };\n};\n\nexport const toPublishedSkillDetail = (item: PublishedSkillDetailItemLike): PublishedSkillDetail => ({\n ...toPublishedSkillSummary(item),\n skillId: item.skill.id,\n skillVersionId: item.skillVersion.id,\n artifactId: item.publishedArtifact.id,\n markdownDocument: buildSkillMarkdown(item),\n markdownBody: item.publishedArtifact.markdownBody,\n renderedContent: item.publishedArtifact.renderedContent,\n files: item.publishedArtifact.files,\n resources: item.publishedArtifact.files.filter((file) => file.relativePath !== 'SKILL.md'),\n});\n\nconst getWizardArtifactContextKind = (item: WizardArtifactCatalogItemLike): WizardArtifactSummary['contextKind'] => {\n if (item.assignmentSource === 'GLOBAL') return 'global';\n if (item.assignmentSource === 'CATALOG') return 'installable';\n return 'project';\n};\n\nconst getWizardArtifactIdentifiers = (item: WizardArtifactCatalogItemLike): string[] => {\n const candidates = [item.artifact.slug, item.artifactVersion.frontmatterName, item.artifact.name];\n const seen = new Set<string>();\n return candidates.reduce<string[]>((all, candidate) => {\n const normalized = candidate.trim();\n if (!normalized) return all;\n const cacheKey = normalized.toLowerCase();\n if (seen.has(cacheKey)) return all;\n seen.add(cacheKey);\n all.push(normalized);\n return all;\n }, []);\n};\n\nexport const toWizardArtifactSummary = (item: WizardArtifactCatalogItemLike): WizardArtifactSummary => {\n const contextKind = getWizardArtifactContextKind(item);\n return {\n artifactKind: item.artifact.kind,\n artifactSlug: item.artifact.slug,\n artifactName: item.artifactVersion.frontmatterName || item.artifact.name,\n artifactDescription: item.artifactVersion.frontmatterDescription || item.artifact.summary || '',\n whenToUse: item.artifact.whenToUse ?? null,\n version: item.artifactVersion.version,\n assignmentSource: item.assignmentSource,\n assignmentType: item.assignmentType,\n scopePath: item.scopePath,\n includeChildren: item.includeChildren ?? null,\n checksum: item.artifactVersion.checksum,\n publishedAt: item.artifactVersion.publishedAt,\n fileCount: item.artifactVersion.fileCount,\n canonicalFilePath: item.artifactVersion.canonicalFilePath,\n identifiers: getWizardArtifactIdentifiers(item),\n contextKind,\n installPolicy: item.artifact.installPolicy,\n assignmentLabel: getPublishedSkillAssignmentLabel(item.assignmentSource),\n policyLabel: getPublishedSkillPolicyLabel({\n assignmentSource: item.assignmentSource,\n contextKind,\n policy: item.artifact.installPolicy,\n }),\n };\n};\n\nexport const buildWizardArtifactMarkdown = (item: WizardArtifactDetailLike): string => {\n const body = item.artifactVersion.markdownBody.trim() || item.artifactVersion.renderedContent.trim();\n if (body.endsWith('\\n')) return body;\n return `${body}\\n`;\n};\n\nexport const toWizardArtifactDetail = (item: WizardArtifactDetailLike): WizardArtifactDetail => ({\n ...toWizardArtifactSummary(item),\n artifactId: item.artifact.id,\n artifactVersionId: item.artifactVersion.id,\n markdownDocument: buildWizardArtifactMarkdown(item),\n markdownBody: item.artifactVersion.markdownBody,\n renderedContent: item.artifactVersion.renderedContent,\n files: item.artifactVersion.files,\n resources: item.artifactVersion.files.filter((file) => file.relativePath !== item.artifactVersion.canonicalFilePath),\n});\n\nexport const toWizardArtifactCatalog = (\n payload: WizardArtifactCatalogPayloadLike,\n options: { pluginId: string; availableTools: string[] },\n): WizardArtifactCatalogState => ({\n pluginId: options.pluginId,\n runtimeMode: 'tool_fetch_only',\n deliveryModel: 'backend_published_generic_artifacts',\n artifactKind: payload.artifactKind,\n workspace: payload.workspace,\n directoryPath: payload.directoryPath,\n availableTools: options.availableTools,\n artifactCount: payload.artifacts.length,\n artifacts: payload.artifacts.map(toWizardArtifactSummary),\n catalogArtifacts: payload.catalogArtifacts.map((item) =>\n toWizardArtifactSummary({\n ...item,\n assignmentSource: 'CATALOG',\n assignmentType: 'PATH',\n scopePath: '',\n includeChildren: true,\n }),\n ),\n});\n\nexport const toInstallableSkillSummary = (item: PublishedSkillInstallableCatalogItemLike): PublishedSkillSummary => ({\n skillSlug: item.skill.slug,\n skillName: item.skill.name,\n artifactName: item.publishedArtifact.frontmatterName,\n artifactDescription: item.publishedArtifact.frontmatterDescription,\n whenToUse: item.skill.whenToUse ?? null,\n version: item.skillVersion.version,\n assignmentSource: 'CATALOG',\n assignmentType: 'PATH',\n scopePath: '',\n includeChildren: true,\n checksum: item.publishedArtifact.checksum,\n publishedAt: item.publishedArtifact.publishedAt,\n fileCount: item.publishedArtifact.fileCount,\n identifiers: getSkillIdentifiers({\n ...item,\n assignmentSource: 'CATALOG',\n assignmentType: 'PATH',\n scopePath: '',\n includeChildren: true,\n }),\n tags: item.skill.tags.map(toPublishedSkillTagSummary),\n contextKind: 'installable',\n installPolicy: item.skill.installPolicy,\n assignmentLabel: 'catalog skill',\n policyLabel: getPublishedSkillPolicyLabel({\n assignmentSource: 'CATALOG',\n contextKind: 'installable',\n policy: item.skill.installPolicy,\n }),\n});\n\nexport const toPublishedSkillCatalog = (\n payload: PublishedSkillCatalogPayloadLike,\n options: PublishedSkillCatalogOptions,\n): PublishedSkillsSuccessState => ({\n pluginId: options.pluginId,\n runtimeMode: 'tool_fetch_only',\n deliveryModel: 'backend_published_installed_effective_skills',\n workspace: payload.workspace,\n directoryPath: payload.directoryPath,\n rootSkillSeedPath: options.rootSkillSeedPath,\n availableTools: options.availableTools,\n publishedSkillCount: payload.skills.length,\n assignmentCounts: getPublishedSkillAssignmentCounts(payload.skills),\n facets: getPublishedSkillFacets(payload.skills),\n skills: payload.skills.map(toPublishedSkillSummary),\n});\n\nconst normalizeSkillIdentifier = (value: string): string => value.trim().toLowerCase();\n\nconst parseSkillIdentifiers = (value: string): string[] => {\n const seen = new Set<string>();\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n .filter((item) => {\n const normalized = normalizeSkillIdentifier(item);\n if (seen.has(normalized)) return false;\n seen.add(normalized);\n return true;\n });\n};\n\nconst mergeSkillIdentifiers = (values: string[]): string[] => {\n const seen = new Set<string>();\n\n return values.filter((value) => {\n const normalized = normalizeSkillIdentifier(value);\n if (!normalized || seen.has(normalized)) return false;\n seen.add(normalized);\n return true;\n });\n};\n\nexport const parseRequestedSkillArgs = (args: { skill?: string; skills?: string }): string[] => {\n const requestedSkills: string[] = [];\n\n if (typeof args.skill === 'string') {\n requestedSkills.push(...parseSkillIdentifiers(args.skill));\n }\n\n if (typeof args.skills === 'string') {\n requestedSkills.push(...parseSkillIdentifiers(args.skills));\n }\n\n return mergeSkillIdentifiers(requestedSkills);\n};\n\nexport const selectPublishedSkills = <TItem extends PublishedSkillCatalogItemLike>(\n payload: Omit<PublishedSkillCatalogPayloadLike<TItem>, 'skills'> & { skills: TItem[] },\n identifiers: string[],\n) => {\n const itemsByIdentifier = new Map<string, TItem>();\n\n for (const item of payload.skills) {\n for (const identifier of getSkillIdentifiers(item)) {\n itemsByIdentifier.set(normalizeSkillIdentifier(identifier), item);\n }\n }\n\n const selectedItems: TItem[] = [];\n const selectedKeys = new Set<string>();\n const missingIdentifiers: string[] = [];\n\n for (const identifier of identifiers) {\n const matched = itemsByIdentifier.get(normalizeSkillIdentifier(identifier));\n if (!matched) {\n missingIdentifiers.push(identifier);\n continue;\n }\n\n if (selectedKeys.has(matched.publishedArtifact.id)) {\n continue;\n }\n\n selectedKeys.add(matched.publishedArtifact.id);\n selectedItems.push(matched);\n }\n\n return {\n selectedItems,\n missingIdentifiers,\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import type { LoginBootstrapSnapshot, PluginStatusSnapshot } from './types.js';
2
+ export declare const createIdleLoginBootstrapSnapshot: () => LoginBootstrapSnapshot;
3
+ export declare const resolvePluginStatusSnapshotWithAuthBootstrap: ({ worktree, directory, signal, }: {
4
+ worktree: string;
5
+ directory: string;
6
+ signal: AbortSignal;
7
+ }) => Promise<PluginStatusSnapshot>;
@@ -0,0 +1,89 @@
1
+ import { createPluginSession, openBrowser, startLoginFlow } from './auth-flow.js';
2
+ import { resolveConfig } from './config.js';
3
+ import { LOGIN_TIMEOUT_MS, OIDC_CALLBACK_URL } from './constants.js';
4
+ import { toAuthState, writeAuthState } from './auth-store.js';
5
+ import { resolvePluginStatusSnapshot, withStatusMessage } from './status.js';
6
+ const STATUS_PATH_LOGIN_RETRY_COOLDOWN_MS = 60_000;
7
+ const statusPathLoginBootstrap = {
8
+ promise: null,
9
+ status: 'idle',
10
+ message: null,
11
+ failedAt: null
12
+ };
13
+ export const createIdleLoginBootstrapSnapshot = () => ({
14
+ status: 'idle',
15
+ trigger: null,
16
+ startedAt: null,
17
+ expiresAt: null,
18
+ browserUrl: null,
19
+ browserOpenError: null,
20
+ email: null,
21
+ message: null
22
+ });
23
+ const startStatusPathLoginBootstrap = config => {
24
+ if (statusPathLoginBootstrap.promise) return;
25
+ if (statusPathLoginBootstrap.status === 'failed' && statusPathLoginBootstrap.failedAt && Date.now() - statusPathLoginBootstrap.failedAt < STATUS_PATH_LOGIN_RETRY_COOLDOWN_MS) {
26
+ return;
27
+ }
28
+ statusPathLoginBootstrap.status = 'pending';
29
+ statusPathLoginBootstrap.message = 'Browser login started automatically from the TUI/status path.';
30
+ statusPathLoginBootstrap.failedAt = null;
31
+ statusPathLoginBootstrap.promise = (async () => {
32
+ const loginSignal = AbortSignal.timeout(LOGIN_TIMEOUT_MS);
33
+ const loginStart = await startLoginFlow(loginSignal);
34
+ const browserOpenError = await openBrowser(loginStart.browserUrl);
35
+ if (browserOpenError) {
36
+ statusPathLoginBootstrap.message = `Automatic browser open failed. Open ${loginStart.browserUrl} manually.`;
37
+ }
38
+ try {
39
+ const callbackPayload = await loginStart.callbackPromise;
40
+ if (callbackPayload.status === 'error') {
41
+ throw new Error(callbackPayload.message);
42
+ }
43
+ if (callbackPayload.state !== loginStart.expectedState) {
44
+ throw new Error('OAuth callback state did not match the original login request.');
45
+ }
46
+ const pluginSession = await createPluginSession({
47
+ code: callbackPayload.code,
48
+ codeVerifier: loginStart.codeVerifier,
49
+ redirectUri: OIDC_CALLBACK_URL,
50
+ config,
51
+ signal: loginSignal
52
+ });
53
+ const authState = toAuthState(pluginSession);
54
+ await writeAuthState(config.authStatePath, authState);
55
+ statusPathLoginBootstrap.status = 'authenticated';
56
+ statusPathLoginBootstrap.message = `Browser login completed successfully for ${authState.email}.`;
57
+ return authState;
58
+ } finally {
59
+ await loginStart.closeCallbackServer().catch(() => undefined);
60
+ }
61
+ })().catch(error => {
62
+ statusPathLoginBootstrap.status = 'failed';
63
+ statusPathLoginBootstrap.failedAt = Date.now();
64
+ statusPathLoginBootstrap.message = error instanceof Error ? error.message : 'Browser login failed.';
65
+ throw error;
66
+ }).finally(() => {
67
+ statusPathLoginBootstrap.promise = null;
68
+ });
69
+ statusPathLoginBootstrap.promise.catch(() => undefined);
70
+ };
71
+ export const resolvePluginStatusSnapshotWithAuthBootstrap = async ({
72
+ worktree,
73
+ directory,
74
+ signal
75
+ }) => {
76
+ const snapshot = await resolvePluginStatusSnapshot({
77
+ worktree,
78
+ directory,
79
+ signal
80
+ });
81
+ if (snapshot.status !== 'missing_auth') return snapshot;
82
+ const config = await resolveConfig(worktree);
83
+ startStatusPathLoginBootstrap(config);
84
+ if (statusPathLoginBootstrap.message) {
85
+ return withStatusMessage(snapshot, statusPathLoginBootstrap.message);
86
+ }
87
+ return withStatusMessage(snapshot, 'Browser login is pending from the TUI/status path.');
88
+ };
89
+ //# sourceMappingURL=auth-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPluginSession","openBrowser","startLoginFlow","resolveConfig","LOGIN_TIMEOUT_MS","OIDC_CALLBACK_URL","toAuthState","writeAuthState","resolvePluginStatusSnapshot","withStatusMessage","STATUS_PATH_LOGIN_RETRY_COOLDOWN_MS","statusPathLoginBootstrap","promise","status","message","failedAt","createIdleLoginBootstrapSnapshot","trigger","startedAt","expiresAt","browserUrl","browserOpenError","email","startStatusPathLoginBootstrap","config","Date","now","loginSignal","AbortSignal","timeout","loginStart","callbackPayload","callbackPromise","Error","state","expectedState","pluginSession","code","codeVerifier","redirectUri","signal","authState","authStatePath","closeCallbackServer","catch","undefined","error","finally","resolvePluginStatusSnapshotWithAuthBootstrap","worktree","directory","snapshot"],"sources":["../../src/server/auth-bootstrap.ts"],"sourcesContent":["import { createPluginSession, openBrowser, startLoginFlow } from './auth-flow.js';\nimport { resolveConfig } from './config.js';\nimport { LOGIN_TIMEOUT_MS, OIDC_CALLBACK_URL } from './constants.js';\nimport { toAuthState, writeAuthState } from './auth-store.js';\nimport { resolvePluginStatusSnapshot, withStatusMessage } from './status.js';\nimport type {\n AuthState,\n LoginBootstrapSnapshot,\n PluginStatusSnapshot,\n ResolvedConfig,\n StatusPathLoginBootstrap,\n} from './types.js';\n\nconst STATUS_PATH_LOGIN_RETRY_COOLDOWN_MS = 60_000;\n\nconst statusPathLoginBootstrap: StatusPathLoginBootstrap = {\n promise: null,\n status: 'idle',\n message: null,\n failedAt: null,\n};\n\nexport const createIdleLoginBootstrapSnapshot = (): LoginBootstrapSnapshot => ({\n status: 'idle',\n trigger: null,\n startedAt: null,\n expiresAt: null,\n browserUrl: null,\n browserOpenError: null,\n email: null,\n message: null,\n});\n\nconst startStatusPathLoginBootstrap = (config: ResolvedConfig): void => {\n if (statusPathLoginBootstrap.promise) return;\n\n if (\n statusPathLoginBootstrap.status === 'failed' &&\n statusPathLoginBootstrap.failedAt &&\n Date.now() - statusPathLoginBootstrap.failedAt < STATUS_PATH_LOGIN_RETRY_COOLDOWN_MS\n ) {\n return;\n }\n\n statusPathLoginBootstrap.status = 'pending';\n statusPathLoginBootstrap.message = 'Browser login started automatically from the TUI/status path.';\n statusPathLoginBootstrap.failedAt = null;\n\n statusPathLoginBootstrap.promise = (async (): Promise<AuthState> => {\n const loginSignal = AbortSignal.timeout(LOGIN_TIMEOUT_MS);\n const loginStart = await startLoginFlow(loginSignal);\n const browserOpenError = await openBrowser(loginStart.browserUrl);\n\n if (browserOpenError) {\n statusPathLoginBootstrap.message = `Automatic browser open failed. Open ${loginStart.browserUrl} manually.`;\n }\n\n try {\n const callbackPayload = await loginStart.callbackPromise;\n\n if (callbackPayload.status === 'error') {\n throw new Error(callbackPayload.message);\n }\n\n if (callbackPayload.state !== loginStart.expectedState) {\n throw new Error('OAuth callback state did not match the original login request.');\n }\n\n const pluginSession = await createPluginSession({\n code: callbackPayload.code,\n codeVerifier: loginStart.codeVerifier,\n redirectUri: OIDC_CALLBACK_URL,\n config,\n signal: loginSignal,\n });\n const authState = toAuthState(pluginSession);\n await writeAuthState(config.authStatePath, authState);\n\n statusPathLoginBootstrap.status = 'authenticated';\n statusPathLoginBootstrap.message = `Browser login completed successfully for ${authState.email}.`;\n return authState;\n } finally {\n await loginStart.closeCallbackServer().catch(() => undefined);\n }\n })()\n .catch((error: unknown) => {\n statusPathLoginBootstrap.status = 'failed';\n statusPathLoginBootstrap.failedAt = Date.now();\n statusPathLoginBootstrap.message = error instanceof Error ? error.message : 'Browser login failed.';\n throw error;\n })\n .finally(() => {\n statusPathLoginBootstrap.promise = null;\n });\n\n statusPathLoginBootstrap.promise.catch(() => undefined);\n};\n\nexport const resolvePluginStatusSnapshotWithAuthBootstrap = async ({\n worktree,\n directory,\n signal,\n}: {\n worktree: string;\n directory: string;\n signal: AbortSignal;\n}): Promise<PluginStatusSnapshot> => {\n const snapshot = await resolvePluginStatusSnapshot({\n worktree,\n directory,\n signal,\n });\n\n if (snapshot.status !== 'missing_auth') return snapshot;\n\n const config = await resolveConfig(worktree);\n startStatusPathLoginBootstrap(config);\n\n if (statusPathLoginBootstrap.message) {\n return withStatusMessage(snapshot, statusPathLoginBootstrap.message);\n }\n\n return withStatusMessage(snapshot, 'Browser login is pending from the TUI/status path.');\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import type { OidcLoginStart, PluginSessionResponse, ResolvedConfig } from './types.js';
2
+ export declare const startLoginFlow: (signal: AbortSignal) => Promise<OidcLoginStart>;
3
+ export declare const createPluginSession: ({ code, codeVerifier, redirectUri, config, signal, }: {
4
+ code: string;
5
+ codeVerifier: string;
6
+ redirectUri: string;
7
+ config: ResolvedConfig;
8
+ signal: AbortSignal;
9
+ }) => Promise<PluginSessionResponse["session"]>;
10
+ export declare const openBrowser: (url: string) => Promise<string | null>;
@@ -0,0 +1,215 @@
1
+ import { execFile } from 'node:child_process';
2
+ import crypto from 'node:crypto';
3
+ import http from 'node:http';
4
+ import { promisify } from 'node:util';
5
+ import { URL } from 'node:url';
6
+ import { sendOAuthCallbackHtmlResponse } from '../oauth-callback-page.js';
7
+ import { LOGIN_TIMEOUT_MS, OIDC_CALLBACK_ORIGIN, OIDC_CALLBACK_PATH, OIDC_CALLBACK_URL, OIDC_CLIENT_ID, OIDC_ISSUER, OIDC_SCOPES } from './constants.js';
8
+ const execFileAsync = promisify(execFile);
9
+ const createRandomBase64Url = bytes => {
10
+ return crypto.randomBytes(bytes).toString('base64url');
11
+ };
12
+ const createCodeChallenge = codeVerifier => {
13
+ return crypto.createHash('sha256').update(codeVerifier).digest('base64url');
14
+ };
15
+ const getMessageFromUnknownPayload = value => {
16
+ if (!value || typeof value !== 'object') return null;
17
+ const candidate = 'message' in value ? value.message : null;
18
+ return typeof candidate === 'string' ? candidate : null;
19
+ };
20
+ const fetchOidcDiscoveryDocument = async signal => {
21
+ const discoveryUrl = `${OIDC_ISSUER.replace(/\/+$/, '')}/.well-known/openid-configuration`;
22
+ const response = await fetch(discoveryUrl, {
23
+ method: 'GET',
24
+ signal
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`OIDC discovery failed with HTTP ${response.status}.`);
28
+ }
29
+ return await response.json();
30
+ };
31
+ const isCallbackPortInUseError = error => {
32
+ if (!error || typeof error !== 'object') return false;
33
+ if (!('code' in error)) return false;
34
+ return error.code === 'EADDRINUSE';
35
+ };
36
+ const toCallbackServerStartError = error => {
37
+ if (!isCallbackPortInUseError(error)) {
38
+ return error instanceof Error ? error : new Error('Failed to start local OAuth callback server.');
39
+ }
40
+ return new Error('OAuth login cannot start because localhost:24953 is already in use. Another OpenCode login is likely in progress; finish it or close the other instance, then retry.');
41
+ };
42
+ const startLocalCallbackServer = async ({
43
+ expectedState,
44
+ signal
45
+ }) => {
46
+ let settled = false;
47
+ let resolvePayload = () => undefined;
48
+ let rejectPayload = () => undefined;
49
+ const callbackPromise = new Promise((resolve, reject) => {
50
+ resolvePayload = resolve;
51
+ rejectPayload = reject;
52
+ });
53
+ const finalize = payload => {
54
+ if (settled) return;
55
+ settled = true;
56
+ resolvePayload(payload);
57
+ };
58
+ const fail = reason => {
59
+ if (settled) return;
60
+ settled = true;
61
+ rejectPayload(reason);
62
+ };
63
+ const server = http.createServer((request, response) => {
64
+ const requestUrl = new URL(request.url ?? '/', OIDC_CALLBACK_ORIGIN);
65
+ if (requestUrl.pathname !== OIDC_CALLBACK_PATH) {
66
+ sendOAuthCallbackHtmlResponse(response, 404, 'opencode-wizard plugin login', 'Unknown callback path.');
67
+ return;
68
+ }
69
+ const error = requestUrl.searchParams.get('error');
70
+ const errorDescription = requestUrl.searchParams.get('error_description');
71
+ if (error) {
72
+ const message = errorDescription ?? error;
73
+ sendOAuthCallbackHtmlResponse(response, 400, 'opencode-wizard plugin login failed', message);
74
+ finalize({
75
+ status: 'error',
76
+ message
77
+ });
78
+ return;
79
+ }
80
+ const state = requestUrl.searchParams.get('state');
81
+ const code = requestUrl.searchParams.get('code');
82
+ if (!state || state !== expectedState) {
83
+ sendOAuthCallbackHtmlResponse(response, 400, 'opencode-wizard plugin login failed', 'OAuth state did not match the login request.');
84
+ finalize({
85
+ status: 'error',
86
+ message: 'OAuth state did not match the login request.'
87
+ });
88
+ return;
89
+ }
90
+ if (!code) {
91
+ sendOAuthCallbackHtmlResponse(response, 400, 'opencode-wizard plugin login failed', 'OAuth callback did not include an authorization code.');
92
+ finalize({
93
+ status: 'error',
94
+ message: 'OAuth callback did not include an authorization code.'
95
+ });
96
+ return;
97
+ }
98
+ sendOAuthCallbackHtmlResponse(response, 200, 'opencode-wizard plugin callback received', 'Callback received. OpenCode is finalizing the backend session now.');
99
+ finalize({
100
+ status: 'success',
101
+ code,
102
+ state
103
+ });
104
+ });
105
+ const close = async () => {
106
+ await new Promise((resolve, reject) => {
107
+ server.close(error => {
108
+ if (error) {
109
+ reject(error);
110
+ return;
111
+ }
112
+ resolve();
113
+ });
114
+ });
115
+ };
116
+ await new Promise((resolve, reject) => {
117
+ const rejectStart = error => {
118
+ reject(toCallbackServerStartError(error));
119
+ };
120
+ server.once('error', rejectStart);
121
+ server.listen(24953, 'localhost', () => {
122
+ server.off('error', rejectStart);
123
+ server.on('error', error => {
124
+ fail(error instanceof Error ? error : new Error('Local OAuth callback server failed.'));
125
+ });
126
+ resolve();
127
+ });
128
+ });
129
+ signal.addEventListener('abort', () => {
130
+ fail(signal.reason instanceof Error ? signal.reason : new Error('OAuth login aborted.'));
131
+ void close().catch(() => undefined);
132
+ }, {
133
+ once: true
134
+ });
135
+ return {
136
+ callbackPromise,
137
+ close
138
+ };
139
+ };
140
+ export const startLoginFlow = async signal => {
141
+ const discovery = await fetchOidcDiscoveryDocument(signal);
142
+ const codeVerifier = createRandomBase64Url(64);
143
+ const expectedState = createRandomBase64Url(32);
144
+ const codeChallenge = createCodeChallenge(codeVerifier);
145
+ const expiresAt = new Date(Date.now() + LOGIN_TIMEOUT_MS).toISOString();
146
+ const {
147
+ callbackPromise,
148
+ close
149
+ } = await startLocalCallbackServer({
150
+ expectedState,
151
+ signal
152
+ });
153
+ const browserUrl = new URL(discovery.authorization_endpoint);
154
+ browserUrl.searchParams.set('client_id', OIDC_CLIENT_ID);
155
+ browserUrl.searchParams.set('response_type', 'code');
156
+ browserUrl.searchParams.set('redirect_uri', OIDC_CALLBACK_URL);
157
+ browserUrl.searchParams.set('response_mode', 'query');
158
+ browserUrl.searchParams.set('scope', OIDC_SCOPES.join(' '));
159
+ browserUrl.searchParams.set('code_challenge', codeChallenge);
160
+ browserUrl.searchParams.set('code_challenge_method', 'S256');
161
+ browserUrl.searchParams.set('state', expectedState);
162
+ return {
163
+ browserUrl: browserUrl.toString(),
164
+ expiresAt,
165
+ codeVerifier,
166
+ expectedState,
167
+ callbackPromise,
168
+ closeCallbackServer: close
169
+ };
170
+ };
171
+ export const createPluginSession = async ({
172
+ code,
173
+ codeVerifier,
174
+ redirectUri,
175
+ config,
176
+ signal
177
+ }) => {
178
+ const response = await fetch(config.authSessionUrl, {
179
+ method: 'POST',
180
+ headers: {
181
+ 'content-type': 'application/json'
182
+ },
183
+ body: JSON.stringify({
184
+ code,
185
+ codeVerifier,
186
+ redirectUri
187
+ }),
188
+ signal
189
+ });
190
+ const payload = await response.json().catch(() => null);
191
+ if (!response.ok) {
192
+ throw new Error(getMessageFromUnknownPayload(payload) ?? `Plugin session exchange failed with HTTP ${response.status}.`);
193
+ }
194
+ if (!payload || !('success' in payload) || payload.success !== true) {
195
+ throw new Error('Plugin session exchange returned an unexpected payload.');
196
+ }
197
+ return payload.session;
198
+ };
199
+ export const openBrowser = async url => {
200
+ try {
201
+ if (process.platform === 'darwin') {
202
+ await execFileAsync('open', [url]);
203
+ return null;
204
+ }
205
+ if (process.platform === 'win32') {
206
+ await execFileAsync('cmd', ['/c', 'start', '', url]);
207
+ return null;
208
+ }
209
+ await execFileAsync('xdg-open', [url]);
210
+ return null;
211
+ } catch (error) {
212
+ return error instanceof Error ? error.message : 'Failed to open browser automatically';
213
+ }
214
+ };
215
+ //# sourceMappingURL=auth-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["execFile","crypto","http","promisify","URL","sendOAuthCallbackHtmlResponse","LOGIN_TIMEOUT_MS","OIDC_CALLBACK_ORIGIN","OIDC_CALLBACK_PATH","OIDC_CALLBACK_URL","OIDC_CLIENT_ID","OIDC_ISSUER","OIDC_SCOPES","execFileAsync","createRandomBase64Url","bytes","randomBytes","toString","createCodeChallenge","codeVerifier","createHash","update","digest","getMessageFromUnknownPayload","value","candidate","message","fetchOidcDiscoveryDocument","signal","discoveryUrl","replace","response","fetch","method","ok","Error","status","json","isCallbackPortInUseError","error","code","toCallbackServerStartError","startLocalCallbackServer","expectedState","settled","resolvePayload","undefined","rejectPayload","callbackPromise","Promise","resolve","reject","finalize","payload","fail","reason","server","createServer","request","requestUrl","url","pathname","searchParams","get","errorDescription","state","close","rejectStart","once","listen","off","on","addEventListener","catch","startLoginFlow","discovery","codeChallenge","expiresAt","Date","now","toISOString","browserUrl","authorization_endpoint","set","join","closeCallbackServer","createPluginSession","redirectUri","config","authSessionUrl","headers","body","JSON","stringify","success","session","openBrowser","process","platform"],"sources":["../../src/server/auth-flow.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport http from 'node:http';\nimport { promisify } from 'node:util';\nimport { URL } from 'node:url';\nimport { sendOAuthCallbackHtmlResponse } from '../oauth-callback-page.js';\nimport {\n LOGIN_TIMEOUT_MS,\n OIDC_CALLBACK_ORIGIN,\n OIDC_CALLBACK_PATH,\n OIDC_CALLBACK_URL,\n OIDC_CLIENT_ID,\n OIDC_ISSUER,\n OIDC_SCOPES,\n} from './constants.js';\nimport type { OidcCallbackPayload, OidcDiscoveryDocument, OidcLoginStart, PluginSessionResponse, ResolvedConfig } from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst createRandomBase64Url = (bytes: number): string => {\n return crypto.randomBytes(bytes).toString('base64url');\n};\n\nconst createCodeChallenge = (codeVerifier: string): string => {\n return crypto.createHash('sha256').update(codeVerifier).digest('base64url');\n};\n\nconst getMessageFromUnknownPayload = (value: unknown): string | null => {\n if (!value || typeof value !== 'object') return null;\n\n const candidate = 'message' in value ? value.message : null;\n return typeof candidate === 'string' ? candidate : null;\n};\n\nconst fetchOidcDiscoveryDocument = async (signal: AbortSignal): Promise<OidcDiscoveryDocument> => {\n const discoveryUrl = `${OIDC_ISSUER.replace(/\\/+$/, '')}/.well-known/openid-configuration`;\n const response = await fetch(discoveryUrl, {\n method: 'GET',\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`OIDC discovery failed with HTTP ${response.status}.`);\n }\n\n return (await response.json()) as OidcDiscoveryDocument;\n};\n\nconst isCallbackPortInUseError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') return false;\n if (!('code' in error)) return false;\n return error.code === 'EADDRINUSE';\n};\n\nconst toCallbackServerStartError = (error: unknown): Error => {\n if (!isCallbackPortInUseError(error)) {\n return error instanceof Error ? error : new Error('Failed to start local OAuth callback server.');\n }\n\n return new Error(\n 'OAuth login cannot start because localhost:24953 is already in use. Another OpenCode login is likely in progress; finish it or close the other instance, then retry.',\n );\n};\n\nconst startLocalCallbackServer = async ({\n expectedState,\n signal,\n}: {\n expectedState: string;\n signal: AbortSignal;\n}): Promise<{\n callbackPromise: Promise<OidcCallbackPayload>;\n close: () => Promise<void>;\n}> => {\n let settled = false;\n let resolvePayload: (value: OidcCallbackPayload) => void = () => undefined;\n let rejectPayload: (reason?: unknown) => void = () => undefined;\n\n const callbackPromise = new Promise<OidcCallbackPayload>((resolve, reject) => {\n resolvePayload = resolve;\n rejectPayload = reject;\n });\n\n const finalize = (payload: OidcCallbackPayload) => {\n if (settled) return;\n settled = true;\n resolvePayload(payload);\n };\n\n const fail = (reason: unknown) => {\n if (settled) return;\n settled = true;\n rejectPayload(reason);\n };\n\n const server = http.createServer((request, response) => {\n const requestUrl = new URL(request.url ?? '/', OIDC_CALLBACK_ORIGIN);\n\n if (requestUrl.pathname !== OIDC_CALLBACK_PATH) {\n sendOAuthCallbackHtmlResponse(response, 404, 'opencode-wizard plugin login', 'Unknown callback path.');\n return;\n }\n\n const error = requestUrl.searchParams.get('error');\n const errorDescription = requestUrl.searchParams.get('error_description');\n\n if (error) {\n const message = errorDescription ?? error;\n sendOAuthCallbackHtmlResponse(response, 400, 'opencode-wizard plugin login failed', message);\n finalize({ status: 'error', message });\n return;\n }\n\n const state = requestUrl.searchParams.get('state');\n const code = requestUrl.searchParams.get('code');\n\n if (!state || state !== expectedState) {\n sendOAuthCallbackHtmlResponse(\n response,\n 400,\n 'opencode-wizard plugin login failed',\n 'OAuth state did not match the login request.',\n );\n finalize({ status: 'error', message: 'OAuth state did not match the login request.' });\n return;\n }\n\n if (!code) {\n sendOAuthCallbackHtmlResponse(\n response,\n 400,\n 'opencode-wizard plugin login failed',\n 'OAuth callback did not include an authorization code.',\n );\n finalize({ status: 'error', message: 'OAuth callback did not include an authorization code.' });\n return;\n }\n\n sendOAuthCallbackHtmlResponse(\n response,\n 200,\n 'opencode-wizard plugin callback received',\n 'Callback received. OpenCode is finalizing the backend session now.',\n );\n finalize({ status: 'success', code, state });\n });\n\n const close = async () => {\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n };\n\n await new Promise<void>((resolve, reject) => {\n const rejectStart = (error: unknown) => {\n reject(toCallbackServerStartError(error));\n };\n\n server.once('error', rejectStart);\n server.listen(24953, 'localhost', () => {\n server.off('error', rejectStart);\n server.on('error', (error) => {\n fail(error instanceof Error ? error : new Error('Local OAuth callback server failed.'));\n });\n resolve();\n });\n });\n\n signal.addEventListener(\n 'abort',\n () => {\n fail(signal.reason instanceof Error ? signal.reason : new Error('OAuth login aborted.'));\n void close().catch(() => undefined);\n },\n { once: true },\n );\n\n return { callbackPromise, close };\n};\n\nexport const startLoginFlow = async (signal: AbortSignal): Promise<OidcLoginStart> => {\n const discovery = await fetchOidcDiscoveryDocument(signal);\n const codeVerifier = createRandomBase64Url(64);\n const expectedState = createRandomBase64Url(32);\n const codeChallenge = createCodeChallenge(codeVerifier);\n const expiresAt = new Date(Date.now() + LOGIN_TIMEOUT_MS).toISOString();\n const { callbackPromise, close } = await startLocalCallbackServer({ expectedState, signal });\n\n const browserUrl = new URL(discovery.authorization_endpoint);\n browserUrl.searchParams.set('client_id', OIDC_CLIENT_ID);\n browserUrl.searchParams.set('response_type', 'code');\n browserUrl.searchParams.set('redirect_uri', OIDC_CALLBACK_URL);\n browserUrl.searchParams.set('response_mode', 'query');\n browserUrl.searchParams.set('scope', OIDC_SCOPES.join(' '));\n browserUrl.searchParams.set('code_challenge', codeChallenge);\n browserUrl.searchParams.set('code_challenge_method', 'S256');\n browserUrl.searchParams.set('state', expectedState);\n\n return {\n browserUrl: browserUrl.toString(),\n expiresAt,\n codeVerifier,\n expectedState,\n callbackPromise,\n closeCallbackServer: close,\n };\n};\n\nexport const createPluginSession = async ({\n code,\n codeVerifier,\n redirectUri,\n config,\n signal,\n}: {\n code: string;\n codeVerifier: string;\n redirectUri: string;\n config: ResolvedConfig;\n signal: AbortSignal;\n}): Promise<PluginSessionResponse['session']> => {\n const response = await fetch(config.authSessionUrl, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ code, codeVerifier, redirectUri }),\n signal,\n });\n\n const payload = (await response.json().catch(() => null)) as PluginSessionResponse | { message?: string } | null;\n\n if (!response.ok) {\n throw new Error(\n getMessageFromUnknownPayload(payload) ?? `Plugin session exchange failed with HTTP ${response.status}.`,\n );\n }\n\n if (!payload || !('success' in payload) || payload.success !== true) {\n throw new Error('Plugin session exchange returned an unexpected payload.');\n }\n\n return payload.session;\n};\n\nexport const openBrowser = async (url: string): Promise<string | null> => {\n try {\n if (process.platform === 'darwin') {\n await execFileAsync('open', [url]);\n return null;\n }\n\n if (process.platform === 'win32') {\n await execFileAsync('cmd', ['/c', 'start', '', url]);\n return null;\n }\n\n await execFileAsync('xdg-open', [url]);\n return null;\n } catch (error) {\n return error instanceof Error ? error.message : 'Failed to open browser automatically';\n }\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ import type { AuthState, PluginSessionResponse, ResolvedConfig, StoredWorkspaceSlugMapping } from './types.js';
2
+ export declare const isRecord: (value: unknown) => value is Record<string, unknown>;
3
+ export declare const upsertWorkspaceSlugMapping: ({ configFile, repositoryUrl, repositoryRoot, workspaceSlug, }: {
4
+ configFile: string;
5
+ repositoryUrl: string | null;
6
+ repositoryRoot: string | null;
7
+ workspaceSlug: string;
8
+ }) => Promise<void>;
9
+ export declare const findWorkspaceSlugMapping: ({ configFile, repositoryUrl, repositoryRoot, }: {
10
+ configFile: string;
11
+ repositoryUrl: string | null;
12
+ repositoryRoot: string | null;
13
+ }) => Promise<StoredWorkspaceSlugMapping | null>;
14
+ export declare const readGlobalAuthState: (configFile: string) => Promise<AuthState | null>;
15
+ export declare const writeAuthState: (configFile: string, authState: AuthState) => Promise<void>;
16
+ export declare const clearAuthState: (configFile: string) => Promise<void>;
17
+ export declare const toStoredUserKey: (authState: AuthState | null) => string;
18
+ export declare const toAuthState: (session: PluginSessionResponse["session"]) => AuthState;
19
+ export declare const resolveStoredAuthState: (worktree: string, config: ResolvedConfig) => Promise<AuthState | null>;