@gaoding/cli 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -3
  3. package/contracts/operations/agent.send/input.schema.json +353 -0
  4. package/contracts/operations/agent.send/output.schema.json +271 -0
  5. package/contracts/operations/auth.status/input.schema.json +7 -0
  6. package/contracts/operations/auth.status/output.schema.json +132 -0
  7. package/contracts/operations/dam.copy/input.schema.json +19 -0
  8. package/contracts/operations/dam.copy/output.schema.json +19 -0
  9. package/contracts/operations/dam.delete/input.schema.json +23 -0
  10. package/contracts/operations/dam.delete/output.schema.json +6 -0
  11. package/contracts/operations/dam.download/input.schema.json +14 -0
  12. package/contracts/operations/dam.download/output.schema.json +25 -0
  13. package/contracts/operations/dam.folder.list/input.schema.json +15 -0
  14. package/contracts/operations/dam.folder.list/output.schema.json +37 -0
  15. package/contracts/operations/dam.get/input.schema.json +16 -0
  16. package/contracts/operations/dam.get/output.schema.json +46 -0
  17. package/contracts/operations/dam.list/input.schema.json +44 -0
  18. package/contracts/operations/dam.list/output.schema.json +71 -0
  19. package/contracts/operations/dam.move/input.schema.json +19 -0
  20. package/contracts/operations/dam.move/output.schema.json +18 -0
  21. package/contracts/operations/dam.recycle.list/input.schema.json +13 -0
  22. package/contracts/operations/dam.recycle.list/output.schema.json +34 -0
  23. package/contracts/operations/dam.recycle.restore/input.schema.json +14 -0
  24. package/contracts/operations/dam.recycle.restore/output.schema.json +6 -0
  25. package/contracts/operations/dam.rename/input.schema.json +18 -0
  26. package/contracts/operations/dam.rename/output.schema.json +18 -0
  27. package/contracts/operations/dam.repository.list/input.schema.json +8 -0
  28. package/contracts/operations/dam.repository.list/output.schema.json +52 -0
  29. package/contracts/operations/dam.search/input.schema.json +46 -0
  30. package/contracts/operations/dam.search/output.schema.json +71 -0
  31. package/contracts/operations/dam.tag.list/input.schema.json +12 -0
  32. package/contracts/operations/dam.tag.list/output.schema.json +26 -0
  33. package/contracts/operations/dam.upload/input.schema.json +31 -0
  34. package/contracts/operations/dam.upload/output.schema.json +46 -0
  35. package/contracts/operations/editor.apply/input.schema.json +134 -0
  36. package/contracts/operations/editor.apply/output.schema.json +15 -0
  37. package/contracts/operations/editor.connect/input.schema.json +15 -0
  38. package/contracts/operations/editor.connect/output.schema.json +17 -0
  39. package/contracts/operations/editor.disconnect/input.schema.json +8 -0
  40. package/contracts/operations/editor.disconnect/output.schema.json +14 -0
  41. package/contracts/operations/editor.save/input.schema.json +8 -0
  42. package/contracts/operations/editor.save/output.schema.json +23 -0
  43. package/contracts/operations/editor.screenshot/input.schema.json +8 -0
  44. package/contracts/operations/editor.screenshot/output.schema.json +16 -0
  45. package/contracts/operations/editor.snapshot/input.schema.json +8 -0
  46. package/contracts/operations/editor.snapshot/output.schema.json +113 -0
  47. package/contracts/operations/model.get/input.schema.json +18 -0
  48. package/contracts/operations/model.get/output.schema.json +191 -0
  49. package/contracts/operations/model.list/input.schema.json +15 -0
  50. package/contracts/operations/model.list/output.schema.json +111 -0
  51. package/contracts/operations/org.current/input.schema.json +7 -0
  52. package/contracts/operations/org.current/output.schema.json +49 -0
  53. package/contracts/operations/org.list/input.schema.json +7 -0
  54. package/contracts/operations/org.list/output.schema.json +71 -0
  55. package/contracts/operations/tool.call/input.schema.json +35 -0
  56. package/contracts/operations/tool.call/output.schema.json +129 -0
  57. package/contracts/operations/tool.list/input.schema.json +7 -0
  58. package/contracts/operations/tool.list/output.schema.json +45 -0
  59. package/dist/bin/gd-cli.js +60 -0
  60. package/dist/bin/postinstall.js +42 -0
  61. package/dist/src/bootstrap/create-cli.js +112 -0
  62. package/dist/src/bootstrap/create-runtime.js +290 -0
  63. package/dist/src/bootstrap/validators.js +157 -0
  64. package/dist/src/cli/action-binding.js +109 -0
  65. package/dist/src/cli/agent-commands.js +49 -0
  66. package/dist/src/cli/auth-commands.js +55 -0
  67. package/dist/src/cli/dam-commands.js +469 -0
  68. package/dist/src/cli/editor-commands.js +73 -0
  69. package/dist/src/cli/errors.js +157 -0
  70. package/dist/src/cli/model-commands.js +61 -0
  71. package/dist/src/cli/org-commands.js +58 -0
  72. package/dist/src/cli/presenter.js +105 -0
  73. package/dist/src/cli/prompt.js +30 -0
  74. package/dist/src/cli/tool-commands.js +77 -0
  75. package/dist/src/cli/update-command.js +14 -0
  76. package/dist/src/contracts/schema.js +4 -0
  77. package/dist/src/features/agent/creative-agent-adapter.js +36 -0
  78. package/dist/src/features/agent/creative-protocol.js +432 -0
  79. package/dist/src/features/agent/creative-stream.js +127 -0
  80. package/dist/src/features/agent/use-cases.js +150 -0
  81. package/dist/src/features/auth/access-policy.js +101 -0
  82. package/dist/src/features/auth/credential-store.js +62 -0
  83. package/dist/src/features/auth/sso-service.js +194 -0
  84. package/dist/src/features/auth/state.js +129 -0
  85. package/dist/src/features/auth/use-cases.js +136 -0
  86. package/dist/src/features/dam/asset-projection.js +278 -0
  87. package/dist/src/features/dam/dam-api-adapter.js +562 -0
  88. package/dist/src/features/dam/file-downloader.js +242 -0
  89. package/dist/src/features/dam/object-storage.js +193 -0
  90. package/dist/src/features/dam/operation-executor.js +72 -0
  91. package/dist/src/features/dam/registered-uploader.js +247 -0
  92. package/dist/src/features/dam/repository-catalog.js +127 -0
  93. package/dist/src/features/dam/storage-upload.js +141 -0
  94. package/dist/src/features/dam/transient-uploader.js +17 -0
  95. package/dist/src/features/dam/use-cases.js +470 -0
  96. package/dist/src/features/editor/bridge-client.js +109 -0
  97. package/dist/src/features/editor/bridge-process.js +222 -0
  98. package/dist/src/features/editor/bridge-server.js +337 -0
  99. package/dist/src/features/editor/protocol.js +1 -0
  100. package/dist/src/features/editor/public-url.js +36 -0
  101. package/dist/src/features/editor/session-state.js +78 -0
  102. package/dist/src/features/editor/session.js +207 -0
  103. package/dist/src/features/editor/use-cases.js +88 -0
  104. package/dist/src/features/org/org-service.js +76 -0
  105. package/dist/src/features/org/use-cases.js +156 -0
  106. package/dist/src/features/skill/bundled-skills.js +55 -0
  107. package/dist/src/features/skill/installer.js +271 -0
  108. package/dist/src/features/tool/catalog.js +83 -0
  109. package/dist/src/features/tool/dynamic-schema.js +128 -0
  110. package/dist/src/features/tool/mns-catalog-adapter.js +265 -0
  111. package/dist/src/features/tool/tool-api-adapter.js +352 -0
  112. package/dist/src/features/tool/use-cases.js +177 -0
  113. package/dist/src/features/update/latest-version.js +37 -0
  114. package/dist/src/features/update/update-notification.js +262 -0
  115. package/dist/src/features/update/update-service.js +183 -0
  116. package/dist/src/platform/json-input.js +67 -0
  117. package/dist/src/platform/local-json-file.js +59 -0
  118. package/dist/src/platform/open-browser.js +8 -0
  119. package/dist/src/platform/redact.js +80 -0
  120. package/dist/src/platform/remote-error-evidence.js +80 -0
  121. package/dist/src/platform/remote-protocol.js +10 -0
  122. package/dist/src/platform/safe-upload-file.js +146 -0
  123. package/dist/src/platform/signature.js +20 -0
  124. package/dist/src/platform/signed-http-transport.js +143 -0
  125. package/dist/src/platform/url-safety.js +100 -0
  126. package/dist/src/telemetry/invocation.js +156 -0
  127. package/dist/src/telemetry/sls-sink.js +31 -0
  128. package/package.json +54 -8
  129. package/skills/gd-cli/SKILL.md +15 -0
  130. package/skills/gd-cli/references/auth-org.md +9 -0
  131. package/skills/gd-cli/references/creation.md +115 -0
  132. package/skills/gd-cli/references/dam.md +52 -0
  133. package/skills/gd-cli/references/editor.md +254 -0
  134. package/skills/gd-cli/references/errors.md +13 -0
  135. package/skills/gd-cli/references/update.md +13 -0
  136. package/index.js +0 -3
