@vibesdotdev/integrations-meta 0.0.0-stage → 1.0.0-rc.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 (161) hide show
  1. package/LICENSE +126 -0
  2. package/README.md +38 -2
  3. package/dist/ai/index.d.ts +5 -0
  4. package/dist/ai/index.d.ts.map +1 -0
  5. package/dist/ai/index.js +5 -0
  6. package/dist/ai/index.js.map +1 -0
  7. package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-1.json +18 -0
  8. package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-2-contributor.json +18 -0
  9. package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-2.json +18 -0
  10. package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-3-contributor.json +18 -0
  11. package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-3.json +18 -0
  12. package/dist/ai/metadata/providers/meta.json +8 -0
  13. package/dist/ai/muse-client.consumer.d.ts +10 -0
  14. package/dist/ai/muse-client.consumer.d.ts.map +1 -0
  15. package/dist/ai/muse-client.consumer.js +31 -0
  16. package/dist/ai/muse-client.consumer.js.map +1 -0
  17. package/dist/ai/provider.cloud.plugin.d.ts +6 -0
  18. package/dist/ai/provider.cloud.plugin.d.ts.map +1 -0
  19. package/dist/ai/provider.cloud.plugin.js +110 -0
  20. package/dist/ai/provider.cloud.plugin.js.map +1 -0
  21. package/dist/ai/provider.consumer.plugin.d.ts +3 -0
  22. package/dist/ai/provider.consumer.plugin.d.ts.map +1 -0
  23. package/dist/ai/provider.consumer.plugin.js +23 -0
  24. package/dist/ai/provider.consumer.plugin.js.map +1 -0
  25. package/dist/ai/provider.plugin.d.ts +6 -0
  26. package/dist/ai/provider.plugin.d.ts.map +1 -0
  27. package/dist/ai/provider.plugin.js +17 -0
  28. package/dist/ai/provider.plugin.js.map +1 -0
  29. package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.d.ts +4194 -0
  30. package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.d.ts.map +1 -0
  31. package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.js +13 -0
  32. package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.js.map +1 -0
  33. package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.d.ts +39 -0
  34. package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.d.ts.map +1 -0
  35. package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.js +34 -0
  36. package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.js.map +1 -0
  37. package/dist/ai/providers/cloud/frontier/meta/index.d.ts +5 -0
  38. package/dist/ai/providers/cloud/frontier/meta/index.d.ts.map +1 -0
  39. package/dist/ai/providers/cloud/frontier/meta/index.js +4 -0
  40. package/dist/ai/providers/cloud/frontier/meta/index.js.map +1 -0
  41. package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.d.ts +183 -0
  42. package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.d.ts.map +1 -0
  43. package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.js +97 -0
  44. package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.js.map +1 -0
  45. package/dist/ai/providers/meta/detection/system.d.ts +8 -0
  46. package/dist/ai/providers/meta/detection/system.d.ts.map +1 -0
  47. package/dist/ai/providers/meta/detection/system.js +16 -0
  48. package/dist/ai/providers/meta/detection/system.js.map +1 -0
  49. package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.d.ts +4 -0
  50. package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.d.ts.map +1 -0
  51. package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.js +20 -0
  52. package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.js.map +1 -0
  53. package/dist/ai/providers/meta/index.d.ts +7 -0
  54. package/dist/ai/providers/meta/index.d.ts.map +1 -0
  55. package/dist/ai/providers/meta/index.js +6 -0
  56. package/dist/ai/providers/meta/index.js.map +1 -0
  57. package/dist/ai/providers/meta/meta-known-models.d.ts +3 -0
  58. package/dist/ai/providers/meta/meta-known-models.d.ts.map +1 -0
  59. package/dist/ai/providers/meta/meta-known-models.js +2 -0
  60. package/dist/ai/providers/meta/meta-known-models.js.map +1 -0
  61. package/dist/ai/providers/meta/meta.provider.impl.d.ts +42 -0
  62. package/dist/ai/providers/meta/meta.provider.impl.d.ts.map +1 -0
  63. package/dist/ai/providers/meta/meta.provider.impl.js +269 -0
  64. package/dist/ai/providers/meta/meta.provider.impl.js.map +1 -0
  65. package/dist/ai/providers/meta/muse-server/client.d.ts +66 -0
  66. package/dist/ai/providers/meta/muse-server/client.d.ts.map +1 -0
  67. package/dist/ai/providers/meta/muse-server/client.js +209 -0
  68. package/dist/ai/providers/meta/muse-server/client.js.map +1 -0
  69. package/dist/ai/providers/meta/muse-server/connection.d.ts +77 -0
  70. package/dist/ai/providers/meta/muse-server/connection.d.ts.map +1 -0
  71. package/dist/ai/providers/meta/muse-server/connection.js +174 -0
  72. package/dist/ai/providers/meta/muse-server/connection.js.map +1 -0
  73. package/dist/ai/providers/meta/muse-server/failure-chunk.d.ts +10 -0
  74. package/dist/ai/providers/meta/muse-server/failure-chunk.d.ts.map +1 -0
  75. package/dist/ai/providers/meta/muse-server/failure-chunk.js +33 -0
  76. package/dist/ai/providers/meta/muse-server/failure-chunk.js.map +1 -0
  77. package/dist/ai/providers/meta/muse-server/index.d.ts +9 -0
  78. package/dist/ai/providers/meta/muse-server/index.d.ts.map +1 -0
  79. package/dist/ai/providers/meta/muse-server/index.js +9 -0
  80. package/dist/ai/providers/meta/muse-server/index.js.map +1 -0
  81. package/dist/ai/providers/meta/muse-server/muse-failure.d.ts +189 -0
  82. package/dist/ai/providers/meta/muse-server/muse-failure.d.ts.map +1 -0
  83. package/dist/ai/providers/meta/muse-server/muse-failure.js +226 -0
  84. package/dist/ai/providers/meta/muse-server/muse-failure.js.map +1 -0
  85. package/dist/ai/providers/meta/muse-server/muse-messages.d.ts +19 -0
  86. package/dist/ai/providers/meta/muse-server/muse-messages.d.ts.map +1 -0
  87. package/dist/ai/providers/meta/muse-server/muse-messages.js +83 -0
  88. package/dist/ai/providers/meta/muse-server/muse-messages.js.map +1 -0
  89. package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.d.ts +25 -0
  90. package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.d.ts.map +1 -0
  91. package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.js +21 -0
  92. package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.js.map +1 -0
  93. package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.d.ts +33 -0
  94. package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.d.ts.map +1 -0
  95. package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.js +192 -0
  96. package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.js.map +1 -0
  97. package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.d.ts +13 -0
  98. package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.d.ts.map +1 -0
  99. package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.js +11 -0
  100. package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.js.map +1 -0
  101. package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.d.ts +41 -0
  102. package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.d.ts.map +1 -0
  103. package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.js +103 -0
  104. package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.js.map +1 -0
  105. package/dist/ai/providers/meta/muse-server/protocol.d.ts +138 -0
  106. package/dist/ai/providers/meta/muse-server/protocol.d.ts.map +1 -0
  107. package/dist/ai/providers/meta/muse-server/protocol.js +106 -0
  108. package/dist/ai/providers/meta/muse-server/protocol.js.map +1 -0
  109. package/dist/ai/providers/meta/muse-server/runtime-execution.d.ts +14 -0
  110. package/dist/ai/providers/meta/muse-server/runtime-execution.d.ts.map +1 -0
  111. package/dist/ai/providers/meta/muse-server/runtime-execution.js +39 -0
  112. package/dist/ai/providers/meta/muse-server/runtime-execution.js.map +1 -0
  113. package/dist/ai/providers/meta/muse-server/session.d.ts +19 -0
  114. package/dist/ai/providers/meta/muse-server/session.d.ts.map +1 -0
  115. package/dist/ai/providers/meta/muse-server/session.js +341 -0
  116. package/dist/ai/providers/meta/muse-server/session.js.map +1 -0
  117. package/dist/ai/providers/meta/muse-subscription.d.ts +38 -0
  118. package/dist/ai/providers/meta/muse-subscription.d.ts.map +1 -0
  119. package/dist/ai/providers/meta/muse-subscription.js +77 -0
  120. package/dist/ai/providers/meta/muse-subscription.js.map +1 -0
  121. package/dist/ai/providers/meta/recommendations.d.ts +26 -0
  122. package/dist/ai/providers/meta/recommendations.d.ts.map +1 -0
  123. package/dist/ai/providers/meta/recommendations.js +24 -0
  124. package/dist/ai/providers/meta/recommendations.js.map +1 -0
  125. package/dist/ai/providers/meta/schemas/index.d.ts +12 -0
  126. package/dist/ai/providers/meta/schemas/index.d.ts.map +1 -0
  127. package/dist/ai/providers/meta/schemas/index.js +8 -0
  128. package/dist/ai/providers/meta/schemas/index.js.map +1 -0
  129. package/dist/external/external.plugin.d.ts +3 -0
  130. package/dist/external/external.plugin.d.ts.map +1 -0
  131. package/dist/external/external.plugin.js +18 -0
  132. package/dist/external/external.plugin.js.map +1 -0
  133. package/dist/external/index.d.ts +2 -0
  134. package/dist/external/index.d.ts.map +1 -0
  135. package/dist/external/index.js +2 -0
  136. package/dist/external/index.js.map +1 -0
  137. package/dist/external/muse/index.d.ts +162 -0
  138. package/dist/external/muse/index.d.ts.map +1 -0
  139. package/dist/external/muse/index.js +7 -0
  140. package/dist/external/muse/index.js.map +1 -0
  141. package/dist/external/muse/manifest.d.ts +7 -0
  142. package/dist/external/muse/manifest.d.ts.map +1 -0
  143. package/dist/external/muse/manifest.js +25 -0
  144. package/dist/external/muse/manifest.js.map +1 -0
  145. package/dist/external/muse-subscription.operation.descriptors.d.ts +29 -0
  146. package/dist/external/muse-subscription.operation.descriptors.d.ts.map +1 -0
  147. package/dist/external/muse-subscription.operation.descriptors.js +12 -0
  148. package/dist/external/muse-subscription.operation.descriptors.js.map +1 -0
  149. package/dist/external/muse-subscription.operations.d.ts +3 -0
  150. package/dist/external/muse-subscription.operations.d.ts.map +1 -0
  151. package/dist/external/muse-subscription.operations.js +23 -0
  152. package/dist/external/muse-subscription.operations.js.map +1 -0
  153. package/dist/failure-outcome.d.ts +21 -0
  154. package/dist/failure-outcome.d.ts.map +1 -0
  155. package/dist/failure-outcome.js +22 -0
  156. package/dist/failure-outcome.js.map +1 -0
  157. package/dist/index.d.ts +4 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +4 -0
  160. package/dist/index.js.map +1 -0
  161. package/package.json +103 -4
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Typed failures of the Muse server integration.
3
+ *
4
+ * Every failure is a `CapabilityError` with a code and a `reason` from the table
5
+ * below, and a message that is fixed per reason. Text the child wrote (a JSON-RPC
6
+ * `error.message`, a turn's error, stderr) never enters a message: it rides only
7
+ * in a bounded `cause` ({@link childTextCause}) the logger scrubs.
8
+ */
9
+ import { CapabilityError, CaughtFailureSchema, isCapabilityError, valueFreeFailure } from '@vibesdotdev/kernel';
10
+ import { boundedExcerpt } from '@vibesdotdev/external/jsonrpc';
11
+ const FAILURES = {
12
+ 'muse-transport-closed': {
13
+ code: 'UNAVAILABLE',
14
+ message: 'The Muse server connection is closed.',
15
+ retryable: true
16
+ },
17
+ 'muse-process-exited': {
18
+ code: 'UNAVAILABLE',
19
+ message: 'The Muse server process ended.',
20
+ retryable: true
21
+ },
22
+ 'muse-line-too-long': {
23
+ code: 'UNAVAILABLE',
24
+ message: 'The Muse server wrote a line longer than the declared maximum.',
25
+ retryable: false
26
+ },
27
+ 'muse-envelope-unrecognized': {
28
+ code: 'UNAVAILABLE',
29
+ message: 'The Muse server wrote output that is not a JSON-RPC message.',
30
+ retryable: false
31
+ },
32
+ 'muse-request-failed': {
33
+ code: 'UNAVAILABLE',
34
+ message: 'The Muse server answered a request with an error.',
35
+ retryable: false
36
+ },
37
+ 'muse-request-timeout': {
38
+ code: 'TIMEOUT',
39
+ message: 'A Muse server request timed out.',
40
+ retryable: true
41
+ },
42
+ 'muse-turn-failed': {
43
+ code: 'UNAVAILABLE',
44
+ message: 'The Muse turn did not complete.',
45
+ retryable: false
46
+ },
47
+ 'muse-turn-cancelled': {
48
+ code: 'CANCELLED',
49
+ message: 'The Muse server reported the turn cancelled.',
50
+ retryable: false
51
+ },
52
+ 'muse-turn-timeout': {
53
+ code: 'TIMEOUT',
54
+ message: 'The Muse turn timed out before it completed.',
55
+ retryable: true
56
+ },
57
+ 'generation-cancelled': {
58
+ code: 'CANCELLED',
59
+ message: 'The generation was cancelled.',
60
+ retryable: false
61
+ },
62
+ 'muse-output-too-large': {
63
+ code: 'UNAVAILABLE',
64
+ message: 'The Muse turn produced more output than the declared bound.',
65
+ retryable: false
66
+ },
67
+ 'muse-notification-invalid': {
68
+ code: 'UNAVAILABLE',
69
+ message: 'The Muse server sent a notification of an unexpected shape.',
70
+ retryable: false
71
+ },
72
+ 'approval-denied': {
73
+ code: 'PERMISSION_DENIED',
74
+ message: 'The Muse session asked for an approval the declared execution policy does not permit.',
75
+ retryable: false
76
+ },
77
+ 'muse-user-input-requested': {
78
+ code: 'UNAVAILABLE',
79
+ message: 'The Muse session asked for user input, which a headless session cannot answer.',
80
+ retryable: false
81
+ },
82
+ 'muse-approval-failed': {
83
+ code: 'UNAVAILABLE',
84
+ message: 'The Muse approval request could not be answered.',
85
+ retryable: false
86
+ },
87
+ 'muse-listener-failed': {
88
+ code: 'INTERNAL',
89
+ message: 'A listener of the Muse server connection failed.',
90
+ retryable: false
91
+ },
92
+ 'muse-transport-close-failed': {
93
+ code: 'UNAVAILABLE',
94
+ message: 'A Muse server connection could not be closed.',
95
+ retryable: false
96
+ },
97
+ 'muse-cli-unavailable': {
98
+ code: 'UNAVAILABLE',
99
+ message: 'The Muse CLI is unavailable in the runtime environment.',
100
+ retryable: false
101
+ },
102
+ 'muse-consumer-host-required': {
103
+ code: 'UNAVAILABLE',
104
+ message: 'Muse subscription execution requires a connected consumer host.',
105
+ retryable: false
106
+ },
107
+ 'muse-session-program-missing': {
108
+ code: 'INTERNAL',
109
+ message: 'The selected spec did not provide a Muse session program.',
110
+ retryable: false
111
+ },
112
+ 'muse-no-result': {
113
+ code: 'UNAVAILABLE',
114
+ message: 'The Muse session ended without a result.',
115
+ retryable: false
116
+ },
117
+ 'response-shape-mismatch': {
118
+ code: 'UNAVAILABLE',
119
+ message: 'The Muse server answered with a result of an unexpected shape.',
120
+ retryable: false
121
+ },
122
+ 'unsupported-option': {
123
+ code: 'INVALID_INPUT',
124
+ message: 'The Muse server spec does not support this request option.',
125
+ retryable: false
126
+ },
127
+ 'unsupported-modality': {
128
+ code: 'INVALID_INPUT',
129
+ message: 'The Muse server spec only supports text generation.',
130
+ retryable: false
131
+ },
132
+ 'unsupported-content': {
133
+ code: 'INVALID_INPUT',
134
+ message: 'The Muse server session carries text only: images, tools, tool calls and tool results are not supported.',
135
+ retryable: false
136
+ },
137
+ 'invalid-connection': {
138
+ code: 'INVALID_INPUT',
139
+ message: 'The Meta connection configuration is not readable.',
140
+ retryable: false
141
+ },
142
+ 'invalid-auth-method': {
143
+ code: 'INVALID_INPUT',
144
+ message: 'The Meta connection names an authentication method this provider does not support.',
145
+ retryable: false
146
+ },
147
+ 'invalid-request': {
148
+ code: 'INVALID_INPUT',
149
+ message: 'The generation request is not a readable text request.',
150
+ retryable: false
151
+ },
152
+ 'request-too-large': {
153
+ code: 'INVALID_INPUT',
154
+ message: 'The generation request is larger than the Muse server spec accepts.',
155
+ retryable: false
156
+ },
157
+ 'invalid-transport-record': {
158
+ code: 'UNAVAILABLE',
159
+ message: 'The transport delivered a record the Muse spec cannot read.',
160
+ retryable: false
161
+ },
162
+ untyped: {
163
+ code: 'INTERNAL',
164
+ message: 'The Muse server failed unexpectedly.',
165
+ retryable: false
166
+ }
167
+ };
168
+ /** Every reason this integration raises, for the SPEC table and its test. */
169
+ export const MUSE_FAILURE_REASONS = Object.freeze(Object.keys(FAILURES));
170
+ /** Whether `reason` is one this integration raises. */
171
+ export function isMuseFailureReason(reason) {
172
+ return Object.hasOwn(FAILURES, reason);
173
+ }
174
+ /**
175
+ * A typed failure with its reason's fixed message; `details` and `cause` are the caller's bounded facts.
176
+ * `retryable` overrides the reason's default only when the child judged the failure itself (MSP `TurnError.retryable`).
177
+ */
178
+ export function museFailure(reason, extra = {}) {
179
+ const terms = FAILURES[reason];
180
+ const options = { reason, retryable: extra.retryable ?? terms.retryable };
181
+ if (extra.details !== undefined)
182
+ options.details = extra.details;
183
+ if (extra.cause !== undefined)
184
+ options.cause = extra.cause;
185
+ return new CapabilityError(terms.message, terms.code, options);
186
+ }
187
+ /**
188
+ * Text the child wrote, kept only as the `cause` of a typed failure: at most 200
189
+ * characters, with control, format and separator characters removed.
190
+ */
191
+ export function childTextCause(text) {
192
+ return new Error(boundedExcerpt(text));
193
+ }
194
+ /** The failure of a JSON-RPC request or of the child, as the Muse reason that names it. */
195
+ export function museFailureFrom(caught) {
196
+ const failure = CaughtFailureSchema.parse(caught);
197
+ // `isCapabilityError` never throws: a hostile value (a Proxy that traps `name`) is simply not typed.
198
+ // An untyped failure is known by its value-free facts and keeps the failure as its cause.
199
+ if (!isCapabilityError(failure)) {
200
+ return museFailure('untyped', { details: { failure: { ...valueFreeFailure(failure) } }, cause: failure });
201
+ }
202
+ // A failure that already carries one of this package's reasons is the answer as it is.
203
+ if (isMuseFailureReason(failure.reason))
204
+ return failure;
205
+ switch (failure.reason) {
206
+ case 'jsonrpc-child-exited':
207
+ return museFailure('muse-process-exited', { details: failure.details, cause: failure });
208
+ case 'jsonrpc-line-too-large':
209
+ return museFailure('muse-line-too-long', { cause: failure });
210
+ case 'jsonrpc-protocol-invalid':
211
+ return failure.details?.stage === 'result-schema' || failure.details?.stage === 'result-schema-threw'
212
+ ? museFailure('response-shape-mismatch', { cause: failure })
213
+ : museFailure('muse-envelope-unrecognized', { cause: failure });
214
+ case 'jsonrpc-closed':
215
+ return museFailure('muse-transport-closed', { cause: failure });
216
+ case 'jsonrpc-timeout':
217
+ return museFailure('muse-request-timeout', { cause: failure });
218
+ case 'jsonrpc-cancelled':
219
+ return museFailure('generation-cancelled', { cause: failure });
220
+ case 'jsonrpc-error':
221
+ return museFailure('muse-request-failed', { cause: failure });
222
+ default:
223
+ return failure;
224
+ }
225
+ }
226
+ //# sourceMappingURL=muse-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-failure.js","sourceRoot":"","sources":["../../../../../src/ai/providers/meta/muse-server/muse-failure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { GenerationRequest } from '@vibesdotdev/ai/interfaces/adapter';
2
+ import type { Modality } from '@vibesdotdev/ai/models/schemas/constants';
3
+ /** Characters of prompt one request may carry (the sum of every message's content). */
4
+ export declare const MUSE_MAX_PROMPT_CHARS = 4194304;
5
+ export interface MuseTextMessage {
6
+ readonly role: 'system' | 'user' | 'assistant';
7
+ readonly content: string;
8
+ }
9
+ /**
10
+ * The conversation of a text request, or a typed refusal. A request that is not
11
+ * a text request (or cannot be read at all: a throwing getter, a trapping
12
+ * Proxy) is `unsupported-modality`; a malformed message list is
13
+ * `invalid-request`; content the text session cannot carry (an image, a tool
14
+ * call or result, native tools) is `unsupported-content` (never dropped); an
15
+ * oversize prompt is `request-too-large`. Nothing the request said is echoed
16
+ * into a message.
17
+ */
18
+ export declare function readMuseTextMessages<M extends Modality>(request: GenerationRequest<M>): MuseTextMessage[];
19
+ //# sourceMappingURL=muse-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-messages.d.ts","sourceRoot":"","sources":["../../../../../src/ai/providers/meta/muse-server/muse-messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAKzE,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAoB/C,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAmBD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,CAyBzG"}
@@ -0,0 +1,83 @@
1
+ import * as z from 'zod/v4';
2
+ import { isTextRequest } from '@vibesdotdev/ai/specs/interfaces';
3
+ import { attempt } from "../../../../failure-outcome.js";
4
+ import { museFailure } from "./muse-failure.js";
5
+ /** Characters of prompt one request may carry (the sum of every message's content). */
6
+ export const MUSE_MAX_PROMPT_CHARS = 4_194_304;
7
+ /** Messages one request may carry. */
8
+ const MAX_MESSAGES = 4_096;
9
+ /**
10
+ * What the Muse spec reads from a message. `images`, `toolCalls`, `toolCallId`
11
+ * and `toolName` are read only to be refused: a spec that flattens a
12
+ * conversation to text must not drop them.
13
+ */
14
+ const MuseMessageSchema = z.object({
15
+ role: z.enum(['system', 'user', 'assistant', 'tool']),
16
+ content: z.string().max(MUSE_MAX_PROMPT_CHARS),
17
+ images: z.unknown().optional(),
18
+ toolCalls: z.unknown().optional(),
19
+ toolCallId: z.unknown().optional(),
20
+ toolName: z.unknown().optional()
21
+ });
22
+ const MuseMessagesSchema = z.array(MuseMessageSchema).min(1).max(MAX_MESSAGES);
23
+ /** An empty list drops nothing. */
24
+ const EmptyListSchema = z.array(z.never()).max(0);
25
+ /** The one request member read to be refused: native tools the session cannot offer the model (an empty list drops nothing). */
26
+ const ToolsSchema = z.object({ tools: EmptyListSchema.optional() });
27
+ function unsupportedField(message) {
28
+ // A value a schema cannot even measure (a trapping Proxy) is not an empty list: it would be dropped.
29
+ const images = attempt(() => EmptyListSchema.safeParse(message.images));
30
+ if (message.images !== undefined && (images.failed || !images.value.success))
31
+ return 'images';
32
+ const toolCalls = attempt(() => EmptyListSchema.safeParse(message.toolCalls));
33
+ if (message.toolCalls !== undefined && (toolCalls.failed || !toolCalls.value.success))
34
+ return 'toolCalls';
35
+ if (message.toolCallId !== undefined)
36
+ return 'toolCallId';
37
+ if (message.toolName !== undefined)
38
+ return 'toolName';
39
+ return undefined;
40
+ }
41
+ /**
42
+ * The conversation of a text request, or a typed refusal. A request that is not
43
+ * a text request (or cannot be read at all: a throwing getter, a trapping
44
+ * Proxy) is `unsupported-modality`; a malformed message list is
45
+ * `invalid-request`; content the text session cannot carry (an image, a tool
46
+ * call or result, native tools) is `unsupported-content` (never dropped); an
47
+ * oversize prompt is `request-too-large`. Nothing the request said is echoed
48
+ * into a message.
49
+ */
50
+ export function readMuseTextMessages(request) {
51
+ if (!isTextRequest(request))
52
+ throw museFailure('unsupported-modality');
53
+ const tools = attempt(() => ToolsSchema.safeParse(request));
54
+ if (tools.failed)
55
+ throw museFailure('invalid-request', { details: { stage: 'read' }, cause: tools.cause });
56
+ if (!tools.value.success)
57
+ throw museFailure('unsupported-content', { details: { field: 'tools' } });
58
+ const read = attempt(() => MuseMessagesSchema.safeParse(request.messages));
59
+ if (read.failed)
60
+ throw museFailure('invalid-request', { details: { stage: 'read' }, cause: read.cause });
61
+ if (!read.value.success) {
62
+ const issue = read.value.error.issues[0];
63
+ const tooLarge = issue?.code === 'too_big' && issue.path.at(-1) === 'content';
64
+ throw museFailure(tooLarge ? 'request-too-large' : 'invalid-request', {
65
+ details: { stage: 'schema', path: issue ? issue.path.map(String).join('.').slice(0, 64) : undefined }
66
+ });
67
+ }
68
+ const messages = [];
69
+ let total = 0;
70
+ for (const [index, message] of read.value.data.entries()) {
71
+ const unsupported = unsupportedField(message);
72
+ if (unsupported)
73
+ throw museFailure('unsupported-content', { details: { field: unsupported, index } });
74
+ if (message.role === 'tool')
75
+ throw museFailure('unsupported-content', { details: { field: 'role', index } });
76
+ total += message.content.length;
77
+ if (total > MUSE_MAX_PROMPT_CHARS)
78
+ throw museFailure('request-too-large', { details: { stage: 'total' } });
79
+ messages.push({ role: message.role, content: message.content });
80
+ }
81
+ return messages;
82
+ }
83
+ //# sourceMappingURL=muse-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-messages.js","sourceRoot":"","sources":["../../../../../src/ai/providers/meta/muse-server/muse-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ declare const _default: {
2
+ id: string;
3
+ kind: "ai/spec";
4
+ name: string;
5
+ description: string;
6
+ modalities: ("image" | "text" | "audio" | "video" | "embedding" | "transcription" | "evaluation" | "speech" | "ocr")[];
7
+ streamFraming: "none" | "sse" | "sse-named" | "ndjson" | "binary-chunked" | "ws-frame";
8
+ toolCallEnvelope: string;
9
+ transports: string[];
10
+ external: boolean;
11
+ priority: number;
12
+ enabled: boolean;
13
+ capabilities?: ("streaming" | "json_mode" | "text_generation" | "chat_completion" | "function_calling" | "embedding_generation" | "image_generation_text_to_image" | "image_generation_image_to_image" | "image_generation_inpainting" | "image_generation_outpainting" | "image_upscaling" | "image_editing_via_instructions" | "audio_generation_text_to_speech" | "audio_generation_voice_cloning" | "audio_generation_music" | "audio_generation_sound_effects" | "audio_transcription" | "audio_transcription_realtime" | "video_generation_text_to_video" | "workflow_execution" | "code_generation" | "image_understanding" | "structured_evaluation")[] | undefined;
14
+ imageControls?: {
15
+ steps: boolean;
16
+ cfg: boolean;
17
+ sampler: boolean;
18
+ scheduler: boolean;
19
+ negativePrompt: boolean;
20
+ seed: boolean;
21
+ } | undefined;
22
+ tags?: string[] | undefined;
23
+ };
24
+ export default _default;
25
+ //# sourceMappingURL=muse-server.spec.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-server.spec.descriptor.d.ts","sourceRoot":"","sources":["../../../../../src/ai/providers/meta/muse-server/muse-server.spec.descriptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAEA,wBAmBG"}
@@ -0,0 +1,21 @@
1
+ import { createAISpecDescriptor } from '@vibesdotdev/ai/specs/schemas/descriptor';
2
+ export default createAISpecDescriptor({
3
+ id: 'muse-server',
4
+ name: 'Meta Muse Server',
5
+ description: 'Subscription-backed, provider-managed agent turns over the persistent Meta Muse app-server MSP protocol.',
6
+ modalities: ['text'],
7
+ streamFraming: 'ndjson',
8
+ toolCallEnvelope: 'openai-tool-calls',
9
+ transports: ['muse-server'],
10
+ capabilities: ['text_generation', 'function_calling'],
11
+ priority: 110,
12
+ tags: [
13
+ 'meta',
14
+ 'muse',
15
+ 'msp',
16
+ 'meta-managed-auth',
17
+ 'provider-managed-tool-loop',
18
+ 'consumer-only'
19
+ ]
20
+ });
21
+ //# sourceMappingURL=muse-server.spec.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-server.spec.descriptor.js","sourceRoot":"","sources":["../../../../../src/ai/providers/meta/muse-server/muse-server.spec.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAElF,eAAe,sBAAsB,CAAC;IACrC,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACV,0GAA0G;IAC3G,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ;IACvB,gBAAgB,EAAE,mBAAmB;IACrC,UAAU,EAAE,CAAC,aAAa,CAAC;IAC3B,YAAY,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IACrD,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE;QACL,MAAM;QACN,MAAM;QACN,KAAK;QACL,mBAAmB;QACnB,4BAA4B;QAC5B,eAAe;KACf;CACD,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type AISpecInterface, type DecodedEvent, type SpecCallContext, type WireRequest, type WireResponseChunk } from '@vibesdotdev/ai/specs/interfaces';
2
+ import type { GenerationRequest } from '@vibesdotdev/ai/interfaces/adapter';
3
+ import type { Modality } from '@vibesdotdev/ai/models/schemas/constants';
4
+ declare class MuseServerSpec implements AISpecInterface {
5
+ readonly descriptor: {
6
+ id: string;
7
+ kind: "ai/spec";
8
+ name: string;
9
+ description: string;
10
+ modalities: ("image" | "text" | "audio" | "video" | "embedding" | "transcription" | "evaluation" | "speech" | "ocr")[];
11
+ streamFraming: "none" | "sse" | "sse-named" | "ndjson" | "binary-chunked" | "ws-frame";
12
+ toolCallEnvelope: string;
13
+ transports: string[];
14
+ external: boolean;
15
+ priority: number;
16
+ enabled: boolean;
17
+ capabilities?: ("streaming" | "json_mode" | "text_generation" | "chat_completion" | "function_calling" | "embedding_generation" | "image_generation_text_to_image" | "image_generation_image_to_image" | "image_generation_inpainting" | "image_generation_outpainting" | "image_upscaling" | "image_editing_via_instructions" | "audio_generation_text_to_speech" | "audio_generation_voice_cloning" | "audio_generation_music" | "audio_generation_sound_effects" | "audio_transcription" | "audio_transcription_realtime" | "video_generation_text_to_video" | "workflow_execution" | "code_generation" | "image_understanding" | "structured_evaluation")[] | undefined;
18
+ imageControls?: {
19
+ steps: boolean;
20
+ cfg: boolean;
21
+ sampler: boolean;
22
+ scheduler: boolean;
23
+ negativePrompt: boolean;
24
+ seed: boolean;
25
+ } | undefined;
26
+ tags?: string[] | undefined;
27
+ };
28
+ encodeRequest<M extends Modality>(request: GenerationRequest<M>, context: SpecCallContext): WireRequest;
29
+ decodeResponse<M extends Modality>(chunks: AsyncIterable<WireResponseChunk>, request: GenerationRequest<M>, context: SpecCallContext): AsyncIterable<DecodedEvent<M>>;
30
+ }
31
+ declare const _default: MuseServerSpec;
32
+ export default _default;
33
+ //# sourceMappingURL=muse-server.spec.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse-server.spec.impl.d.ts","sourceRoot":"","sources":["../../../../../src/ai/providers/meta/muse-server/muse-server.spec.impl.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,iBAAiB,EAA0B,MAAM,oCAAoC,CAAC;AACpG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAuCzE,cAAM,cAAe,YAAW,eAAe;IAC9C,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;MAAc;IAEjC,aAAa,CAAC,CAAC,SAAS,QAAQ,EAC/B,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,eAAe,GACtB,WAAW;IAmDP,cAAc,CAAC,CAAC,SAAS,QAAQ,EACvC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACxC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,eAAe,GACtB,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;CAmDjC;;AA8DD,wBAAoC"}
@@ -0,0 +1,192 @@
1
+ import { isTextRequest, textResultEvent } from '@vibesdotdev/ai/specs/interfaces';
2
+ import * as z from 'zod/v4';
3
+ import { JsonObjectSchema } from '@vibesdotdev/kernel/schemas/json';
4
+ import { attempt } from "../../../../failure-outcome.js";
5
+ import descriptor from "./muse-server.spec.descriptor.js";
6
+ import { museFailure } from "./muse-failure.js";
7
+ import { readMuseTextMessages } from "./muse-messages.js";
8
+ import { MuseServerRecordSchema } from "./protocol.js";
9
+ import { createMuseServerSessionProgram } from "./session.js";
10
+ /** The reasoning efforts a request may name (the vendor-neutral vocabulary of the text request). */
11
+ const EffortSchema = z.enum(['none', 'low', 'medium', 'high', 'xhigh', 'max']).optional();
12
+ /** The part of the call's declared execution policy (`AIExecutionPolicy`) that sets the approval posture. */
13
+ const PolicySchema = z.object({
14
+ sandboxMode: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional(),
15
+ approvalPolicy: z.enum(['untrusted', 'on-failure', 'on-request', 'never']).optional()
16
+ });
17
+ /** The workspace path the policy declares; anything but a string is not a path. */
18
+ const WorkspacePathSchema = z.string().optional();
19
+ /**
20
+ * The approval posture of a session. Unmatched approvals are denied unless the call
21
+ * declares an execution policy that permits them: full access (`danger-full-access`)
22
+ * with no approval prompts (`approvalPolicy: 'never'`), the same rule as Codex and
23
+ * Antigravity. A read-only or workspace-write policy never approves a write or a
24
+ * shell command, whatever its approval policy. Nothing is inferred: an absent or
25
+ * unreadable policy is the denying posture.
26
+ */
27
+ function approvalModeFor(policy) {
28
+ return policy.sandboxMode === 'danger-full-access' && policy.approvalPolicy === 'never' ? 'allowAll' : 'denyUnmatched';
29
+ }
30
+ class MuseServerSpec {
31
+ descriptor = descriptor;
32
+ encodeRequest(request, context) {
33
+ // Refuses images, tools, tool calls and tool results typed: the session carries text only, and nothing is dropped.
34
+ const messages = readMuseTextMessages(request);
35
+ if (!isTextRequest(request))
36
+ throw museFailure('unsupported-modality');
37
+ const modelId = resolveMuseModel(context.wireModelId);
38
+ const requested = attempt(() => request.reasoningEffort);
39
+ if (requested.failed) {
40
+ throw museFailure('invalid-request', { details: { stage: 'read' }, cause: requested.cause });
41
+ }
42
+ const declared = EffortSchema.safeParse(requested.value);
43
+ if (!declared.success)
44
+ throw museFailure('unsupported-option', { details: { option: 'reasoningEffort' } });
45
+ const effort = toMuseEffort(declared.data);
46
+ // The policy is read once, inside the guard: a hostile getter or Proxy on it is a typed refusal.
47
+ const policy = attempt(() => {
48
+ const raw = context.executionPolicy;
49
+ return { posture: PolicySchema.safeParse(raw ?? {}), workspacePath: WorkspacePathSchema.safeParse(raw?.workspacePath) };
50
+ });
51
+ if (policy.failed)
52
+ throw museFailure('invalid-request', { details: { stage: 'policy' }, cause: policy.cause });
53
+ if (!policy.value.workspacePath.success)
54
+ throw museFailure('invalid-request', { details: { stage: 'policy' } });
55
+ // A policy that does not parse declares nothing: the posture stays denying.
56
+ const declaredPolicy = policy.value.posture.success ? policy.value.posture.data : {};
57
+ const workspacePath = policy.value.workspacePath.data ?? '.';
58
+ const jsonSchema = attempt(() => JsonObjectSchema.optional().safeParse(request.jsonSchema));
59
+ if (jsonSchema.failed) {
60
+ throw museFailure('invalid-request', { details: { stage: 'read' }, cause: jsonSchema.cause });
61
+ }
62
+ if (!jsonSchema.value.success)
63
+ throw museFailure('invalid-request', { details: { stage: 'jsonSchema' } });
64
+ const body = {
65
+ model: modelId,
66
+ workspaceRoot: workspacePath.replace(/\\/g, '/'),
67
+ approvalMode: approvalModeFor(declaredPolicy),
68
+ input: encodeTurnInput(messages, jsonSchema.value.data),
69
+ reasoningEffort: effort
70
+ };
71
+ return {
72
+ method: 'POST',
73
+ path: '',
74
+ headers: { 'content-type': 'application/x-ndjson' },
75
+ body: {
76
+ ...body,
77
+ sessionProgram: createMuseServerSessionProgram(body)
78
+ },
79
+ streaming: true
80
+ };
81
+ }
82
+ async *decodeResponse(chunks, request, context) {
83
+ let resultSeen = false;
84
+ for await (const chunk of chunks) {
85
+ if (chunk.kind === 'error') {
86
+ yield { kind: 'error', error: chunk.error };
87
+ return;
88
+ }
89
+ if (chunk.kind !== 'ndjson-record')
90
+ continue;
91
+ const record = parseRecord(chunk.data);
92
+ // A record the session never writes, or any record after the result: the stream cannot be trusted.
93
+ if (!record.ok) {
94
+ yield {
95
+ kind: 'error',
96
+ error: museFailure('invalid-transport-record', { details: { problem: record.problem }, cause: record.cause })
97
+ };
98
+ return;
99
+ }
100
+ if (resultSeen) {
101
+ yield { kind: 'error', error: museFailure('invalid-transport-record', { details: { problem: 'record-after-result' } }) };
102
+ return;
103
+ }
104
+ if (record.value.type === 'text-delta') {
105
+ yield { kind: 'text-delta', delta: record.value.delta };
106
+ continue;
107
+ }
108
+ const final = record.value;
109
+ const result = {
110
+ id: `${context.providerId}.${final.sessionId}.${final.turnId}`,
111
+ timestamp: new Date(),
112
+ content: final.content,
113
+ toolCalls: final.toolExecutions.map((tool) => ({
114
+ id: tool.id,
115
+ name: tool.name,
116
+ arguments: tool.arguments,
117
+ result: tool.result
118
+ })),
119
+ metadata: {
120
+ modelVersion: context.wireModelId,
121
+ finishReason: 'stop',
122
+ providerManagedToolLoop: true,
123
+ executedToolCount: final.toolExecutions.length,
124
+ executedTools: final.toolExecutions
125
+ }
126
+ };
127
+ yield textResultEvent(request, result);
128
+ // The stream is read to its end, so the transport finishes (and stops the turn) in the normal flow.
129
+ resultSeen = true;
130
+ }
131
+ // The session ended without its result record: never an empty success.
132
+ if (!resultSeen)
133
+ yield { kind: 'error', error: museFailure('muse-no-result') };
134
+ }
135
+ }
136
+ function parseRecord(text) {
137
+ const decoded = attempt(() => JSON.parse(text));
138
+ if (decoded.failed)
139
+ return { ok: false, problem: 'not-json', cause: decoded.cause };
140
+ const parsed = MuseServerRecordSchema.safeParse(decoded.value);
141
+ return parsed.success ? { ok: true, value: parsed.data } : { ok: false, problem: 'unrecognized-record' };
142
+ }
143
+ function resolveMuseModel(wireModelId) {
144
+ if (!wireModelId)
145
+ return 'muse-spark-1.3';
146
+ const stripped = wireModelId.replace(/^meta[:/]/, '').replace(/^meta-/, '');
147
+ if (stripped === 'muse-spark-1-3' || stripped === 'muse-spark-1.3')
148
+ return 'muse-spark-1.3';
149
+ if (stripped === 'muse-spark-1-2' || stripped === 'muse-spark-1.2')
150
+ return 'muse-spark-1.2';
151
+ if (stripped === 'muse-spark-1-1' || stripped === 'muse-spark-1.1')
152
+ return 'muse-spark-1.1';
153
+ return stripped;
154
+ }
155
+ /**
156
+ * Muse always reasons and has three efforts: `none` is clamped up to `low`, the
157
+ * two highest tiers down to `high`. A value that is not a declared effort is
158
+ * refused, never guessed.
159
+ */
160
+ function toMuseEffort(effort) {
161
+ switch (effort) {
162
+ case undefined:
163
+ case 'medium':
164
+ return 'medium';
165
+ case 'none':
166
+ case 'low':
167
+ return 'low';
168
+ case 'high':
169
+ case 'xhigh':
170
+ case 'max':
171
+ return 'high';
172
+ }
173
+ }
174
+ function encodeTurnInput(messages, jsonSchema) {
175
+ const encoded = messages
176
+ .map((message) => {
177
+ const rolePrefix = message.role === 'user' ? '' : message.role === 'system' ? '[Instruction]\n' : '';
178
+ return `${rolePrefix}${message.content}`.trim();
179
+ })
180
+ .filter(Boolean)
181
+ .join('\n\n');
182
+ const serialized = attempt(() => jsonSchema ? JSON.stringify(jsonSchema) : undefined);
183
+ if (serialized.failed)
184
+ throw museFailure('invalid-request', { details: { stage: 'jsonSchema' }, cause: serialized.cause });
185
+ const schemaText = serialized.value;
186
+ const text = schemaText && !encoded.includes(schemaText)
187
+ ? `${encoded}\n\n<output_schema>\nReturn only a JSON value matching this JSON Schema (no markdown fences or surrounding prose):\n${schemaText}\n</output_schema>`
188
+ : encoded;
189
+ return [{ type: 'text', text: text || 'Continue' }];
190
+ }
191
+ export default new MuseServerSpec();
192
+ //# sourceMappingURL=muse-server.spec.impl.js.map