{"version":3,"file":"help.mjs","names":[],"sources":["../../src/schemas/help.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis';\nimport { type Static, Type } from 'typebox';\nimport { Check, Errors } from 'typebox/value';\n\n/** Provider-owned Cordis service for the live Help catalog. */\nexport const DOOM_HELP_SERVICE = 'doom/help';\nexport const DOOM_HELP_MAX_CONTRIBUTORS = 32;\nexport const DOOM_HELP_MAX_SKILLS = 64;\nexport const DOOM_HELP_MAX_DIAGNOSTICS = 64;\nexport const DOOM_HELP_MAX_DESCRIPTION_LENGTH = 512;\nexport const DOOM_HELP_MAX_DIAGNOSTIC_LENGTH = 512;\n\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_SKILL_NAME_LENGTH = 64;\nconst MAX_MODULE_URL_LENGTH = 4_096;\nconst MAX_IDENTIFIER_LENGTH = 256;\n\nexport const DOOM_HELP_ERROR_CODE = {\n  contributorLimit: 'HELP_CONTRIBUTOR_LIMIT',\n  disposed: 'HELP_DISPOSED',\n  duplicateSkill: 'HELP_DUPLICATE_SKILL',\n  inactiveSnapshot: 'HELP_INACTIVE_SNAPSHOT',\n  invalidContribution: 'HELP_INVALID_CONTRIBUTION',\n  invalidGeneration: 'HELP_INVALID_GENERATION',\n  invalidSnapshot: 'HELP_INVALID_SNAPSHOT',\n} as const;\n\nexport type DoomHelpErrorCode = (typeof DOOM_HELP_ERROR_CODE)[keyof typeof DOOM_HELP_ERROR_CODE];\n\nexport class DoomHelpError extends Error {\n  readonly code: DoomHelpErrorCode;\n\n  constructor(code: DoomHelpErrorCode, message: string) {\n    super(message);\n    this.name = 'DoomHelpError';\n    this.code = code;\n  }\n}\n\nexport const DoomHelpSourceSchema = Type.String({\n  minLength: 1,\n  maxLength: MAX_SOURCE_LENGTH,\n  pattern: '^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$',\n});\n\nexport const DoomHelpSkillNameSchema = Type.String({\n  minLength: 1,\n  maxLength: MAX_SKILL_NAME_LENGTH,\n  pattern: '^[a-z0-9][a-z0-9-]*$',\n});\n\nexport const DoomHelpSkillDescriptorSchema = Type.Object(\n  {\n    name: DoomHelpSkillNameSchema,\n    description: Type.String({ minLength: 1, maxLength: DOOM_HELP_MAX_DESCRIPTION_LENGTH }),\n  },\n  { additionalProperties: false },\n);\nexport type DoomHelpSkillDescriptor = Static<typeof DoomHelpSkillDescriptorSchema>;\n\nexport const DoomHelpContributionSchema = Type.Object(\n  {\n    source: DoomHelpSourceSchema,\n    moduleUrl: Type.String({ minLength: 1, maxLength: MAX_MODULE_URL_LENGTH }),\n    skills: Type.Array(DoomHelpSkillDescriptorSchema, { minItems: 1, maxItems: DOOM_HELP_MAX_SKILLS }),\n  },\n  { additionalProperties: false },\n);\nexport type DoomHelpContribution = Static<typeof DoomHelpContributionSchema>;\n\nconst GenerationSchema = Type.String({ minLength: 1, maxLength: MAX_IDENTIFIER_LENGTH });\n\nexport const DoomHelpActivationSchema = Type.Union([\n  Type.Literal('inactive'),\n  Type.Literal('activating'),\n  Type.Literal('active'),\n  Type.Literal('degraded'),\n]);\nexport type DoomHelpActivation = Static<typeof DoomHelpActivationSchema>;\n\nexport const DoomHelpSkillSchema = Type.Object(\n  {\n    source: DoomHelpSourceSchema,\n    name: DoomHelpSkillNameSchema,\n    description: Type.String({ minLength: 1, maxLength: DOOM_HELP_MAX_DESCRIPTION_LENGTH }),\n    filePath: Type.String({ minLength: 1, maxLength: MAX_MODULE_URL_LENGTH }),\n    baseDir: Type.String({ minLength: 1, maxLength: MAX_MODULE_URL_LENGTH }),\n  },\n  { additionalProperties: false },\n);\nexport type DoomHelpSkill = Static<typeof DoomHelpSkillSchema>;\n\nexport const DoomHelpDiagnosticSchema = Type.Object(\n  {\n    source: Type.Optional(DoomHelpSourceSchema),\n    code: Type.String({ minLength: 1, maxLength: 64, pattern: '^[A-Z0-9_]+$' }),\n    message: Type.String({ minLength: 1, maxLength: DOOM_HELP_MAX_DIAGNOSTIC_LENGTH }),\n  },\n  { additionalProperties: false },\n);\nexport type DoomHelpDiagnostic = Static<typeof DoomHelpDiagnosticSchema>;\n\nexport const DoomHelpSnapshotSchema = Type.Object(\n  {\n    hostGeneration: GenerationSchema,\n    revision: Type.Integer({ minimum: 0 }),\n    activation: DoomHelpActivationSchema,\n    skills: Type.Array(DoomHelpSkillSchema, { maxItems: DOOM_HELP_MAX_SKILLS }),\n    diagnostics: Type.Array(DoomHelpDiagnosticSchema, { maxItems: DOOM_HELP_MAX_DIAGNOSTICS }),\n  },\n  { additionalProperties: false },\n);\nexport type DoomHelpSnapshot = Static<typeof DoomHelpSnapshotSchema>;\n\nexport interface DoomHelpSnapshotDraft {\n  readonly activation: DoomHelpActivation;\n  readonly skills: readonly DoomHelpSkill[];\n  readonly diagnostics: readonly DoomHelpDiagnostic[];\n}\n\nexport interface DoomHelpContributionHandle {\n  readonly source: string;\n  readonly generation: string;\n  dispose(): void;\n}\n\n/** Direct, session-local registrar and query surface owned by doompi-help. */\nexport interface DoomHelpService {\n  readonly generation: string;\n  register(contribution: DoomHelpContribution): DoomHelpContributionHandle;\n  listContributions(): readonly DoomHelpContribution[];\n  subscribeContributions(listener: (contributions: readonly DoomHelpContribution[]) => void): () => void;\n  getSnapshot(): DoomHelpSnapshot;\n  publish(snapshot: DoomHelpSnapshotDraft): DoomHelpSnapshot;\n  subscribeSnapshot(listener: (snapshot: DoomHelpSnapshot) => void): () => void;\n  dispose(): void;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n  interface Context {\n    'doom/help': DoomHelpService;\n  }\n}\n\ninterface RegisteredContribution {\n  readonly token: symbol;\n  readonly generation: string;\n  readonly contribution: DoomHelpContribution;\n}\n\nfunction schemaFailure(\n  schema: typeof DoomHelpContributionSchema | typeof DoomHelpSnapshotSchema,\n  value: unknown,\n): string {\n  const [first] = Errors(schema, value);\n  return first ? ` at ${first.instancePath || '/'}: ${first.message}` : '';\n}\n\nfunction cloneContribution(contribution: DoomHelpContribution): DoomHelpContribution {\n  return {\n    source: contribution.source,\n    moduleUrl: contribution.moduleUrl,\n    skills: contribution.skills.map((skill) => ({ ...skill })),\n  };\n}\n\nfunction cloneSnapshot(snapshot: DoomHelpSnapshot): DoomHelpSnapshot {\n  return {\n    ...snapshot,\n    skills: snapshot.skills.map((skill) => ({ ...skill })),\n    diagnostics: snapshot.diagnostics.map((diagnostic) => ({ ...diagnostic })),\n  };\n}\n\nfunction validateContribution(contribution: DoomHelpContribution): DoomHelpContribution {\n  if (!Check(DoomHelpContributionSchema, contribution)) {\n    throw new DoomHelpError(\n      DOOM_HELP_ERROR_CODE.invalidContribution,\n      `Invalid Help contribution${schemaFailure(DoomHelpContributionSchema, contribution)}.`,\n    );\n  }\n  const names = new Set<string>();\n  for (const skill of contribution.skills) {\n    if (names.has(skill.name)) {\n      throw new DoomHelpError(\n        DOOM_HELP_ERROR_CODE.duplicateSkill,\n        `Help contribution '${contribution.source}' declares duplicate skill '${skill.name}'.`,\n      );\n    }\n    names.add(skill.name);\n  }\n  return cloneContribution(contribution);\n}\n\n/** Creates the provider-owned Help service value for one Cordis session. */\nexport function createDoomHelpService(generation: string): DoomHelpService {\n  if (!Check(GenerationSchema, generation)) {\n    throw new DoomHelpError(DOOM_HELP_ERROR_CODE.invalidGeneration, 'Doom Help requires a valid generation.');\n  }\n\n  const contributions = new Map<string, RegisteredContribution>();\n  const contributionListeners = new Set<(value: readonly DoomHelpContribution[]) => void>();\n  const snapshotListeners = new Set<(value: DoomHelpSnapshot) => void>();\n  let registrationSequence = 0;\n  let disposed = false;\n  let snapshot: DoomHelpSnapshot = {\n    hostGeneration: generation,\n    revision: 0,\n    activation: 'inactive',\n    skills: [],\n    diagnostics: [],\n  };\n\n  const ensureActive = (): void => {\n    if (disposed) throw new DoomHelpError(DOOM_HELP_ERROR_CODE.disposed, 'The Doom Help service is disposed.');\n  };\n  const list = (): readonly DoomHelpContribution[] =>\n    [...contributions.values()]\n      .map(({ contribution }) => cloneContribution(contribution))\n      .sort((left, right) => left.source.localeCompare(right.source));\n  const notifyContributions = (): void => {\n    const value = list();\n    for (const listener of contributionListeners) listener(value);\n  };\n\n  const service: DoomHelpService = {\n    generation,\n    register(contribution) {\n      ensureActive();\n      const validated = validateContribution(contribution);\n      if (!contributions.has(validated.source) && contributions.size >= DOOM_HELP_MAX_CONTRIBUTORS) {\n        throw new DoomHelpError(\n          DOOM_HELP_ERROR_CODE.contributorLimit,\n          `Help accepts at most ${DOOM_HELP_MAX_CONTRIBUTORS} contributors.`,\n        );\n      }\n      registrationSequence += 1;\n      const token = Symbol(validated.source);\n      const registrationGeneration = `${generation}:help:${registrationSequence}`;\n      contributions.set(validated.source, {\n        token,\n        generation: registrationGeneration,\n        contribution: validated,\n      });\n      notifyContributions();\n      let registrationDisposed = false;\n      return Object.freeze({\n        source: validated.source,\n        generation: registrationGeneration,\n        dispose() {\n          if (registrationDisposed) return;\n          registrationDisposed = true;\n          if (contributions.get(validated.source)?.token !== token) return;\n          contributions.delete(validated.source);\n          notifyContributions();\n        },\n      });\n    },\n    listContributions: list,\n    subscribeContributions(listener) {\n      ensureActive();\n      contributionListeners.add(listener);\n      return () => contributionListeners.delete(listener);\n    },\n    getSnapshot: () => cloneSnapshot(snapshot),\n    publish(draft) {\n      ensureActive();\n      if (draft.activation === 'inactive' && draft.skills.length > 0) {\n        throw new DoomHelpError(DOOM_HELP_ERROR_CODE.inactiveSnapshot, 'Inactive Help snapshots cannot expose skills.');\n      }\n      const next: DoomHelpSnapshot = {\n        hostGeneration: generation,\n        revision: snapshot.revision + 1,\n        activation: draft.activation,\n        skills: draft.skills.map((skill) => ({ ...skill })),\n        diagnostics: draft.diagnostics.map((diagnostic) => ({ ...diagnostic })),\n      };\n      if (!Check(DoomHelpSnapshotSchema, next)) {\n        throw new DoomHelpError(\n          DOOM_HELP_ERROR_CODE.invalidSnapshot,\n          `Invalid Help snapshot${schemaFailure(DoomHelpSnapshotSchema, next)}.`,\n        );\n      }\n      snapshot = next;\n      const published = cloneSnapshot(snapshot);\n      for (const listener of snapshotListeners) listener(cloneSnapshot(published));\n      return published;\n    },\n    subscribeSnapshot(listener) {\n      ensureActive();\n      snapshotListeners.add(listener);\n      return () => snapshotListeners.delete(listener);\n    },\n    dispose() {\n      if (disposed) return;\n      disposed = true;\n      contributions.clear();\n      contributionListeners.clear();\n      snapshotListeners.clear();\n    },\n  };\n  return Object.freeze(service);\n}\n\nexport function readDoomHelpService(context: Context): DoomHelpService | undefined {\n  return context.get(DOOM_HELP_SERVICE) as DoomHelpService | undefined;\n}\n\nexport function requireDoomHelpService(context: Context): DoomHelpService {\n  const service = readDoomHelpService(context);\n  if (!service) throw new Error('Doom Help is unavailable. Load @agimon-ai/doompi-help.');\n  return service;\n}\n"],"mappings":"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"}