@@ -0,0 +1,157 @@
1
+ import { Ajv2020 } from "ajv/dist/2020.js";
2
+ import addFormatsImport, {} from "ajv-formats";
3
+ import { contractSchema } from "../contracts/schema.js";
4
+ const agentSendInputSchema = contractSchema("agent.send", "input");
5
+ const agentSendOutputSchema = contractSchema("agent.send", "output");
6
+ const authStatusSchema = contractSchema("auth.status", "output");
7
+ const damDeleteInputSchema = contractSchema("dam.delete", "input");
8
+ const damDeleteOutputSchema = contractSchema("dam.delete", "output");
9
+ const damCopyInputSchema = contractSchema("dam.copy", "input");
10
+ const damCopyOutputSchema = contractSchema("dam.copy", "output");
11
+ const damDownloadInputSchema = contractSchema("dam.download", "input");
12
+ const damDownloadOutputSchema = contractSchema("dam.download", "output");
13
+ const damFolderListInputSchema = contractSchema("dam.folder.list", "input");
14
+ const damFolderListOutputSchema = contractSchema("dam.folder.list", "output");
15
+ const damGetInputSchema = contractSchema("dam.get", "input");
16
+ const damGetOutputSchema = contractSchema("dam.get", "output");
17
+ const damListInputSchema = contractSchema("dam.list", "input");
18
+ const damListOutputSchema = contractSchema("dam.list", "output");
19
+ const damMoveInputSchema = contractSchema("dam.move", "input");
20
+ const damMoveOutputSchema = contractSchema("dam.move", "output");
21
+ const damRepositoryListOutputSchema = contractSchema("dam.repository.list", "output");
22
+ const damRenameInputSchema = contractSchema("dam.rename", "input");
23
+ const damRenameOutputSchema = contractSchema("dam.rename", "output");
24
+ const damSearchInputSchema = contractSchema("dam.search", "input");
25
+ const damSearchOutputSchema = contractSchema("dam.search", "output");
26
+ const damTagListInputSchema = contractSchema("dam.tag.list", "input");
27
+ const damTagListOutputSchema = contractSchema("dam.tag.list", "output");
28
+ const damUploadInputSchema = contractSchema("dam.upload", "input");
29
+ const damUploadOutputSchema = contractSchema("dam.upload", "output");
30
+ const editorApplyInputSchema = contractSchema("editor.apply", "input");
31
+ const editorApplyOutputSchema = contractSchema("editor.apply", "output");
32
+ const editorConnectInputSchema = contractSchema("editor.connect", "input");
33
+ const editorConnectOutputSchema = contractSchema("editor.connect", "output");
34
+ const editorDisconnectOutputSchema = contractSchema("editor.disconnect", "output");
35
+ const editorSaveOutputSchema = contractSchema("editor.save", "output");
36
+ const editorScreenshotOutputSchema = contractSchema("editor.screenshot", "output");
37
+ const editorSnapshotOutputSchema = contractSchema("editor.snapshot", "output");
38
+ const orgCurrentSchema = contractSchema("org.current", "output");
39
+ const orgListSchema = contractSchema("org.list", "output");
40
+ const modelGetInputSchema = contractSchema("model.get", "input");
41
+ const modelGetOutputSchema = contractSchema("model.get", "output");
42
+ const modelListInputSchema = contractSchema("model.list", "input");
43
+ const modelListOutputSchema = contractSchema("model.list", "output");
44
+ const toolCallInputSchema = contractSchema("tool.call", "input");
45
+ const toolCallOutputSchema = contractSchema("tool.call", "output");
46
+ const toolListOutputSchema = contractSchema("tool.list", "output");
47
+ export class InputContractError extends Error {
48
+ constructor() {
49
+ super("输入不符合命令契约。");
50
+ this.name = "InputContractError";
51
+ }
52
+ }
53
+ export class OutputContractError extends Error {
54
+ constructor() {
55
+ super("命令结果不符合公开契约。");
56
+ this.name = "OutputContractError";
57
+ }
58
+ }
59
+ export function createContractValidators() {
60
+ const ajv = new Ajv2020({ allErrors: true, strict: true });
61
+ const addFormats = addFormatsImport;
62
+ addFormats(ajv);
63
+ const agentSendInput = ajv.compile(agentSendInputSchema);
64
+ const agentSendOutput = ajv.compile(agentSendOutputSchema);
65
+ const authStatus = ajv.compile(authStatusSchema);
66
+ const damFolderListInput = ajv.compile(damFolderListInputSchema);
67
+ const damFolderListOutput = ajv.compile(damFolderListOutputSchema);
68
+ const damListInput = ajv.compile(damListInputSchema);
69
+ const damListOutput = ajv.compile(damListOutputSchema);
70
+ const damRepositoryListOutput = ajv.compile(damRepositoryListOutputSchema);
71
+ const damRenameInput = ajv.compile(damRenameInputSchema);
72
+ const damRenameOutput = ajv.compile(damRenameOutputSchema);
73
+ const damMoveInput = ajv.compile(damMoveInputSchema);
74
+ const damMoveOutput = ajv.compile(damMoveOutputSchema);
75
+ const damCopyInput = ajv.compile(damCopyInputSchema);
76
+ const damCopyOutput = ajv.compile(damCopyOutputSchema);
77
+ const damSearchInput = ajv.compile(damSearchInputSchema);
78
+ const damSearchOutput = ajv.compile(damSearchOutputSchema);
79
+ const damTagListInput = ajv.compile(damTagListInputSchema);
80
+ const damTagListOutput = ajv.compile(damTagListOutputSchema);
81
+ const damGetInput = ajv.compile(damGetInputSchema);
82
+ const damGetOutput = ajv.compile(damGetOutputSchema);
83
+ const damUploadInput = ajv.compile(damUploadInputSchema);
84
+ const damUploadOutput = ajv.compile(damUploadOutputSchema);
85
+ const damDeleteInput = ajv.compile(damDeleteInputSchema);
86
+ const damDeleteOutput = ajv.compile(damDeleteOutputSchema);
87
+ const damDownloadInput = ajv.compile(damDownloadInputSchema);
88
+ const damDownloadOutput = ajv.compile(damDownloadOutputSchema);
89
+ const editorConnectInput = ajv.compile(editorConnectInputSchema);
90
+ const editorConnectOutput = ajv.compile(editorConnectOutputSchema);
91
+ const editorDisconnectOutput = ajv.compile(editorDisconnectOutputSchema);
92
+ const editorSnapshotOutput = ajv.compile(editorSnapshotOutputSchema);
93
+ const editorApplyInput = ajv.compile(editorApplyInputSchema);
94
+ const editorApplyOutput = ajv.compile(editorApplyOutputSchema);
95
+ const editorScreenshotOutput = ajv.compile(editorScreenshotOutputSchema);
96
+ const editorSaveOutput = ajv.compile(editorSaveOutputSchema);
97
+ const orgList = ajv.compile(orgListSchema);
98
+ const orgCurrent = ajv.compile(orgCurrentSchema);
99
+ const toolListOutput = ajv.compile(toolListOutputSchema);
100
+ const modelListInput = ajv.compile(modelListInputSchema);
101
+ const modelListOutput = ajv.compile(modelListOutputSchema);
102
+ const modelGetInput = ajv.compile(modelGetInputSchema);
103
+ const modelGetOutput = ajv.compile(modelGetOutputSchema);
104
+ const toolCallInput = ajv.compile(toolCallInputSchema);
105
+ const toolCallOutput = ajv.compile(toolCallOutputSchema);
106
+ return {
107
+ agentSendInput: assertion(agentSendInput, InputContractError),
108
+ agentSendOutput: assertion(agentSendOutput, OutputContractError),
109
+ authStatus: assertion(authStatus, OutputContractError),
110
+ damRepositoryListOutput: assertion(damRepositoryListOutput, OutputContractError),
111
+ damListInput: assertion(damListInput, InputContractError),
112
+ damListOutput: assertion(damListOutput, OutputContractError),
113
+ damSearchInput: assertion(damSearchInput, InputContractError),
114
+ damSearchOutput: assertion(damSearchOutput, OutputContractError),
115
+ damFolderListInput: assertion(damFolderListInput, InputContractError),
116
+ damFolderListOutput: assertion(damFolderListOutput, OutputContractError),
117
+ damTagListInput: assertion(damTagListInput, InputContractError),
118
+ damTagListOutput: assertion(damTagListOutput, OutputContractError),
119
+ damGetInput: assertion(damGetInput, InputContractError),
120
+ damGetOutput: assertion(damGetOutput, OutputContractError),
121
+ damUploadInput: assertion(damUploadInput, InputContractError),
122
+ damUploadOutput: assertion(damUploadOutput, OutputContractError),
123
+ damDeleteInput: assertion(damDeleteInput, InputContractError),
124
+ damDeleteOutput: assertion(damDeleteOutput, OutputContractError),
125
+ damDownloadInput: assertion(damDownloadInput, InputContractError),
126
+ damDownloadOutput: assertion(damDownloadOutput, OutputContractError),
127
+ damRenameInput: assertion(damRenameInput, InputContractError),
128
+ damRenameOutput: assertion(damRenameOutput, OutputContractError),
129
+ damMoveInput: assertion(damMoveInput, InputContractError),
130
+ damMoveOutput: assertion(damMoveOutput, OutputContractError),
131
+ damCopyInput: assertion(damCopyInput, InputContractError),
132
+ damCopyOutput: assertion(damCopyOutput, OutputContractError),
133
+ editorConnectInput: assertion(editorConnectInput, InputContractError),
134
+ editorConnectOutput: assertion(editorConnectOutput, OutputContractError),
135
+ editorDisconnectOutput: assertion(editorDisconnectOutput, OutputContractError),
136
+ editorSnapshotOutput: assertion(editorSnapshotOutput, OutputContractError),
137
+ editorApplyInput: assertion(editorApplyInput, InputContractError),
138
+ editorApplyOutput: assertion(editorApplyOutput, OutputContractError),
139
+ editorScreenshotOutput: assertion(editorScreenshotOutput, OutputContractError),
140
+ editorSaveOutput: assertion(editorSaveOutput, OutputContractError),
141
+ orgList: assertion(orgList, OutputContractError),
142
+ orgCurrent: assertion(orgCurrent, OutputContractError),
143
+ toolListOutput: assertion(toolListOutput, OutputContractError),
144
+ modelListInput: assertion(modelListInput, InputContractError),
145
+ modelListOutput: assertion(modelListOutput, OutputContractError),
146
+ modelGetInput: assertion(modelGetInput, InputContractError),
147
+ modelGetOutput: assertion(modelGetOutput, OutputContractError),
148
+ toolCallInput: assertion(toolCallInput, InputContractError),
149
+ toolCallOutput: assertion(toolCallOutput, OutputContractError)
150
+ };
151
+ }
152
+ function assertion(validate, ErrorType) {
153
+ return (value) => {
154
+ if (!validate(value))
155
+ throw new ErrorType();
156
+ };
157
+ }
@@ -0,0 +1,109 @@
1
+ const environments = new WeakMap();
2
+ const boundPolicies = new WeakMap();
3
+ export function configureActionEnvironment(program, environment) {
4
+ environments.set(program, environment);
5
+ }
6
+ export function bindAction(command, policy, handler, telemetry) {
7
+ if (boundPolicies.has(command))
8
+ throw new Error(`Action already bound: ${commandPath(command)}`);
9
+ boundPolicies.set(command, policy);
10
+ bindTelemetrySelection(command, telemetry);
11
+ command.action(async () => {
12
+ const environment = environments.get(rootCommand(command));
13
+ if (!environment)
14
+ throw new Error("CLI action environment is missing.");
15
+ await checkUpdateNotification(environment, telemetry);
16
+ const context = await environment.telemetry.stage("access", async () => {
17
+ const authorized = await environment.policies[policy].authorize(environment.signal);
18
+ if (authorized.policy !== policy) {
19
+ throw new Error("Access policy returned the wrong context.");
20
+ }
21
+ return authorized;
22
+ });
23
+ annotateAccessContext(environment.telemetry, context);
24
+ await handler(context, environment.signal);
25
+ });
26
+ }
27
+ export function bindPreparedAction(command, policy, prepare, run, telemetry) {
28
+ if (boundPolicies.has(command))
29
+ throw new Error(`Action already bound: ${commandPath(command)}`);
30
+ boundPolicies.set(command, policy);
31
+ bindTelemetrySelection(command, telemetry);
32
+ command.action(async () => {
33
+ const environment = environments.get(rootCommand(command));
34
+ if (!environment)
35
+ throw new Error("CLI action environment is missing.");
36
+ await checkUpdateNotification(environment, telemetry);
37
+ const prepared = await environment.telemetry.stage("input", () => prepare(environment.signal));
38
+ if (prepared.handled)
39
+ return;
40
+ const context = await environment.telemetry.stage("access", async () => {
41
+ const authorized = await environment.policies[policy].authorize(environment.signal);
42
+ if (authorized.policy !== policy) {
43
+ throw new Error("Access policy returned the wrong context.");
44
+ }
45
+ return authorized;
46
+ });
47
+ annotateAccessContext(environment.telemetry, context);
48
+ await run(context, prepared.input, environment.signal);
49
+ });
50
+ }
51
+ async function checkUpdateNotification(environment, telemetry) {
52
+ if (telemetry?.operation === "update")
53
+ return;
54
+ try {
55
+ await environment.updateNotification.check(environment.signal);
56
+ }
57
+ catch {
58
+ // Version availability must never change the requested command outcome.
59
+ }
60
+ }
61
+ export function assertAllLeafCommandsBound(program) {
62
+ for (const command of leafCommands(program)) {
63
+ if (!boundPolicies.has(command)) {
64
+ throw new Error(`Leaf command is missing an access policy: ${commandPath(command)}`);
65
+ }
66
+ }
67
+ }
68
+ function leafCommands(command) {
69
+ if (command.commands.length === 0)
70
+ return [command];
71
+ return command.commands.flatMap(leafCommands);
72
+ }
73
+ function rootCommand(command) {
74
+ let current = command;
75
+ while (current.parent)
76
+ current = current.parent;
77
+ return current;
78
+ }
79
+ function bindTelemetrySelection(command, definition) {
80
+ if (!definition)
81
+ return;
82
+ if (!command.parent)
83
+ throw new Error(`Telemetry command has no parent: ${command.name()}`);
84
+ command.parent.hook("preSubcommand", (parent, selected) => {
85
+ if (selected !== command)
86
+ return;
87
+ const environment = environments.get(rootCommand(parent));
88
+ if (!environment)
89
+ throw new Error("CLI action environment is missing.");
90
+ environment.telemetry.select(definition);
91
+ });
92
+ }
93
+ function annotateAccessContext(telemetry, context) {
94
+ if (context.policy === "none")
95
+ return;
96
+ telemetry.annotate({
97
+ account_id: context.state.account?.id,
98
+ organization_id: context.state.organization?.id
99
+ });
100
+ }
101
+ function commandPath(command) {
102
+ const names = [];
103
+ let current = command;
104
+ while (current) {
105
+ names.unshift(current.name());
106
+ current = current.parent;
107
+ }
108
+ return names.join(" ");
109
+ }
@@ -0,0 +1,49 @@
1
+ import { contractSchema } from "../contracts/schema.js";
2
+ import { bindPreparedAction } from "./action-binding.js";
3
+ import { CliUsageError } from "./errors.js";
4
+ const agentSendInputSchema = contractSchema("agent.send", "input");
5
+ export function registerAgentCommands(program, runtime) {
6
+ const agent = program.command("agent")
7
+ .description("稿定 Agent")
8
+ .helpCommand(false);
9
+ const send = agent.command("send")
10
+ .description("发送结构化创作消息")
11
+ .option("--schema", "输出输入 Schema")
12
+ .option("--input <file|->", "从文件或标准输入读取 JSON")
13
+ .allowExcessArguments(false);
14
+ bindPreparedAction(send, "organization", async (signal) => {
15
+ signal.throwIfAborted();
16
+ const options = send.opts();
17
+ const modes = Number(options.schema === true) + Number(options.input !== undefined);
18
+ if (modes !== 1)
19
+ throw new CliUsageError();
20
+ if (options.schema === true) {
21
+ await runtime.telemetry.stage("output", async () => {
22
+ runtime.io.writeOut(`${JSON.stringify(agentSendInputSchema)}\n`);
23
+ });
24
+ return { handled: true };
25
+ }
26
+ const input = await runtime.jsonInput.read(options.input, signal);
27
+ runtime.validators.agentSendInput(input);
28
+ runtime.telemetry.annotate({ parameters: { ...input } });
29
+ return { handled: false, input };
30
+ }, async (context, input, signal) => {
31
+ const result = await runtime.agent.send({
32
+ input,
33
+ access: {
34
+ credential: context.state.credential,
35
+ organizationId: context.state.organization.id
36
+ },
37
+ signal
38
+ });
39
+ await runtime.telemetry.stage("output", async () => {
40
+ runtime.validators.agentSendOutput(result);
41
+ runtime.io.writeOut(`${JSON.stringify(result)}\n`);
42
+ });
43
+ }, {
44
+ operation: "agent.send",
45
+ mode: () => send.opts().schema === true
46
+ ? "schema"
47
+ : "execute"
48
+ });
49
+ }
@@ -0,0 +1,55 @@
1
+ import { bindAction } from "./action-binding.js";
2
+ import { authStatusView } from "./presenter.js";
3
+ export function registerAuthCommands(program, runtime) {
4
+ const auth = program.command("auth")
5
+ .description("登录与本机凭证")
6
+ .helpCommand(false);
7
+ const login = leaf(auth.command("login"))
8
+ .description("登录稿定")
9
+ .option("--no-browser", "不自动打开浏览器");
10
+ bindAction(login, "none", async (_context, signal) => {
11
+ const noBrowser = login.opts().browser === false;
12
+ runtime.telemetry.annotate({ parameters: { noBrowser } });
13
+ const result = await runtime.auth.login({
14
+ noBrowser,
15
+ signal,
16
+ interaction: {
17
+ showAuthorization: (url) => runtime.presenter.authorization({
18
+ url,
19
+ terminal: runtime.io.stderrTerminal
20
+ }),
21
+ openBrowser: (url) => runtime.browser.open(url),
22
+ warn: (message) => runtime.presenter.warning(message)
23
+ }
24
+ });
25
+ await runtime.telemetry.stage("output", async () => {
26
+ runtime.presenter.success(result.status === "already_logged_in" ? "已登录。" : "登录成功。");
27
+ if (result.status === "already_logged_in" && !result.organizationSelected) {
28
+ runtime.presenter.warning("尚未选择组织,请执行 gd-cli org switch。");
29
+ }
30
+ });
31
+ }, { operation: "auth.login" });
32
+ const status = leaf(auth.command("status"))
33
+ .description("查看登录状态")
34
+ .option("--json", "输出 JSON");
35
+ bindAction(status, "none", async () => {
36
+ const result = await runtime.auth.status({ now: runtime.now() });
37
+ await runtime.telemetry.stage("output", async () => {
38
+ runtime.validators.authStatus(result);
39
+ runtime.presenter.result(result, {
40
+ json: status.opts().json === true,
41
+ view: authStatusView
42
+ });
43
+ });
44
+ }, { operation: "auth.status" });
45
+ const logout = leaf(auth.command("logout")).description("退出登录");
46
+ bindAction(logout, "none", async () => {
47
+ await runtime.auth.logout();
48
+ await runtime.telemetry.stage("output", async () => {
49
+ runtime.presenter.success("已退出登录。");
50
+ });
51
+ }, { operation: "auth.logout" });
52
+ }
53
+ function leaf(command) {
54
+ return command.allowExcessArguments(false);
55
+ }