@deepseekharness-mobile/companion 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -2
  3. package/cordis.patch.yml +20 -0
  4. package/dist/core/devices.d.ts +35 -0
  5. package/dist/core/devices.d.ts.map +1 -0
  6. package/dist/core/devices.js +90 -0
  7. package/dist/core/devices.js.map +1 -0
  8. package/dist/core/pairing.d.ts +21 -0
  9. package/dist/core/pairing.d.ts.map +1 -0
  10. package/dist/core/pairing.js +74 -0
  11. package/dist/core/pairing.js.map +1 -0
  12. package/dist/dsh/errors.d.ts +3 -0
  13. package/dist/dsh/errors.d.ts.map +1 -0
  14. package/dist/dsh/errors.js +15 -0
  15. package/dist/dsh/errors.js.map +1 -0
  16. package/dist/dsh/lifecycle.d.ts +37 -0
  17. package/dist/dsh/lifecycle.d.ts.map +1 -0
  18. package/dist/dsh/lifecycle.js +95 -0
  19. package/dist/dsh/lifecycle.js.map +1 -0
  20. package/dist/dsh/models.d.ts +39 -0
  21. package/dist/dsh/models.d.ts.map +1 -0
  22. package/dist/dsh/models.js +171 -0
  23. package/dist/dsh/models.js.map +1 -0
  24. package/dist/dsh/prompt.d.ts +8 -0
  25. package/dist/dsh/prompt.d.ts.map +1 -0
  26. package/dist/dsh/prompt.js +25 -0
  27. package/dist/dsh/prompt.js.map +1 -0
  28. package/dist/dsh/providers.d.ts +25 -0
  29. package/dist/dsh/providers.d.ts.map +1 -0
  30. package/dist/dsh/providers.js +315 -0
  31. package/dist/dsh/providers.js.map +1 -0
  32. package/dist/dsh/question-bridge.d.ts +25 -0
  33. package/dist/dsh/question-bridge.d.ts.map +1 -0
  34. package/dist/dsh/question-bridge.js +140 -0
  35. package/dist/dsh/question-bridge.js.map +1 -0
  36. package/dist/dsh/questions.d.ts +15 -0
  37. package/dist/dsh/questions.d.ts.map +1 -0
  38. package/dist/dsh/questions.js +126 -0
  39. package/dist/dsh/questions.js.map +1 -0
  40. package/dist/dsh/session-activity.d.ts +5 -0
  41. package/dist/dsh/session-activity.d.ts.map +1 -0
  42. package/dist/dsh/session-activity.js +100 -0
  43. package/dist/dsh/session-activity.js.map +1 -0
  44. package/dist/dsh/session-source.d.ts +19 -0
  45. package/dist/dsh/session-source.d.ts.map +1 -0
  46. package/dist/dsh/session-source.js +104 -0
  47. package/dist/dsh/session-source.js.map +1 -0
  48. package/dist/dsh/sessions.d.ts +10 -0
  49. package/dist/dsh/sessions.d.ts.map +1 -0
  50. package/dist/dsh/sessions.js +51 -0
  51. package/dist/dsh/sessions.js.map +1 -0
  52. package/dist/dsh/slash-commands.d.ts +15 -0
  53. package/dist/dsh/slash-commands.d.ts.map +1 -0
  54. package/dist/dsh/slash-commands.js +60 -0
  55. package/dist/dsh/slash-commands.js.map +1 -0
  56. package/dist/dsh/transcript.d.ts +28 -0
  57. package/dist/dsh/transcript.d.ts.map +1 -0
  58. package/dist/dsh/transcript.js +211 -0
  59. package/dist/dsh/transcript.js.map +1 -0
  60. package/dist/dsh/workspaces.d.ts +20 -0
  61. package/dist/dsh/workspaces.d.ts.map +1 -0
  62. package/dist/dsh/workspaces.js +123 -0
  63. package/dist/dsh/workspaces.js.map +1 -0
  64. package/dist/host-api.d.ts +148 -0
  65. package/dist/host-api.d.ts.map +1 -0
  66. package/dist/host-api.js +54 -0
  67. package/dist/host-api.js.map +1 -0
  68. package/dist/index.d.ts +5 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +268 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/log.d.ts +5 -0
  73. package/dist/log.d.ts.map +1 -0
  74. package/dist/log.js +40 -0
  75. package/dist/log.js.map +1 -0
  76. package/dist/open-browser.d.ts +3 -0
  77. package/dist/open-browser.d.ts.map +1 -0
  78. package/dist/open-browser.js +46 -0
  79. package/dist/open-browser.js.map +1 -0
  80. package/dist/pairing-message.d.ts +16 -0
  81. package/dist/pairing-message.d.ts.map +1 -0
  82. package/dist/pairing-message.js +38 -0
  83. package/dist/pairing-message.js.map +1 -0
  84. package/dist/persist/devices-file.d.ts +8 -0
  85. package/dist/persist/devices-file.d.ts.map +1 -0
  86. package/dist/persist/devices-file.js +47 -0
  87. package/dist/persist/devices-file.js.map +1 -0
  88. package/dist/probe.d.ts +25 -0
  89. package/dist/probe.d.ts.map +1 -0
  90. package/dist/probe.js +143 -0
  91. package/dist/probe.js.map +1 -0
  92. package/dist/public-origin.d.ts +11 -0
  93. package/dist/public-origin.d.ts.map +1 -0
  94. package/dist/public-origin.js +79 -0
  95. package/dist/public-origin.js.map +1 -0
  96. package/dist/qr-text.d.ts +2 -0
  97. package/dist/qr-text.d.ts.map +1 -0
  98. package/dist/qr-text.js +31 -0
  99. package/dist/qr-text.js.map +1 -0
  100. package/dist/routes/origin.d.ts +17 -0
  101. package/dist/routes/origin.d.ts.map +1 -0
  102. package/dist/routes/origin.js +85 -0
  103. package/dist/routes/origin.js.map +1 -0
  104. package/dist/routes/static.d.ts +9 -0
  105. package/dist/routes/static.d.ts.map +1 -0
  106. package/dist/routes/static.js +129 -0
  107. package/dist/routes/static.js.map +1 -0
  108. package/dist/routes/web-root.d.ts +2 -0
  109. package/dist/routes/web-root.d.ts.map +1 -0
  110. package/dist/routes/web-root.js +21 -0
  111. package/dist/routes/web-root.js.map +1 -0
  112. package/dist/server.d.ts +140 -0
  113. package/dist/server.d.ts.map +1 -0
  114. package/dist/server.js +829 -0
  115. package/dist/server.js.map +1 -0
  116. package/dist/web/apple-touch-icon-precomposed.png +0 -0
  117. package/dist/web/apple-touch-icon.png +0 -0
  118. package/dist/web/assets/index-NOGXMIsS.js +65 -0
  119. package/dist/web/assets/index-NOGXMIsS.js.map +1 -0
  120. package/dist/web/assets/index-s7zoNGmx.css +1 -0
  121. package/dist/web/fonts/Montserrat-OFL.txt +93 -0
  122. package/dist/web/fonts/montserrat-medium.woff2 +0 -0
  123. package/dist/web/fonts/montserrat-regular.woff2 +0 -0
  124. package/dist/web/icon-192.png +0 -0
  125. package/dist/web/icon-512.png +0 -0
  126. package/dist/web/icon-maskable-512.png +0 -0
  127. package/dist/web/icon-maskable.svg +15 -0
  128. package/dist/web/icon.svg +6 -0
  129. package/dist/web/index.html +25 -0
  130. package/dist/web/manifest.webmanifest +37 -0
  131. package/package.json +60 -3
