@maiaos/sdk 0.1.0-canary.2
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/README.md +177 -0
- package/dist/agent-permission/agent-permission.d.ts +9 -0
- package/dist/agent-permission/agent-permission.js +5 -0
- package/dist/agent-permission/effect.d.ts +4 -0
- package/dist/agent-permission/effect.js +34 -0
- package/dist/agent-permission/index.d.ts +2 -0
- package/dist/agent-permission/index.js +2 -0
- package/dist/approval/approval.d.ts +10 -0
- package/dist/approval/approval.js +5 -0
- package/dist/approval/effect.d.ts +5 -0
- package/dist/approval/effect.js +43 -0
- package/dist/approval/index.d.ts +2 -0
- package/dist/approval/index.js +2 -0
- package/dist/call/call.d.ts +26 -0
- package/dist/call/call.js +6 -0
- package/dist/call/effect.d.ts +5 -0
- package/dist/call/effect.js +46 -0
- package/dist/call/index.d.ts +2 -0
- package/dist/call/index.js +2 -0
- package/dist/client/effect.d.ts +8 -0
- package/dist/client/effect.js +283 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +2 -0
- package/dist/client/local-node-client.d.ts +100 -0
- package/dist/client/local-node-client.js +4 -0
- package/dist/connection/connection.d.ts +19 -0
- package/dist/connection/connection.js +5 -0
- package/dist/connection/effect.d.ts +5 -0
- package/dist/connection/effect.js +119 -0
- package/dist/connection/index.d.ts +2 -0
- package/dist/connection/index.js +2 -0
- package/dist/container/container.d.ts +14 -0
- package/dist/container/container.js +5 -0
- package/dist/container/effect.d.ts +4 -0
- package/dist/container/effect.js +90 -0
- package/dist/container/index.d.ts +2 -0
- package/dist/container/index.js +2 -0
- package/dist/discovery/discovery.d.ts +11 -0
- package/dist/discovery/discovery.js +5 -0
- package/dist/discovery/effect.d.ts +5 -0
- package/dist/discovery/effect.js +44 -0
- package/dist/discovery/index.d.ts +2 -0
- package/dist/discovery/index.js +2 -0
- package/dist/execution/effect.d.ts +4 -0
- package/dist/execution/effect.js +8 -0
- package/dist/execution/index.d.ts +2 -0
- package/dist/execution/index.js +2 -0
- package/dist/execution/relocation.d.ts +10 -0
- package/dist/execution/relocation.js +4 -0
- package/dist/feature-bindings/feature-bindings.d.ts +10 -0
- package/dist/feature-bindings/feature-bindings.js +2 -0
- package/dist/feature-bindings/index.d.ts +2 -0
- package/dist/feature-bindings/index.js +2 -0
- package/dist/hold/effect.d.ts +5 -0
- package/dist/hold/effect.js +61 -0
- package/dist/hold/hold.d.ts +12 -0
- package/dist/hold/hold.js +5 -0
- package/dist/hold/index.d.ts +2 -0
- package/dist/hold/index.js +2 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +21 -0
- package/dist/interaction/effect.d.ts +5 -0
- package/dist/interaction/effect.js +79 -0
- package/dist/interaction/index.d.ts +2 -0
- package/dist/interaction/index.js +2 -0
- package/dist/interaction/interaction.d.ts +12 -0
- package/dist/interaction/interaction.js +5 -0
- package/dist/node/attach.d.ts +11 -0
- package/dist/node/attach.js +33 -0
- package/dist/node/bridge-frame.d.ts +18 -0
- package/dist/node/bridge-frame.js +67 -0
- package/dist/node/bridge.d.ts +31 -0
- package/dist/node/bridge.js +148 -0
- package/dist/node/discovery.d.ts +187 -0
- package/dist/node/discovery.js +408 -0
- package/dist/node/effect.d.ts +9 -0
- package/dist/node/effect.js +9 -0
- package/dist/node/fetch.d.ts +2 -0
- package/dist/node/fetch.js +2 -0
- package/dist/node/http.d.ts +27 -0
- package/dist/node/http.js +258 -0
- package/dist/node/index.d.ts +3 -0
- package/dist/node/index.js +3 -0
- package/dist/node/local-node.d.ts +26 -0
- package/dist/node/local-node.js +67 -0
- package/dist/node/session.d.ts +15 -0
- package/dist/node/session.js +27 -0
- package/dist/node/ssh.d.ts +16 -0
- package/dist/node/ssh.js +74 -0
- package/dist/node/transport.d.ts +52 -0
- package/dist/node/transport.js +211 -0
- package/dist/node-changes/effect.d.ts +11 -0
- package/dist/node-changes/effect.js +61 -0
- package/dist/node-changes/index.d.ts +2 -0
- package/dist/node-changes/index.js +2 -0
- package/dist/node-changes/node-changes.d.ts +21 -0
- package/dist/node-changes/node-changes.js +23 -0
- package/dist/port-lease/effect.d.ts +5 -0
- package/dist/port-lease/effect.js +53 -0
- package/dist/port-lease/index.d.ts +2 -0
- package/dist/port-lease/index.js +2 -0
- package/dist/port-lease/port-lease.d.ts +11 -0
- package/dist/port-lease/port-lease.js +5 -0
- package/dist/presentation/client.d.ts +10 -0
- package/dist/presentation/client.js +4 -0
- package/dist/presentation/effect.d.ts +5 -0
- package/dist/presentation/effect.js +30 -0
- package/dist/presentation/index.d.ts +5 -0
- package/dist/presentation/index.js +3 -0
- package/dist/presentation/project-list.d.ts +7 -0
- package/dist/presentation/project-list.js +24 -0
- package/dist/presentation/session-list.d.ts +7 -0
- package/dist/presentation/session-list.js +32 -0
- package/dist/project-guard/effect.d.ts +5 -0
- package/dist/project-guard/effect.js +39 -0
- package/dist/project-guard/index.d.ts +2 -0
- package/dist/project-guard/index.js +2 -0
- package/dist/project-guard/project-guard.d.ts +10 -0
- package/dist/project-guard/project-guard.js +5 -0
- package/dist/project-workspace/effect.d.ts +5 -0
- package/dist/project-workspace/effect.js +124 -0
- package/dist/project-workspace/index.d.ts +2 -0
- package/dist/project-workspace/index.js +2 -0
- package/dist/project-workspace/project-workspace.d.ts +23 -0
- package/dist/project-workspace/project-workspace.js +4 -0
- package/dist/provider-pool/effect.d.ts +4 -0
- package/dist/provider-pool/effect.js +5 -0
- package/dist/provider-pool/index.d.ts +2 -0
- package/dist/provider-pool/index.js +2 -0
- package/dist/provider-pool/provider-pool.d.ts +7 -0
- package/dist/provider-pool/provider-pool.js +4 -0
- package/dist/remote-node/effect.d.ts +4 -0
- package/dist/remote-node/effect.js +57 -0
- package/dist/remote-node/index.d.ts +2 -0
- package/dist/remote-node/index.js +2 -0
- package/dist/remote-node/remote-node.d.ts +12 -0
- package/dist/remote-node/remote-node.js +5 -0
- package/dist/request/classify.d.ts +15 -0
- package/dist/request/classify.js +96 -0
- package/dist/request/client-error.d.ts +10 -0
- package/dist/request/client-error.js +11 -0
- package/dist/request/effect.d.ts +22 -0
- package/dist/request/effect.js +104 -0
- package/dist/request/envelope-schema.d.ts +2 -0
- package/dist/request/envelope-schema.js +2 -0
- package/dist/request/index.d.ts +5 -0
- package/dist/request/index.js +4 -0
- package/dist/request/maia-client.d.ts +21 -0
- package/dist/request/maia-client.js +9 -0
- package/dist/request/options.d.ts +9 -0
- package/dist/request/options.js +2 -0
- package/dist/run-ledger/effect.d.ts +5 -0
- package/dist/run-ledger/effect.js +72 -0
- package/dist/run-ledger/index.d.ts +2 -0
- package/dist/run-ledger/index.js +2 -0
- package/dist/run-ledger/run-ledger.d.ts +12 -0
- package/dist/run-ledger/run-ledger.js +2 -0
- package/dist/session/effect.d.ts +4 -0
- package/dist/session/effect.js +7 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.js +2 -0
- package/dist/session/mailbox.d.ts +9 -0
- package/dist/session/mailbox.js +4 -0
- package/dist/session-creation/effect.d.ts +25 -0
- package/dist/session-creation/effect.js +269 -0
- package/dist/session-creation/index.d.ts +3 -0
- package/dist/session-creation/index.js +3 -0
- package/dist/session-creation/session-creation.d.ts +18 -0
- package/dist/session-creation/session-creation.js +24 -0
- package/dist/session-creation/tasks.d.ts +69 -0
- package/dist/session-creation/tasks.js +37 -0
- package/dist/session-view/index.d.ts +2 -0
- package/dist/session-view/index.js +2 -0
- package/dist/session-view/view.d.ts +42 -0
- package/dist/session-view/view.js +137 -0
- package/dist/stream/effect.d.ts +29 -0
- package/dist/stream/effect.js +77 -0
- package/dist/stream/index.d.ts +2 -0
- package/dist/stream/index.js +2 -0
- package/dist/stream/stream.d.ts +9 -0
- package/dist/stream/stream.js +2 -0
- package/dist/voice/effect.d.ts +7 -0
- package/dist/voice/effect.js +71 -0
- package/dist/voice/index.d.ts +4 -0
- package/dist/voice/index.js +3 -0
- package/dist/voice/managed-turn.d.ts +9 -0
- package/dist/voice/managed-turn.js +4 -0
- package/dist/voice/orchestrator-contract.d.ts +5 -0
- package/dist/voice/orchestrator-contract.js +4 -0
- package/dist/voice/orchestrator.d.ts +25 -0
- package/dist/voice/orchestrator.js +169 -0
- package/dist/voice/pi-relay-contract.d.ts +4 -0
- package/dist/voice/pi-relay-contract.js +2 -0
- package/dist/voice/pi-relay.d.ts +12 -0
- package/dist/voice/pi-relay.js +9 -0
- package/dist/voice/wire-schema.d.ts +215 -0
- package/dist/voice/wire-schema.js +16 -0
- package/package.json +84 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProjectGuardConfirmParameters, ProjectGuardConfirmResult, ProjectGuardPreviewParameters, ProjectGuardPreviewResult, ProjectGuardShowParameters, ProjectGuardShowResult } from "@maiaos/protocol";
|
|
2
|
+
import type { LocalNodeRequester, LocalNodeRequestOptions } from "../request/index.js";
|
|
3
|
+
export type ProjectGuardClient = {
|
|
4
|
+
readonly confirmProjectGuard: (parameters: ProjectGuardConfirmParameters, options: LocalNodeRequestOptions) => Promise<ProjectGuardConfirmResult>;
|
|
5
|
+
readonly previewProjectGuard: (parameters: ProjectGuardPreviewParameters, options: LocalNodeRequestOptions) => Promise<ProjectGuardPreviewResult>;
|
|
6
|
+
readonly showProjectGuard: (parameters: ProjectGuardShowParameters, options: LocalNodeRequestOptions) => Promise<ProjectGuardShowResult>;
|
|
7
|
+
};
|
|
8
|
+
export declare const makeProjectGuardClient: (request: LocalNodeRequester) => ProjectGuardClient;
|
|
9
|
+
export { DEFAULT_SESSION_GUARD_LIMITS, type ProjectGuard, type ProjectGuardConfirmParameters, projectGuardConfirmParametersSchema, type ProjectGuardConfirmResult, projectGuardConfirmResultSchema, type ProjectGuardPreviewParameters, projectGuardPreviewParametersSchema, type ProjectGuardPreviewResult, projectGuardPreviewResultSchema, type ProjectGuardShowParameters, projectGuardShowParametersSchema, type ProjectGuardShowResult, projectGuardShowResultSchema, SESSION_GUARD_BOUNDS, SESSION_GUARD_ERROR_CODES, SESSION_ROLE_DENIED_ERROR_CODE, type SessionGuardLimits, type SessionRole, } from "@maiaos/protocol";
|
|
10
|
+
//# sourceMappingURL=project-guard.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { fromPromiseRequester, toPromiseClient } from "../request/effect.js";
|
|
2
|
+
import { makeProjectGuardOperations } from "./effect.js";
|
|
3
|
+
export const makeProjectGuardClient = (request) => toPromiseClient(makeProjectGuardOperations(fromPromiseRequester(request)));
|
|
4
|
+
export { DEFAULT_SESSION_GUARD_LIMITS, projectGuardConfirmParametersSchema, projectGuardConfirmResultSchema, projectGuardPreviewParametersSchema, projectGuardPreviewResultSchema, projectGuardShowParametersSchema, projectGuardShowResultSchema, SESSION_GUARD_BOUNDS, SESSION_GUARD_ERROR_CODES, SESSION_ROLE_DENIED_ERROR_CODE, } from "@maiaos/protocol";
|
|
5
|
+
//# sourceMappingURL=project-guard.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type EffectClient, type LocalNodeEffectRequester } from "../request/effect.js";
|
|
2
|
+
import type { MaiaClientError } from "../request/index.js";
|
|
3
|
+
import type { InvalidProjectWorkspaceResponse, ProjectWorkspaceClient } from "./project-workspace.js";
|
|
4
|
+
export declare const makeProjectWorkspaceOperations: <TError>(request: LocalNodeEffectRequester<TError>, invalidResponse: InvalidProjectWorkspaceResponse) => EffectClient<ProjectWorkspaceClient, MaiaClientError | TError>;
|
|
5
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { projectContextListResultSchema, projectContextRecordResultSchema, projectContextShowResultSchema, projectCreateConfirmResultSchema, projectCreatePreviewResultSchema, projectListResultSchema, projectRegisterResultSchema, projectRenameConfirmResultSchema, projectRenamePreviewResultSchema, projectShowResultSchema, workspaceContextShowResultSchema, workspaceListResultSchema, workspaceMembershipAttachResultSchema, workspaceRepositoryAttachResultSchema, workspaceSelectResultSchema, workspaceShowResultSchema, } from "@maiaos/protocol";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { failInvalidResponse, verifiedMutation, } from "../request/effect.js";
|
|
4
|
+
const matchedResult = (context, result, matches) => matches
|
|
5
|
+
? Effect.succeed(result)
|
|
6
|
+
: failInvalidResponse(context.invalidResponse);
|
|
7
|
+
const requestWorkspaceMembershipAttach = (context, parameters, options) => context
|
|
8
|
+
.request({ method: "workspace.membership.attach", parameters }, workspaceMembershipAttachResultSchema, options)
|
|
9
|
+
.pipe(Effect.flatMap((result) => matchedResult(context, result, result.receipt.commandId === parameters.commandId &&
|
|
10
|
+
result.workspace.id === parameters.workspaceId &&
|
|
11
|
+
result.membership.workspaceId === parameters.workspaceId &&
|
|
12
|
+
result.membership.projectId === parameters.projectId &&
|
|
13
|
+
result.membership.repositoryId === parameters.repositoryId)));
|
|
14
|
+
const requestWorkspaceSelect = (context, parameters, options) => context
|
|
15
|
+
.request({ method: "workspace.select", parameters }, workspaceSelectResultSchema, options)
|
|
16
|
+
.pipe(Effect.flatMap((result) => matchedResult(context, result, result.receipt.commandId === parameters.commandId &&
|
|
17
|
+
result.workspace.id === parameters.workspaceId &&
|
|
18
|
+
result.context.systemPromptInput.focus.projectId ===
|
|
19
|
+
parameters.projectId &&
|
|
20
|
+
result.context.systemPromptInput.focus.repositoryId ===
|
|
21
|
+
parameters.repositoryId)));
|
|
22
|
+
const requestProjectContextRecord = (context, parameters, options) => context
|
|
23
|
+
.request({ method: "project.context.record", parameters }, projectContextRecordResultSchema, options)
|
|
24
|
+
.pipe(Effect.flatMap((result) => matchedResult(context, result, result.receipt.commandId === parameters.commandId &&
|
|
25
|
+
result.note.body === parameters.body &&
|
|
26
|
+
result.note.projectId === parameters.projectId &&
|
|
27
|
+
result.note.attribution === parameters.attribution)));
|
|
28
|
+
const makeProjectOperations = (context) => ({
|
|
29
|
+
listProjects: (parameters, options) => context.request({ method: "project.list", parameters }, projectListResultSchema, options),
|
|
30
|
+
registerProject: (parameters, options) => context.request({ method: "project.register", parameters }, projectRegisterResultSchema, options),
|
|
31
|
+
showProject: (parameters, options) => context.request({ method: "project.show", parameters }, projectShowResultSchema, options),
|
|
32
|
+
});
|
|
33
|
+
const makeProjectContextOperations = (context) => ({
|
|
34
|
+
listProjectContext: (parameters, options) => context.request({ method: "project.context.list", parameters }, projectContextListResultSchema, options),
|
|
35
|
+
recordProjectContext: (parameters, options) => requestProjectContextRecord(context, parameters, options),
|
|
36
|
+
showProjectContext: (parameters, options) => context.request({ method: "project.context.show", parameters }, projectContextShowResultSchema, options),
|
|
37
|
+
});
|
|
38
|
+
const makeWorkspaceReadOperations = (request) => ({
|
|
39
|
+
listWorkspaces: (parameters, options) => request({ method: "workspace.list", parameters }, workspaceListResultSchema, options),
|
|
40
|
+
showWorkspace: (parameters, options) => request({ method: "workspace.show", parameters }, workspaceShowResultSchema, options),
|
|
41
|
+
showWorkspaceContext: (parameters, options) => request({ method: "workspace.context.show", parameters }, workspaceContextShowResultSchema, options),
|
|
42
|
+
});
|
|
43
|
+
const makeWorkspaceMutationOperations = (context) => ({
|
|
44
|
+
attachWorkspaceMembership: (parameters, options) => requestWorkspaceMembershipAttach(context, parameters, options),
|
|
45
|
+
attachWorkspaceRepository: (parameters, options) => context.request({ method: "workspace.repository.attach", parameters }, workspaceRepositoryAttachResultSchema, options),
|
|
46
|
+
selectWorkspace: (parameters, options) => requestWorkspaceSelect(context, parameters, options),
|
|
47
|
+
});
|
|
48
|
+
const makeProjectCreatePreview = (context) => ({
|
|
49
|
+
previewProjectCreate: (parameters, options) => context.request({ method: "project.create.preview", parameters }, {
|
|
50
|
+
parse: (value) => {
|
|
51
|
+
const result = projectCreatePreviewResultSchema.parse(value);
|
|
52
|
+
return result.commandId === parameters.commandId &&
|
|
53
|
+
result.name === parameters.name.trim() &&
|
|
54
|
+
result.containerId === parameters.containerId &&
|
|
55
|
+
result.expectedContainerRevision ===
|
|
56
|
+
parameters.expectedContainerRevision
|
|
57
|
+
? result
|
|
58
|
+
: context.invalidResponse();
|
|
59
|
+
},
|
|
60
|
+
}, options),
|
|
61
|
+
});
|
|
62
|
+
const makeProjectRenamePreview = (context) => ({
|
|
63
|
+
previewProjectRename: (parameters, options) => context.request({ method: "project.rename.preview", parameters }, {
|
|
64
|
+
parse: (value) => {
|
|
65
|
+
const result = projectRenamePreviewResultSchema.parse(value);
|
|
66
|
+
return result.commandId === parameters.commandId &&
|
|
67
|
+
result.name === parameters.name.trim() &&
|
|
68
|
+
result.containerId === parameters.containerId &&
|
|
69
|
+
result.projectId === parameters.projectId &&
|
|
70
|
+
result.expectedRevision === parameters.expectedRevision
|
|
71
|
+
? result
|
|
72
|
+
: context.invalidResponse();
|
|
73
|
+
},
|
|
74
|
+
}, options),
|
|
75
|
+
});
|
|
76
|
+
const makeProjectCreateConfirmation = (context) => ({
|
|
77
|
+
confirmProjectCreate: (parameters, options) => context.request({ method: "project.create.confirm", parameters }, {
|
|
78
|
+
parse: (value) => {
|
|
79
|
+
const result = projectCreateConfirmResultSchema.parse(value);
|
|
80
|
+
return result.commandId === parameters.commandId &&
|
|
81
|
+
result.project.name === parameters.name.trim() &&
|
|
82
|
+
result.inputDigest === parameters.inputDigest &&
|
|
83
|
+
result.containerId === parameters.containerId &&
|
|
84
|
+
result.expectedContainerRevision ===
|
|
85
|
+
parameters.expectedContainerRevision
|
|
86
|
+
? result
|
|
87
|
+
: context.invalidResponse();
|
|
88
|
+
},
|
|
89
|
+
}, options),
|
|
90
|
+
});
|
|
91
|
+
const makeProjectRenameConfirmation = (context) => ({
|
|
92
|
+
confirmProjectRename: (parameters, options) => context.request({ method: "project.rename.confirm", parameters }, {
|
|
93
|
+
parse: (value) => {
|
|
94
|
+
const result = projectRenameConfirmResultSchema.parse(value);
|
|
95
|
+
return result.commandId === parameters.commandId &&
|
|
96
|
+
result.project.name === parameters.name.trim() &&
|
|
97
|
+
result.inputDigest === parameters.inputDigest &&
|
|
98
|
+
result.containerId === parameters.containerId &&
|
|
99
|
+
result.project.id === parameters.projectId &&
|
|
100
|
+
result.expectedRevision === parameters.expectedRevision
|
|
101
|
+
? result
|
|
102
|
+
: context.invalidResponse();
|
|
103
|
+
},
|
|
104
|
+
}, options),
|
|
105
|
+
});
|
|
106
|
+
const confirmationContextOf = (context) => ({
|
|
107
|
+
invalidResponse: context.invalidResponse,
|
|
108
|
+
request: (payload, output, options) => verifiedMutation(context.request(payload, output, options), options),
|
|
109
|
+
});
|
|
110
|
+
export const makeProjectWorkspaceOperations = (request, invalidResponse) => {
|
|
111
|
+
const context = { invalidResponse, request };
|
|
112
|
+
const confirmationContext = confirmationContextOf(context);
|
|
113
|
+
return {
|
|
114
|
+
...makeProjectCreatePreview(context),
|
|
115
|
+
...makeProjectRenamePreview(context),
|
|
116
|
+
...makeProjectCreateConfirmation(confirmationContext),
|
|
117
|
+
...makeProjectRenameConfirmation(confirmationContext),
|
|
118
|
+
...makeProjectOperations(context),
|
|
119
|
+
...makeProjectContextOperations(context),
|
|
120
|
+
...makeWorkspaceReadOperations(request),
|
|
121
|
+
...makeWorkspaceMutationOperations(context),
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ProjectContextListParameters, ProjectContextListResult, ProjectContextRecordParameters, ProjectContextRecordResult, ProjectContextShowParameters, ProjectContextShowResult, ProjectCreateConfirmParameters, ProjectCreateConfirmResult, ProjectCreatePreviewParameters, ProjectCreatePreviewResult, ProjectListParameters, ProjectListResult, ProjectRegisterParameters, ProjectRegisterResult, ProjectRenameConfirmParameters, ProjectRenameConfirmResult, ProjectRenamePreviewParameters, ProjectRenamePreviewResult, ProjectShowParameters, ProjectShowResult, WorkspaceContextShowParameters, WorkspaceContextShowResult, WorkspaceListParameters, WorkspaceListResult, WorkspaceMembershipAttachParameters, WorkspaceMembershipAttachResult, WorkspaceRepositoryAttachParameters, WorkspaceRepositoryAttachResult, WorkspaceSelectParameters, WorkspaceSelectResult, WorkspaceShowParameters, WorkspaceShowResult } from "@maiaos/protocol";
|
|
2
|
+
import type { LocalNodeRequester, LocalNodeRequestOptions } from "../request/index.js";
|
|
3
|
+
export type ProjectWorkspaceClient = {
|
|
4
|
+
readonly attachWorkspaceMembership: (parameters: WorkspaceMembershipAttachParameters, options: LocalNodeRequestOptions) => Promise<WorkspaceMembershipAttachResult>;
|
|
5
|
+
readonly attachWorkspaceRepository: (parameters: WorkspaceRepositoryAttachParameters, options: LocalNodeRequestOptions) => Promise<WorkspaceRepositoryAttachResult>;
|
|
6
|
+
readonly confirmProjectCreate: (parameters: ProjectCreateConfirmParameters, options: LocalNodeRequestOptions) => Promise<ProjectCreateConfirmResult>;
|
|
7
|
+
readonly confirmProjectRename: (parameters: ProjectRenameConfirmParameters, options: LocalNodeRequestOptions) => Promise<ProjectRenameConfirmResult>;
|
|
8
|
+
readonly listProjectContext: (parameters: ProjectContextListParameters, options: LocalNodeRequestOptions) => Promise<ProjectContextListResult>;
|
|
9
|
+
readonly listProjects: (parameters: ProjectListParameters, options: LocalNodeRequestOptions) => Promise<ProjectListResult>;
|
|
10
|
+
readonly listWorkspaces: (parameters: WorkspaceListParameters, options: LocalNodeRequestOptions) => Promise<WorkspaceListResult>;
|
|
11
|
+
readonly previewProjectCreate: (parameters: ProjectCreatePreviewParameters, options: LocalNodeRequestOptions) => Promise<ProjectCreatePreviewResult>;
|
|
12
|
+
readonly previewProjectRename: (parameters: ProjectRenamePreviewParameters, options: LocalNodeRequestOptions) => Promise<ProjectRenamePreviewResult>;
|
|
13
|
+
readonly recordProjectContext: (parameters: ProjectContextRecordParameters, options: LocalNodeRequestOptions) => Promise<ProjectContextRecordResult>;
|
|
14
|
+
readonly registerProject: (parameters: ProjectRegisterParameters, options: LocalNodeRequestOptions) => Promise<ProjectRegisterResult>;
|
|
15
|
+
readonly selectWorkspace: (parameters: WorkspaceSelectParameters, options: LocalNodeRequestOptions) => Promise<WorkspaceSelectResult>;
|
|
16
|
+
readonly showProject: (parameters: ProjectShowParameters, options: LocalNodeRequestOptions) => Promise<ProjectShowResult>;
|
|
17
|
+
readonly showProjectContext: (parameters: ProjectContextShowParameters, options: LocalNodeRequestOptions) => Promise<ProjectContextShowResult>;
|
|
18
|
+
readonly showWorkspace: (parameters: WorkspaceShowParameters, options: LocalNodeRequestOptions) => Promise<WorkspaceShowResult>;
|
|
19
|
+
readonly showWorkspaceContext: (parameters: WorkspaceContextShowParameters, options: LocalNodeRequestOptions) => Promise<WorkspaceContextShowResult>;
|
|
20
|
+
};
|
|
21
|
+
export type InvalidProjectWorkspaceResponse = () => never;
|
|
22
|
+
export declare const makeProjectWorkspaceClient: (request: LocalNodeRequester, invalidResponse: InvalidProjectWorkspaceResponse) => ProjectWorkspaceClient;
|
|
23
|
+
//# sourceMappingURL=project-workspace.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { fromPromiseRequester, toPromiseClient } from "../request/effect.js";
|
|
2
|
+
import { makeProjectWorkspaceOperations } from "./effect.js";
|
|
3
|
+
export const makeProjectWorkspaceClient = (request, invalidResponse) => toPromiseClient(makeProjectWorkspaceOperations(fromPromiseRequester(request), invalidResponse));
|
|
4
|
+
//# sourceMappingURL=project-workspace.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EffectClient, LocalNodeEffectRequester } from "../request/effect.js";
|
|
2
|
+
import type { ProviderPoolClient } from "./provider-pool.js";
|
|
3
|
+
export declare const makeProviderPoolOperations: <TError>(request: LocalNodeEffectRequester<TError>) => EffectClient<ProviderPoolClient, TError>;
|
|
4
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { providerPoolListResultSchema } from "@maiaos/protocol";
|
|
2
|
+
export const makeProviderPoolOperations = (request) => ({
|
|
3
|
+
listProviderPools: (parameters, options) => request({ method: "provider.pool.list", parameters }, providerPoolListResultSchema, options),
|
|
4
|
+
});
|
|
5
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProviderPoolListParameters, ProviderPoolListResult } from "@maiaos/protocol";
|
|
2
|
+
import type { LocalNodeRequester, LocalNodeRequestOptions } from "../request/index.js";
|
|
3
|
+
export type ProviderPoolClient = {
|
|
4
|
+
readonly listProviderPools: (parameters: ProviderPoolListParameters, options: LocalNodeRequestOptions) => Promise<ProviderPoolListResult>;
|
|
5
|
+
};
|
|
6
|
+
export declare const makeProviderPoolClient: (request: LocalNodeRequester) => ProviderPoolClient;
|
|
7
|
+
//# sourceMappingURL=provider-pool.d.ts.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { fromPromiseRequester, toPromiseClient } from "../request/effect.js";
|
|
2
|
+
import { makeProviderPoolOperations } from "./effect.js";
|
|
3
|
+
export const makeProviderPoolClient = (request) => toPromiseClient(makeProviderPoolOperations(fromPromiseRequester(request)));
|
|
4
|
+
//# sourceMappingURL=provider-pool.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { EffectClient, LocalNodeEffectRequester } from "../request/effect.js";
|
|
2
|
+
import type { RemoteNodeClient } from "./remote-node.js";
|
|
3
|
+
export declare const makeRemoteNodeOperations: <TError>(request: LocalNodeEffectRequester<TError>) => EffectClient<RemoteNodeClient, TError>;
|
|
4
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { remoteNodeInstallConfirmResultSchema, remoteNodeInstallPreviewResultSchema, remoteNodeListResultSchema, remoteNodeRemoveConfirmResultSchema, remoteNodeRemovePreviewResultSchema, } from "@maiaos/protocol";
|
|
2
|
+
import { MaiaClientError } from "../request/index.js";
|
|
3
|
+
const requireMatch = (matches) => {
|
|
4
|
+
if (!matches)
|
|
5
|
+
throw new MaiaClientError("invalid_response", "The remote Node response did not match the request.");
|
|
6
|
+
};
|
|
7
|
+
const parsePreview = (value, parameters) => {
|
|
8
|
+
const result = remoteNodeInstallPreviewResultSchema.parse(value);
|
|
9
|
+
requireMatch(result.commandId === parameters.commandId &&
|
|
10
|
+
(result.state !== "ready" ||
|
|
11
|
+
(result.name === parameters.name &&
|
|
12
|
+
result.plan.profile === parameters.profile &&
|
|
13
|
+
result.plan.keep === parameters.keep)));
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
const nodeMatches = (node, parameters) => node.name === parameters.name;
|
|
17
|
+
const parseInstallConfirmation = (value, parameters) => {
|
|
18
|
+
const result = remoteNodeInstallConfirmResultSchema.parse(value);
|
|
19
|
+
requireMatch(result.commandId === parameters.commandId &&
|
|
20
|
+
result.inputDigest === parameters.inputDigest &&
|
|
21
|
+
nodeMatches(result.node, parameters) &&
|
|
22
|
+
result.node.host === parameters.host &&
|
|
23
|
+
result.node.profile === parameters.profile);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
const parseRemovePreview = (value, parameters) => {
|
|
27
|
+
const result = remoteNodeRemovePreviewResultSchema.parse(value);
|
|
28
|
+
requireMatch(result.commandId === parameters.commandId &&
|
|
29
|
+
result.name === parameters.name &&
|
|
30
|
+
result.purge === parameters.purge &&
|
|
31
|
+
result.expectedRevision === parameters.expectedRevision);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
const parseRemoveConfirmation = (value, parameters) => {
|
|
35
|
+
const result = remoteNodeRemoveConfirmResultSchema.parse(value);
|
|
36
|
+
requireMatch(result.commandId === parameters.commandId &&
|
|
37
|
+
result.inputDigest === parameters.inputDigest &&
|
|
38
|
+
nodeMatches(result.node, parameters));
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
const makeRemoteNodeReadOperations = (request) => ({
|
|
42
|
+
listRemoteNodes: (parameters, options) => request({ method: "node.remote.list", parameters }, remoteNodeListResultSchema, options),
|
|
43
|
+
});
|
|
44
|
+
const makeRemoteNodeInstallOperations = (request) => ({
|
|
45
|
+
confirmRemoteNodeInstall: (parameters, options) => request({ method: "node.remote.install.confirm", parameters }, { parse: (value) => parseInstallConfirmation(value, parameters) }, options),
|
|
46
|
+
previewRemoteNodeInstall: (parameters, options) => request({ method: "node.remote.install.preview", parameters }, { parse: (value) => parsePreview(value, parameters) }, options),
|
|
47
|
+
});
|
|
48
|
+
const makeRemoteNodeRemoveOperations = (request) => ({
|
|
49
|
+
confirmRemoteNodeRemove: (parameters, options) => request({ method: "node.remote.remove.confirm", parameters }, { parse: (value) => parseRemoveConfirmation(value, parameters) }, options),
|
|
50
|
+
previewRemoteNodeRemove: (parameters, options) => request({ method: "node.remote.remove.preview", parameters }, { parse: (value) => parseRemovePreview(value, parameters) }, options),
|
|
51
|
+
});
|
|
52
|
+
export const makeRemoteNodeOperations = (request) => ({
|
|
53
|
+
...makeRemoteNodeReadOperations(request),
|
|
54
|
+
...makeRemoteNodeInstallOperations(request),
|
|
55
|
+
...makeRemoteNodeRemoveOperations(request),
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { makeRemoteNodeClient, type RemoteNodeClient, type RemoteNodeExecutor, type RemoteNodeInstallConfirmParameters, remoteNodeInstallConfirmParametersSchema, type RemoteNodeInstallConfirmResult, type RemoteNodeInstallPlan, type RemoteNodeInstallPreviewParameters, remoteNodeInstallPreviewParametersSchema, type RemoteNodeInstallPreviewResult, type RemoteNodeListParameters, remoteNodeListParametersSchema, type RemoteNodeListResult, type RemoteNodeRecord, type RemoteNodeRemoveConfirmParameters, remoteNodeRemoveConfirmParametersSchema, type RemoteNodeRemoveConfirmResult, type RemoteNodeRemovePreviewParameters, remoteNodeRemovePreviewParametersSchema, type RemoteNodeRemovePreviewResult, } from "./remote-node.js";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { makeRemoteNodeClient, remoteNodeInstallConfirmParametersSchema, remoteNodeInstallPreviewParametersSchema, remoteNodeListParametersSchema, remoteNodeRemoveConfirmParametersSchema, remoteNodeRemovePreviewParametersSchema, } from "./remote-node.js";
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RemoteNodeInstallConfirmParameters, RemoteNodeInstallConfirmResult, RemoteNodeInstallPreviewParameters, RemoteNodeInstallPreviewResult, RemoteNodeListParameters, RemoteNodeListResult, RemoteNodeRemoveConfirmParameters, RemoteNodeRemoveConfirmResult, RemoteNodeRemovePreviewParameters, RemoteNodeRemovePreviewResult } from "@maiaos/protocol";
|
|
2
|
+
import type { LocalNodeRequester, LocalNodeRequestOptions } from "../request/index.js";
|
|
3
|
+
export type RemoteNodeClient = {
|
|
4
|
+
readonly confirmRemoteNodeInstall: (parameters: RemoteNodeInstallConfirmParameters, options: LocalNodeRequestOptions) => Promise<RemoteNodeInstallConfirmResult>;
|
|
5
|
+
readonly confirmRemoteNodeRemove: (parameters: RemoteNodeRemoveConfirmParameters, options: LocalNodeRequestOptions) => Promise<RemoteNodeRemoveConfirmResult>;
|
|
6
|
+
readonly listRemoteNodes: (parameters: RemoteNodeListParameters, options: LocalNodeRequestOptions) => Promise<RemoteNodeListResult>;
|
|
7
|
+
readonly previewRemoteNodeInstall: (parameters: RemoteNodeInstallPreviewParameters, options: LocalNodeRequestOptions) => Promise<RemoteNodeInstallPreviewResult>;
|
|
8
|
+
readonly previewRemoteNodeRemove: (parameters: RemoteNodeRemovePreviewParameters, options: LocalNodeRequestOptions) => Promise<RemoteNodeRemovePreviewResult>;
|
|
9
|
+
};
|
|
10
|
+
export declare const makeRemoteNodeClient: (request: LocalNodeRequester) => RemoteNodeClient;
|
|
11
|
+
export { type RemoteNodeExecutor, type RemoteNodeInstallConfirmParameters, remoteNodeInstallConfirmParametersSchema, type RemoteNodeInstallConfirmResult, type RemoteNodeInstallPlan, type RemoteNodeInstallPreviewParameters, remoteNodeInstallPreviewParametersSchema, type RemoteNodeInstallPreviewResult, type RemoteNodeListParameters, remoteNodeListParametersSchema, type RemoteNodeListResult, type RemoteNodeRecord, type RemoteNodeRemoveConfirmParameters, remoteNodeRemoveConfirmParametersSchema, type RemoteNodeRemoveConfirmResult, type RemoteNodeRemovePreviewParameters, remoteNodeRemovePreviewParametersSchema, type RemoteNodeRemovePreviewResult, } from "@maiaos/protocol";
|
|
12
|
+
//# sourceMappingURL=remote-node.d.ts.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { fromPromiseRequester, toPromiseClient } from "../request/effect.js";
|
|
2
|
+
import { makeRemoteNodeOperations } from "./effect.js";
|
|
3
|
+
export const makeRemoteNodeClient = (request) => toPromiseClient(makeRemoteNodeOperations(fromPromiseRequester(request)));
|
|
4
|
+
export { remoteNodeInstallConfirmParametersSchema, remoteNodeInstallPreviewParametersSchema, remoteNodeListParametersSchema, remoteNodeRemoveConfirmParametersSchema, remoteNodeRemovePreviewParametersSchema, } from "@maiaos/protocol";
|
|
5
|
+
//# sourceMappingURL=remote-node.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MaiaClientError } from "./client-error.js";
|
|
2
|
+
export type MaiaErrorKind = "cancelled" | "conflict" | "declined" | "denied" | "invalid" | "not_found" | "offline" | "outcome_unknown" | "refused" | "unavailable";
|
|
3
|
+
export type MaiaError = {
|
|
4
|
+
readonly _tag: "MaiaError";
|
|
5
|
+
readonly code?: string;
|
|
6
|
+
readonly kind: MaiaErrorKind;
|
|
7
|
+
readonly operationId?: string;
|
|
8
|
+
readonly retryable: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const platformStoppedBeforeDispatch: (error: MaiaClientError) => boolean;
|
|
11
|
+
export declare const classifyClientError: (error: unknown, options: {
|
|
12
|
+
readonly mutation: boolean;
|
|
13
|
+
readonly operationId?: string;
|
|
14
|
+
}) => MaiaError;
|
|
15
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { MaiaClientError } from "./client-error.js";
|
|
2
|
+
const CONFLICT_CODES = new Set([
|
|
3
|
+
"port_lease_conflict",
|
|
4
|
+
"revision_conflict",
|
|
5
|
+
"storage_conflict",
|
|
6
|
+
]);
|
|
7
|
+
const NOT_FOUND_CODES = new Set(["port_lease_not_found", "resource_not_found"]);
|
|
8
|
+
const DENIED_CODES = new Set([
|
|
9
|
+
"authentication_failed",
|
|
10
|
+
"authorization_failed",
|
|
11
|
+
"role_denied",
|
|
12
|
+
]);
|
|
13
|
+
const UNAVAILABLE_CODES = new Set([
|
|
14
|
+
"command_not_implemented",
|
|
15
|
+
"unsupported_method",
|
|
16
|
+
]);
|
|
17
|
+
const classified = (kind, retryable, code) => ({
|
|
18
|
+
...(code === undefined ? {} : { code }),
|
|
19
|
+
kind,
|
|
20
|
+
retryable,
|
|
21
|
+
});
|
|
22
|
+
const platformReason = (error) => {
|
|
23
|
+
const cause = error.cause;
|
|
24
|
+
return cause !== null && typeof cause === "object"
|
|
25
|
+
? Reflect.get(cause, "reason")
|
|
26
|
+
: undefined;
|
|
27
|
+
};
|
|
28
|
+
const fromPlatform = (reason) => {
|
|
29
|
+
if (reason === "cancelled_before_dispatch")
|
|
30
|
+
return classified("cancelled", true, reason);
|
|
31
|
+
if (reason === "deadline_before_dispatch")
|
|
32
|
+
return classified("offline", true, reason);
|
|
33
|
+
if (reason === "confirmation_declined")
|
|
34
|
+
return classified("declined", false, "confirmation_declined");
|
|
35
|
+
if (reason === "confirmation_unavailable")
|
|
36
|
+
return classified("refused", true, "confirmation_unavailable");
|
|
37
|
+
if (reason === "request_denied" || reason === "credential_invalid")
|
|
38
|
+
return classified("denied", false, reason);
|
|
39
|
+
return undefined;
|
|
40
|
+
};
|
|
41
|
+
export const platformStoppedBeforeDispatch = (error) => fromPlatform(platformReason(error)) !== undefined;
|
|
42
|
+
const fromRemote = (remote) => {
|
|
43
|
+
if (remote.code === "outcome_unknown")
|
|
44
|
+
return classified("outcome_unknown", true, remote.code);
|
|
45
|
+
if (DENIED_CODES.has(remote.code))
|
|
46
|
+
return classified("denied", false, remote.code);
|
|
47
|
+
if (CONFLICT_CODES.has(remote.code))
|
|
48
|
+
return classified("conflict", false, remote.code);
|
|
49
|
+
if (NOT_FOUND_CODES.has(remote.code))
|
|
50
|
+
return classified("not_found", false, remote.code);
|
|
51
|
+
if (UNAVAILABLE_CODES.has(remote.code))
|
|
52
|
+
return classified("unavailable", false, remote.code);
|
|
53
|
+
return classified("refused", remote.retryable, remote.code);
|
|
54
|
+
};
|
|
55
|
+
const unanswered = (code, mutation) => mutation
|
|
56
|
+
? classified("outcome_unknown", true, code)
|
|
57
|
+
: classified("offline", true, code);
|
|
58
|
+
const fromClient = (error, mutation) => {
|
|
59
|
+
switch (error.code) {
|
|
60
|
+
case "cancelled":
|
|
61
|
+
return classified("cancelled", true, error.code);
|
|
62
|
+
case "correlation_mismatch":
|
|
63
|
+
case "invalid_response":
|
|
64
|
+
return mutation
|
|
65
|
+
? classified("outcome_unknown", true, error.code)
|
|
66
|
+
: classified("invalid", false, error.code);
|
|
67
|
+
case "deadline_exceeded":
|
|
68
|
+
case "saturated":
|
|
69
|
+
return classified("offline", true, error.code);
|
|
70
|
+
case "invalid_request":
|
|
71
|
+
return classified("invalid", false, error.code);
|
|
72
|
+
case "outcome_unknown":
|
|
73
|
+
return classified("outcome_unknown", true, error.code);
|
|
74
|
+
case "remote_error":
|
|
75
|
+
case "transport_failure":
|
|
76
|
+
return unanswered(error.code, mutation);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const classify = (error, mutation) => {
|
|
80
|
+
if (!(error instanceof MaiaClientError))
|
|
81
|
+
return unanswered("transport_failure", mutation);
|
|
82
|
+
const platform = fromPlatform(platformReason(error));
|
|
83
|
+
if (platform !== undefined)
|
|
84
|
+
return platform;
|
|
85
|
+
return error.remoteError === undefined
|
|
86
|
+
? fromClient(error, mutation)
|
|
87
|
+
: fromRemote(error.remoteError);
|
|
88
|
+
};
|
|
89
|
+
export const classifyClientError = (error, options) => ({
|
|
90
|
+
_tag: "MaiaError",
|
|
91
|
+
...classify(error, options.mutation),
|
|
92
|
+
...(options.operationId === undefined
|
|
93
|
+
? {}
|
|
94
|
+
: { operationId: options.operationId }),
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LocalNodeOperationErrorCode, ProtocolError } from "@maiaos/protocol";
|
|
2
|
+
export type MaiaClientErrorCode = "cancelled" | "correlation_mismatch" | "invalid_request" | "invalid_response" | "remote_error" | "transport_failure" | LocalNodeOperationErrorCode;
|
|
3
|
+
export declare class MaiaClientError extends Error {
|
|
4
|
+
readonly code: MaiaClientErrorCode;
|
|
5
|
+
readonly remoteError?: ProtocolError;
|
|
6
|
+
constructor(code: MaiaClientErrorCode, message: string, options?: ErrorOptions & {
|
|
7
|
+
readonly remoteError?: ProtocolError;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=client-error.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class MaiaClientError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
remoteError;
|
|
4
|
+
constructor(code, message, options) {
|
|
5
|
+
super(message, options);
|
|
6
|
+
this.name = "MaiaClientError";
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.remoteError = options?.remoteError;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=client-error.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type LocalNodeRequestPayload, type ProtocolRequestEnvelope } from "@maiaos/protocol";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { MaiaClientError } from "./client-error.js";
|
|
4
|
+
import type { MaiaRequest, MaiaTransport, TransportRequestOptions } from "./maia-client.js";
|
|
5
|
+
import type { LocalNodeRequester, LocalNodeRequestOptions } from "./options.js";
|
|
6
|
+
export type MaiaEffectTransport = {
|
|
7
|
+
readonly request: (envelope: ProtocolRequestEnvelope<unknown>, options?: TransportRequestOptions) => Effect.Effect<unknown, MaiaClientError>;
|
|
8
|
+
};
|
|
9
|
+
export type LocalNodeEffectRequester<TError = MaiaClientError> = <TOutput>(payload: LocalNodeRequestPayload, outputSchema: {
|
|
10
|
+
readonly parse: (value: unknown) => TOutput;
|
|
11
|
+
}, options: LocalNodeRequestOptions) => Effect.Effect<TOutput, TError>;
|
|
12
|
+
export type EffectClient<TClient, TError = MaiaClientError> = {
|
|
13
|
+
readonly [TName in keyof TClient]: TClient[TName] extends (...arguments_: infer TArguments) => Promise<infer TResult> ? (...arguments_: TArguments) => Effect.Effect<TResult, TError> : never;
|
|
14
|
+
};
|
|
15
|
+
export declare const fromPromiseTransport: (transport: MaiaTransport) => MaiaEffectTransport;
|
|
16
|
+
export declare const executeMaiaRequest: <TInput, TOutput>(transport: MaiaEffectTransport, request: MaiaRequest<TInput, TOutput>) => Effect.Effect<TOutput, MaiaClientError>;
|
|
17
|
+
export declare const makeLocalNodeEffectRequester: (transport: MaiaEffectTransport, validatePayload?: boolean) => LocalNodeEffectRequester;
|
|
18
|
+
export declare const fromPromiseRequester: (request: LocalNodeRequester) => LocalNodeEffectRequester<unknown>;
|
|
19
|
+
export declare const verifiedMutation: <TResult, TError>(mutation: Effect.Effect<TResult, TError>, options: LocalNodeRequestOptions) => Effect.Effect<TResult, MaiaClientError | TError>;
|
|
20
|
+
export declare const failInvalidResponse: (reject: () => never) => Effect.Effect<never, MaiaClientError>;
|
|
21
|
+
export declare const toPromiseClient: <TClient>(client: EffectClient<TClient, unknown>) => TClient;
|
|
22
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { localNodeOperationErrorCodeSchema, MAIA_PROTOCOL_VERSION, protocolErrorEnvelopeSchema, protocolRequestEnvelopeSchema, protocolSuccessEnvelopeSchema, } from "@maiaos/protocol";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { platformStoppedBeforeDispatch } from "./classify.js";
|
|
4
|
+
import { MaiaClientError } from "./client-error.js";
|
|
5
|
+
import { localNodeRequestPayloadParser } from "./envelope-schema.js";
|
|
6
|
+
const transportRequestError = (error, signal) => {
|
|
7
|
+
if (error instanceof MaiaClientError)
|
|
8
|
+
return error;
|
|
9
|
+
const cancelled = signal?.aborted ?? false;
|
|
10
|
+
return new MaiaClientError(cancelled ? "cancelled" : "transport_failure", cancelled
|
|
11
|
+
? "The Maia request was cancelled."
|
|
12
|
+
: "The Maia transport request failed.", { cause: error });
|
|
13
|
+
};
|
|
14
|
+
export const fromPromiseTransport = (transport) => ({
|
|
15
|
+
request: (envelope, options) => Effect.tryPromise({
|
|
16
|
+
catch: (error) => transportRequestError(error, options?.signal),
|
|
17
|
+
try: () => transport.request(envelope, options),
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
20
|
+
const createRequestEnvelope = (request) => Effect.try({
|
|
21
|
+
catch: (error) => new MaiaClientError("invalid_request", "The Maia request failed runtime validation.", { cause: error }),
|
|
22
|
+
try: () => {
|
|
23
|
+
const envelope = {
|
|
24
|
+
kind: "request",
|
|
25
|
+
messageId: request.messageId,
|
|
26
|
+
payload: request.inputSchema.parse(request.payload),
|
|
27
|
+
protocolVersion: MAIA_PROTOCOL_VERSION,
|
|
28
|
+
};
|
|
29
|
+
protocolRequestEnvelopeSchema.parse(envelope);
|
|
30
|
+
return envelope;
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
const requireCorrelation = (response, requestMessageId) => response.correlationId === requestMessageId
|
|
34
|
+
? Effect.void
|
|
35
|
+
: Effect.fail(new MaiaClientError("correlation_mismatch", "The Maia response did not match the request message."));
|
|
36
|
+
const rejectRemoteError = (rawResponse, requestMessageId) => {
|
|
37
|
+
const response = protocolErrorEnvelopeSchema.safeParse(rawResponse);
|
|
38
|
+
if (!response.success)
|
|
39
|
+
return Effect.void;
|
|
40
|
+
const { error } = response.data.payload;
|
|
41
|
+
return requireCorrelation(response.data, requestMessageId).pipe(Effect.andThen(Effect.suspend(() => {
|
|
42
|
+
const localCode = localNodeOperationErrorCodeSchema.safeParse(error.code);
|
|
43
|
+
return Effect.fail(new MaiaClientError(localCode.success ? localCode.data : "remote_error", error.message, { remoteError: error }));
|
|
44
|
+
})));
|
|
45
|
+
};
|
|
46
|
+
const parseSuccessResult = (rawResponse, requestMessageId) => Effect.try({
|
|
47
|
+
catch: (error) => new MaiaClientError("invalid_response", "The Maia response envelope failed runtime validation.", { cause: error }),
|
|
48
|
+
try: () => protocolSuccessEnvelopeSchema.parse(rawResponse),
|
|
49
|
+
}).pipe(Effect.tap((response) => requireCorrelation(response, requestMessageId)), Effect.map((response) => response.payload.result));
|
|
50
|
+
const parseOutput = (outputSchema, output) => Effect.try({
|
|
51
|
+
catch: (error) => new MaiaClientError("invalid_response", "The Maia response payload failed runtime validation.", { cause: error }),
|
|
52
|
+
try: () => outputSchema.parse(output),
|
|
53
|
+
});
|
|
54
|
+
const cancelledRequest = () => new MaiaClientError("cancelled", "The Maia request was cancelled.");
|
|
55
|
+
export const executeMaiaRequest = (transport, request) => Effect.gen(function* () {
|
|
56
|
+
const envelope = yield* createRequestEnvelope(request);
|
|
57
|
+
const { messageId, outputSchema, signal } = request;
|
|
58
|
+
if (signal?.aborted === true)
|
|
59
|
+
return yield* Effect.fail(cancelledRequest());
|
|
60
|
+
const rawResponse = yield* transport.request(envelope, signal === undefined ? undefined : { signal });
|
|
61
|
+
yield* rejectRemoteError(rawResponse, messageId);
|
|
62
|
+
const output = yield* parseSuccessResult(rawResponse, messageId);
|
|
63
|
+
return yield* parseOutput(outputSchema, output);
|
|
64
|
+
});
|
|
65
|
+
export const makeLocalNodeEffectRequester = (transport, validatePayload = true) => (payload, outputSchema, { messageId, signal }) => executeMaiaRequest(transport, {
|
|
66
|
+
inputSchema: validatePayload
|
|
67
|
+
? localNodeRequestPayloadParser
|
|
68
|
+
: { parse: () => payload },
|
|
69
|
+
messageId,
|
|
70
|
+
outputSchema,
|
|
71
|
+
payload,
|
|
72
|
+
signal,
|
|
73
|
+
});
|
|
74
|
+
export const fromPromiseRequester = (request) => (payload, outputSchema, options) => Effect.tryPromise({
|
|
75
|
+
catch: (error) => error,
|
|
76
|
+
try: () => request(payload, outputSchema, options),
|
|
77
|
+
});
|
|
78
|
+
const uncertainMutation = (error, cancelledBeforeRequest) => error instanceof MaiaClientError &&
|
|
79
|
+
!platformStoppedBeforeDispatch(error) &&
|
|
80
|
+
(error.code === "invalid_response" ||
|
|
81
|
+
error.code === "correlation_mismatch" ||
|
|
82
|
+
error.code === "transport_failure" ||
|
|
83
|
+
(error.code === "cancelled" && !cancelledBeforeRequest))
|
|
84
|
+
? new MaiaClientError("outcome_unknown", "The mutation result could not be verified. Reconcile the original command ID.")
|
|
85
|
+
: error;
|
|
86
|
+
export const verifiedMutation = (mutation, options) => Effect.suspend(() => {
|
|
87
|
+
const cancelledBeforeRequest = options.signal?.aborted ?? false;
|
|
88
|
+
return Effect.mapError(mutation, (error) => uncertainMutation(error, cancelledBeforeRequest));
|
|
89
|
+
});
|
|
90
|
+
export const failInvalidResponse = (reject) => Effect.suspend(() => {
|
|
91
|
+
try {
|
|
92
|
+
return reject();
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return error instanceof MaiaClientError
|
|
96
|
+
? Effect.fail(error)
|
|
97
|
+
: Effect.die(error);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
export const toPromiseClient = (client) => Object.fromEntries(Object.entries(client).map(([name, operation]) => [
|
|
101
|
+
name,
|
|
102
|
+
(...arguments_) => Effect.runPromise(operation(...arguments_)),
|
|
103
|
+
]));
|
|
104
|
+
//# sourceMappingURL=effect.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { classifyClientError, type MaiaError, type MaiaErrorKind, } from "./classify.js";
|
|
2
|
+
export { MaiaClientError, type MaiaClientErrorCode } from "./client-error.js";
|
|
3
|
+
export { type CancellationSignal, createMaiaClient, type MaiaClient, type MaiaRequest, type MaiaTransport, type RuntimeSchema, type TransportRequestOptions, } from "./maia-client.js";
|
|
4
|
+
export type { LocalNodeRequester, LocalNodeRequestOptions } from "./options.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|