aipctl 2026.9.7 → 2026.9.8

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 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.9.7".length > 0 ? "2026.9.7" : "0.0.0";
89673
+ const VERSION = "2026.9.8".length > 0 ? "2026.9.8" : "0.0.0";
89674
89674
  const BUILD_ENV = injectedBuildEnv;
89675
89675
  const INCLUDE_NATIVE_LOGS = BUILD_ENV !== "prod";
89676
89676
 
@@ -89804,6 +89804,14 @@ const normalizeAipArgs = (args) => {
89804
89804
  };
89805
89805
 
89806
89806
  const implementedCommandOperationIds = /* @__PURE__ */ new Set([
89807
+ "listCliAgents",
89808
+ "getCliAgent",
89809
+ "listCliAgentTemplates",
89810
+ "createCliAgent",
89811
+ "updateCliAgent",
89812
+ "deleteCliAgent",
89813
+ "updateCliAgentStatus",
89814
+ "getCliAgentShare",
89807
89815
  "getCliMe",
89808
89816
  "getCliUserSettings",
89809
89817
  "listCliOrganizations",
@@ -89814,6 +89822,14 @@ const implementedCommandOperationIds = /* @__PURE__ */ new Set([
89814
89822
  "createCliModelChatExecution"
89815
89823
  ]);
89816
89824
  const releaseEnabledCommandOperationIds = /* @__PURE__ */ new Set([
89825
+ "listCliAgents",
89826
+ "getCliAgent",
89827
+ "listCliAgentTemplates",
89828
+ "createCliAgent",
89829
+ "updateCliAgent",
89830
+ "deleteCliAgent",
89831
+ "updateCliAgentStatus",
89832
+ "getCliAgentShare",
89817
89833
  "getCliMe",
89818
89834
  "getCliUserSettings",
89819
89835
  "listCliOrganizations",
@@ -95291,7 +95307,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95291
95307
  // Phase 2: Agent management
95292
95308
  listInstalledAgents: (orgSlug) => gen(function* () {
95293
95309
  const token = yield* getAccessToken();
95294
- const path = `/api/web/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents`;
95310
+ yield* requireServerOperation("listCliAgents", token);
95311
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents`;
95295
95312
  const raw = yield* makeRequest(baseUrl, path, token);
95296
95313
  return {
95297
95314
  pagination: normalizePageNumberPagination(raw.pagination, raw.list.length),
@@ -95300,7 +95317,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95300
95317
  }),
95301
95318
  getInstalledAgent: (orgSlug, agentId) => gen(function* () {
95302
95319
  const token = yield* getAccessToken();
95303
- const path = `/api/web/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents/${encodeURIComponent(agentId)}`;
95320
+ yield* requireServerOperation("getCliAgent", token);
95321
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents/${encodeURIComponent(agentId)}`;
95304
95322
  const raw = yield* makeRequest(baseUrl, path, token);
95305
95323
  return {
95306
95324
  data: {
@@ -95312,7 +95330,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95312
95330
  }),
95313
95331
  updateInstalledAgentStatus: (orgSlug, agentId, status) => gen(function* () {
95314
95332
  const token = yield* getAccessToken();
95315
- const path = `/api/web/admin/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents/${encodeURIComponent(agentId)}/status`;
95333
+ yield* requireServerOperation("updateCliAgentStatus", token);
95334
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents/${encodeURIComponent(agentId)}/status`;
95316
95335
  return yield* makeRequest(baseUrl, path, token, {
95317
95336
  method: "PATCH",
95318
95337
  body: { status }
@@ -95605,7 +95624,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95605
95624
  // Phase 8: Agent admin CRUD
95606
95625
  createInstalledAgent: (orgSlug, body) => gen(function* () {
95607
95626
  const token = yield* getAccessToken();
95608
- const path = `/api/web/admin/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents`;
95627
+ yield* requireServerOperation("createCliAgent", token);
95628
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents`;
95609
95629
  return yield* makeRequest(baseUrl, path, token, {
95610
95630
  method: "POST",
95611
95631
  body
@@ -95613,7 +95633,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95613
95633
  }),
95614
95634
  updateInstalledAgent: (orgSlug, agentId, body) => gen(function* () {
95615
95635
  const token = yield* getAccessToken();
95616
- const path = `/api/web/admin/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents/${encodeURIComponent(agentId)}`;
95636
+ yield* requireServerOperation("updateCliAgent", token);
95637
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents/${encodeURIComponent(agentId)}`;
95617
95638
  return yield* makeRequest(baseUrl, path, token, {
95618
95639
  method: "PATCH",
95619
95640
  body
@@ -95621,7 +95642,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95621
95642
  }),
95622
95643
  deleteInstalledAgent: (orgSlug, agentId) => gen(function* () {
95623
95644
  const token = yield* getAccessToken();
95624
- const path = `/api/web/admin/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents/${encodeURIComponent(agentId)}`;
95645
+ yield* requireServerOperation("deleteCliAgent", token);
95646
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents/${encodeURIComponent(agentId)}`;
95625
95647
  return yield* makeRequest(baseUrl, path, token, { method: "DELETE" });
95626
95648
  }),
95627
95649
  exportInstalledAgent: (orgSlug, agentId) => gen(function* () {
@@ -95647,7 +95669,8 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95647
95669
  }),
95648
95670
  getInstalledAgentShare: (orgSlug, agentId) => gen(function* () {
95649
95671
  const token = yield* getAccessToken();
95650
- const path = `/api/web/admin/organizations/slug/${encodeURIComponent(orgSlug)}/installed-agents/${encodeURIComponent(agentId)}/share`;
95672
+ yield* requireServerOperation("getCliAgentShare", token);
95673
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents/${encodeURIComponent(agentId)}/share`;
95651
95674
  const raw = yield* makeRequest(baseUrl, path, token);
95652
95675
  const sharedUserList = yield* try_({
95653
95676
  try: () => normalizeSharedUserList(raw.sharedUserList),
@@ -95660,11 +95683,19 @@ const makeApiServiceLive = (buildEnv) => effect$1(
95660
95683
  }),
95661
95684
  listAgentTemplates: (orgSlug) => gen(function* () {
95662
95685
  const token = yield* getAccessToken();
95663
- const path = `/api/web/admin/organizations/slug/${encodeURIComponent(orgSlug)}/agents`;
95664
- const raw = yield* makeRequest(baseUrl, path, token);
95686
+ yield* requireServerOperation("listCliAgentTemplates", token);
95687
+ const path = `/api/cli/v1/organizations/${encodeURIComponent(orgSlug)}/agents/templates`;
95688
+ const templates = [];
95689
+ let page = 1;
95690
+ while (true) {
95691
+ const raw = yield* makeRequest(baseUrl, page === 1 ? path : `${path}?page=${page}`, token);
95692
+ templates.push(...raw.list);
95693
+ if (raw.list.length === 0 || page * raw.pagination.pageSize >= raw.pagination.total) break;
95694
+ page += 1;
95695
+ }
95665
95696
  return {
95666
- pagination: { pageNumber: 1, pageSize: raw.length, totalCount: raw.length },
95667
- data: raw.map((item) => ({
95697
+ pagination: { pageNumber: 1, pageSize: templates.length, totalCount: templates.length },
95698
+ data: templates.map((item) => ({
95668
95699
  id: item.agentId,
95669
95700
  displayName: item.label,
95670
95701
  categories: item.categoryList,
@@ -49,8 +49,9 @@
49
49
  | SKILL-04 | skill-admin | `aipctl admin skill list`, `get`, `delete`, `publish`, `unpublish` | `listAdminSkills`, `getAdminSkill`, `deleteAdminSkill`, `updateAdminSkill` | api | `GET`, `GET`, `DELETE`, `PATCH` | `/api/web/admin/organizations/slug/{organizationSlug}/skills`; `/skills/{skillId}` | list query `{ pageNumber,pageSize,search }`; publish toggle body `{ availableInLibrary: boolean }` | local `ListAdminSkillsResponse`, `SkillDetail`, `void` | `resource/oas/modules/backend/organization/skills/openapi.yaml` | `frontend/packages/api/src/out/modules/organization-skills-types.ts#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/{skillId}"]` | `generated-ready` | N/A | `keep` | none | N/A | existing `commands/admin/skill.test.ts`; needed admin list/detail/update path snapshot |
50
50
  | SKILL-05 | skill-admin | `aipctl skill download`; `aipctl admin skill upload`, `aipctl admin skill download`, `aipctl admin skill github inspect/import/sync/credentials set/clear` | `createAdminUploadUrl` → `uploadToS3` → `completeAdminUpload` (`abortAdminUpload` on failure); `getSkillDownloadUrl` → `downloadFromUrl`; `inspectGitHubSkillSource`, `prepareGitHubSkill`, `syncPrepareGitHubSkill`, `updateGitHubSkillCredentials` | api + external | `POST`/`PUT`/`POST`; `POST`/`GET`; `POST`, `POST`, `POST`, `PATCH` | `/admin/.../skills/upload-url`; `/admin/.../skills/download-url`; `/admin/.../skills/github-repo-inspect`; `/github-prepare`; `/{skillId}/sync-prepare`; `/{skillId}/github-credentials` | upload/download local bodies; GitHub inspect/prepare `{ url, pat? }`; credentials `{ pat or null }` | upload/download/GitHub admin skill DTOs | `resource/oas/modules/backend/organization/skills/openapi.yaml` | `frontend/packages/api/src/out/modules/organization-skills-types.ts#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/upload-url"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/download-url"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/github-repo-inspect"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/github-prepare"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/{skillId}/sync-prepare"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/skills/{skillId}/github-credentials"]` | `external-presigned` | N/A | `keep` | none | N/A | existing `commands/admin/skill.test.ts`, `commands/skill/skill-extended.test.ts`; needed GitHub admin skill contract fixtures |
51
51
  | P1-SKILL-01 | skill-docs | `aipctl skill get --json`, `aipctl admin skill get --json`, `aipctl admin skill github import/sync --json` | same owners as `SKILL-01`/`SKILL-05` | api | same as upstream rows | same as upstream rows | runtime/JSON/help/docs now align on `source`, `origin`, `updateAvailable`, `secretsAvailable`, GitHub metadata, `secretKeys`; stale `version` and file `size` removed | JSON/help/docs contract for skill objects | `resource/oas/modules/backend/organization/skills/openapi.yaml` | `frontend/packages/api/src/out/modules/organization-skills-types.ts#components[...]` | `generated-ready` | `P1` | `keep` | none | N/A | updated `src/core/api.test.ts`, `commands/skill/skill.test.ts`, `commands/skill/skill-extended.test.ts`, `commands/admin/skill.test.ts`, `commands/json-format.test.ts`, `../docs/how-to/aip-cli-usage.md`; covers JSON/help/docs field sync |
52
- | P0-AGENT-01 | agent-user | `aipctl agent list`, `aipctl agent get` | `listInstalledAgents`, `getInstalledAgent` | api | `GET`, `GET` | `/api/web/organizations/slug/{organizationSlug}/installed-agents`; `/installed-agents/{installedAgentId}` | legacy implemented endpoint maps `list`/`installedAgentId` into CLI `data`/`id`; detail wraps legacy response in `{ data }` and maps `installedIntegrationList` fallback | local `ListInstalledAgentsResponse`, `{ data: InstalledAgentDetail }` | implemented: `resource/oas/duplo.yaml`; future v2 source: `resource/oas/modules/backend/agent/user/openapi.yaml` | legacy `frontend/packages/api/src/out/user-types.ts#paths["/api/web/organizations/slug/{organizationSlug}/installed-agents"]`, `#paths["/api/web/organizations/slug/{organizationSlug}/installed-agents/{installedAgentId}"]` | `legacy-generated` | `P0` | `keep legacy` | owner=`backend app AgentsApiController`; rationale=`agent v2 controllers currently throw NotImplementedError in this repo, so public beta must call implemented legacy endpoints`; removal condition=`AgentUserApiController v2 methods are implemented and deployed`; incorporation plan=`switch to agent v2 OAS/generated contract only after backend implementation lands` | `AIP-PUB-05` | updated `src/core/api.test.ts`, `commands/agent/agent.test.ts`; covers implemented legacy list/detail path and response mapping |
53
- | P0-AGENT-02 | agent-admin | `aipctl admin agent create`, `update`, `delete`, `export`, `share`, `templates`; `aipctl agent enable`, `disable` | `createInstalledAgent`, `updateInstalledAgent`, `deleteInstalledAgent`, `exportInstalledAgent`, `getInstalledAgentShare`, `listAgentTemplates`, `updateInstalledAgentStatus` | api | `POST`, `PATCH`, `DELETE`, `GET`, `GET`, `GET`, `PATCH` | `/api/web/admin/organizations/slug/{organizationSlug}/installed-agents`; `/{installedAgentId}`; export uses legacy direct `/web/admin/organizations/slug/{organizationSlug}/installed-agents/{installedAgentId}/export`; `/share`; `/agents`; `/{installedAgentId}/status` | create/update bodies follow implemented legacy admin request (`custom.iconKeyOrUrl`, `knowledgeBundleIdList`); export is YAML bytes from direct controller path; templates map legacy `agentId`/`label`/`categoryList`; status body `{ status }` | create/update return plain `{ id }`; local admin agent DTOs + `Buffer` export | implemented: `resource/oas/duplo.yaml`; export controller path: `backend/api/src/main/kotlin/com/querypie/duplo/api/app/controller/AgentExportController.kt`; future v2 source: `resource/oas/modules/backend/agent/admin/openapi.yaml` | legacy `frontend/packages/api/src/out/user-types.ts#paths["/api/web/admin/organizations/slug/{organizationSlug}/installed-agents"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/installed-agents/{installedAgentId}"]`, `#paths["/api/web/admin/organizations/slug/{organizationSlug}/agents"]`; export path intentionally OAS-codegen excluded | `legacy-generated` | `P0` | `keep legacy` | owner=`backend app AgentsApiController + AgentExportController`; rationale=`agent v2 admin controllers currently throw NotImplementedError and export is implemented only at /web/admin direct controller path in PROD`; removal condition=`AgentAdminApiController v2 and export path are implemented/deployed under versioned OAS path`; incorporation plan=`switch to agent v2 OAS/generated contract only after backend implementation lands, then remove direct export exception` | `AIP-PUB-05` | updated `src/core/api.test.ts`, `commands/agent/agent.test.ts`; covers implemented legacy CRUD/status/template path/body, direct export path, Buffer response, and 404 propagation |
52
+ | P0-AGENT-01 | agent-user | `aipctl agent list`, `aipctl agent get` | `listInstalledAgents`, `getInstalledAgent` | api | `GET`, `GET` | `/api/cli/v1/organizations/{organizationSlug}/agents`; `/{installedAgentId}` | preserves user read semantics and maps `list`/`installedAgentId` to local `data`/`id` | local `ListInstalledAgentsResponse`, `{ data: InstalledAgentDetail }` | `resource/oas/modules/backend/cli/openapi.yaml`; shared DTO refs from `resource/oas/duplo.yaml` | `backend/api/.../cli/generated/api/CliAgentApi.kt` | `generated-ready` | `P0` | `migrate` | none; dedicated adapter delegates to the working `AgentsApiController` bean | `AI-6344` | `src/core/api.test.ts`, `CliAgentApiControllerTest`, Gateway registry/admission parity; real local production CLI list/get JSON |
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
+ | 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 |
54
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 |
55
56
  | P1-AUTO-01 | automation | `aipctl automation list`, `get`, `create`, `update`, `delete`, `run`, `enable`, `disable`, `history`, `cancel`, `webhook-regen`, `triggers` | `listAutomations`, `getAutomation`, `createAutomation`, `updateAutomation`, `deleteAutomation`, `runAutomation`, `updateAutomationStatus`, `listAutomationHistories`, `cancelAutomationHistory`, `regenerateWebhookUrl`, `getTriggerProviderMetadata` | api | `GET`, `POST`, `PUT`, `DELETE` mix | `/api/web/organizations/slug/{organizationSlug}/automations...`; `/automation-trigger-providers/.../metadata` | automation pagination normalized to `{ page, pageSize, total }`; metadata calls now use provider-specific OAS paths and required args (`accountId`, `folderId`, `serviceType`) | local automation DTOs + 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` | `keep` | none | N/A | updated `src/core/api.test.ts`, `commands/automation/automation.test.ts`, `commands/json-format.test.ts`; covers official pagination fields, provider-specific metadata routes, and unsupported-provider preflight failure |
56
57
  | CHAT-01 | chat-readonly | `aipctl chat list`, `aipctl chat get`, `aipctl chat messages` | `listConversations`, `getConversation`, `listMessages` | chat | `GET` | `/librechat/api/{orgSlug}/convos`; `/convos/{conversationId}`; `/messages/{conversationId}` | list sends no default query; optional cursor only (`?cursor=...`). `pageSize`/`sortBy`/`sortDirection` defaults removed due deployed Chat validation drift | local `ListConversationsResponse`, `ConversationDetail`, `ChatMessage[]` | `resource/oas/chat.yaml` | `frontend/packages/api/src/out/chat-types.ts#paths["/librechat/api/{orgSlug}/convos"]`, `#paths["/librechat/api/{orgSlug}/convos/{conversationId}"]`, `#paths["/librechat/api/{orgSlug}/messages/{conversationId}"]` | `legacy-generated` | N/A | `keep` | owner=`chat backend`; rationale=`PROD rejects CLI default pageSize/sort query while no-query and cursor-only read path are safe`; removal condition=`chat deployed contract publishes and accepts explicit pagination query for public CLI`; incorporation plan=`reintroduce explicit pagination only after OAS/source/deployed validation align` | N/A | updated `src/core/api.test.ts`, existing `commands/chat/chat.test.ts`; covers default no-query and cursor-only URL |
@@ -83,8 +84,8 @@ CLI `ApiError`는 위 세 code에서 allowlist된 quota detail만 보존하며
83
84
 
84
85
  - `P0-ORG-01` org member list/mutation legacy-exception aligned (done in `AIP-PUB-04`, independent contract follow-up remains)
85
86
  - `P0-ORG-02` org invite-link trio hidden from public beta (done in `AIP-PUB-04`)
86
- - `P0-AGENT-01` user agent remains on implemented legacy endpoints until v2 backend lands
87
- - `P0-AGENT-02` admin agent remains on implemented legacy endpoints until v2 backend lands
87
+ - `P0-AGENT-01` / `P0-AGENT-02` moved to dedicated CLI lifecycle endpoints with metadata quota and capability checks (`AI-6344`)
88
+ - `P0-AGENT-03` export remains a gated transfer candidate (`AI-6380`)
88
89
  - `P0-DRIVE-01` drive list/download/delete/mkdir/rename/usage contract migration (done in `AIP-PUB-04`)
89
90
  - `P0-DRIVE-02` drive upload contract migration (done in `AIP-PUB-04`)
90
91
  - `P0-MODEL-01` model list path/DTO migration (done in `AIP-PUB-04`)
@@ -101,6 +102,6 @@ CLI `ApiError`는 위 세 code에서 allowlist된 quota detail만 보존하며
101
102
  ## Manual notes
102
103
 
103
104
  - Generated reference files under `frontend/packages/api/src/out/**` are inventory links only. They are not imported by CLI source/build/test/lint.
104
- - `agent-user` / `agent-admin` modern OAS files exist under `resource/oas/modules/backend/agent/**`, but current backend v2 controllers throw `NotImplementedError`; current CLI intentionally uses implemented `AgentsApiController` endpoints until v2 implementation lands.
105
+ - Agent lifecycle uses the dedicated `CliAgentApiController` and CLI OAS, delegating internally to the implemented `AgentsApiController` bean. Future v2 implementation can replace that internal owner without changing the CLI endpoint. `agent chat` and `admin agent export` retain their separate candidate gates.
105
106
  - OAuth authorization-server metadata, dynamic client registration, authorize, and token endpoints used by `src/core/oauth.ts` were not found in current `resource/oas`; they need owner-backed contractization.
106
107
  - `config` commands intentionally excluded. local config surface has no network owner.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aipctl",
3
- "version": "2026.9.7",
3
+ "version": "2026.9.8",
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": "193ccba3e435808c7b5d0088f7fa877f90dee7b22206ac32aaa73bc950cd77dd",
26
- "wrapperHash": "dd78d97e373451c52e871f46c154b9cec801b192cb68c250932de890891e8a97",
25
+ "contentHash": "fc535c50b1c26702237a8dbfd683f04ddaec6b84c369c308b9714d1e65c5fc69",
26
+ "wrapperHash": "69f4f9d9e2ed5283318f3b770870f094ae315b9cc579ad426203224c66624461",
27
27
  "nativeHash": "006b08c3e391f4571d9b7c0f12d684fe2448106259e7e0581b10f9be362452e9"
28
28
  },
29
29
  "optionalDependencies": {