lh-api-client 0.0.2 → 0.0.3

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.
@@ -1,13 +1,20 @@
1
1
  import { Client } from '../client';
2
2
  /**
3
- * One audit entry from `GET /platform/audit`. Mirrors the `AuditLog`
4
- * Prisma model (backend/prisma/schema.prisma) verbatim — verified by
5
- * canary smoke 2026-05-20 against live data.
3
+ * One audit entry from `GET /platform/audit`. Mirrors the backend
4
+ * `AuditLogRow` (backend/src/modules/audit/audit.service.ts) verbatim —
5
+ * resynced 2026-09-02 (#896) after #886 added label enrichment on the
6
+ * read path.
6
7
  *
7
8
  * `occurredAt` is the timestamp; `before` + `after` are diffable JSON
8
9
  * snapshots (used for state-change audits); `payload` is free-form
9
10
  * context (request params, response codes, etc.). All three Json fields
10
11
  * are nullable — many actions only set one or two.
12
+ *
13
+ * Label fields (#886): `platformTokenId` is the raw anchor the backend
14
+ * enriches from; `actorEmail`/`actorName`/`orgName`/`tokenLabel`/
15
+ * `tokenPrefix` are ABSENT when the referenced id doesn't resolve
16
+ * (actor 'system', purged org/token) — the raw id remains the display
17
+ * fallback. Never assume they are present.
11
18
  */
