@dzhi/ocpg 0.6.1 → 0.7.0

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.
Files changed (3) hide show
  1. package/README.md +15 -25
  2. package/ocpg.ts +11 -20
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -12,41 +12,31 @@ In `opencode.json`:
12
12
  ```json
13
13
  {
14
14
  "plugin": [
15
- ["@dzhi/ocpg", {}]
15
+ "@dzhi/ocpg"
16
16
  ]
17
17
  }
18
18
  ```
19
19
 
20
20
  ## Connecting to the database
21
21
 
22
- Pass connection params as the plugin options tuple (all optional):
22
+ Configure the connection via environment variables, e.g. in `~/.zshenv`. Any Postgres user and database name will do — use whatever names fit your setup and mirror them here:
23
23
 
24
- ```json
25
- {
26
- "plugin": [
27
- [
28
- "@dzhi/ocpg",
29
- {
30
- "host": "localhost",
31
- "port": 5432,
32
- "user": "pguser",
33
- "database": "agent-memory"
34
- }
35
- ]
36
- ]
37
- }
24
+ ```bash
25
+ export OCPG_HOST="localhost"
26
+ export OCPG_PORT="5432"
27
+ export OCPG_USER="ocpguser"
28
+ export OCPG_PASSWORD="your-postgres-password"
29
+ export OCPG_DB="ocpg"
38
30
  ```
39
31
 
40
- Precedence: plugin options > env vars > defaults.
41
-
42
- | Param | Env var (fallback) | Default |
43
- | ---------- | ------------------ | -------------- |
44
- | `host` | `OCPG_HOST` | `localhost` |
45
- | `port` | `OCPG_PORT` | `5432` |
46
- | `user` | `OCPG_USER` | `pguser` |
47
- | `database` | `OCPG_DB` | `agent-memory` |
32
+ | Env var | Default |
33
+ | --------------- | ------------ |
34
+ | `OCPG_HOST` | `localhost` |
35
+ | `OCPG_PORT` | `5432` |
36
+ | `OCPG_USER` | `ocpguser` |
37
+ | `OCPG_DB` | `ocpg` |
48
38
 
49
- **Password is never set via params** it resolves from `OCPG_PASSWORD`.
39
+ **Password is env-only.** If `OCPG_PASSWORD` is unset, the plugin falls back to `pass show postgres-workstation-password` at startup.
50
40
 
51
41
  ## Tools
52
42
 
package/ocpg.ts CHANGED
@@ -2,14 +2,13 @@
2
2
  import { SQL } from "bun";
3
3
  import { Plugin } from "@opencode/plugin";
4
4
 
5
- // --- DB config: plugin options > env > defaults. Password is deliberately env-only (never in config).
6
- type DbOptions = {
7
- host?: string;
8
- port?: number;
9
- user?: string;
10
- database?: string;
5
+ // --- DB config: env > defaults. Plugin options are not read; password is deliberately env-only (never in config).
6
+ type DbConfig = {
7
+ host: string;
8
+ port: number;
9
+ user: string;
10
+ database: string;
11
11
  };
12
- type DbConfig = Required<DbOptions>;
13
12
  type RecallArgs = { query?: string; global?: boolean; limit?: number };
14
13
  type RememberArgs = { content: string; tags?: string[] };
15
14
 
@@ -17,8 +16,8 @@ type RememberArgs = { content: string; tags?: string[] };
17
16
  const defaultConfig: DbConfig = {
18
17
  host: process.env.OCPG_HOST || "localhost",
19
18
  port: Number(process.env.OCPG_PORT) || 5432,
20
- user: process.env.OCPG_USER || "pguser",
21
- database: process.env.OCPG_DB || "agent-memory",
19
+ user: process.env.OCPG_USER || "ocpguser",
20
+ database: process.env.OCPG_DB || "ocpg",
22
21
  };
23
22
  const password =
24
23
  process.env.OCPG_PASSWORD ||
@@ -41,14 +40,6 @@ function makeSql(cfg: DbConfig): SQL {
41
40
 
42
41
  let sql = makeSql(defaultConfig);
43
42
 
44
- // Swap the pool when the plugin loads with config options ({ "package": "@dzhi/ocpg", "options": {...} } in opencode.jsonc).
45
- // No-op without options so the module-level env/default config stands. Pools are lazy — a never-connected pool closes cleanly.
46
- function reconfigure(options?: DbOptions): void {
47
- if (!options) return;
48
- void sql.close().catch(() => {});
49
- sql = makeSql({ ...defaultConfig, ...options });
50
- }
51
-
52
43
  export interface MemoryRow {
53
44
  id: number;
54
45
  content: string;
@@ -229,9 +220,11 @@ async function remember(
229
220
  return `Similar memory already stored as #${dedup[0].id} for this project; skipping insert.`;
230
221
  }
231
222
 
223
+ // sql.array(tags) alone encodes text[] with quoted elements under bun 1.4.2;
224
+ // the element type hint is required for clean array storage.
232
225
  const inserted = await sql`
233
226
  INSERT INTO memories (content, tags, session_id, project)
234
- VALUES (${args.content}, ${sql.array(normalizedTags)}, ${ctx.sessionID}, ${ctx.directory})
227
+ VALUES (${args.content}, ${sql.array(normalizedTags, "text")}, ${ctx.sessionID}, ${ctx.directory})
235
228
  RETURNING id
236
229
  ` as { id: number }[];
237
230
 
@@ -254,7 +247,6 @@ function invalidateInjection(sessionID: string): void {
254
247
  const ocpg = Plugin.define({
255
248
  id: "ocpg",
256
249
  async setup(ctx) {
257
- reconfigure(ctx.options as DbOptions | undefined);
258
250
  const directory = ctx.location.directory;
259
251
 
260
252
  // Inject project memories into every model request's system context.
@@ -318,7 +310,6 @@ const __internals = {
318
310
  get sql() {
319
311
  return sql;
320
312
  },
321
- reconfigure,
322
313
  truncateMemory,
323
314
  formatBlock,
324
315
  handleTransform,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhi/ocpg",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "description": "Postgres-backed persistent memory plugin for OpenCode",
6
6
  "main": "ocpg.ts",