From 0040a5c33b732c009e76acff168213e5bbdf8f20 Mon Sep 17 00:00:00 2001 From: Sirttas Date: Sat, 8 Aug 2026 20:47:13 +0200 Subject: [PATCH 1/3] feat: regenerate open api --- docs/mammon-api.yml | 200 +++++++++++++++++++++++++++++++---- src/generated/mammon/api.ts | 204 ++++++++++++++++++++++++++++++++---- 2 files changed, 362 insertions(+), 42 deletions(-) diff --git a/docs/mammon-api.yml b/docs/mammon-api.yml index f85d475..f8171cb 100644 --- a/docs/mammon-api.yml +++ b/docs/mammon-api.yml @@ -43,8 +43,7 @@ paths: "400": description: |- Returned when: - - a binding references a ledger the caller does not own - - a binding references a ledger that is not a main ledger + - a ledger scope reference is not one of the caller's own main ledgers /ledgers/main/{ledgerId}: put: tags: @@ -438,11 +437,38 @@ paths: get: tags: - rule-script - summary: Download the TypeScript definitions for the rule script runtime - operationId: getScriptDefinitions + summary: List the available rule script type definition files + operationId: listScriptDefinitions responses: "200": - description: The rule-runner.d.ts type definitions + description: The names of the available .d.ts type definitions + content: + '*/*': + schema: + type: array + items: + type: string + /rule-scripts/definitions/{name}: + get: + tags: + - rule-script + summary: Download a rule script type definition file by name + operationId: getScriptDefinition + parameters: + - name: name + in: path + required: true + schema: + type: string + responses: + "200": + description: The requested .d.ts type definitions + content: + text/plain: + schema: + type: string + "404": + description: No type definition with that name exists content: text/plain: schema: @@ -974,8 +1000,10 @@ paths: format: uuid responses: "200": - description: "Daily realized profit for the ledger, ascending by date, only\ - \ for days with a sale" + description: "Daily FIFO-realized profit for the ledger, ascending by date,\ + \ only for days with a sale. iskIn is the sum of that day's profitable\ + \ trades, iskOut is the sum of that day's losing trades (as a positive\ + \ deficit); profit is iskIn minus iskOut." content: '*/*': schema: @@ -1127,50 +1155,180 @@ paths: $ref: "#/components/schemas/AcquisitionResponse" components: schemas: - UpdateRuleBookRequest: + RuleScopeRequest: type: object - description: Request to update the caller's rule book; replaces its mutable - fields. + description: The ledgers and other resources to bind to a rule script. properties: - bindings: + ledgers: type: object additionalProperties: type: string format: uuid description: "Ledger references the script writes to, each bound to one\ - \ of the user's ledgers." + \ of the user's own main ledgers." + characters: + type: object + additionalProperties: + type: integer + format: int64 + description: "Character references the script can read, each bound to one\ + \ of the user's own characters." + corporations: + type: object + additionalProperties: + type: integer + format: int64 + description: "Corporation references the script can read, each bound to\ + \ a corporation of one of the user's own characters." + walletDivisions: + type: object + additionalProperties: + $ref: "#/components/schemas/WalletDivisionTargetRequest" + description: "Corporation wallet division references the script can read,\ + \ each bound to a corporation of one of the user's own characters." + required: + - characters + - corporations + - ledgers + - walletDivisions + RuleScriptRequest: + type: object + description: "A named rule script to store in the book, together with its scope." + properties: + name: + type: string + description: Unique script name within the book; a lowercase alphanumeric + identifier. + example: sales + scope: + $ref: "#/components/schemas/RuleScopeRequest" + description: The ledgers and other resources bound to this script. script: type: string description: The classification script source. - example: transfer.to('sales') + example: transfer.to('wallet') required: - - bindings + - name + - scope - script + UpdateRuleBookRequest: + type: object + description: Request to update the caller's rule book; replaces its rule scripts. + properties: + scripts: + type: array + description: The rule scripts making up the book. + items: + $ref: "#/components/schemas/RuleScriptRequest" + required: + - scripts + WalletDivisionTargetRequest: + type: object + description: A corporation wallet division to bind. + properties: + corporationId: + type: integer + format: int64 + description: The corporation the wallet division belongs to. + example: 98000001 + division: + type: integer + format: int32 + description: "The wallet division number, from 1 to 7." + example: 1 + required: + - corporationId + - division RuleBookResponse: type: object - description: "The caller's rule book: a script that classifies transactions,\ - \ together with its ledger bindings." + description: "The caller's rule book: the named rule scripts that classify transactions,\ + \ each with its scope." properties: userId: type: string format: uuid description: Owning user identifier. example: 3fa85f64-5717-4562-b3fc-2c963f66afa6 - bindings: + scripts: + type: array + description: The rule scripts making up the book. + items: + $ref: "#/components/schemas/RuleScriptResponse" + required: + - scripts + - userId + RuleScopeResponse: + type: object + description: The ledgers and other resources bound to a rule script. + properties: + ledgers: type: object additionalProperties: type: string format: uuid description: "Ledger references the script writes to, each bound to one\ - \ of the user's ledgers." + \ of the user's own main ledgers." + characters: + type: object + additionalProperties: + type: integer + format: int64 + description: "Character references the script can read, each bound to one\ + \ of the user's own characters." + corporations: + type: object + additionalProperties: + type: integer + format: int64 + description: "Corporation references the script can read, each bound to\ + \ a corporation of one of the user's own characters." + walletDivisions: + type: object + additionalProperties: + $ref: "#/components/schemas/WalletDivisionTargetResponse" + description: "Corporation wallet division references the script can read,\ + \ each bound to a corporation of one of the user's own characters." + required: + - characters + - corporations + - ledgers + - walletDivisions + RuleScriptResponse: + type: object + description: "A named rule script within the book, together with its scope." + properties: + name: + type: string + description: Unique script name within the book. + example: sales + scope: + $ref: "#/components/schemas/RuleScopeResponse" + description: The ledgers and other resources bound to this script. script: type: string description: The classification script source. - example: transfer.to('sales') + example: transfer.to('wallet') required: - - bindings + - name + - scope - script - - userId + WalletDivisionTargetResponse: + type: object + description: A corporation wallet division bound to the script. + properties: + corporationId: + type: integer + format: int64 + description: The corporation the wallet division belongs to. + example: 98000001 + division: + type: integer + format: int32 + description: "The wallet division number, from 1 to 7." + example: 1 + required: + - corporationId + - division UpdateMainLedgerRequest: type: object description: Request to update an existing main ledger. diff --git a/src/generated/mammon/api.ts b/src/generated/mammon/api.ts index 18b2d8b..49ffa98 100644 --- a/src/generated/mammon/api.ts +++ b/src/generated/mammon/api.ts @@ -732,7 +732,7 @@ export interface ReprocessingResultResponse { 'output': Array; } /** - * The caller\'s rule book: a script that classifies transactions, together with its ledger bindings. + * The caller\'s rule book: the named rule scripts that classify transactions, each with its scope. */ export interface RuleBookResponse { /** @@ -740,9 +740,81 @@ export interface RuleBookResponse { */ 'userId': string; /** - * Ledger references the script writes to, each bound to one of the user\'s ledgers. + * The rule scripts making up the book. */ - 'bindings': { [key: string]: string; }; + 'scripts': Array; +} +/** + * The ledgers and other resources to bind to a rule script. + */ +export interface RuleScopeRequest { + /** + * Ledger references the script writes to, each bound to one of the user\'s own main ledgers. + */ + 'ledgers': { [key: string]: string; }; + /** + * Character references the script can read, each bound to one of the user\'s own characters. + */ + 'characters': { [key: string]: number; }; + /** + * Corporation references the script can read, each bound to a corporation of one of the user\'s own characters. + */ + 'corporations': { [key: string]: number; }; + /** + * Corporation wallet division references the script can read, each bound to a corporation of one of the user\'s own characters. + */ + 'walletDivisions': { [key: string]: WalletDivisionTargetRequest; }; +} +/** + * The ledgers and other resources bound to a rule script. + */ +export interface RuleScopeResponse { + /** + * Ledger references the script writes to, each bound to one of the user\'s own main ledgers. + */ + 'ledgers': { [key: string]: string; }; + /** + * Character references the script can read, each bound to one of the user\'s own characters. + */ + 'characters': { [key: string]: number; }; + /** + * Corporation references the script can read, each bound to a corporation of one of the user\'s own characters. + */ + 'corporations': { [key: string]: number; }; + /** + * Corporation wallet division references the script can read, each bound to a corporation of one of the user\'s own characters. + */ + 'walletDivisions': { [key: string]: WalletDivisionTargetResponse; }; +} +/** + * A named rule script to store in the book, together with its scope. + */ +export interface RuleScriptRequest { + /** + * Unique script name within the book; a lowercase alphanumeric identifier. + */ + 'name': string; + /** + * The ledgers and other resources bound to this script. + */ + 'scope': RuleScopeRequest; + /** + * The classification script source. + */ + 'script': string; +} +/** + * A named rule script within the book, together with its scope. + */ +export interface RuleScriptResponse { + /** + * Unique script name within the book. + */ + 'name': string; + /** + * The ledgers and other resources bound to this script. + */ + 'scope': RuleScopeResponse; /** * The classification script source. */ @@ -805,17 +877,39 @@ export interface UpdateMainLedgerRequest { 'name': string; } /** - * Request to update the caller\'s rule book; replaces its mutable fields. + * Request to update the caller\'s rule book; replaces its rule scripts. */ export interface UpdateRuleBookRequest { /** - * Ledger references the script writes to, each bound to one of the user\'s ledgers. + * The rule scripts making up the book. */ - 'bindings': { [key: string]: string; }; + 'scripts': Array; +} +/** + * A corporation wallet division to bind. + */ +export interface WalletDivisionTargetRequest { /** - * The classification script source. + * The corporation the wallet division belongs to. */ - 'script': string; + 'corporationId': number; + /** + * The wallet division number, from 1 to 7. + */ + 'division': number; +} +/** + * A corporation wallet division bound to the script. + */ +export interface WalletDivisionTargetResponse { + /** + * The corporation the wallet division belongs to. + */ + 'corporationId': number; + /** + * The wallet division number, from 1 to 7. + */ + 'division': number; } /** @@ -3909,12 +4003,16 @@ export const RuleScriptApiAxiosParamCreator = function (configuration?: Configur return { /** * - * @summary Download the TypeScript definitions for the rule script runtime + * @summary Download a rule script type definition file by name + * @param {string} name * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getScriptDefinitions: async (options: RawAxiosRequestConfig = {}): Promise => { - const localVarPath = `/rule-scripts/definitions`; + getScriptDefinition: async (name: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'name' is not null or undefined + assertParamExists('getScriptDefinition', 'name', name) + const localVarPath = `/rule-scripts/definitions/{name}` + .replace('{name}', encodeURIComponent(String(name))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -3932,6 +4030,36 @@ export const RuleScriptApiAxiosParamCreator = function (configuration?: Configur let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary List the available rule script type definition files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listScriptDefinitions: async (options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/rule-scripts/definitions`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = '*/*'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, @@ -3948,14 +4076,27 @@ export const RuleScriptApiFp = function(configuration?: Configuration) { return { /** * - * @summary Download the TypeScript definitions for the rule script runtime + * @summary Download a rule script type definition file by name + * @param {string} name * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getScriptDefinitions(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getScriptDefinitions(options); + async getScriptDefinition(name: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getScriptDefinition(name, options); const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['RuleScriptApi.getScriptDefinitions']?.[localVarOperationServerIndex]?.url; + const localVarOperationServerBasePath = operationServerMap['RuleScriptApi.getScriptDefinition']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * + * @summary List the available rule script type definition files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async listScriptDefinitions(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.listScriptDefinitions(options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['RuleScriptApi.listScriptDefinitions']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, } @@ -3969,12 +4110,22 @@ export const RuleScriptApiFactory = function (configuration?: Configuration, bas return { /** * - * @summary Download the TypeScript definitions for the rule script runtime + * @summary Download a rule script type definition file by name + * @param {string} name * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getScriptDefinitions(options?: RawAxiosRequestConfig): AxiosPromise { - return localVarFp.getScriptDefinitions(options).then((request) => request(axios, basePath)); + getScriptDefinition(name: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.getScriptDefinition(name, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary List the available rule script type definition files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + listScriptDefinitions(options?: RawAxiosRequestConfig): AxiosPromise> { + return localVarFp.listScriptDefinitions(options).then((request) => request(axios, basePath)); }, }; }; @@ -3985,12 +4136,23 @@ export const RuleScriptApiFactory = function (configuration?: Configuration, bas export class RuleScriptApi extends BaseAPI { /** * - * @summary Download the TypeScript definitions for the rule script runtime + * @summary Download a rule script type definition file by name + * @param {string} name * @param {*} [options] Override http request option. * @throws {RequiredError} */ - public getScriptDefinitions(options?: RawAxiosRequestConfig) { - return RuleScriptApiFp(this.configuration).getScriptDefinitions(options).then((request) => request(this.axios, this.basePath)); + public getScriptDefinition(name: string, options?: RawAxiosRequestConfig) { + return RuleScriptApiFp(this.configuration).getScriptDefinition(name, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary List the available rule script type definition files + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public listScriptDefinitions(options?: RawAxiosRequestConfig) { + return RuleScriptApiFp(this.configuration).listScriptDefinitions(options).then((request) => request(this.axios, this.basePath)); } } -- 2.54.0 From f7a193d1c5a286bdfb094989fb8d6a67ab4dc3f6 Mon Sep 17 00:00:00 2001 From: Sirttas Date: Sat, 8 Aug 2026 21:28:23 +0200 Subject: [PATCH 2/3] feat: New runner UI --- src/pages/rules/EditRuleBook.vue | 205 ++++++++++++++++++++++++++----- src/rules/ScriptEditor.vue | 40 ++++-- src/rules/rules.ts | 19 ++- 3 files changed, 214 insertions(+), 50 deletions(-) diff --git a/src/pages/rules/EditRuleBook.vue b/src/pages/rules/EditRuleBook.vue index bd5eb06..b685c64 100644 --- a/src/pages/rules/EditRuleBook.vue +++ b/src/pages/rules/EditRuleBook.vue @@ -1,49 +1,111 @@