@maiaos/cli 0.1.0-canary.44938d4.manual.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +382 -0
  2. package/dist/bin/maia.NOTICES.txt +31 -0
  3. package/dist/bin/maia.cdx.json +138 -0
  4. package/dist/bin/maia.mjs +115 -0
  5. package/dist/command-line/arguments.d.ts +21 -0
  6. package/dist/command-line/arguments.js +99 -0
  7. package/dist/command-line/context.d.ts +112 -0
  8. package/dist/command-line/context.js +2 -0
  9. package/dist/command-line/help.d.ts +36 -0
  10. package/dist/command-line/help.js +267 -0
  11. package/dist/command-line/output.d.ts +2111 -0
  12. package/dist/command-line/output.js +643 -0
  13. package/dist/command-line/stdin.d.ts +7 -0
  14. package/dist/command-line/stdin.js +34 -0
  15. package/dist/command-receipt/command.d.ts +3 -0
  16. package/dist/command-receipt/command.js +63 -0
  17. package/dist/command-receipt/compact-list.d.ts +18 -0
  18. package/dist/command-receipt/compact-list.js +18 -0
  19. package/dist/context/client.d.ts +4 -0
  20. package/dist/context/client.js +19 -0
  21. package/dist/context/commands.d.ts +3 -0
  22. package/dist/context/commands.js +13 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.js +202 -0
  25. package/dist/integration-authorization/client.d.ts +16 -0
  26. package/dist/integration-authorization/client.js +30 -0
  27. package/dist/integration-authorization/commands.d.ts +3 -0
  28. package/dist/integration-authorization/commands.js +92 -0
  29. package/dist/local-node/client.d.ts +31 -0
  30. package/dist/local-node/client.js +99 -0
  31. package/dist/orchestration/client.d.ts +59 -0
  32. package/dist/orchestration/client.js +66 -0
  33. package/dist/orchestration/commands.d.ts +3 -0
  34. package/dist/orchestration/commands.js +336 -0
  35. package/dist/orchestration/compact-aggregate.d.ts +123 -0
  36. package/dist/orchestration/compact-aggregate.js +110 -0
  37. package/dist/orchestration/compact-run-list.d.ts +19 -0
  38. package/dist/orchestration/compact-run-list.js +16 -0
  39. package/dist/project-workspace/client.d.ts +43 -0
  40. package/dist/project-workspace/client.js +54 -0
  41. package/dist/project-workspace/commands.d.ts +5 -0
  42. package/dist/project-workspace/commands.js +239 -0
  43. package/dist/runtime/client.d.ts +6 -0
  44. package/dist/runtime/client.js +10 -0
  45. package/dist/runtime/command.d.ts +3 -0
  46. package/dist/runtime/command.js +20 -0
  47. package/dist/session/client.d.ts +32 -0
  48. package/dist/session/client.js +30 -0
  49. package/dist/session/commands.d.ts +3 -0
  50. package/dist/session/commands.js +160 -0
  51. package/dist/status/client.d.ts +5 -0
  52. package/dist/status/client.js +15 -0
  53. package/dist/status/command.d.ts +3 -0
  54. package/dist/status/command.js +17 -0
  55. package/dist/status/compact.d.ts +31 -0
  56. package/dist/status/compact.js +46 -0
  57. package/dist/terminal/arguments.d.ts +12 -0
  58. package/dist/terminal/arguments.js +79 -0
  59. package/dist/terminal/client.d.ts +45 -0
  60. package/dist/terminal/client.js +48 -0
  61. package/dist/terminal/commands.d.ts +3 -0
  62. package/dist/terminal/commands.js +151 -0
  63. package/dist/terminal/compact-list.d.ts +148 -0
  64. package/dist/terminal/compact-list.js +152 -0
  65. package/dist/terminal/control-commands.d.ts +7 -0
  66. package/dist/terminal/control-commands.js +211 -0
  67. package/dist/turn/client.d.ts +17 -0
  68. package/dist/turn/client.js +23 -0
  69. package/dist/turn/commands.d.ts +3 -0
  70. package/dist/turn/commands.js +126 -0
  71. package/dist/turn/prompt.d.ts +2 -0
  72. package/dist/turn/prompt.js +9 -0
  73. package/guidance/maia-cli/SKILL.md +75 -0
  74. package/guidance/maia-orchestration/SKILL.md +54 -0
  75. package/package.json +50 -0
