bkper 4.31.1 → 4.31.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,4 +1,4 @@
1
- import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
1
+ import { type BeforeAgentStartEventResult, type ExtensionAPI } from '@earendil-works/pi-coding-agent';
2
2
  export type CoreConceptsPreloadLevel = 'none' | 'full';
3
3
  export interface CoreConceptsPreloadDefinition {
4
4
  docPath: string;
@@ -7,13 +7,11 @@ export interface CoreConceptsPreloadDefinition {
7
7
  export interface CoreConceptsPreloadInput {
8
8
  prompt: string;
9
9
  }
10
- export interface CoreConceptsPreloadResult {
11
- systemPrompt?: string;
12
- }
10
+ export type CoreConceptsPreloadResult = BeforeAgentStartEventResult;
11
+ export declare const CORE_CONCEPTS_MESSAGE_TYPE = "bkper-core-concepts";
13
12
  export declare function resolveBkperDocPathFromModuleDir(moduleDir: string, relativePath: string): string;
14
13
  export declare function getCoreConceptsDocPath(): string;
15
14
  export declare function getDefaultCoreConceptsPreloadDefinition(): CoreConceptsPreloadDefinition;
16
15
  export declare function detectCoreConceptsPreloadLevel(input: CoreConceptsPreloadInput): CoreConceptsPreloadLevel;
17
- export declare function buildCoreConceptsReadInstruction(coreConceptsPath: string): string;
18
- export declare function registerBkperCoreConceptsPreloadExtension(pi: Pick<ExtensionAPI, 'on'>, definition?: CoreConceptsPreloadDefinition): void;
16
+ export declare function registerBkperCoreConceptsPreloadExtension(pi: Pick<ExtensionAPI, 'on' | 'registerMessageRenderer'>, definition?: CoreConceptsPreloadDefinition): void;
19
17
  //# sourceMappingURL=core-concepts-preload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-concepts-preload.d.ts","sourceRoot":"","sources":["../../../src/agent/extensions/core-concepts-preload.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAUpE,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,6BAA6B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAWD,wBAAgB,gCAAgC,CAC5C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACrB,MAAM,CAaR;AAgBD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,uCAAuC,IAAI,6BAA6B,CAMvF;AAED,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,wBAAwB,GAChC,wBAAwB,CAoB1B;AAED,wBAAgB,gCAAgC,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAEjF;AAeD,wBAAgB,yCAAyC,CACrD,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,EAC5B,UAAU,GAAE,6BAAyE,GACtF,IAAI,CAkBN"}
1
+ {"version":3,"file":"core-concepts-preload.d.ts","sourceRoot":"","sources":["../../../src/agent/extensions/core-concepts-preload.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,KAAK,2BAA2B,EAChC,KAAK,YAAY,EAMpB,MAAM,iCAAiC,CAAC;AAWzC,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,6BAA6B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,yBAAyB,GAAG,2BAA2B,CAAC;AAEpE,eAAO,MAAM,0BAA0B,wBAAwB,CAAC;AAUhE,wBAAgB,gCAAgC,CAC5C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACrB,MAAM,CAaR;AAOD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,uCAAuC,IAAI,6BAA6B,CAMvF;AAED,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,wBAAwB,GAChC,wBAAwB,CAoB1B;AAuDD,wBAAgB,yCAAyC,CACrD,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,yBAAyB,CAAC,EACxD,UAAU,GAAE,6BAAyE,GACtF,IAAI,CAqBN"}
@@ -1,10 +1,13 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+ import { createReadToolDefinition, } from '@earendil-works/pi-coding-agent';
5
+ import { Box } from '@earendil-works/pi-tui';
4
6
  const DOCS_PATTERN = /\b(doc|docs|documentation|readme|guide|guides|example|examples|spec|specs|reference)\b/i;
5
7
  const ANALYSIS_PATTERN = /\b(review|audit|validate|verify|critique|rewrite|document|describe|explain|design|model|map|check|spot)\b/i;
6
8
  const AUTOMATION_PATTERN = /\b(bot|bots|app|apps|automation|automations)\b/i;
7
9
  const SEMANTIC_PATTERN = /\b(bkper|book|books|account|accounts|group|groups|transaction|transactions|balance|balances|incoming|outgoing|asset|assets|liability|liabilities|receivable|receivables|payable|payables|statement|statements|ledger|flow|flows|movement|movements|collection|collections|tax)\b/i;
10
+ export const CORE_CONCEPTS_MESSAGE_TYPE = 'bkper-core-concepts';
8
11
  export function resolveBkperDocPathFromModuleDir(moduleDir, relativePath) {
9
12
  const candidates = [
10
13
  path.resolve(moduleDir, '..', '..', 'docs', relativePath),
@@ -21,13 +24,6 @@ function resolveDocPath(relativePath) {
21
24
  const thisDir = path.dirname(fileURLToPath(import.meta.url));
22
25
  return resolveBkperDocPathFromModuleDir(thisDir, relativePath);
23
26
  }
24
- function normalizePath(filePath) {
25
- return path.resolve(filePath);
26
- }
27
- function getReadToolPath(input) {
28
- const maybeReadInput = input;
29
- return typeof maybeReadInput.path === 'string' ? normalizePath(maybeReadInput.path) : undefined;
30
- }
31
27
  export function getCoreConceptsDocPath() {
32
28
  return resolveDocPath('core/core-concepts.md');
33
29
  }
@@ -55,30 +51,62 @@ export function detectCoreConceptsPreloadLevel(input) {
55
51
  }
56
52
  return 'none';
57
53
  }
58
- export function buildCoreConceptsReadInstruction(coreConceptsPath) {
59
- return `## Mandatory Bkper Core Concepts Read\nBefore doing anything else for this task, use the \`read\` tool to load the Bkper core concepts from:\n\n\`\`\`\n${coreConceptsPath}\n\`\`\`\n\nRead this file before any other tool call or substantive response. After reading it, continue normally.`;
54
+ function buildCoreConceptsMessageContent(definition) {
55
+ return `## Bkper Core Concepts\nLoaded from \`${definition.docPath}\`. Base all reasoning about Bkper data on this reference.\n\n${definition.markdown}`;
60
56
  }
61
- function buildCoreConceptsPreloadResult(systemPrompt, definition) {
62
- return {
63
- systemPrompt: `${systemPrompt}\n\n${buildCoreConceptsReadInstruction(definition.docPath)}`,
64
- };
57
+ function hasCoreConceptsInContext(entries) {
58
+ return entries.some((entry) => entry.type === 'custom_message' && entry.customType === CORE_CONCEPTS_MESSAGE_TYPE);
65
59
  }
66
- function shouldAllowReadToolCall(event, definition) {
67
- return event.toolName === 'read' && getReadToolPath(event.input) === normalizePath(definition.docPath);
60
+ /**
61
+ * Renders the injected message with Pi's own read tool renderers, so it looks
62
+ * like a read of the doc: collapsed shows the path, expanded shows the content.
63
+ */
64
+ function createCoreConceptsMessageRenderer(definition) {
65
+ return (_message, options, theme) => {
66
+ const cwd = process.cwd();
67
+ const read = createReadToolDefinition(cwd);
68
+ if (!read.renderCall || !read.renderResult) {
69
+ return undefined;
70
+ }
71
+ const args = { path: definition.docPath };
72
+ const context = {
73
+ args,
74
+ toolCallId: CORE_CONCEPTS_MESSAGE_TYPE,
75
+ invalidate: () => undefined,
76
+ lastComponent: undefined,
77
+ state: {},
78
+ cwd,
79
+ executionStarted: true,
80
+ argsComplete: true,
81
+ isPartial: false,
82
+ expanded: options.expanded,
83
+ showImages: false,
84
+ isError: false,
85
+ };
86
+ // Same shell Pi uses for a successful tool row.
87
+ const box = new Box(1, 1, (text) => theme.bg('toolSuccessBg', text));
88
+ box.addChild(read.renderCall(args, theme, context));
89
+ box.addChild(read.renderResult({ content: [{ type: 'text', text: definition.markdown }], details: undefined }, { expanded: options.expanded, isPartial: false }, theme, context));
90
+ return box;
91
+ };
68
92
  }
69
93
  export function registerBkperCoreConceptsPreloadExtension(pi, definition = getDefaultCoreConceptsPreloadDefinition()) {
70
- let hasLoadedCoreConcepts = false;
71
- pi.on('before_agent_start', event => {
72
- if (hasLoadedCoreConcepts || detectCoreConceptsPreloadLevel({ prompt: event.prompt }) === 'none') {
94
+ pi.registerMessageRenderer(CORE_CONCEPTS_MESSAGE_TYPE, createCoreConceptsMessageRenderer(definition));
95
+ pi.on('before_agent_start', (event, ctx) => {
96
+ if (detectCoreConceptsPreloadLevel({ prompt: event.prompt }) === 'none') {
73
97
  return undefined;
74
98
  }
75
- return buildCoreConceptsPreloadResult(event.systemPrompt, definition);
76
- });
77
- pi.on('tool_call', event => {
78
- if (shouldAllowReadToolCall(event, definition)) {
79
- hasLoadedCoreConcepts = true;
99
+ // Compaction-aware: content summarized away by compaction is injected again.
100
+ if (hasCoreConceptsInContext(ctx.sessionManager.buildContextEntries())) {
101
+ return undefined;
80
102
  }
81
- return undefined;
103
+ return {
104
+ message: {
105
+ customType: CORE_CONCEPTS_MESSAGE_TYPE,
106
+ content: buildCoreConceptsMessageContent(definition),
107
+ display: true,
108
+ },
109
+ };
82
110
  });
83
111
  }
84
112
  //# sourceMappingURL=core-concepts-preload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-concepts-preload.js","sourceRoot":"","sources":["../../../src/agent/extensions/core-concepts-preload.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core-concepts-preload.js","sourceRoot":"","sources":["../../../src/agent/extensions/core-concepts-preload.ts"],"names":[],"mappings":"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"}
@@ -283,7 +283,7 @@ To authenticate Bkper CLI:
283
283
  1. Open this URL: ${deviceCode.verificationUrl}
284
284
  2. Enter this code: ${deviceCode.userCode}
285
285
 
286
- Waiting for authorization... Keep this command running while you complete browser sign-in.
286
+ Waiting for authorization...
287
287
  `);
288
288
  }
289
289
  function sleep(ms, signal) {
@@ -532,7 +532,7 @@ deployment:
532
532
 
533
533
  ### Authentication
534
534
 
535
- - `auth login` - Connect the CLI to your Bkper account, storing credentials locally. Keep the process running while completing browser authorization.
535
+ - `auth login` - Connect the CLI to your Bkper account, storing credentials locally. For agents: share the device code as a progress update without ending the turn or stopping `bkper auth login`; keep it running while the user signs in.
536
536
  - `auth logout` - Revoke the stored Bkper refresh token and clear local credentials
537
537
  - `auth token` - Print the current Bkper OAuth access token to stdout (requires prior login)
538
538
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bkper",
3
- "version": "4.31.1",
3
+ "version": "4.31.3",
4
4
  "description": "Official Bkper CLI for accounting data, automation, apps, and AI agents",
5
5
  "bin": {
6
6
  "bkper": "./lib/cli.js"
@@ -47,10 +47,11 @@
47
47
  "predev": "bun run build",
48
48
  "dev": "tsc -w",
49
49
  "ports": "devpod ssh ../ -L 6274",
50
- "test": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=tsconfig.test.json mocha",
51
- "test:unit": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.json",
52
- "test:integration": "TS_NODE_TRANSPILE_ONLY=true BKPER_API_URL=${BKPER_API_URL:-http://localhost:8081/_ah/api/bkper} TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.integration.json",
53
- "test:deploy": "TS_NODE_TRANSPILE_ONLY=true BKPER_PLATFORM_URL=http://localhost:8790 BKPER_API_URL=https://api-dev.bkper.app TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.deploy.json",
50
+ "test:typecheck": "tsc --noEmit -p tsconfig.test.json",
51
+ "test": "bun run test:typecheck && TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=tsconfig.test.json mocha",
52
+ "test:unit": "bun run test:typecheck && TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.json",
53
+ "test:integration": "bun run test:typecheck && TS_NODE_TRANSPILE_ONLY=true BKPER_API_URL=${BKPER_API_URL:-http://localhost:8081/_ah/api/bkper} TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.integration.json",
54
+ "test:deploy": "bun run test:typecheck && TS_NODE_TRANSPILE_ONLY=true BKPER_PLATFORM_URL=http://localhost:8790 BKPER_API_URL=https://api-dev.bkper.app TS_NODE_PROJECT=tsconfig.test.json mocha --config .mocharc.deploy.json",
54
55
  "test:all": "bun run test:unit && bun run test:integration",
55
56
  "version": "bun ./scripts/sync-plugin-version.ts && git add .claude-plugin/plugin.json .claude-plugin/marketplace.json .codex-plugin/plugin.json",
56
57
  "release:patch": "npm version patch -m \"chore(release): v%s\"",
@@ -61,8 +62,8 @@
61
62
  "upgrade:api": "bun update @bkper/bkper-api-types --latest && bun update bkper-js --latest"
62
63
  },
63
64
  "dependencies": {
64
- "@earendil-works/pi-coding-agent": "0.87.0",
65
- "@earendil-works/pi-tui": "0.87.0",
65
+ "@earendil-works/pi-coding-agent": "0.87.1",
66
+ "@earendil-works/pi-tui": "0.87.1",
66
67
  "bkper-js": "^2.42.0",
67
68
  "commander": "^13.1.0",
68
69
  "dotenv": "^8.2.0",