@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.
- package/LICENSE +126 -0
- package/README.md +38 -2
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-1.json +18 -0
- package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-2-contributor.json +18 -0
- package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-2.json +18 -0
- package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-3-contributor.json +18 -0
- package/dist/ai/metadata/provider-models/meta/meta-muse-spark-1-3.json +18 -0
- package/dist/ai/metadata/providers/meta.json +8 -0
- package/dist/ai/muse-client.consumer.d.ts +10 -0
- package/dist/ai/muse-client.consumer.d.ts.map +1 -0
- package/dist/ai/muse-client.consumer.js +31 -0
- package/dist/ai/muse-client.consumer.js.map +1 -0
- package/dist/ai/provider.cloud.plugin.d.ts +6 -0
- package/dist/ai/provider.cloud.plugin.d.ts.map +1 -0
- package/dist/ai/provider.cloud.plugin.js +110 -0
- package/dist/ai/provider.cloud.plugin.js.map +1 -0
- package/dist/ai/provider.consumer.plugin.d.ts +3 -0
- package/dist/ai/provider.consumer.plugin.d.ts.map +1 -0
- package/dist/ai/provider.consumer.plugin.js +23 -0
- package/dist/ai/provider.consumer.plugin.js.map +1 -0
- package/dist/ai/provider.plugin.d.ts +6 -0
- package/dist/ai/provider.plugin.d.ts.map +1 -0
- package/dist/ai/provider.plugin.js +17 -0
- package/dist/ai/provider.plugin.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.d.ts +4194 -0
- package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.js +13 -0
- package/dist/ai/providers/cloud/frontier/meta/config/config.meta.descriptor.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.d.ts +39 -0
- package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.js +34 -0
- package/dist/ai/providers/cloud/frontier/meta/config/schemas/index.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/index.d.ts +5 -0
- package/dist/ai/providers/cloud/frontier/meta/index.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/index.js +4 -0
- package/dist/ai/providers/cloud/frontier/meta/index.js.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.d.ts +183 -0
- package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.js +97 -0
- package/dist/ai/providers/cloud/frontier/meta/provider.meta.descriptor.js.map +1 -0
- package/dist/ai/providers/meta/detection/system.d.ts +8 -0
- package/dist/ai/providers/meta/detection/system.d.ts.map +1 -0
- package/dist/ai/providers/meta/detection/system.js +16 -0
- package/dist/ai/providers/meta/detection/system.js.map +1 -0
- package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.d.ts +4 -0
- package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.js +20 -0
- package/dist/ai/providers/meta/docs/ai.providers.meta.docs.descriptor.js.map +1 -0
- package/dist/ai/providers/meta/index.d.ts +7 -0
- package/dist/ai/providers/meta/index.d.ts.map +1 -0
- package/dist/ai/providers/meta/index.js +6 -0
- package/dist/ai/providers/meta/index.js.map +1 -0
- package/dist/ai/providers/meta/meta-known-models.d.ts +3 -0
- package/dist/ai/providers/meta/meta-known-models.d.ts.map +1 -0
- package/dist/ai/providers/meta/meta-known-models.js +2 -0
- package/dist/ai/providers/meta/meta-known-models.js.map +1 -0
- package/dist/ai/providers/meta/meta.provider.impl.d.ts +42 -0
- package/dist/ai/providers/meta/meta.provider.impl.d.ts.map +1 -0
- package/dist/ai/providers/meta/meta.provider.impl.js +269 -0
- package/dist/ai/providers/meta/meta.provider.impl.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/client.d.ts +66 -0
- package/dist/ai/providers/meta/muse-server/client.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/client.js +209 -0
- package/dist/ai/providers/meta/muse-server/client.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/connection.d.ts +77 -0
- package/dist/ai/providers/meta/muse-server/connection.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/connection.js +174 -0
- package/dist/ai/providers/meta/muse-server/connection.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/failure-chunk.d.ts +10 -0
- package/dist/ai/providers/meta/muse-server/failure-chunk.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/failure-chunk.js +33 -0
- package/dist/ai/providers/meta/muse-server/failure-chunk.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/index.d.ts +9 -0
- package/dist/ai/providers/meta/muse-server/index.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/index.js +9 -0
- package/dist/ai/providers/meta/muse-server/index.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-failure.d.ts +189 -0
- package/dist/ai/providers/meta/muse-server/muse-failure.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-failure.js +226 -0
- package/dist/ai/providers/meta/muse-server/muse-failure.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-messages.d.ts +19 -0
- package/dist/ai/providers/meta/muse-server/muse-messages.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-messages.js +83 -0
- package/dist/ai/providers/meta/muse-server/muse-messages.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.d.ts +25 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.js +21 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.descriptor.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.d.ts +33 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.js +192 -0
- package/dist/ai/providers/meta/muse-server/muse-server.spec.impl.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.d.ts +13 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.js +11 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.descriptor.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.d.ts +41 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.js +103 -0
- package/dist/ai/providers/meta/muse-server/muse-server.transport.impl.consumer.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/protocol.d.ts +138 -0
- package/dist/ai/providers/meta/muse-server/protocol.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/protocol.js +106 -0
- package/dist/ai/providers/meta/muse-server/protocol.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/runtime-execution.d.ts +14 -0
- package/dist/ai/providers/meta/muse-server/runtime-execution.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/runtime-execution.js +39 -0
- package/dist/ai/providers/meta/muse-server/runtime-execution.js.map +1 -0
- package/dist/ai/providers/meta/muse-server/session.d.ts +19 -0
- package/dist/ai/providers/meta/muse-server/session.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-server/session.js +341 -0
- package/dist/ai/providers/meta/muse-server/session.js.map +1 -0
- package/dist/ai/providers/meta/muse-subscription.d.ts +38 -0
- package/dist/ai/providers/meta/muse-subscription.d.ts.map +1 -0
- package/dist/ai/providers/meta/muse-subscription.js +77 -0
- package/dist/ai/providers/meta/muse-subscription.js.map +1 -0
- package/dist/ai/providers/meta/recommendations.d.ts +26 -0
- package/dist/ai/providers/meta/recommendations.d.ts.map +1 -0
- package/dist/ai/providers/meta/recommendations.js +24 -0
- package/dist/ai/providers/meta/recommendations.js.map +1 -0
- package/dist/ai/providers/meta/schemas/index.d.ts +12 -0
- package/dist/ai/providers/meta/schemas/index.d.ts.map +1 -0
- package/dist/ai/providers/meta/schemas/index.js +8 -0
- package/dist/ai/providers/meta/schemas/index.js.map +1 -0
- package/dist/external/external.plugin.d.ts +3 -0
- package/dist/external/external.plugin.d.ts.map +1 -0
- package/dist/external/external.plugin.js +18 -0
- package/dist/external/external.plugin.js.map +1 -0
- package/dist/external/index.d.ts +2 -0
- package/dist/external/index.d.ts.map +1 -0
- package/dist/external/index.js +2 -0
- package/dist/external/index.js.map +1 -0
- package/dist/external/muse/index.d.ts +162 -0
- package/dist/external/muse/index.d.ts.map +1 -0
- package/dist/external/muse/index.js +7 -0
- package/dist/external/muse/index.js.map +1 -0
- package/dist/external/muse/manifest.d.ts +7 -0
- package/dist/external/muse/manifest.d.ts.map +1 -0
- package/dist/external/muse/manifest.js +25 -0
- package/dist/external/muse/manifest.js.map +1 -0
- package/dist/external/muse-subscription.operation.descriptors.d.ts +29 -0
- package/dist/external/muse-subscription.operation.descriptors.d.ts.map +1 -0
- package/dist/external/muse-subscription.operation.descriptors.js +12 -0
- package/dist/external/muse-subscription.operation.descriptors.js.map +1 -0
- package/dist/external/muse-subscription.operations.d.ts +3 -0
- package/dist/external/muse-subscription.operations.d.ts.map +1 -0
- package/dist/external/muse-subscription.operations.js +23 -0
- package/dist/external/muse-subscription.operations.js.map +1 -0
- package/dist/failure-outcome.d.ts +21 -0
- package/dist/failure-outcome.d.ts.map +1 -0
- package/dist/failure-outcome.js +22 -0
- package/dist/failure-outcome.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- 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
|