{"record":{"id":"07231dc899409679","repo":"deepseek-ai/deepseek-harness","slug":"no-credential-store","errorCode":"NO_CREDENTIAL_STORE","errorMessage":"llm-pi-ai: this composition mounts no credentials service, so there is nowhere to store the credential a sign-in produces; mount one (dsh-credentials-local) to sign in","messagePattern":"llm-pi-ai: this composition mounts no credentials service, so there is nowhere to store the credential a sign-in produces; mount one \\(dsh-credentials-local\\) to sign in","errorType":"exception","errorClass":"LlmError","httpStatus":null,"severity":"error","filePath":"packages/llm/llm-pi-ai/src/auth.ts","lineNumber":91,"sourceCode":"    }\n  }\n  return { kind: 'grant', payload: credential }\n}\n\n/**\n * The credential service, or the failure that names what is missing. Reads\n * answer \"nothing stored\" without a service, because a composition with no\n * credential plane genuinely holds no credential; writes refuse, because a\n * login whose grant silently evaporated would report success and then fail\n * every request.\n * @param ctx - the plugin context.\n * @returns the live service.\n * @throws {LlmError} code `NO_CREDENTIAL_STORE` when none is mounted.\n */\nfunction writableStore(ctx: Context): CredentialProvider {\n  const credentials = ctx.get('credentials')\n  if (credentials === undefined) {\n    throw new LlmError(\n      'llm-pi-ai: this composition mounts no credentials service, so there is nowhere to store the'\n      + ' credential a sign-in produces; mount one (dsh-credentials-local) to sign in',\n      'NO_CREDENTIAL_STORE',\n    )\n  }\n  return credentials\n}\n\n/**\n * A pi-ai `CredentialStore` over the harness credential records.\n *\n * pi-ai runs OAuth refresh *inside* `modify()`, so this store's exclusion has\n * to cover a network round trip rather than a file rename — which is why the\n * record write path takes a wait limit of its own rather than the short one a\n * local write would need.\n *\n * pi-ai asks this store about every provider in the collection, hand-declared\n * routes included, and a route key is an arbitrary settings dict key while a","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/llm/llm-pi-ai/src/auth.ts#L73-L109","documentation":"Error \"llm-pi-ai: this composition mounts no credentials service, so there is nowhere to store the credential a sign-in produces; mount one (dsh-credentials-local) to sign in\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/llm/llm-pi-ai/src/auth.ts:91 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Mount a credentials service (dsh-credentials-local) in the composition before signing in."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}