aipctl 2026.9.10 → 2026.10.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.
- package/build/index.cjs +96 -38
- package/docs/api-contract-inventory.md +5 -4
- package/package.json +3 -3
package/build/index.cjs
CHANGED
|
@@ -89670,7 +89670,7 @@ const injectedBuildEnv = "dev".length > 0 ? "dev" : "local";
|
|
|
89670
89670
|
if (!isBuildEnv(injectedBuildEnv)) {
|
|
89671
89671
|
throw new Error(`Invalid AIPCTL_BUILD_ENV: ${injectedBuildEnv}`);
|
|
89672
89672
|
}
|
|
89673
|
-
const VERSION = "2026.
|
|
89673
|
+
const VERSION = "2026.10.1".length > 0 ? "2026.10.1" : "0.0.0";
|
|
89674
89674
|
const BUILD_ENV = injectedBuildEnv;
|
|
89675
89675
|
const INCLUDE_NATIVE_LOGS = BUILD_ENV !== "prod";
|
|
89676
89676
|
|
|
@@ -89732,6 +89732,19 @@ const isNativeCommandEnabled = (command, includeLogs = INCLUDE_NATIVE_LOGS) => {
|
|
|
89732
89732
|
const FORCED_ARGS_SEPARATOR = "--";
|
|
89733
89733
|
const NATIVE_ROOT_COMMANDS = new Set(nativeCommandNames);
|
|
89734
89734
|
const trailingOptionSpecs = [
|
|
89735
|
+
...["list", "get"].map((command) => ({
|
|
89736
|
+
command: ["automation", command],
|
|
89737
|
+
booleanOptions: /* @__PURE__ */ new Set(["--json"]),
|
|
89738
|
+
valueOptions: /* @__PURE__ */ new Set(["--org", ...command === "list" ? ["--name"] : []]),
|
|
89739
|
+
explicitBooleanValues: true
|
|
89740
|
+
})),
|
|
89741
|
+
{
|
|
89742
|
+
command: ["automation", "delete"],
|
|
89743
|
+
booleanOptions: /* @__PURE__ */ new Set(["--force", "-f"]),
|
|
89744
|
+
valueOptions: /* @__PURE__ */ new Set(["--org"]),
|
|
89745
|
+
explicitBooleanValues: true,
|
|
89746
|
+
booleanAliases: { "-f": "--force" }
|
|
89747
|
+
},
|
|
89735
89748
|
{
|
|
89736
89749
|
command: ["drive", "delete"],
|
|
89737
89750
|
booleanOptions: /* @__PURE__ */ new Set(["--force", "-f"]),
|
|
@@ -89766,6 +89779,19 @@ const normalizeTrailingOptions = (args, spec) => {
|
|
|
89766
89779
|
if (arg === void 0) {
|
|
89767
89780
|
continue;
|
|
89768
89781
|
}
|
|
89782
|
+
if (spec.explicitBooleanValues && spec.booleanOptions.has(getOptionName(arg))) {
|
|
89783
|
+
const nextArg = args[index + 1];
|
|
89784
|
+
const optionName = spec.booleanAliases?.[getOptionName(arg)] ?? getOptionName(arg);
|
|
89785
|
+
if (arg.includes("=")) {
|
|
89786
|
+
options.push(`${optionName}${arg.slice(arg.indexOf("="))}`);
|
|
89787
|
+
} else if (nextArg === "true" || nextArg === "false") {
|
|
89788
|
+
options.push(`${optionName}=${nextArg}`);
|
|
89789
|
+
index += 1;
|
|
89790
|
+
} else {
|
|
89791
|
+
options.push(`${optionName}=true`);
|
|
89792
|
+
}
|
|
89793
|
+
continue;
|
|
89794
|
+
}
|
|
89769
89795
|
if (isBooleanOption(arg, spec)) {
|
|
89770
89796
|
options.push(arg);
|
|
89771
89797
|
continue;
|
|
@@ -89837,7 +89863,22 @@ const implementedCommandOperationIds = /* @__PURE__ */ new Set([
|
|
|
89837
89863
|
"getCliDriveUsage",
|
|
89838
89864
|
"createCliDriveFolder",
|
|
89839
89865
|
"updateCliDriveEntryName",
|
|
89840
|
-
"deleteCliDriveEntries"
|
|
89866
|
+
"deleteCliDriveEntries",
|
|
89867
|
+
"listCliChats",
|
|
89868
|
+
"getCliChat",
|
|
89869
|
+
"listCliChatMessages",
|
|
89870
|
+
"listCliIntegrations",
|
|
89871
|
+
"listCliAvailableIntegrations",
|
|
89872
|
+
"getCliAdminIntegration",
|
|
89873
|
+
"listCliIntegrationTools",
|
|
89874
|
+
"listCliAutomations",
|
|
89875
|
+
"getCliAutomation",
|
|
89876
|
+
"listCliAutomationTriggers",
|
|
89877
|
+
"listCliAutomationHistory",
|
|
89878
|
+
"createCliAutomation",
|
|
89879
|
+
"updateCliAutomation",
|
|
89880
|
+
"deleteCliAutomation",
|
|
89881
|
+
"updateCliAutomationStatus"
|
|
89841
89882
|
]);
|
|
89842
89883
|
const releaseEnabledCommandOperationIds = /* @__PURE__ */ new Set([
|
|
89843
89884
|
"listCliAgents",
|
|
@@ -89872,7 +89913,22 @@ const releaseEnabledCommandOperationIds = /* @__PURE__ */ new Set([
|
|
|
89872
89913
|
"getCliDriveUsage",
|
|
89873
89914
|
"createCliDriveFolder",
|
|
89874
89915
|
"updateCliDriveEntryName",
|
|
89875
|
-
"deleteCliDriveEntries"
|
|
89916
|
+
"deleteCliDriveEntries",
|
|
89917
|
+
"listCliChats",
|
|
89918
|
+
"getCliChat",
|
|
89919
|
+
"listCliChatMessages",
|
|
89920
|
+
"listCliIntegrations",
|
|
89921
|
+
"listCliAvailableIntegrations",
|
|
89922
|
+
"getCliAdminIntegration",
|
|
89923
|
+
"listCliIntegrationTools",
|
|
89924
|
+
"listCliAutomations",
|
|
89925
|
+
"getCliAutomation",
|
|
89926
|
+
"listCliAutomationTriggers",
|
|
89927
|
+
"listCliAutomationHistory",
|
|
89928
|
+
"createCliAutomation",
|
|
89929
|
+
"updateCliAutomation",
|
|
89930
|
+
"deleteCliAutomation",
|
|
89931
|
+
"updateCliAutomationStatus"
|
|
89876
89932
|
]);
|
|
89877
89933
|
const direct = (commands, operation) => commands.map((command) => ({
|
|
89878
89934
|
command,
|
|
@@ -93877,6 +93933,10 @@ function maskSensitiveData(value, options = {}, context = {}) {
|
|
|
93877
93933
|
const shouldUseMaskedCommand = typeof record.command === "string" && typeof record.maskedCommand === "string";
|
|
93878
93934
|
for (const [key, entry] of Object.entries(record)) {
|
|
93879
93935
|
const normalizedKey = normalizeKey(key);
|
|
93936
|
+
if (normalizedKey === "secretconfigured" && typeof entry === "boolean" && !context.forceMaskPrimitives) {
|
|
93937
|
+
masked[key] = entry;
|
|
93938
|
+
continue;
|
|
93939
|
+
}
|
|
93880
93940
|
if (normalizedKey === COMMAND_KEY && shouldUseMaskedCommand) {
|
|
93881
93941
|
masked[key] = record.maskedCommand;
|
|
93882
93942
|
continue;
|
|
@@ -94608,24 +94668,8 @@ function resolveTriggerMetadataRequest(triggerProviderType, options = {}) {
|
|
|
94608
94668
|
}
|
|
94609
94669
|
}
|
|
94610
94670
|
function buildTriggerProviderMetadataPath(orgSlug, request) {
|
|
94611
|
-
const
|
|
94612
|
-
|
|
94613
|
-
case "GMAIL":
|
|
94614
|
-
case "OUTLOOK": {
|
|
94615
|
-
const params = new URLSearchParams({ accountId: request.options.accountId });
|
|
94616
|
-
return `${basePath}/${encodeURIComponent(request.triggerProviderType)}/metadata?${params.toString()}`;
|
|
94617
|
-
}
|
|
94618
|
-
case "google-drive":
|
|
94619
|
-
case "box": {
|
|
94620
|
-
const params = new URLSearchParams({
|
|
94621
|
-
accountId: request.options.accountId,
|
|
94622
|
-
folderId: request.options.folderId
|
|
94623
|
-
});
|
|
94624
|
-
return `${basePath}/${encodeURIComponent(request.triggerProviderType)}/metadata?${params.toString()}`;
|
|
94625
|
-
}
|
|
94626
|
-
case "webhook":
|
|
94627
|
-
return `${basePath}/webhook/${encodeURIComponent(request.options.serviceType)}/metadata`;
|
|
94628
|
-
}
|
|
94671
|
+
const params = new URLSearchParams({ type: request.triggerProviderType, ...request.options });
|
|
94672
|
+
return `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations/triggers?${params.toString()}`;
|
|
94629
94673
|
}
|
|
94630
94674
|
function normalizeSharedUserList(sharedUserList) {
|
|
94631
94675
|
return sharedUserList?.map((user, index) => {
|
|
@@ -95349,11 +95393,12 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95349
95393
|
// Phase 3: Automation
|
|
95350
95394
|
listAutomations: (orgSlug, options) => gen(function* () {
|
|
95351
95395
|
const token = yield* getAccessToken();
|
|
95396
|
+
yield* requireReleaseEnabledOperation("listCliAutomations");
|
|
95352
95397
|
const params = new URLSearchParams();
|
|
95353
95398
|
params.set("pageNumber", String(options?.pageNumber ?? 1));
|
|
95354
95399
|
params.set("pageSize", String(options?.pageSize ?? 50));
|
|
95355
95400
|
if (options?.name) params.set("name", options.name);
|
|
95356
|
-
const path = `/api/
|
|
95401
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations?${params.toString()}`;
|
|
95357
95402
|
const response = yield* makeRequest(baseUrl, path, token);
|
|
95358
95403
|
return {
|
|
95359
95404
|
...response,
|
|
@@ -95367,18 +95412,20 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95367
95412
|
}),
|
|
95368
95413
|
updateAutomationStatus: (orgSlug, automationId, status) => gen(function* () {
|
|
95369
95414
|
const token = yield* getAccessToken();
|
|
95370
|
-
|
|
95415
|
+
yield* requireReleaseEnabledOperation("updateCliAutomationStatus");
|
|
95416
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations/${encodeURIComponent(automationId)}/status`;
|
|
95371
95417
|
return yield* makeRequest(baseUrl, path, token, {
|
|
95372
|
-
method: "
|
|
95418
|
+
method: "PATCH",
|
|
95373
95419
|
body: { status }
|
|
95374
95420
|
});
|
|
95375
95421
|
}),
|
|
95376
95422
|
listAutomationHistories: (orgSlug, automationId, options) => gen(function* () {
|
|
95377
95423
|
const token = yield* getAccessToken();
|
|
95424
|
+
yield* requireReleaseEnabledOperation("listCliAutomationHistory");
|
|
95378
95425
|
const params = new URLSearchParams();
|
|
95379
95426
|
params.set("pageNumber", String(options?.pageNumber ?? 1));
|
|
95380
95427
|
params.set("pageSize", String(options?.pageSize ?? 20));
|
|
95381
|
-
const path = `/api/
|
|
95428
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations/${encodeURIComponent(automationId)}/history?${params.toString()}`;
|
|
95382
95429
|
const response = yield* makeRequest(baseUrl, path, token);
|
|
95383
95430
|
return {
|
|
95384
95431
|
...response,
|
|
@@ -95387,12 +95434,14 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95387
95434
|
}),
|
|
95388
95435
|
getAutomation: (orgSlug, automationId) => gen(function* () {
|
|
95389
95436
|
const token = yield* getAccessToken();
|
|
95390
|
-
|
|
95437
|
+
yield* requireReleaseEnabledOperation("getCliAutomation");
|
|
95438
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations/${encodeURIComponent(automationId)}`;
|
|
95391
95439
|
return yield* makeRequest(baseUrl, path, token);
|
|
95392
95440
|
}),
|
|
95393
95441
|
createAutomation: (orgSlug, body) => gen(function* () {
|
|
95394
95442
|
const token = yield* getAccessToken();
|
|
95395
|
-
|
|
95443
|
+
yield* requireReleaseEnabledOperation("createCliAutomation");
|
|
95444
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations`;
|
|
95396
95445
|
return yield* makeRequest(baseUrl, path, token, {
|
|
95397
95446
|
method: "POST",
|
|
95398
95447
|
body
|
|
@@ -95400,7 +95449,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95400
95449
|
}),
|
|
95401
95450
|
updateAutomation: (orgSlug, automationId, body) => gen(function* () {
|
|
95402
95451
|
const token = yield* getAccessToken();
|
|
95403
|
-
|
|
95452
|
+
yield* requireReleaseEnabledOperation("updateCliAutomation");
|
|
95453
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations/${encodeURIComponent(automationId)}`;
|
|
95404
95454
|
return yield* makeRequest(baseUrl, path, token, {
|
|
95405
95455
|
method: "PUT",
|
|
95406
95456
|
body
|
|
@@ -95408,7 +95458,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95408
95458
|
}),
|
|
95409
95459
|
deleteAutomation: (orgSlug, automationId) => gen(function* () {
|
|
95410
95460
|
const token = yield* getAccessToken();
|
|
95411
|
-
|
|
95461
|
+
yield* requireReleaseEnabledOperation("deleteCliAutomation");
|
|
95462
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/automations/${encodeURIComponent(automationId)}`;
|
|
95412
95463
|
return yield* makeRequest(baseUrl, path, token, { method: "DELETE" });
|
|
95413
95464
|
}),
|
|
95414
95465
|
cancelAutomationHistory: (orgSlug, automationId, historySeq) => gen(function* () {
|
|
@@ -95586,7 +95637,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95586
95637
|
}),
|
|
95587
95638
|
listIntegrations: (orgSlug) => gen(function* () {
|
|
95588
95639
|
const token = yield* getAccessToken();
|
|
95589
|
-
|
|
95640
|
+
yield* requireReleaseEnabledOperation("listCliIntegrations");
|
|
95641
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/integrations`;
|
|
95590
95642
|
return yield* makeRequest(baseUrl, path, token);
|
|
95591
95643
|
}),
|
|
95592
95644
|
testIntegration: (orgSlug, integrationId) => gen(function* () {
|
|
@@ -95608,22 +95660,25 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95608
95660
|
listConversations: (orgSlug, options) => gen(function* () {
|
|
95609
95661
|
yield* requireChatBaseUrlEffect();
|
|
95610
95662
|
const token = yield* getAccessToken();
|
|
95663
|
+
yield* requireReleaseEnabledOperation("listCliChats");
|
|
95611
95664
|
const params = new URLSearchParams();
|
|
95612
95665
|
if (options?.cursor) params.set("cursor", options.cursor);
|
|
95613
95666
|
const query = params.toString();
|
|
95614
|
-
const path = `/
|
|
95667
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/chats${query ? `?${query}` : ""}`;
|
|
95615
95668
|
return yield* makeRequest(chatBaseUrl, path, token);
|
|
95616
95669
|
}),
|
|
95617
95670
|
getConversation: (orgSlug, conversationId) => gen(function* () {
|
|
95618
95671
|
yield* requireChatBaseUrlEffect();
|
|
95619
95672
|
const token = yield* getAccessToken();
|
|
95620
|
-
|
|
95673
|
+
yield* requireReleaseEnabledOperation("getCliChat");
|
|
95674
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/chats/${encodeURIComponent(conversationId)}`;
|
|
95621
95675
|
return yield* makeRequest(chatBaseUrl, path, token);
|
|
95622
95676
|
}),
|
|
95623
95677
|
listMessages: (orgSlug, conversationId) => gen(function* () {
|
|
95624
95678
|
yield* requireChatBaseUrlEffect();
|
|
95625
95679
|
const token = yield* getAccessToken();
|
|
95626
|
-
|
|
95680
|
+
yield* requireReleaseEnabledOperation("listCliChatMessages");
|
|
95681
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/chats/${encodeURIComponent(conversationId)}/messages`;
|
|
95627
95682
|
return yield* makeRequest(chatBaseUrl, path, token);
|
|
95628
95683
|
}),
|
|
95629
95684
|
sendChatMessage: (orgSlug, body) => gen(function* () {
|
|
@@ -95765,6 +95820,7 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95765
95820
|
}),
|
|
95766
95821
|
getTriggerProviderMetadata: (orgSlug, triggerProviderType, options) => gen(function* () {
|
|
95767
95822
|
const token = yield* getAccessToken();
|
|
95823
|
+
yield* requireReleaseEnabledOperation("listCliAutomationTriggers");
|
|
95768
95824
|
const request = yield* try_({
|
|
95769
95825
|
try: () => resolveTriggerMetadataRequest(triggerProviderType, options),
|
|
95770
95826
|
catch: (error) => apiErrorFromUnknown(error, "Invalid trigger provider metadata request")
|
|
@@ -95778,7 +95834,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95778
95834
|
// Integration CRUD
|
|
95779
95835
|
getIntegration: (orgSlug, id) => gen(function* () {
|
|
95780
95836
|
const token = yield* getAccessToken();
|
|
95781
|
-
|
|
95837
|
+
yield* requireReleaseEnabledOperation("getCliAdminIntegration");
|
|
95838
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/admin/integrations/${encodeURIComponent(id)}`;
|
|
95782
95839
|
const response = yield* makeRequest(baseUrl, path, token);
|
|
95783
95840
|
return {
|
|
95784
95841
|
...response,
|
|
@@ -95798,14 +95855,15 @@ const makeApiServiceLive = (buildEnv) => effect$1(
|
|
|
95798
95855
|
}),
|
|
95799
95856
|
listIntegrationTools: (orgSlug, id) => gen(function* () {
|
|
95800
95857
|
const token = yield* getAccessToken();
|
|
95801
|
-
|
|
95858
|
+
yield* requireReleaseEnabledOperation("listCliIntegrationTools");
|
|
95859
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/admin/integrations/${encodeURIComponent(id)}/tools`;
|
|
95802
95860
|
return yield* makeRequest(baseUrl, path, token);
|
|
95803
95861
|
}),
|
|
95804
95862
|
listConfigurableIntegrations: (orgSlug) => gen(function* () {
|
|
95805
95863
|
const token = yield* getAccessToken();
|
|
95806
|
-
|
|
95807
|
-
const
|
|
95808
|
-
return
|
|
95864
|
+
yield* requireReleaseEnabledOperation("listCliAvailableIntegrations");
|
|
95865
|
+
const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/admin/integrations/available`;
|
|
95866
|
+
return yield* makeRequest(baseUrl, path, token);
|
|
95809
95867
|
}),
|
|
95810
95868
|
// Audit event types
|
|
95811
95869
|
listAuditEventTypes: () => gen(function* () {
|
|
@@ -53,11 +53,12 @@
|
|
|
53
53
|
| P0-AGENT-02 | agent-admin | `aipctl admin agent create`, `update`, `delete`, `share`, `templates`; `aipctl agent enable`, `disable` | `createInstalledAgent`, `updateInstalledAgent`, `deleteInstalledAgent`, `getInstalledAgentShare`, `listAgentTemplates`, `updateInstalledAgentStatus` | api | `POST`, `PATCH`, `DELETE`, `GET`, `GET`, `PATCH` | `/api/cli/v1/organizations/{organizationSlug}/agents`; `/{installedAgentId}`; `/{installedAgentId}/share`; `/templates`; `/{installedAgentId}/status` | existing create/update/status bodies; templates collect bounded pages and retain the full catalog; share is read-only | create/update `{ id }`, void mutation responses, existing CLI template/share mapping | `resource/oas/modules/backend/cli/openapi.yaml`; shared legacy DTO refs | `backend/api/.../cli/generated/api/CliAgentApi.kt` | `generated-ready` | `P0` | `migrate` | none; AI operator/workflow/audit policy stays in existing domain owner | `AI-6344` | all eight operations capability/path tests, mutation non-replay, template paging, real CLI lifecycle/DB/audit and metadata 429 verification |
|
|
54
54
|
| P0-AGENT-03 | agent-export | `aipctl admin agent export` (GA-CANDIDATE, production gated) | `exportInstalledAgent` | api | `GET` | `/web/admin/organizations/slug/{organizationSlug}/installed-agents/{installedAgentId}/export` | existing direct controller request | YAML `Buffer` | `backend/api/.../app/controller/AgentExportController.kt`; intentionally OAS-codegen excluded | none | `legacy-generated` | `P0` | `legacy-exception` | owner=`AgentExportController`; dedicated transfer contract, size/timeout/partial-file/authorization/audit gates remain | `AI-6380` | existing direct export path/Buffer/404 tests; production help remains hidden |
|
|
55
55
|
| P1-CHAT-01 | agent-chat | `aipctl agent chat` | `agentNewChat`, `agentChat`, local `parseSseStream` | chat | `POST` + SSE | `/librechat/api/{orgSlug}/agent/new-chat`; `/librechat/api/{orgSlug}/agent/chat` | request body `{ agentInstallationId or conversationId, text, files: [] }` | local `AgentChatResult { text, conversationId }` parsed from SSE event fields `final`, `conversation.conversationId`, `responseMessage` | path source: `resource/oas/chat.yaml` | `frontend/packages/api/src/out/chat-types.ts#paths["/librechat/api/{orgSlug}/agent/new-chat"]`, `#paths["/librechat/api/{orgSlug}/agent/chat"]` | `stream-exception` | `P1` | `legacy-exception` | owner=`chat backend agent SSE stream contract`; rationale=`path exists in OpenAPI but final SSE event payload is still out-of-band`; removal condition=`official SSE event schema or versioned fixture is published with the chat contract`; incorporation plan=`bind CLI parser/tests to the published SSE fixture and drop local-only stream assumptions` | N/A | updated `src/core/api.test.ts`; covers content[] text, fallback text, malformed event skip, and no-final-event failure |
|
|
56
|
-
| P1-AUTO-01 | automation | `aipctl automation list`, `get`, `create`, `update`, `delete`, `
|
|
57
|
-
|
|
|
56
|
+
| P1-AUTO-01 | automation | `aipctl automation list`, `get`, `create`, `update`, `delete`, `enable`, `disable`, `history`, `triggers` | `listAutomations`, `getAutomation`, `createAutomation`, `updateAutomation`, `deleteAutomation`, `updateAutomationStatus`, `listAutomationHistories`, `getTriggerProviderMetadata` | api | `GET`, `POST`, `PUT`, `DELETE`, `PATCH` | `/api/cli/v1/organizations/{organizationSlug}/automations`; `/{automationId}`; `/{automationId}/status`; `/{automationId}/history`; `/triggers?type=...` | one-based pageNumber/pageSize (1..100); status `{ status }`; exactly one matching trigger branch; metadata retains required accountId/folderId/serviceType input | existing list/history domain DTOs; dedicated `GetCliAutomationResponse` and ID DTO; webhook detail only serviceType/boolean secretConfigured | `resource/oas/modules/backend/cli/openapi.yaml` → `v1_automations*.yaml`; request/list/history aliases reuse Automation user schemas | `backend/api/.../cli/generated/api/CliAutomationApi.kt` | `generated-ready` | `P1` | `migrate` | owner=`CLI Automation adapter`; Schedule/Webhook/My Drive management enabled; external account provider metadata/mutations return 403 before provider side effects; stored external detail never enriches remotely or fabricates account/folder validity | `AI-6344`; external lifecycle gate `AI-6380`; large pagination gate `AI-6413` | `src/core/automation-contract.test.ts`, `src/core/api.test.ts`, Automation command tests, `redaction.test.ts`, Backend safe-read/controller/audit tests, Gateway parity; real mise servers + production CLI CRUD/ownership/pagination/quota/DB/audit |
|
|
57
|
+
| P1-AUTO-02 | automation-execution | `aipctl automation run`, `cancel`, `webhook-regen` (GA-CANDIDATE, production gated) | `runAutomation`, `cancelAutomationHistory`, `regenerateWebhookUrl` | api | `POST`, `DELETE`, `POST` | legacy `/api/web/organizations/slug/{organizationSlug}/automations/{automationId}/run`; `/histories/{seq}`; `/webhook-url/regen` | existing domain input | existing execution/history/webhook URL DTO | `resource/oas/modules/backend/automation/user/openapi.yaml` | `frontend/packages/api/src/out/modules/automation-user-types.ts#paths[...]` | `generated-ready` | `P1` | `legacy-exception` | owner=`Automation execution domain`; requires execution quota, idempotency/cancel lifetime, webhook secret rotation and safe output verification before customer enablement | `AI-6380` | existing legacy path/command tests; production availability keeps all three hidden |
|
|
58
|
+
| CHAT-01 | chat-readonly | `aipctl chat list`, `aipctl chat get`, `aipctl chat messages` | `listConversations`, `getConversation`, `listMessages` | chat | `GET` | `/api/cli/v1/organizations/{orgSlug}/chats`; `/chats/{conversationId}`; `/chats/{conversationId}/messages` | list sends optional cursor; server fixes bounded `updatedAt desc` page size; detail/messages preserve organization and user ownership | local `ListConversationsResponse`, `ConversationDetail`, `ChatMessage[]` | `chat/packages/chat/src/modules/cli-chat/interface/cli-chat-read-v1.interface.controller.ts` | code-first controller contract with `operationId`/quota/capability extensions; no generated backend artifact | `oas-source-only` | `P0` | `migrate` | none; `CliChatReadInterfaceService` reuses the existing conversation/message ownership services and returns CLI-safe fields only | `AI-6344` | updated `src/core/api.test.ts`, Chat read service spec, Gateway registry/contract parity; local CLI/Chat verification covers cursor and no legacy fallback |
|
|
58
59
|
| P0-DRIVE-01 | drive | `aipctl drive list`, `download`, `delete`, `mkdir`, `rename`, `usage` | `listDriveEntries`, `getDriveDownloadUrl`, `deleteDriveEntries`, `createDriveFolder`, `renameDriveEntry`, `getDriveUsage`, `downloadFromUrl` | api + external | `GET`, `POST`, `POST`, `POST`, `PATCH`, `GET`, external `GET` | CLI-managed basic CRUD: `/api/cli/v1/organizations/{organizationSlug}/drive/entries?count=200`, `/drive/entries/delete`, `/drive/folders`, `/drive/entries/{entryId}`, `/drive/usage`; download/upload remain Web/presigned | official list `{ path, hasNext, nextCursor, items }`; delete body `{ entryIds[] }`; mkdir optional `parentId`; rename body `{ newName }`; download body `{ entryIds: [id] }` | official drive list/download DTOs + external file buffer | `resource/oas/modules/backend/cli/openapi.yaml` → `v1_drive_*.yaml` (DTO aliases to organization Storage OAS); download/upload remain `resource/oas/modules/backend/organization/storage/openapi.yaml` | `backend/api/.../cli/generated/api/CliDriveApi.kt`; domain DTOs remain `com.querypie.duplo.api.drive.controller.generated.model.*` | `generated-ready` | `P0` | `migrate` | none; `CliDriveApiController` delegates membership, capacity and audit owner | `AI-6344` | `src/core/api.test.ts`, `CliSkillDriveApiControllerTest`, Gateway registry/contract parity; production CRUD/usage and local 403/404 checks (401/429 remain common gates) |
|
|
59
60
|
| P0-DRIVE-02 | drive | `aipctl drive upload` | `createDriveUploadUrl` → `uploadToS3` → `completeDriveUpload` | api + external | `POST` → `PUT` → `POST` | `/drive/entries/upload-url`; external presigned `uploadUrl`; `/drive/entries/{entryId}/complete` | official upload request `{ parentId: null, filename, fileSize, mimeType }` | official `CreateDriveUploadUrlResponse { id, filename, uploadUrl, headers }` then `void` | `resource/oas/modules/backend/organization/storage/openapi.yaml` | `frontend/packages/api/src/out/modules/organization-storage-types.ts#paths["/api/web/organizations/slug/{organizationSlug}/drive/entries/upload-url"]`, `#paths["/api/web/organizations/slug/{organizationSlug}/drive/entries/{entryId}/complete"]` | `generated-ready` | `P0` | `migrate` | none | `AIP-PUB-05` | updated `src/core/api.test.ts`, `commands/drive/drive.test.ts`; covers `parentId: null` request and response `id`/`filename` usage |
|
|
60
|
-
| P1-INT-01 | integration | `aipctl integration list`, `test`; `aipctl admin integration get`, `update`, `delete`, `tools`, `available` | `listIntegrations`, `testIntegration`, `getIntegration`, `updateIntegration`, `deleteIntegration`, `listIntegrationTools`, `listConfigurableIntegrations` | api | `GET`, `POST`, `GET`, `PUT`, `DELETE`, `GET`, `GET` | `/api/
|
|
61
|
+
| P1-INT-01 | integration | `aipctl integration list`, `test`; `aipctl admin integration get`, `update`, `delete`, `tools`, `available` | `listIntegrations`, `testIntegration`, `getIntegration`, `updateIntegration`, `deleteIntegration`, `listIntegrationTools`, `listConfigurableIntegrations` | api | `GET`, `POST`, `GET`, `PUT`, `DELETE`, `GET`, `GET` | read operations use `/api/cli/v1/organizations/{organizationSlug}/integrations`; `/admin/integrations/available`; `/admin/integrations/{integrationId}`; `/tools`; mutations/test remain legacy candidate paths | read responses use dedicated CLI DTOs; admin detail maps only metadata and configured boolean, never property descriptors or credential values; update/delete/test remain unchanged | local `Integration`, `IntegrationDetail`, `IntegrationToolsResponse`, `ConfigurableIntegration[]` | `resource/oas/modules/backend/cli/openapi.yaml` → `v1_integrations*.yaml` | `backend/api/.../cli/generated/api/CliIntegrationApi.kt`; generated `Cli*Integration*` models | `generated-ready` | `P1` | `migrate` | owner=`backend CLI integration adapter`; rationale=`read-only operations now have a stable v1 contract while external test and mutations retain candidate gates`; removal condition=`dedicated test/mutation contracts pass timeout, redaction and idempotency gates`; incorporation plan=`follow AI-6380 candidate work` | `AI-6344` | updated `src/core/api.test.ts`, Backend adapter/security tests, Gateway registry/contract parity; local CLI read verification and legacy mutation path regression |
|
|
61
62
|
| P0-MODEL-01 | model | `aipctl model list` | `listModels` | chat | `GET` | `/api/cli/v1/organizations/{orgSlug}/models` | none | `{ models: string[], defaultModel? }` is mapped into `Model[]` and preserves active standard, custom/BYOK, and `etc` catalog IDs | code-first OAS: `chat/packages/chat/src/modules/cli-model-exec/interface/cli-model-exec-v1.interface.controller.ts` | runtime Swagger contract; the existing Web model endpoint remains an independent compatibility reference | `oas-source-only` | `P0` | `migrate` | owner=`Chat CliModelExecV1InterfaceController/ModelInternalService`; rationale=`the dedicated route reuses the existing organization-authorized model domain catalog instead of the narrowed model-exec SharedModel catalog`; removal condition=`none for the CLI route; Web migration is a separate work item`; incorporation plan=`keep the CLI path and capability/registry parity tests aligned with the code-first Chat contract` | `AIP-PUB-05` | `src/core/api.test.ts` verifies the dedicated path, production capability gate, default mapping, and preservation of custom/BYOK and `etc` IDs; Chat service/controller tests verify domain delegation and Swagger extensions |
|
|
62
63
|
| P1-MODEL-EXEC-01 | model-exec | `aipctl model-exec models`, `get`, `sample`, `chat` | `listModelExecModels`, `executeModelExecChat` | chat | `GET`, `POST` | `/api/cli/v1/organizations/{orgSlug}/model-exec/models`; `/chat` | local `ModelExecChatRequest`; Chat Zod/Swagger DTO source `chat/packages/chat/src/modules/cli-model-exec/interface/dto/cli-model-exec.dto.ts` | local `ModelExecModelCatalog`, `ModelExecChatResponse` | code-first OAS: `chat/packages/chat/src/modules/cli-model-exec/interface/cli-model-exec-v1.interface.controller.ts` | runtime Swagger contract | `oas-source-only` | `P1` | `migrate` | none | `AIP-PUB-05` | `src/core/api.test.ts` verifies both v1 paths; Chat controller contract test verifies operation IDs, request/response schemas, delegation to the existing service, and absence of a v1 image route |
|
|
63
64
|
| P1-MODEL-EXEC-02 | model-exec-image | `aipctl model-exec image generate` | `executeModelExecImageGeneration`; output uses `downloadFromUrl` | chat + external artifact URL | `POST`, external `GET` | legacy `/api/{orgSlug}/cli/model-exec/images/generations`; response `downloadUrl` | local `ModelExecImageGenerationRequest`; Chat DTO source `chat/packages/chat/src/modules/cli-model-exec/interface/dto/cli-model-exec.dto.ts` | local `ModelExecImageGenerationResponse`; image bytes from external URL | no GA OAS; legacy controller only | none | `oas-missing` | deferred | `hide` | owner=`chat CLI Model Exec API`; rationale=`synchronous image execution, external artifact lifetime, and cost recovery require the deferred async design`; removal condition=`image job/artifact/TTL/My Drive/cost gates pass`; incorporation plan=`publish a separate v1 image job contract only after the deferred design is implemented` | follow-up image hardening | existing image request/path test remains on the legacy route; customer capability must stay disabled |
|
|
@@ -96,7 +97,7 @@ CLI `ApiError`는 위 여섯 code에서 allowlist된 quota detail만 보존하
|
|
|
96
97
|
### P1 queue
|
|
97
98
|
|
|
98
99
|
- `P1-INT-01` integration legacy-exception documented; current/legacy path+DTO tests added
|
|
99
|
-
- `P1-AUTO-01`
|
|
100
|
+
- `P1-AUTO-01` Automation management uses eight dedicated v1 operations; Schedule/Webhook/My Drive lifecycle and stored safe reads are implemented. External provider metadata/mutations and `P1-AUTO-02` remain gated.
|
|
100
101
|
- `P1-PRESET-01` preset admin namespace/docs + legacy path tests done
|
|
101
102
|
- `P1-SKILL-01` skill JSON/help/docs field sync done
|
|
102
103
|
- `P1-CHAT-01` chat SSE fixture tests added for final/fallback/error cases
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aipctl",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.10.1",
|
|
4
4
|
"description": "QueryPie AIP and MCP CLI tool",
|
|
5
5
|
"author": "QueryPie",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"node": ">=24.18.0"
|
|
23
23
|
},
|
|
24
24
|
"metadata": {
|
|
25
|
-
"contentHash": "
|
|
26
|
-
"wrapperHash": "
|
|
25
|
+
"contentHash": "ea5c348d28e6d1e64655c97b08350c4e9b14572c4474243a654e18c2b6bb7917",
|
|
26
|
+
"wrapperHash": "03b7520e6526fd395045d78d3a17ba20bf875e10cd352306b5417a3b63ed384c",
|
|
27
27
|
"nativeHash": "006b08c3e391f4571d9b7c0f12d684fe2448106259e7e0581b10f9be362452e9"
|
|
28
28
|
},
|
|
29
29
|
"optionalDependencies": {
|