ai-spend-agent 0.9.6 → 0.9.7

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/README.md CHANGED
@@ -29,9 +29,21 @@ provider evidence. Remove it with `npx aibill statusline uninstall`.
29
29
  It reads supported local Claude Code, Codex, and Gemini CLI financial metadata,
30
30
  labels API-equivalent estimates, and can optionally add official OpenAI or
31
31
  Anthropic provider-reported cost
32
- through an environment-variable reference. No product telemetry is sent.
32
+ through an environment-variable reference.
33
33
  aibill never sits in the inference path and never stores, prints, or proxies provider credentials.
34
34
 
35
+ **Telemetry: anonymous command counts, disclosed at first run.** Terminal
36
+ analysis stays on your machine — transcripts, prompts, file names, and dollar
37
+ amounts are never uploaded. Separately, the CLI counts *which* commands run:
38
+ anonymous, never your arguments, paths, content, dollars, or your email.
39
+ Nothing is sent before a one-time notice has been printed on an interactive
40
+ run, so a machine that has never seen that notice (CI, scripts, pipes) never
41
+ sends anything. One command turns it off — `aibill telemetry off` (or
42
+ `DO_NOT_TRACK`, `CI`, or `AI_SPEND_NO_TELEMETRY`) — `aibill telemetry` prints
43
+ the exact last payload verbatim, and while it is on every receipt says so in
44
+ place of "nothing uploaded". Full scope and the never-list:
45
+ [`docs/TELEMETRY.md`](https://github.com/futurastudio/ai-spend-agent/blob/main/docs/TELEMETRY.md).
46
+
35
47
  Connector validation (`live_verified`, `fixture_verified`, `untested`, or
36
48
  `failed`) and each number's financial evidence (`verified`, `estimated`,
37
49
  `detected_unverified`, or `missing`) are separate status axes. Run `npx aibill
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import { buildImproveExperience } from "./improveExperience.js";
18
18
  import { appendAcceptedProjectOutcome, appendProjectApprovalEvent, createProjectAccountabilityOwnership, loadProjectAccountabilityState, projectAccountabilityStatePath, upsertConfirmedProjectOwnership } from "./projectAccountabilityState.js";
19
19
  import { fetchGitHubAcceptedOutcomeV0 } from "./githubAcceptedOutcome.js";
20
20
  import { decideReportAutoOpen, openReportInBrowser, platformOpenCommand } from "./reportOpener.js";
21
- import { generateActionPlanMarkdown, generateApplyArtifactMarkdown, generateCommandSummary, generateDemoPackageMarkdown, generateHtmlReport, generateMarkdownReport, generatePlainEnglishSummary, generatePolicyConfigDraftMarkdown, generateReceiptCompanionHtml, generateReportCardCaption, generateReportCardSvg, generateVerificationPlanMarkdown, groupByDimensions, shellPathPointer } from "@agent-finops/report";
21
+ import { generateActionPlanMarkdown, generateApplyArtifactMarkdown, generateCommandSummary, generateDemoPackageMarkdown, generateHtmlReport, generateMarkdownReport, generatePlainEnglishSummary, generatePolicyConfigDraftMarkdown, generateReceiptCompanionHtml, generateReportCardCaption, generateReportCardSvg, generateVerificationPlanMarkdown, groupByDimensions, shellPathPointer, spendReportTotalLine } from "@agent-finops/report";
22
22
  // One shared v2 sharded store instance for BOTH evidence kinds: the v1
23
23
  // monolithic qualitative adapter re-probed git privacy on every read (176
24
24
  // spawned git processes per warm run with $HOME itself a git repo) and
@@ -4019,12 +4019,14 @@ async function reportCommand(args, runtime = {}) {
4019
4019
  : []),
4020
4020
  {
4021
4021
  label: "Total",
4022
- value: reportInput.dataMode === "sample"
4023
- ? `${formatOptionalUsd(reportInput.summary.totalUsd)} · DEMO SAMPLE · illustrative cost/value evidence · not user data`
4024
- : reportInput.dataMode === "connected_provider" &&
4025
- !(reportInput.allRecords ?? reportInput.providerRecords ?? []).some((record) => typeof record.amountUsd === "number")
4026
- ? "Unavailable · cost/value evidence · no priced financial evidence; missing/null is not zero"
4027
- : `${formatOptionalUsd(reportInput.summary.totalUsd)} · cost/value evidence`
4022
+ // B1: the row is rendered by the report package from this exact
4023
+ // input, so the terminal summary and the report.md/report.html this
4024
+ // command just wrote cannot disagree about whether the money is zero
4025
+ // or unknown. The local branch used to fall straight through to
4026
+ // `formatOptionalUsd(summary.totalUsd)` and `analyzeSpend` returns
4027
+ // a plain 0 for a window where nothing could be priced, so `report`
4028
+ // printed "$0.00" beside artifacts that said "Unavailable".
4029
+ value: spendReportTotalLine(reportInput)
4028
4030
  },
4029
4031
  {
4030
4032
  label: "Privacy",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-spend-agent",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
4
4
  "funding": "https://asktilden.com",
5
5
  "description": "Local-first financial accountability CLI: Claude Code/Codex attribution, provenance, and next actions, plus experimental Gemini CLI cost evidence.",
6
6
  "type": "module",
@@ -55,8 +55,8 @@
55
55
  "prepack": "npm run build"
56
56
  },
57
57
  "dependencies": {
58
- "@agent-finops/core": "0.9.6",
59
- "@agent-finops/report": "0.9.6",
58
+ "@agent-finops/core": "0.9.7",
59
+ "@agent-finops/report": "0.9.7",
60
60
  "yocto-spinner": "^1.2.0"
61
61
  }
62
62
  }