@@ -0,0 +1,171 @@
1
+ import { service } from '../host-api.js';
2
+ import { codeOf, messageOf } from './errors.js';
3
+ function text(value) {
4
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
5
+ }
6
+ export function selectionOf(value) {
7
+ if (typeof value !== 'object' || value === null)
8
+ return undefined;
9
+ const source = value;
10
+ const provider = text(source['provider']);
11
+ const model = text(source['model']);
12
+ if (!provider || !model)
13
+ return undefined;
14
+ const effort = text(source['reasoningEffort']);
15
+ return {
16
+ provider,
17
+ model,
18
+ ...(effort ? { reasoningEffort: effort } : {}),
19
+ };
20
+ }
21
+ function effortsOf(value) {
22
+ if (typeof value !== 'object' || value === null)
23
+ return {};
24
+ const reasoning = value.reasoning;
25
+ if (typeof reasoning !== 'object' || reasoning === null)
26
+ return {};
27
+ const raw = reasoning.efforts;
28
+ const efforts = Array.isArray(raw)
29
+ ? raw.flatMap((entry) => {
30
+ if (typeof entry !== 'object' || entry === null)
31
+ return [];
32
+ const item = entry;
33
+ const id = text(item.id);
34
+ if (!id)
35
+ return [];
36
+ return [
37
+ {
38
+ id,
39
+ name: text(item.name) ?? id,
40
+ ...(text(item.description) ? { description: text(item.description) } : {}),
41
+ },
42
+ ];
43
+ })
44
+ : [];
45
+ const defaultEffort = text(reasoning.defaultEffort);
46
+ return {
47
+ ...(efforts.length > 0 ? { reasoningEfforts: efforts } : {}),
48
+ ...(defaultEffort ? { defaultReasoningEffort: defaultEffort } : {}),
49
+ };
50
+ }
51
+ function toModel(value) {
52
+ if (typeof value !== 'object' || value === null)
53
+ return undefined;
54
+ const source = value;
55
+ const id = text(source.id);
56
+ if (!id)
57
+ return undefined;
58
+ const description = text(source.description);
59
+ return {
60
+ id,
61
+ name: text(source.name) ?? id,
62
+ ...(description ? { description } : {}),
63
+ ...effortsOf(source),
64
+ };
65
+ }
66
+ function toGroup(value) {
67
+ if (typeof value !== 'object' || value === null)
68
+ return undefined;
69
+ const source = value;
70
+ const id = text(source.id);
71
+ if (!id)
72
+ return undefined;
73
+ const models = Array.isArray(source.models)
74
+ ? source.models.map(toModel).filter((model) => model !== undefined)
75
+ : [];
76
+ return { id, name: text(source.name) ?? id, models };
77
+ }
78
+ function toFailure(value) {
79
+ if (typeof value !== 'object' || value === null)
80
+ return undefined;
81
+ const source = value;
82
+ const id = text(source.id);
83
+ if (!id)
84
+ return undefined;
85
+ return {
86
+ id,
87
+ name: text(source.name) ?? id,
88
+ message: text(source.message) ?? 'The provider could not be read.',
89
+ };
90
+ }
91
+ export function toCatalog(payload) {
92
+ if (typeof payload !== 'object' || payload === null)
93
+ return { groups: [], failures: [] };
94
+ const source = payload;
95
+ const groups = Array.isArray(source.groups)
96
+ ? source.groups.map(toGroup).filter((group) => group !== undefined)
97
+ : [];
98
+ const failures = Array.isArray(source.failures)
99
+ ? source.failures
100
+ .map(toFailure)
101
+ .filter((failure) => failure !== undefined)
102
+ : [];
103
+ const selection = selectionOf(source.default);
104
+ return {
105
+ ...(selection ? { default: selection } : {}),
106
+ groups: groups.filter((group) => group.models.length > 0),
107
+ failures,
108
+ };
109
+ }
110
+ export function canListModels(ctx) {
111
+ try {
112
+ return typeof service(ctx, 'sessionController')?.modelCatalog === 'function';
113
+ }
114
+ catch {
115
+ return false;
116
+ }
117
+ }
118
+ export function canSelectModel(ctx) {
119
+ try {
120
+ return typeof service(ctx, 'sessionController')?.selectModel === 'function';
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ export async function listModels(ctx) {
127
+ const controller = service(ctx, 'sessionController');
128
+ if (!controller || typeof controller.modelCatalog !== 'function') {
129
+ return { groups: [], failures: [] };
130
+ }
131
+ try {
132
+ return toCatalog(await controller.modelCatalog());
133
+ }
134
+ catch (error) {
135
+ return {
136
+ groups: [],
137
+ failures: [{ id: 'catalog', name: 'Models', message: messageOf(error) }],
138
+ };
139
+ }
140
+ }
141
+ export async function selectModel(ctx, request) {
142
+ const controller = service(ctx, 'sessionController');
143
+ if (!controller || typeof controller.selectModel !== 'function') {
144
+ return { ok: false, code: 'no-service', message: 'This host cannot select models.' };
145
+ }
146
+ try {
147
+ const result = await controller.selectModel({
148
+ sessionId: request.sessionId,
149
+ provider: request.provider,
150
+ model: request.model,
151
+ ...(request.reasoningEffort ? { reasoningEffort: request.reasoningEffort } : {}),
152
+ });
153
+ const selection = selectionOf(result?.selected) ?? {
154
+ provider: request.provider,
155
+ model: request.model,
156
+ ...(request.reasoningEffort ? { reasoningEffort: request.reasoningEffort } : {}),
157
+ };
158
+ return { ok: true, selection };
159
+ }
160
+ catch (error) {
161
+ const code = codeOf(error);
162
+ if (code === 'session/model-unavailable') {
163
+ return { ok: false, code: 'unavailable', message: messageOf(error) };
164
+ }
165
+ if (code === 'session/not-found' || code === 'workspace/not-found') {
166
+ return { ok: false, code: 'not-found', message: 'That session no longer exists.' };
167
+ }
168
+ return { ok: false, code: 'failed', message: messageOf(error) };
169
+ }
170
+ }
171
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/dsh/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type HostContext } from '../host-api.js';
2
+ export type InjectMode = 'queue' | 'steer';
3
+ export interface InjectResult {
4
+ ok: boolean;
5
+ detail: string;
6
+ }
7
+ export declare function injectText(ctx: HostContext, sessionId: string, text: string, mode?: InjectMode): Promise<InjectResult>;
8
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/dsh/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,WAAW,EAA0B,MAAM,gBAAgB,CAAC;AAEnF,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAoB,GACzB,OAAO,CAAC,YAAY,CAAC,CA2BvB"}
@@ -0,0 +1,25 @@
1
+ import { service } from '../host-api.js';
2
+ export async function injectText(ctx, sessionId, text, mode = 'queue') {
3
+ const controller = service(ctx, 'sessionController');
4
+ if (!controller || typeof controller.prompt !== 'function') {
5
+ return { ok: false, detail: 'ctx.sessionController is not available on this host.' };
6
+ }
7
+ const trimmed = text.trim();
8
+ if (!trimmed)
9
+ return { ok: false, detail: 'The text is empty.' };
10
+ try {
11
+ const result = await controller.prompt({
12
+ requestId: globalThis.crypto.randomUUID(),
13
+ sessionId,
14
+ mode,
15
+ content: [{ type: 'text', text: trimmed }],
16
+ }, new AbortController().signal);
17
+ return result.accepted
18
+ ? { ok: true, detail: `Message accepted on ${sessionId} (mode ${mode}).` }
19
+ : { ok: false, detail: `The host did not accept the message for ${sessionId}.` };
20
+ }
21
+ catch (error) {
22
+ return { ok: false, detail: `Injection failed: ${String(error)}` };
23
+ }
24
+ }
25
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/dsh/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA4C,MAAM,gBAAgB,CAAC;AASnF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAgB,EAChB,SAAiB,EACjB,IAAY,EACZ,OAAmB,OAAO;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAoB,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAExE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sDAAsD,EAAE,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CACpC;YACE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE;YACzC,SAAS;YACT,IAAI;YACJ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAC3C,EACD,IAAI,eAAe,EAAE,CAAC,MAAM,CAC7B,CAAC;QAEF,OAAO,MAAM,CAAC,QAAQ;YACpB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,uBAAuB,SAAS,UAAU,IAAI,IAAI,EAAE;YAC1E,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2CAA2C,SAAS,GAAG,EAAE,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACrE,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ProviderConnection, ProviderTestResult, ProviderView } from '@deepseekharness-mobile/protocol';
2
+ import { type HostContext } from '../host-api.js';
3
+ export interface ProviderOutcome {
4
+ ok: boolean;
5
+ code?: 'bad-request' | 'internal';
6
+ message?: string;
7
+ connection?: ProviderConnection;
8
+ }
9
+ export declare function providersAvailable(ctx: HostContext): boolean;
10
+ export declare function providerConnectAvailable(ctx: HostContext): boolean;
11
+ declare function classifyTestError(error: unknown): ProviderTestResult['code'];
12
+ export declare function listProviders(ctx: HostContext): Promise<ProviderView[]>;
13
+ export declare function testProvider(ctx: HostContext, input: {
14
+ provider: string;
15
+ apiKey: string;
16
+ }): Promise<ProviderTestResult>;
17
+ export declare function connectProvider(ctx: HostContext, input: {
18
+ provider: string;
19
+ apiKey: string;
20
+ }): Promise<ProviderOutcome>;
21
+ export declare function disconnectProvider(ctx: HostContext, input: {
22
+ provider: string;
23
+ }): Promise<ProviderOutcome>;
24
+ export { classifyTestError as providerTestCode };
25
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/dsh/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAElB,kBAAkB,EAClB,YAAY,EACb,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAIL,KAAK,WAAW,EAGjB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAcD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAQ5D;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAQlE;AAqHD,iBAAS,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CA+BrE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwD7E;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,kBAAkB,CAAC,CAkD7B;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1B,OAAO,CAAC,eAAe,CAAC,CAiC1B;AAED,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,315 @@
1
+ import { service, } from '../host-api.js';
2
+ const API_KEY = /^[\x21-\x7E]+$/;
3
+ const CREDENTIAL_REF = /^[A-Za-z_]\w*$/;
4
+ const MAX_KEY_LENGTH = 8_192;
5
+ const TEST_TIMEOUT_MS = 8_000;
6
+ function services(ctx) {
7
+ return {
8
+ llm: service(ctx, 'llm'),
9
+ settings: service(ctx, 'settings'),
10
+ credentials: service(ctx, 'credentials'),
11
+ };
12
+ }
13
+ export function providersAvailable(ctx) {
14
+ const { llm, settings, credentials } = services(ctx);
15
+ return (typeof llm?.listProviders === 'function' &&
16
+ typeof llm?.listConfigurableProviders === 'function' &&
17
+ typeof settings?.describe === 'function' &&
18
+ typeof credentials?.describe === 'function');
19
+ }
20
+ export function providerConnectAvailable(ctx) {
21
+ const { settings, credentials } = services(ctx);
22
+ return (providersAvailable(ctx) &&
23
+ typeof settings?.update === 'function' &&
24
+ typeof credentials?.set === 'function' &&
25
+ typeof credentials?.unset === 'function');
26
+ }
27
+ function isRecord(value) {
28
+ return typeof value === 'object' && value !== null;
29
+ }
30
+ function catalog(llm) {
31
+ try {
32
+ return llm.listConfigurableProviders();
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ }
38
+ function findEntry(llm, provider) {
39
+ return catalog(llm).find((entry) => entry.provider === provider);
40
+ }
41
+ function descriptorFor(settings, ns) {
42
+ try {
43
+ return settings.describe({ redactSecrets: true }).find((item) => item.ns === ns);
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ }
49
+ function profileAt(settings, entry) {
50
+ const descriptor = descriptorFor(settings, entry.settingsNs);
51
+ if (!descriptor)
52
+ return undefined;
53
+ let value = descriptor.value;
54
+ for (const segment of entry.settingsPath) {
55
+ if (!isRecord(value))
56
+ return undefined;
57
+ value = value[segment];
58
+ }
59
+ return isRecord(value) ? value : undefined;
60
+ }
61
+ function refOf(profile) {
62
+ const ref = profile?.['apiKeyEnv'];
63
+ return typeof ref === 'string' && CREDENTIAL_REF.test(ref) ? ref : undefined;
64
+ }
65
+ function deriveRef(provider) {
66
+ const base = provider.toUpperCase().replace(/[^A-Z0-9]/g, '_');
67
+ const prefix = /^[A-Z_]/.test(base) ? base : `PROVIDER_${base}`;
68
+ return `${prefix}_API_KEY`;
69
+ }
70
+ function allRefs(llm, settings) {
71
+ const refs = new Set();
72
+ for (const entry of catalog(llm)) {
73
+ const ref = refOf(profileAt(settings, entry));
74
+ if (ref)
75
+ refs.add(ref);
76
+ }
77
+ return refs;
78
+ }
79
+ function actionFor(entry, profile, credential) {
80
+ if (!profile)
81
+ return 'add-provider';
82
+ return credential === 'set' ? 'none' : 'add-key';
83
+ }
84
+ function resolveRef(llm, settings, entry) {
85
+ const existing = refOf(profileAt(settings, entry));
86
+ const ref = existing ?? deriveRef(entry.provider);
87
+ if (!existing && allRefs(llm, settings).has(ref)) {
88
+ return { error: 'The derived credential name is already used by another provider.' };
89
+ }
90
+ return { ref };
91
+ }
92
+ async function addProviderProfile(settings, entry, ref) {
93
+ const descriptor = descriptorFor(settings, entry.settingsNs);
94
+ if (!descriptor)
95
+ return 'The key was stored, but the provider settings are not available.';
96
+ const patch = entry.settingsPath.reduceRight((value, segment) => ({ [segment]: value }), { apiKeyEnv: ref });
97
+ try {
98
+ await settings.update(entry.settingsNs, patch, descriptor.revision);
99
+ return undefined;
100
+ }
101
+ catch (error) {
102
+ const detail = error instanceof Error ? error.message : String(error);
103
+ return `The key was stored, but the provider could not be added: ${detail}`;
104
+ }
105
+ }
106
+ function validateKey(raw) {
107
+ const key = raw.trim();
108
+ if (!key || key.length > MAX_KEY_LENGTH || !API_KEY.test(key))
109
+ return undefined;
110
+ return key;
111
+ }
112
+ function scrub(detail, key) {
113
+ if (!detail)
114
+ return undefined;
115
+ return detail.split(key).join('***');
116
+ }
117
+ function classifyTestError(error) {
118
+ const message = error instanceof Error ? error.message : String(error);
119
+ const code = isRecord(error) && typeof error['code'] === 'string' ? error['code'] : '';
120
+ const status = isRecord(error) && typeof error['status'] === 'number'
121
+ ? error['status']
122
+ : undefined;
123
+ const text = `${code} ${message}`.toLowerCase();
124
+ if (text.includes('no_discovery') || text.includes('no model discovery'))
125
+ return 'unsupported';
126
+ if (status === 401 ||
127
+ status === 403 ||
128
+ text.includes('401') ||
129
+ text.includes('403') ||
130
+ text.includes('api key') ||
131
+ text.includes('unauthorized') ||
132
+ text.includes('forbidden'))
133
+ return 'rejected';
134
+ if (text.includes('abort') ||
135
+ text.includes('timeout') ||
136
+ text.includes('timed out') ||
137
+ text.includes('fetch failed') ||
138
+ text.includes('enotfound') ||
139
+ text.includes('econn'))
140
+ return 'unreachable';
141
+ return 'rejected';
142
+ }
143
+ export async function listProviders(ctx) {
144
+ const { llm, settings, credentials } = services(ctx);
145
+ if (!llm || !settings || !credentials)
146
+ return [];
147
+ let routes;
148
+ try {
149
+ routes = llm.listProviders();
150
+ }
151
+ catch {
152
+ return [];
153
+ }
154
+ const configured = new Set(routes.map((route) => route.id));
155
+ const entries = catalog(llm);
156
+ const seen = new Set(entries.map((entry) => entry.provider));
157
+ const views = await Promise.all(entries.map(async (entry) => {
158
+ const profile = profileAt(settings, entry);
159
+ const ref = refOf(profile);
160
+ let credential = 'unknown';
161
+ let credentialSource;
162
+ if (ref) {
163
+ try {
164
+ const description = await credentials.describe(ref);
165
+ credential = description.configured ? 'set' : 'missing';
166
+ credentialSource = description.source;
167
+ }
168
+ catch { }
169
+ }
170
+ return {
171
+ id: entry.provider,
172
+ name: entry.displayName,
173
+ configured: configured.has(entry.provider),
174
+ credential,
175
+ ...(credentialSource ? { credentialSource } : {}),
176
+ action: actionFor(entry, profile, credential),
177
+ };
178
+ }));
179
+ for (const route of routes) {
180
+ if (seen.has(route.id))
181
+ continue;
182
+ views.push({
183
+ id: route.id,
184
+ name: route.name ?? route.id,
185
+ configured: true,
186
+ credential: 'unknown',
187
+ action: 'desktop',
188
+ });
189
+ }
190
+ return views.sort((left, right) => {
191
+ if (left.configured !== right.configured)
192
+ return left.configured ? -1 : 1;
193
+ return left.name.localeCompare(right.name);
194
+ });
195
+ }
196
+ export async function testProvider(ctx, input) {
197
+ const { llm, settings } = services(ctx);
198
+ if (!llm || !settings)
199
+ return { provider: input.provider, ok: false, code: 'unsupported' };
200
+ const entry = findEntry(llm, input.provider);
201
+ if (!entry) {
202
+ return { provider: input.provider, ok: false, code: 'invalid', detail: 'Unknown provider.' };
203
+ }
204
+ const key = validateKey(input.apiKey);
205
+ if (!key) {
206
+ return {
207
+ provider: input.provider,
208
+ ok: false,
209
+ code: 'invalid',
210
+ detail: 'The key is empty, too long or has characters a header cannot carry.',
211
+ };
212
+ }
213
+ const profile = profileAt(settings, entry);
214
+ const baseURL = typeof profile?.['baseURL'] === 'string' ? profile['baseURL'] : entry.defaultBaseURL;
215
+ const api = typeof profile?.['api'] === 'string' ? profile['api'] : undefined;
216
+ const controller = new AbortController();
217
+ const timer = setTimeout(() => controller.abort(), TEST_TIMEOUT_MS);
218
+ try {
219
+ await llm.discoverModels(entry.settingsNs, {
220
+ provider: entry.provider,
221
+ ...(baseURL ? { baseURL } : {}),
222
+ ...(api ? { api } : {}),
223
+ apiKey: key,
224
+ }, controller.signal);
225
+ return { provider: input.provider, ok: true, code: 'ok' };
226
+ }
227
+ catch (error) {
228
+ const message = error instanceof Error ? error.message : String(error);
229
+ return {
230
+ provider: input.provider,
231
+ ok: false,
232
+ code: classifyTestError(error),
233
+ ...(message ? { detail: scrub(message, key) } : {}),
234
+ };
235
+ }
236
+ finally {
237
+ clearTimeout(timer);
238
+ }
239
+ }
240
+ export async function connectProvider(ctx, input) {
241
+ const { llm, settings, credentials } = services(ctx);
242
+ if (!llm || !settings || !credentials) {
243
+ return { ok: false, code: 'bad-request', message: 'This host cannot configure providers.' };
244
+ }
245
+ const entry = findEntry(llm, input.provider);
246
+ if (!entry) {
247
+ return { ok: false, code: 'bad-request', message: 'Unknown provider.' };
248
+ }
249
+ const key = validateKey(input.apiKey);
250
+ if (!key) {
251
+ return {
252
+ ok: false,
253
+ code: 'bad-request',
254
+ message: 'The key is empty, too long or has characters a header cannot carry.',
255
+ };
256
+ }
257
+ const profile = profileAt(settings, entry);
258
+ const resolved = resolveRef(llm, settings, entry);
259
+ if (!resolved.ref) {
260
+ return {
261
+ ok: false,
262
+ code: 'bad-request',
263
+ message: resolved.error ?? 'The provider has no usable credential name.',
264
+ };
265
+ }
266
+ const ref = resolved.ref;
267
+ try {
268
+ await credentials.set(ref, key);
269
+ }
270
+ catch {
271
+ return { ok: false, code: 'internal', message: 'The key could not be stored on the host.' };
272
+ }
273
+ if (!profile) {
274
+ const error = await addProviderProfile(settings, entry, ref);
275
+ if (error)
276
+ return { ok: false, code: 'internal', message: error };
277
+ }
278
+ return {
279
+ ok: true,
280
+ connection: { provider: entry.provider, credential: 'set' },
281
+ };
282
+ }
283
+ export async function disconnectProvider(ctx, input) {
284
+ const { llm, settings, credentials } = services(ctx);
285
+ if (!llm || !settings || !credentials) {
286
+ return { ok: false, code: 'bad-request', message: 'This host cannot configure providers.' };
287
+ }
288
+ const entry = findEntry(llm, input.provider);
289
+ if (!entry) {
290
+ return { ok: false, code: 'bad-request', message: 'Unknown provider.' };
291
+ }
292
+ const ref = refOf(profileAt(settings, entry));
293
+ if (!ref) {
294
+ return { ok: false, code: 'bad-request', message: 'This provider has no stored key.' };
295
+ }
296
+ try {
297
+ await credentials.unset(ref);
298
+ }
299
+ catch {
300
+ return { ok: false, code: 'internal', message: 'The key could not be removed.' };
301
+ }
302
+ let connection = { provider: entry.provider, credential: 'unknown' };
303
+ try {
304
+ const description = await credentials.describe(ref);
305
+ connection = {
306
+ provider: entry.provider,
307
+ credential: description.configured ? 'set' : 'missing',
308
+ ...(description.source ? { credentialSource: description.source } : {}),
309
+ };
310
+ }
311
+ catch { }
312
+ return { ok: true, connection };
313
+ }
314
+ export { classifyTestError as providerTestCode };
315
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/dsh/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type QuestionAnswerItem, type QuestionBatch, type ServerMessage } from '@deepseekharness-mobile/protocol';
2
+ import type { HostContext } from '../host-api.js';
3
+ export interface BridgeAnswer {
4
+ answers: QuestionAnswerItem[];
5
+ }
6
+ export interface BridgeOutcome {
7
+ ok: boolean;
8
+ code?: 'not-found' | 'bad-request' | 'internal';
9
+ message?: string;
10
+ }
11
+ export interface QuestionBridge {
12
+ answer(input: {
13
+ callId: string;
14
+ sessionId: string;
15
+ answers: QuestionAnswerItem[];
16
+ }): BridgeOutcome | undefined;
17
+ pendingBatches(): QuestionBatch[];
18
+ counts(): Map<string, number>;
19
+ dispose(): void;
20
+ }
21
+ export declare function createQuestionBridge(ctx: HostContext, deps: {
22
+ push: (message: ServerMessage) => void;
23
+ clients: () => number;
24
+ }): QuestionBridge;
25
+ //# sourceMappingURL=question-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-bridge.d.ts","sourceRoot":"","sources":["../../src/dsh/question-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAElB,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,KAAK,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,kBAAkB,EAAE,CAAC;KAC/B,GAAG,aAAa,GAAG,SAAS,CAAC;IAC9B,cAAc,IAAI,aAAa,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AAsED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IAAE,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,MAAM,CAAA;CAAE,GACtE,cAAc,CA6GhB"}