12
19
  export interface AuditEntry {
13
20
  id: string;
@@ -18,7 +25,23 @@ export interface AuditEntry {
18
25
  before: unknown;
19
26
  after: unknown;
20
27
  payload: unknown;
28
+ platformTokenId: string | null;
29
+ actorEmail?: string;
30
+ actorName?: string;
31
+ orgName?: string;
32
+ tokenLabel?: string | null;
33
+ tokenPrefix?: string;
21
34
  }
35
+ /**
36
+ * Every `action` literal the backend currently writes via
37
+ * `auditService.record()` (grep-audited 2026-09-02, #896 — includes the
38
+ * #881 `plan.archive.force` and ADR-015 `api_key.auto_inactivate`/`park`
39
+ * family). `AuditEntry.action` stays `string` on purpose: new backend
40
+ * actions must not break typed consumers. Keep this list in sync when a
41
+ * new `record()` call site lands; `activity/enterprise-visible-actions`
42
+ * on the backend is the enforcement point for the tenant-visible subset.
43
+ */
44
+ export declare const AUDIT_ACTIONS: readonly ["api_key.acknowledge", "api_key.auto_inactivate", "api_key.create", "api_key.park", "api_key.reactivate", "api_key.revoke", "api_key.revoke_token_orphaned", "api_key.switch_subscription", "auth.password.change", "auth.password.reset", "drift.settle_failed", "member.create", "member.deactivate", "member.delete", "member.enable_login", "member.freeze", "member.import", "member.reactivate", "member.reset_login_password", "member.set_budget_cap", "member.unfreeze", "member.update", "notification.broadcast", "org.activate", "org.create", "org.rename", "org.set_currency", "org.suspend", "plan.archive", "plan.archive.force", "plan.create", "plan.publish", "plan.update", "platform_token.create", "platform_token.revoke", "pricebook.activate", "pricebook.create", "provision.base_sub_anchor_fallback", "subscription.cancel", "subscription.contract.extend", "subscription.create", "subscription.rebook", "subscription.status_change", "topup.execute", "user.create"];
22
45
  export interface QueryAuditArgs {
23
46
  /** ISO-8601 inclusive start, e.g. 2026-04-19T00:00:00Z */
24
47
  from: string;
@@ -1,6 +1,63 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUDIT_ACTIONS = void 0;
3
4
  exports.queryAudit = queryAudit;
5
+ /**
6
+ * Every `action` literal the backend currently writes via
7
+ * `auditService.record()` (grep-audited 2026-09-02, #896 — includes the
8
+ * #881 `plan.archive.force` and ADR-015 `api_key.auto_inactivate`/`park`
9
+ * family). `AuditEntry.action` stays `string` on purpose: new backend
10
+ * actions must not break typed consumers. Keep this list in sync when a
11
+ * new `record()` call site lands; `activity/enterprise-visible-actions`
12
+ * on the backend is the enforcement point for the tenant-visible subset.
13
+ */
14
+ exports.AUDIT_ACTIONS = [
15
+ 'api_key.acknowledge',
16
+ 'api_key.auto_inactivate',
17
+ 'api_key.create',
18
+ 'api_key.park',
19
+ 'api_key.reactivate',
20
+ 'api_key.revoke',
21
+ 'api_key.revoke_token_orphaned',
22
+ 'api_key.switch_subscription',
23
+ 'auth.password.change',
24
+ 'auth.password.reset',
25
+ 'drift.settle_failed',
26
+ 'member.create',
27
+ 'member.deactivate',
28
+ 'member.delete',
29
+ 'member.enable_login',
30
+ 'member.freeze',
31
+ 'member.import',
32
+ 'member.reactivate',
33
+ 'member.reset_login_password',
34
+ 'member.set_budget_cap',
35
+ 'member.unfreeze',
36
+ 'member.update',
37
+ 'notification.broadcast',
38
+ 'org.activate',
39
+ 'org.create',
40
+ 'org.rename',
41
+ 'org.set_currency',
42
+ 'org.suspend',
43
+ 'plan.archive',
44
+ 'plan.archive.force',
45
+ 'plan.create',
46
+ 'plan.publish',
47
+ 'plan.update',
48
+ 'platform_token.create',
49
+ 'platform_token.revoke',
50
+ 'pricebook.activate',
51
+ 'pricebook.create',
52
+ 'provision.base_sub_anchor_fallback',
53
+ 'subscription.cancel',
54
+ 'subscription.contract.extend',
55
+ 'subscription.create',
56
+ 'subscription.rebook',
57
+ 'subscription.status_change',
58
+ 'topup.execute',
59
+ 'user.create',
60
+ ];
4
61
  /**
5
62
  * v0.2.0 agent read tool. Mirrors `GET /platform/audit` (lh-ops CLI has
6
63
  * the same endpoint via `audit query`). All filters are AND-composed
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":";;AAiDA,gCAgBC;AAzBD;;;;;;;;GAQG;AACI,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAoB;IAEpB,OAAO,MAAM,CAAC,OAAO,CAAe,iBAAiB,EAAE;QACrD,MAAM,EAAE,KAAK;QACb,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":";;;AAwHA,gCAgBC;AApGD;;;;;;;;GAQG;AACU,QAAA,aAAa,GAAG;IAC3B,qBAAqB;IACrB,yBAAyB;IACzB,gBAAgB;IAChB,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,+BAA+B;IAC/B,6BAA6B;IAC7B,sBAAsB;IACtB,qBAAqB;IACrB,qBAAqB;IACrB,eAAe;IACf,mBAAmB;IACnB,eAAe;IACf,qBAAqB;IACrB,eAAe;IACf,eAAe;IACf,mBAAmB;IACnB,6BAA6B;IAC7B,uBAAuB;IACvB,iBAAiB;IACjB,eAAe;IACf,wBAAwB;IACxB,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,aAAa;IACb,cAAc;IACd,oBAAoB;IACpB,aAAa;IACb,cAAc;IACd,aAAa;IACb,uBAAuB;IACvB,uBAAuB;IACvB,oBAAoB;IACpB,kBAAkB;IAClB,oCAAoC;IACpC,qBAAqB;IACrB,8BAA8B;IAC9B,qBAAqB;IACrB,qBAAqB;IACrB,4BAA4B;IAC5B,eAAe;IACf,aAAa;CACL,CAAC;AAoBX;;;;;;;;GAQG;AACI,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAoB;IAEpB,OAAO,MAAM,CAAC,OAAO,CAAe,iBAAiB,EAAE;QACrD,MAAM,EAAE,KAAK;QACb,KAAK,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB;KACF,CAAC,CAAC;AACL,CAAC"}
package/dist/client.js CHANGED
@@ -61,7 +61,13 @@ class Client {
61
61
  attempt++;
62
62
  continue;
63
63
  }
64
- throw err;
64
+ // #542 — HTTP errors (ApiError) carry their own context; network-layer
65
+ // errors get enriched with method/URL + a write-side hint so operators
66
+ // can decide whether a non-idempotent write (issue/topup/provision) may
67
+ // have landed before retrying — instead of a bare "fetch failed".
68
+ if (err instanceof ApiError)
69
+ throw err;
70
+ throw enrichNetworkError(method, url, err);
65
71
  }
66
72
  }
67
73
  }
@@ -117,4 +123,16 @@ function isTransientNetworkError(err) {
117
123
  function sleep(ms) {
118
124
  return new Promise((resolve) => setTimeout(resolve, ms));
119
125
  }
126
+ // #542 — wrap a network-layer error with method/URL + a write-side hint. GET
127
+ // (idempotent) gets no hint; non-idempotent writes get "可能已生效" so operators
128
+ // verify with a read command before retrying (avoids duplicate issue/topup).
129
+ function enrichNetworkError(method, url, err) {
130
+ const cause = err instanceof Error ? err.message : String(err);
131
+ const hint = method === 'GET'
132
+ ? ''
133
+ : ' — 该操作可能已生效,重试前先用读命令核对(如 lh-ops token list / get_statement),避免重复签发/充值/开通';
134
+ const e = new Error(`${method} ${url.pathname} 网络失败: ${cause}${hint}`);
135
+ e.cause = err;
136
+ return e;
137
+ }
120
138
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;;;AAmB9E,MAAa,QAAS,SAAQ,KAAK;IAEf;IACA;IAFlB,YACkB,MAAc,EACd,IAAa,EAC7B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAS;QAI7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AATD,4BASC;AAED,MAAa,MAAM;IACY;IAA7B,YAA6B,IAAmB;QAAnB,SAAI,GAAJ,IAAI,CAAe;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,UAA0B,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,KAAK,SAAS;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,aAAa,GAAG,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACzE,IAAI,OAAO,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACvC,MAAM,eAAe,GAAG,MAAM,KAAK,KAAK,CAAC;QACzC,wEAAwE;QACxE,0DAA0D;QAC1D,qDAAqD;QACrD,2DAA2D;QAC3D,mDAAmD;QACnD,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,iDAAiD;QACjD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAC3B,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC5E,CAAC,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,cAAc,CAAI,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,GAAG,WAAW,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1D,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9C,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;oBACrB,OAAO,EAAE,CAAC;oBACV,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,GAAa,EACb,MAAc,EACd,GAAQ;QAER,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAChB,GAAG,CAAC,MAAM,EACV,MAAM,EACN,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,SAAS,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CACtE,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,+EAA+E;QAC/E,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB,MAAM,IAAK,MAAkC,EAC7C,CAAC;YACD,OAAQ,MAAsB,CAAC,IAAI,CAAC;QACtC,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC;CACF;AAlFD,wBAkFC;AAED,2EAA2E;AAC3E,wEAAwE;AACxE,0EAA0E;AAC1E,8EAA8E;AAC9E,SAAS,uBAAuB,CAAC,GAAY;IAC3C,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;IACjD,IACE,IAAI,KAAK,YAAY;QACrB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,WAAW;QACpB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,cAAc,EACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,yEAAyE;IACzE,+EAA+E;IAC/E,MAAM,KAAK,GAAI,GAA2B,CAAC,KAAK,CAAC;IACjD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export type { ApiKeyExportRow, ListApiKeysArgs } from './api-keys';
15
15
  export { listMembers, unfreezeMember, setMemberBudgetCap, } from './member';
16
16
  export type { MemberRow, ListMembersArgs } from './member';
17
17
  export { queryAudit } from './audit';
18
+ export { AUDIT_ACTIONS } from './audit';
18
19
  export type { AuditEntry, QueryAuditArgs } from './audit';
19
20
  export { listPlans, getPlan, updatePlan, archivePlan } from './plan';
20
21
  export type { Plan, PlanQuota, PlanStatus, ListPlansArgs, UpdatePlanInput, } from './plan';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.revokePlatformToken = exports.listPlatformTokens = exports.issuePlatformToken = exports.listUpstreamModels = exports.executeTopup = exports.addSubscription = exports.extendContract = exports.listPriceBooks = exports.archivePlan = exports.updatePlan = exports.getPlan = exports.listPlans = exports.queryAudit = exports.setMemberBudgetCap = exports.unfreezeMember = exports.listMembers = exports.listApiKeys = exports.PHASE2_BANNER = exports.DEFAULT_STATE_PATH = exports.phase2Status = exports.savePhase2Flags = exports.loadPhase2Flags = exports.evaluatePhase2State = exports.getCacheCoverage = exports.getOrgUsage = exports.getStatement = exports.setOrgCurrency = exports.provisionOrg = exports.renameOrg = exports.getOrgTokens = exports.listOrgs = exports.ApiError = exports.Client = void 0;
3
+ exports.revokePlatformToken = exports.listPlatformTokens = exports.issuePlatformToken = exports.listUpstreamModels = exports.executeTopup = exports.addSubscription = exports.extendContract = exports.listPriceBooks = exports.archivePlan = exports.updatePlan = exports.getPlan = exports.listPlans = exports.AUDIT_ACTIONS = exports.queryAudit = exports.setMemberBudgetCap = exports.unfreezeMember = exports.listMembers = exports.listApiKeys = exports.PHASE2_BANNER = exports.DEFAULT_STATE_PATH = exports.phase2Status = exports.savePhase2Flags = exports.loadPhase2Flags = exports.evaluatePhase2State = exports.getCacheCoverage = exports.getOrgUsage = exports.getStatement = exports.setOrgCurrency = exports.provisionOrg = exports.renameOrg = exports.getOrgTokens = exports.listOrgs = exports.ApiError = exports.Client = void 0;
4
4
  // Public surface — both lh-ops and lh-ops-skill import from here.
5
5
  var client_1 = require("./client");
6
6
  Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_1.Client; } });
@@ -32,6 +32,8 @@ Object.defineProperty(exports, "unfreezeMember", { enumerable: true, get: functi
32
32
  Object.defineProperty(exports, "setMemberBudgetCap", { enumerable: true, get: function () { return member_1.setMemberBudgetCap; } });
33
33
  var audit_1 = require("./audit");
34
34
  Object.defineProperty(exports, "queryAudit", { enumerable: true, get: function () { return audit_1.queryAudit; } });
35
+ var audit_2 = require("./audit");
36
+ Object.defineProperty(exports, "AUDIT_ACTIONS", { enumerable: true, get: function () { return audit_2.AUDIT_ACTIONS; } });
35
37
  var plan_1 = require("./plan");
36
38
  Object.defineProperty(exports, "listPlans", { enumerable: true, get: function () { return plan_1.listPlans; } });
37
39
  Object.defineProperty(exports, "getPlan", { enumerable: true, get: function () { return plan_1.getPlan; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAClE,mCAA4C;AAAnC,gGAAA,MAAM,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAGzB,+BAMgB;AALd,gGAAA,QAAQ,OAAA;AACR,oGAAA,YAAY,OAAA;AACZ,iGAAA,SAAS,OAAA;AACT,oGAAA,YAAY,OAAA;AACZ,sGAAA,cAAc,OAAA;AAahB,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AAGrB,yCAA0C;AAAjC,wGAAA,WAAW,OAAA;AAEpB,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA;AAGzB,mCAOkB;AANhB,6GAAA,mBAAmB,OAAA;AACnB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AASf,uCAAyC;AAAhC,uGAAA,WAAW,OAAA;AAGpB,mCAIkB;AAHhB,qGAAA,WAAW,OAAA;AACX,wGAAA,cAAc,OAAA;AACd,4GAAA,kBAAkB,OAAA;AAIpB,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AAGnB,+BAAqE;AAA5D,iGAAA,SAAS,OAAA;AAAE,+FAAA,OAAO,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,mGAAA,WAAW,OAAA;AASpD,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AAGvB,+CAAiE;AAAxD,8GAAA,cAAc,OAAA;AAAE,+GAAA,eAAe,OAAA;AAOxC,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AAGrB,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAE3B,mDAI0B;AAHxB,oHAAA,kBAAkB,OAAA;AAClB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAClE,mCAA4C;AAAnC,gGAAA,MAAM,OAAA;AAAE,kGAAA,QAAQ,OAAA;AAGzB,+BAMgB;AALd,gGAAA,QAAQ,OAAA;AACR,oGAAA,YAAY,OAAA;AACZ,iGAAA,SAAS,OAAA;AACT,oGAAA,YAAY,OAAA;AACZ,sGAAA,cAAc,OAAA;AAahB,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AAGrB,yCAA0C;AAAjC,wGAAA,WAAW,OAAA;AAEpB,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA;AAGzB,mCAOkB;AANhB,6GAAA,mBAAmB,OAAA;AACnB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,sGAAA,YAAY,OAAA;AACZ,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AASf,uCAAyC;AAAhC,uGAAA,WAAW,OAAA;AAGpB,mCAIkB;AAHhB,qGAAA,WAAW,OAAA;AACX,wGAAA,cAAc,OAAA;AACd,4GAAA,kBAAkB,OAAA;AAIpB,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AACnB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAGtB,+BAAqE;AAA5D,iGAAA,SAAS,OAAA;AAAE,+FAAA,OAAO,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,mGAAA,WAAW,OAAA;AASpD,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AAGvB,+CAAiE;AAAxD,8GAAA,cAAc,OAAA;AAAE,+GAAA,eAAe,OAAA;AAOxC,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AAGrB,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAE3B,mDAI0B;AAHxB,oHAAA,kBAAkB,OAAA;AAClB,oHAAA,kBAAkB,OAAA;AAClB,qHAAA,mBAAmB,OAAA"}
@@ -1,13 +1,15 @@
1
1
  import { Client } from '../client';
2
2
  /**
3
3
  * Body for `POST /platform/topups/execute` (ExecuteTopupDto, #28 Smoke-A
4
- * subset). Single-shot deposit: credits an org's balance and writes the audit +
5
- * DEPOSIT log atomically. `amountUsd` must be positive (negative adjustments
6
- * belong to a separate path). Requires the `write:billing` scope on the token.
4
+ * subset). Single-shot balance movement: credits (positive) or deducts
5
+ * (negative) an org's balance and writes the audit + DEPOSIT log atomically.
6
+ * #734 (Option A): negative amounts are allowed (operator deduction /
7
+ * correction). Zero is rejected at the service layer. Requires the
8
+ * `write:billing` scope on the token.
7
9
  */
8
10
  export interface ExecuteTopupArgs {
9
11
  orgId: string;
10
- /** Positive USD amount (≥ 0.01). */
12
+ /** USD-canonical amount. Positive = credit, negative = deduction (#734). */
11
13
  amountUsd: number;
12
14
  memo?: string;
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/topup/index.ts"],"names":[],"mappings":";;AAuCA,oCAYC;AAjBD;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,IAAsB;IAEtB,OAAO,MAAM,CAAC,OAAO,CAAc,0BAA0B,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/topup/index.ts"],"names":[],"mappings":";;AAyCA,oCAYC;AAjBD;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,IAAsB;IAEtB,OAAO,MAAM,CAAC,OAAO,CAAc,0BAA0B,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lh-api-client",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "private": false,
5
5
  "description": "Shared HTTP client + types + pure-logic helpers for talking to LH Enterprise backend. Consumed by lh-ops (CLI) and lh-ops-skill (MCP).",
6
6
  "main": "./dist/index.js",