@@ -0,0 +1,148 @@
1
+ import type { TerminalEventsListResult, TerminalListResult, TerminalReadResult, TerminalShowResult } from "@maiaos/sdk";
2
+ type ProtocolTerminal = TerminalListResult["items"][number];
3
+ type ProtocolUnavailable = Extract<ProtocolTerminal, {
4
+ readonly state: "unavailable";
5
+ }>;
6
+ type ProtocolLive = Exclude<ProtocolTerminal, ProtocolUnavailable>;
7
+ type ProtocolCleanup = ProtocolLive["cleanup"];
8
+ type ProtocolExit = NonNullable<Extract<ProtocolLive, {
9
+ readonly exit?: unknown;
10
+ }>["exit"]>;
11
+ type ProtocolEvent = TerminalEventsListResult["items"][number];
12
+ type ProtocolLegacyEvent = Extract<ProtocolEvent, {
13
+ readonly eventType: unknown;
14
+ }>;
15
+ type ProtocolLiveEvent = Exclude<ProtocolEvent, ProtocolLegacyEvent>;
16
+ type ProtocolChunk = TerminalReadResult["items"][number];
17
+ export type CliOutputAudience = "human" | "json";
18
+ export type CliTerminalCleanup = {
19
+ readonly reason: Extract<ProtocolCleanup, {
20
+ readonly state: "unknown";
21
+ }>["reason"];
22
+ readonly state: "unknown";
23
+ } | {
24
+ readonly state: Exclude<ProtocolCleanup["state"], "unknown">;
25
+ };
26
+ export type CliUnavailableTerminal = {
27
+ readonly id: ProtocolUnavailable["id"];
28
+ readonly projectId: ProtocolUnavailable["projectId"];
29
+ readonly revision: ProtocolUnavailable["revision"];
30
+ readonly state: ProtocolUnavailable["state"];
31
+ readonly unavailability: ProtocolUnavailable["unavailability"];
32
+ readonly workspaceId: ProtocolUnavailable["workspaceId"];
33
+ readonly workspaceRevision: ProtocolUnavailable["workspaceRevision"];
34
+ };
35
+ type CliHumanLiveCapability = {
36
+ readonly capability: {
37
+ readonly tier: ProtocolLive["capability"]["tier"];
38
+ };
39
+ };
40
+ type CliLiveTerminalFields = {
41
+ readonly cleanup?: CliTerminalCleanup;
42
+ readonly exit?: ProtocolExit;
43
+ readonly generation: ProtocolLive["generation"];
44
+ readonly id: ProtocolLive["id"];
45
+ readonly projectId: ProtocolLive["projectId"];
46
+ readonly revision: ProtocolLive["revision"];
47
+ readonly state: ProtocolLive["state"];
48
+ readonly workspaceId: ProtocolLive["workspaceId"];
49
+ readonly workspaceRevision: ProtocolLive["workspaceRevision"];
50
+ };
51
+ export type CliLiveTerminal<TAudience extends CliOutputAudience = "json"> = TAudience extends "human" ? CliLiveTerminalFields & CliHumanLiveCapability : CliLiveTerminalFields;
52
+ export type CliTerminalListItem<TAudience extends CliOutputAudience = "json"> = CliLiveTerminal<TAudience> | CliUnavailableTerminal;
53
+ export type CliTerminalShowTerminal<TAudience extends CliOutputAudience = "json"> = (CliLiveTerminal<TAudience> & {
54
+ readonly viewport: ProtocolLive["viewport"];
55
+ }) | CliUnavailableTerminal;
56
+ export type CliTerminalListResult<TAudience extends CliOutputAudience = "json"> = {
57
+ readonly command: "terminal.list";
58
+ readonly count: number;
59
+ readonly items: readonly CliTerminalListItem<TAudience>[];
60
+ readonly nextCursor?: TerminalListResult["nextCursor"];
61
+ readonly workspaceId: ProtocolTerminal["workspaceId"];
62
+ };
63
+ export type CliTerminalShowResult<TAudience extends CliOutputAudience = "json"> = {
64
+ readonly command: "terminal.show";
65
+ readonly terminal: CliTerminalShowTerminal<TAudience>;
66
+ };
67
+ type CliLegacyEventFields = {
68
+ readonly cursor: string;
69
+ readonly type: ProtocolLegacyEvent["eventType"];
70
+ readonly unavailability: ProtocolUnavailable["unavailability"];
71
+ };
72
+ export type CliLegacyTerminalEvent<TAudience extends CliOutputAudience = "json"> = TAudience extends "human" ? CliLegacyEventFields & {
73
+ readonly globalCursor: ProtocolLegacyEvent["globalCursor"];
74
+ } : CliLegacyEventFields;
75
+ export type CliTerminalEvent<TAudience extends CliOutputAudience = "json"> = CliLegacyTerminalEvent<TAudience> | {
76
+ readonly cleanup: CliTerminalCleanup;
77
+ readonly cursor: string;
78
+ readonly type: "cleanup";
79
+ } | {
80
+ readonly cursor: string;
81
+ readonly exit: ProtocolExit;
82
+ readonly type: "exit";
83
+ } | {
84
+ readonly cursor: string;
85
+ readonly headCursor: string;
86
+ readonly oldestAvailableCursor: string;
87
+ readonly reason: Extract<ProtocolLiveEvent, {
88
+ readonly type: "gap";
89
+ }>["reason"];
90
+ readonly recovery: Extract<ProtocolLiveEvent, {
91
+ readonly type: "gap";
92
+ }>["recovery"];
93
+ readonly requestedAfterCursor?: string;
94
+ readonly type: "gap";
95
+ } | {
96
+ readonly cursor: string;
97
+ readonly leaseId: string;
98
+ readonly reason: Extract<ProtocolLiveEvent, {
99
+ readonly type: "controller-revoked";
100
+ }>["reason"];
101
+ readonly type: "controller-revoked";
102
+ } | {
103
+ readonly cursor: string;
104
+ readonly previousCleanup: CliTerminalCleanup;
105
+ readonly previousGeneration: number;
106
+ readonly previousRevision: string;
107
+ readonly previousState: ProtocolLive["state"];
108
+ readonly terminal: CliTerminalListItem<TAudience>;
109
+ readonly transition: Extract<ProtocolLiveEvent, {
110
+ readonly type: "lifecycle-transition";
111
+ }>["transition"];
112
+ readonly type: "lifecycle-transition";
113
+ } | {
114
+ readonly cursor: string;
115
+ readonly type: "output";
116
+ };
117
+ export type CliTerminalEventsResult<TAudience extends CliOutputAudience = "json"> = {
118
+ readonly command: "terminal.events";
119
+ readonly count: number;
120
+ readonly headCursor: TerminalEventsListResult["headTerminalCursor"];
121
+ readonly items: readonly CliTerminalEvent<TAudience>[];
122
+ readonly nextCursor?: TerminalEventsListResult["nextTerminalCursor"];
123
+ readonly terminalId: TerminalEventsListResult["terminalId"];
124
+ };
125
+ export type CliTerminalChunk = {
126
+ readonly bytesBase64: ProtocolChunk["bytesBase64"];
127
+ readonly cursor: ProtocolChunk["cursor"];
128
+ readonly generation?: number;
129
+ };
130
+ export type CliTerminalReadResult = {
131
+ readonly command: "terminal.read";
132
+ readonly count: number;
133
+ readonly headChunkCursor: TerminalReadResult["headChunkCursor"];
134
+ readonly items: readonly CliTerminalChunk[];
135
+ readonly nextChunkCursor?: TerminalReadResult["nextChunkCursor"];
136
+ readonly terminalId: TerminalReadResult["terminalId"];
137
+ };
138
+ export declare const terminalOutputAudience: (json: boolean) => CliOutputAudience;
139
+ export declare const projectTerminalListItem: <TAudience extends CliOutputAudience = "json">(terminal: ProtocolTerminal, audience?: TAudience) => CliTerminalListItem<TAudience>;
140
+ export declare const projectTerminalShowTerminal: <TAudience extends CliOutputAudience = "json">(terminal: ProtocolTerminal, audience?: TAudience) => CliTerminalShowTerminal<TAudience>;
141
+ export declare const projectTerminalListResult: <TAudience extends CliOutputAudience = "json">(value: TerminalListResult, workspaceId: ProtocolTerminal["workspaceId"], audience?: TAudience) => CliTerminalListResult<TAudience>;
142
+ export declare const projectTerminalShowResult: <TAudience extends CliOutputAudience = "json">(value: TerminalShowResult, audience?: TAudience) => CliTerminalShowResult<TAudience>;
143
+ export declare const projectTerminalEvent: <TAudience extends CliOutputAudience = "json">(event: ProtocolEvent, audience?: TAudience) => CliTerminalEvent<TAudience>;
144
+ export declare const projectTerminalEventsResult: <TAudience extends CliOutputAudience = "json">(value: TerminalEventsListResult, audience?: TAudience) => CliTerminalEventsResult<TAudience>;
145
+ export declare const projectTerminalChunk: (chunk: ProtocolChunk) => CliTerminalChunk;
146
+ export declare const projectTerminalReadResult: (value: TerminalReadResult) => CliTerminalReadResult;
147
+ export {};
148
+ //# sourceMappingURL=compact-list.d.ts.map
@@ -0,0 +1,152 @@
1
+ const projectCleanup = (cleanup) => cleanup.state === "unknown"
2
+ ? { reason: cleanup.reason, state: cleanup.state }
3
+ : { state: cleanup.state };
4
+ const projectOptionalCleanup = (cleanup) => cleanup.state === "pending" ? {} : { cleanup: projectCleanup(cleanup) };
5
+ const projectExit = (exit) => ({
6
+ ...(exit.code === undefined ? {} : { code: exit.code }),
7
+ observedAt: exit.observedAt,
8
+ ...(exit.signal === undefined ? {} : { signal: exit.signal }),
9
+ });
10
+ const projectOptionalExit = (terminal) => "exit" in terminal && terminal.exit !== undefined
11
+ ? { exit: projectExit(terminal.exit) }
12
+ : {};
13
+ const projectUnavailableTerminal = (terminal) => ({
14
+ id: terminal.id,
15
+ projectId: terminal.projectId,
16
+ revision: terminal.revision,
17
+ state: terminal.state,
18
+ unavailability: terminal.unavailability,
19
+ workspaceId: terminal.workspaceId,
20
+ workspaceRevision: terminal.workspaceRevision,
21
+ });
22
+ const projectLiveTerminal = (terminal, includeViewport, audience) => ({
23
+ ...(audience === "human"
24
+ ? { capability: { tier: terminal.capability.tier } }
25
+ : {}),
26
+ ...projectOptionalCleanup(terminal.cleanup),
27
+ ...projectOptionalExit(terminal),
28
+ generation: terminal.generation,
29
+ id: terminal.id,
30
+ projectId: terminal.projectId,
31
+ revision: terminal.revision,
32
+ state: terminal.state,
33
+ ...(includeViewport
34
+ ? {
35
+ viewport: {
36
+ columns: terminal.viewport.columns,
37
+ rows: terminal.viewport.rows,
38
+ },
39
+ }
40
+ : {}),
41
+ workspaceId: terminal.workspaceId,
42
+ workspaceRevision: terminal.workspaceRevision,
43
+ });
44
+ export const terminalOutputAudience = (json) => json ? "json" : "human";
45
+ export const projectTerminalListItem = (terminal, audience = "json") => (terminal.state === "unavailable"
46
+ ? projectUnavailableTerminal(terminal)
47
+ : projectLiveTerminal(terminal, false, audience));
48
+ export const projectTerminalShowTerminal = (terminal, audience = "json") => (terminal.state === "unavailable"
49
+ ? projectUnavailableTerminal(terminal)
50
+ : projectLiveTerminal(terminal, true, audience));
51
+ export const projectTerminalListResult = (value, workspaceId, audience = "json") => ({
52
+ command: "terminal.list",
53
+ count: value.items.length,
54
+ items: value.items.map((item) => projectTerminalListItem(item, audience)),
55
+ ...(value.nextCursor === undefined ? {} : { nextCursor: value.nextCursor }),
56
+ workspaceId: value.items[0]?.workspaceId ?? workspaceId,
57
+ });
58
+ export const projectTerminalShowResult = (value, audience = "json") => ({
59
+ command: "terminal.show",
60
+ terminal: projectTerminalShowTerminal(value.terminal, audience),
61
+ });
62
+ const projectLegacyEvent = (event, audience) => ({
63
+ cursor: event.terminalCursor,
64
+ ...(audience === "human" ? { globalCursor: event.globalCursor } : {}),
65
+ type: event.eventType,
66
+ unavailability: {
67
+ code: event.payload.code,
68
+ platform: event.payload.platform,
69
+ },
70
+ });
71
+ const projectCleanupEvent = (event) => ({
72
+ cleanup: projectCleanup(event.cleanup),
73
+ cursor: event.cursor,
74
+ type: "cleanup",
75
+ });
76
+ const projectControllerRevokedEvent = (event) => ({
77
+ cursor: event.cursor,
78
+ leaseId: event.leaseId,
79
+ reason: event.reason,
80
+ type: "controller-revoked",
81
+ });
82
+ const projectExitEvent = (event) => ({
83
+ cursor: event.cursor,
84
+ exit: projectExit(event.exit),
85
+ type: "exit",
86
+ });
87
+ const projectGapEvent = (event) => ({
88
+ cursor: event.cursor,
89
+ headCursor: event.headCursor,
90
+ oldestAvailableCursor: event.oldestAvailableCursor,
91
+ reason: event.reason,
92
+ recovery: event.recovery,
93
+ ...(event.requestedAfterCursor === undefined
94
+ ? {}
95
+ : { requestedAfterCursor: event.requestedAfterCursor }),
96
+ type: "gap",
97
+ });
98
+ const projectLifecycleEvent = (event, audience) => ({
99
+ cursor: event.cursor,
100
+ previousCleanup: projectCleanup(event.previousCleanup),
101
+ previousGeneration: event.previousGeneration,
102
+ previousRevision: event.previousRevision,
103
+ previousState: event.previousState,
104
+ terminal: projectTerminalListItem(event.terminal, audience),
105
+ transition: event.transition,
106
+ type: "lifecycle-transition",
107
+ });
108
+ const projectLiveEvent = (event, audience) => {
109
+ switch (event.type) {
110
+ case "cleanup":
111
+ return projectCleanupEvent(event);
112
+ case "controller-revoked":
113
+ return projectControllerRevokedEvent(event);
114
+ case "exit":
115
+ return projectExitEvent(event);
116
+ case "gap":
117
+ return projectGapEvent(event);
118
+ case "lifecycle-transition":
119
+ return projectLifecycleEvent(event, audience);
120
+ case "output":
121
+ return { cursor: event.cursor, type: "output" };
122
+ }
123
+ };
124
+ export const projectTerminalEvent = (event, audience = "json") => "eventType" in event
125
+ ? projectLegacyEvent(event, audience)
126
+ : projectLiveEvent(event, audience);
127
+ export const projectTerminalEventsResult = (value, audience = "json") => ({
128
+ command: "terminal.events",
129
+ count: value.items.length,
130
+ headCursor: value.headTerminalCursor,
131
+ items: value.items.map((event) => projectTerminalEvent(event, audience)),
132
+ ...(value.nextTerminalCursor === undefined
133
+ ? {}
134
+ : { nextCursor: value.nextTerminalCursor }),
135
+ terminalId: value.terminalId,
136
+ });
137
+ export const projectTerminalChunk = (chunk) => ({
138
+ bytesBase64: chunk.bytesBase64,
139
+ cursor: chunk.cursor,
140
+ ...("generation" in chunk ? { generation: chunk.generation } : {}),
141
+ });
142
+ export const projectTerminalReadResult = (value) => ({
143
+ command: "terminal.read",
144
+ count: value.items.length,
145
+ headChunkCursor: value.headChunkCursor,
146
+ items: value.items.map(projectTerminalChunk),
147
+ ...(value.nextChunkCursor === undefined
148
+ ? {}
149
+ : { nextChunkCursor: value.nextChunkCursor }),
150
+ terminalId: value.terminalId,
151
+ });
152
+ //# sourceMappingURL=compact-list.js.map
@@ -0,0 +1,7 @@
1
+ import type { CommandContext } from "../command-line/context.js";
2
+ export declare const runTerminalControllerCommand: (tokens: readonly string[], context: CommandContext) => Promise<number>;
3
+ export declare const runTerminalInputCommand: (tokens: readonly string[], context: CommandContext) => Promise<number>;
4
+ export declare const runTerminalResize: (tokens: readonly string[], context: CommandContext) => Promise<number>;
5
+ export declare const runTerminalSignal: (tokens: readonly string[], context: CommandContext) => Promise<number>;
6
+ export declare const runTerminalClose: (tokens: readonly string[], context: CommandContext) => Promise<number>;
7
+ //# sourceMappingURL=control-commands.d.ts.map
@@ -0,0 +1,211 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { liveTerminalWriteParametersSchema, MAX_TERMINAL_INPUT_CHUNK_BYTES, } from "@maiaos/sdk";
3
+ import { CliArgumentError, parseOptions, requirePositionals, } from "../command-line/arguments.js";
4
+ import { writeNodeResult } from "../command-line/output.js";
5
+ import { readTerminalColumns, readTerminalControllerFence, readTerminalExpectedRevision, readTerminalGeneration, readTerminalInputSequence, readTerminalLeaseDuration, readTerminalRows, terminalControllerFenceOptionNames, } from "./arguments.js";
6
+ const optionNames = (...additional) => new Set([...terminalControllerFenceOptionNames, ...additional]);
7
+ const commandId = (options) => {
8
+ const value = options.get("--command-id");
9
+ return value === undefined ? {} : { commandId: value };
10
+ };
11
+ const requiredTerminalId = (positionals) => {
12
+ const terminalId = positionals[0];
13
+ if (terminalId === undefined) {
14
+ throw new CliArgumentError("The terminal identifier is missing.");
15
+ }
16
+ return terminalId;
17
+ };
18
+ const runControllerRequestShow = async (tokens, context) => {
19
+ const parsed = parseOptions(tokens, new Set(["--terminal-generation"]));
20
+ requirePositionals(parsed.positionals, 2, "maia terminal controller request show");
21
+ const terminalId = requiredTerminalId(parsed.positionals);
22
+ const controllerRequestId = parsed.positionals[1];
23
+ if (controllerRequestId === undefined) {
24
+ throw new CliArgumentError("The controller request identifier is missing.");
25
+ }
26
+ const result = await context.dependencies.showTerminalControllerRequest({
27
+ controllerRequestId,
28
+ terminalGeneration: readTerminalGeneration(parsed),
29
+ terminalId,
30
+ });
31
+ return writeNodeResult(result, context, (value) => ({
32
+ command: "terminal.controller.request.show",
33
+ result: value,
34
+ }));
35
+ };
36
+ const runControllerRequest = async (tokens, context) => {
37
+ if (tokens[0] === "show")
38
+ return runControllerRequestShow(tokens.slice(1), context);
39
+ const parsed = parseOptions(tokens, new Set(["--command-id", "--lease-ms", "--terminal-generation"]));
40
+ requirePositionals(parsed.positionals, 1, "maia terminal controller request");
41
+ const terminalId = requiredTerminalId(parsed.positionals);
42
+ const result = await context.dependencies.requestTerminalController({
43
+ ...commandId(parsed.options),
44
+ requestedLeaseDurationMs: readTerminalLeaseDuration(parsed),
45
+ terminalGeneration: readTerminalGeneration(parsed),
46
+ terminalId,
47
+ });
48
+ return writeNodeResult(result, context, (value) => ({
49
+ command: "terminal.controller.request",
50
+ result: value,
51
+ }));
52
+ };
53
+ const readControllerAcquireInput = (tokens) => {
54
+ const parsed = parseOptions(tokens, new Set(["--command-id", "--expected-revision", "--terminal-generation"]));
55
+ requirePositionals(parsed.positionals, 2, "maia terminal controller acquire");
56
+ const terminalId = requiredTerminalId(parsed.positionals);
57
+ const controllerRequestId = parsed.positionals[1];
58
+ if (controllerRequestId === undefined) {
59
+ throw new CliArgumentError("The controller request identifier is missing.");
60
+ }
61
+ return {
62
+ ...commandId(parsed.options),
63
+ controllerRequestId,
64
+ expectedTerminalRevision: readTerminalExpectedRevision(parsed),
65
+ terminalGeneration: readTerminalGeneration(parsed),
66
+ terminalId,
67
+ };
68
+ };
69
+ const requireAdmittedTerminalWriteScope = (scope) => {
70
+ const admission = liveTerminalWriteParametersSchema.safeParse({
71
+ ...scope,
72
+ bytesBase64: "AA==",
73
+ commandId: scope.commandId ?? "command_terminal_input_validation",
74
+ });
75
+ if (!admission.success) {
76
+ throw new CliArgumentError("The terminal input metadata is invalid.");
77
+ }
78
+ };
79
+ const runControllerAcquire = async (tokens, context) => {
80
+ const result = await context.dependencies.acquireTerminalController(readControllerAcquireInput(tokens));
81
+ return writeNodeResult(result, context, (value) => ({
82
+ command: "terminal.controller.acquire",
83
+ result: value,
84
+ }));
85
+ };
86
+ const parseTerminalWriteOptions = (tokens) => {
87
+ const parsed = parseOptions(tokens, optionNames("--input-id", "--input-sequence"), new Set(["--input-stdin"]));
88
+ requirePositionals(parsed.positionals, 1, "maia terminal input write");
89
+ if (!parsed.flags.has("--input-stdin")) {
90
+ throw new CliArgumentError("Option '--input-stdin' is required.");
91
+ }
92
+ return parsed;
93
+ };
94
+ const readTerminalWriteScope = (tokens) => {
95
+ const parsed = parseTerminalWriteOptions(tokens);
96
+ const terminalId = requiredTerminalId(parsed.positionals);
97
+ const inputId = parsed.options.get("--input-id");
98
+ if (inputId === undefined) {
99
+ throw new CliArgumentError("Option '--input-id' is required.");
100
+ }
101
+ const scope = {
102
+ ...commandId(parsed.options),
103
+ ...readTerminalControllerFence(parsed, terminalId),
104
+ inputId,
105
+ inputSequence: readTerminalInputSequence(parsed),
106
+ };
107
+ requireAdmittedTerminalWriteScope(scope);
108
+ return scope;
109
+ };
110
+ const runControllerRelease = async (tokens, context) => {
111
+ const parsed = parseOptions(tokens, optionNames());
112
+ requirePositionals(parsed.positionals, 1, "maia terminal controller release");
113
+ const terminalId = requiredTerminalId(parsed.positionals);
114
+ const result = await context.dependencies.releaseTerminalController({
115
+ ...commandId(parsed.options),
116
+ ...readTerminalControllerFence(parsed, terminalId),
117
+ });
118
+ return writeNodeResult(result, context, (value) => ({
119
+ command: "terminal.controller.release",
120
+ result: value,
121
+ }));
122
+ };
123
+ export const runTerminalControllerCommand = (tokens, context) => {
124
+ const [subcommand, ...rest] = tokens;
125
+ if (subcommand === "acquire")
126
+ return runControllerAcquire(rest, context);
127
+ if (subcommand === "release")
128
+ return runControllerRelease(rest, context);
129
+ if (subcommand === "request")
130
+ return runControllerRequest(rest, context);
131
+ throw new CliArgumentError("Usage: maia terminal controller <request|acquire|release>");
132
+ };
133
+ const readTerminalInput = async (context) => {
134
+ if (context.io.stdin === undefined) {
135
+ throw new CliArgumentError("Terminal input requires standard input.");
136
+ }
137
+ return context.io.stdin({
138
+ label: "terminal input",
139
+ maxBytes: MAX_TERMINAL_INPUT_CHUNK_BYTES,
140
+ maxChunks: 1024,
141
+ });
142
+ };
143
+ export const runTerminalInputCommand = async (tokens, context) => {
144
+ const [subcommand, ...rest] = tokens;
145
+ if (subcommand !== "write") {
146
+ throw new CliArgumentError("Usage: maia terminal input write");
147
+ }
148
+ const scope = readTerminalWriteScope(rest);
149
+ const input = await readTerminalInput(context);
150
+ if (input.length === 0) {
151
+ throw new CliArgumentError("Terminal input must not be empty.");
152
+ }
153
+ const result = await context.dependencies.writeTerminalInput({
154
+ ...scope,
155
+ bytesBase64: Buffer.from(input, "utf8").toString("base64"),
156
+ });
157
+ return writeNodeResult(result, context, (value) => ({
158
+ command: "terminal.input.write",
159
+ result: value,
160
+ }));
161
+ };
162
+ const readTerminalSignalInput = (tokens) => {
163
+ const parsed = parseOptions(tokens, optionNames("--signal"));
164
+ requirePositionals(parsed.positionals, 1, "maia terminal signal");
165
+ const terminalId = requiredTerminalId(parsed.positionals);
166
+ const signal = parsed.options.get("--signal");
167
+ if (signal !== "hangup" && signal !== "interrupt" && signal !== "terminate") {
168
+ throw new CliArgumentError("Option '--signal' must be hangup, interrupt, or terminate.");
169
+ }
170
+ return {
171
+ ...commandId(parsed.options),
172
+ ...readTerminalControllerFence(parsed, terminalId),
173
+ signal,
174
+ };
175
+ };
176
+ export const runTerminalResize = async (tokens, context) => {
177
+ const parsed = parseOptions(tokens, optionNames("--columns", "--rows"));
178
+ requirePositionals(parsed.positionals, 1, "maia terminal resize");
179
+ const terminalId = requiredTerminalId(parsed.positionals);
180
+ const result = await context.dependencies.resizeTerminal({
181
+ ...commandId(parsed.options),
182
+ ...readTerminalControllerFence(parsed, terminalId),
183
+ columns: readTerminalColumns(parsed.options.get("--columns")),
184
+ rows: readTerminalRows(parsed.options.get("--rows")),
185
+ });
186
+ return writeNodeResult(result, context, (value) => ({
187
+ command: "terminal.resize",
188
+ result: value,
189
+ }));
190
+ };
191
+ export const runTerminalSignal = async (tokens, context) => {
192
+ const result = await context.dependencies.signalTerminal(readTerminalSignalInput(tokens));
193
+ return writeNodeResult(result, context, (value) => ({
194
+ command: "terminal.signal",
195
+ result: value,
196
+ }));
197
+ };
198
+ export const runTerminalClose = async (tokens, context) => {
199
+ const parsed = parseOptions(tokens, optionNames());
200
+ requirePositionals(parsed.positionals, 1, "maia terminal close");
201
+ const terminalId = requiredTerminalId(parsed.positionals);
202
+ const result = await context.dependencies.closeTerminal({
203
+ ...commandId(parsed.options),
204
+ ...readTerminalControllerFence(parsed, terminalId),
205
+ });
206
+ return writeNodeResult(result, context, (value) => ({
207
+ command: "terminal.close",
208
+ result: value,
209
+ }));
210
+ };
211
+ //# sourceMappingURL=control-commands.js.map
@@ -0,0 +1,17 @@
1
+ import type { TurnInterruptResult, TurnSendResult, TurnShowResult } from "@maiaos/sdk";
2
+ import { type CliNodeResult } from "../local-node/client.js";
3
+ export type InterruptTurnInput = {
4
+ readonly commandId?: string;
5
+ readonly expectedRevision: string;
6
+ readonly turnId: string;
7
+ };
8
+ export type SendTurnInput = {
9
+ readonly commandId?: string;
10
+ readonly expectedRevision: string;
11
+ readonly prompt: string;
12
+ readonly sessionId: string;
13
+ };
14
+ export declare const interruptTurn: (input: InterruptTurnInput) => Promise<CliNodeResult<TurnInterruptResult>>;
15
+ export declare const sendTurn: (input: SendTurnInput) => Promise<CliNodeResult<TurnSendResult>>;
16
+ export declare const showTurn: (turnId: string) => Promise<CliNodeResult<TurnShowResult>>;
17
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1,23 @@
1
+ import { turnInterruptParametersSchema, turnSendParametersSchema, turnShowParametersSchema, } from "@maiaos/sdk";
2
+ import { newCliIdentifier, runValidatedNodeOperation, } from "../local-node/client.js";
3
+ export const interruptTurn = (input) => {
4
+ const commandId = input.commandId ?? newCliIdentifier("command");
5
+ return runValidatedNodeOperation({
6
+ commandId,
7
+ expectedRevision: input.expectedRevision,
8
+ turnId: input.turnId,
9
+ }, turnInterruptParametersSchema, (client, parameters, options) => client.interruptTurn(parameters, options), { commandId });
10
+ };
11
+ export const sendTurn = (input) => {
12
+ const commandId = input.commandId ?? newCliIdentifier("command");
13
+ return runValidatedNodeOperation({
14
+ commandId,
15
+ expectedRevision: input.expectedRevision,
16
+ input: { text: input.prompt, type: "text" },
17
+ sessionId: input.sessionId,
18
+ }, turnSendParametersSchema, (client, parameters, options) => client.sendTurn(parameters, options), { commandId });
19
+ };
20
+ export const showTurn = (turnId) => {
21
+ return runValidatedNodeOperation({ turnId }, turnShowParametersSchema, (client, parameters, options) => client.showTurn(parameters, options));
22
+ };
23
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,3 @@
1
+ import type { CommandContext } from "../command-line/context.js";
2
+ export declare const runTurnCommand: (tokens: readonly string[], context: CommandContext) => Promise<number>;
3
+ //# sourceMappingURL=commands.d.ts.map