@massa-ai/codex-plugin 1.52.0 → 1.53.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "massa-ai",
3
- "version": "1.52.0",
3
+ "version": "1.53.0",
4
4
  "description": "massa-ai — semantic code search, memory, and context compression for Codex",
5
5
  "author": {
6
6
  "name": "Luiz Massa",
package/install.sh CHANGED
@@ -307,7 +307,7 @@ install_bundled_skills() {
307
307
  fi
308
308
 
309
309
  local installed=0 name src dest
310
- for name in massa-ai persona-router; do
310
+ for name in massa-ai persona-router profile; do
311
311
  src="$SCRIPT_DIR/skills/$name"
312
312
  [[ -d "$src" ]] || continue
313
313
  dest="$HARNESS_SKILLS_DIR/$name"
@@ -336,7 +336,7 @@ if (typeof data.platforms !== "object" || data.platforms === null || Array.isArr
336
336
  }
337
337
  data.version = 2;
338
338
  const prev = data.platforms[host];
339
- data.platforms[host] = { root, skillsOwner: "plugin", skills: ["massa-ai", "persona-router"] };
339
+ data.platforms[host] = { root, skillsOwner: "plugin", skills: ["massa-ai", "persona-router", "profile"] };
340
340
  // The whole-record replace must not drop fields a previous successful install
341
341
  // wrote (R2) — re-attach them. modelProfile (T10, MPS-03 round-trip
342
342
  // obligation) is engine-owned; installRoute is installer-owned but written by
@@ -381,7 +381,7 @@ NODE
381
381
  )"
382
382
  [[ "$raw_owner" == "plugin" ]] && {
383
383
  local name
384
- for name in massa-ai persona-router; do
384
+ for name in massa-ai persona-router profile; do
385
385
  rm -rf "$HARNESS_SKILLS_DIR/$name"
386
386
  done
387
387
  rmdir "$HARNESS_SKILLS_DIR" 2>/dev/null || true
@@ -687,6 +687,35 @@ for src in "$ACTIVE_AGENTS_SRC/"massa-ai-*.toml; do
687
687
  done
688
688
  vecho " + ${specialist_count} subagent specialists (generated from skills/agents/*/SKILL.md)"
689
689
 
690
+ # Shed retired specialists — IPT-02 site 3 (D1 copy-then-prune, D2/AC-02.1a).
691
+ # The copy loop above writes the current set FIRST; only then do we remove
692
+ # owned destination entries the bundle no longer ships. Never the reverse —
693
+ # an interrupted run must never leave the user with fewer agents than before
694
+ # (D1). The removal POPULATION is the destination directory ($AGENTS_DIR,
695
+ # every *.toml, not just files matching the massa-ai- prefix — mirrors the
696
+ # --uninstall loop's population above); the current bundle
697
+ # ($ACTIVE_AGENTS_SRC) supplies only the keep-predicate. Never loop over the
698
+ # bundle to decide removals (D2, AC-02.1a).
699
+ #
700
+ # Ownership test is per-host (D3/AC-02.2), taken verbatim from this file's own
701
+ # --uninstall above: the first line must be exactly "# massa-ai-owned". This
702
+ # is NOT a name-prefix test — $AGENTS_DIR is a directory shared with
703
+ # user-authored agents, and a blind `rm -f massa-ai-*.toml` would delete a
704
+ # user's own file that happens to share the name prefix but carries no marker
705
+ # (AC-02.3, AC-02.5).
706
+ pruned=0
707
+ for f in "$AGENTS_DIR/"*.toml; do
708
+ [[ -f "$f" ]] || continue
709
+ head -n1 "$f" | grep -q "^# massa-ai-owned$" || continue # ownership test (D3)
710
+ base="$(basename "$f")"
711
+ [[ -f "$ACTIVE_AGENTS_SRC/$base" ]] && continue # keep-list: still shipped
712
+ rm -f "$f"
713
+ pruned=$((pruned + 1))
714
+ done
715
+ if [[ "$pruned" -gt 0 ]]; then
716
+ vecho " - pruned ${pruned} retired massa-ai-owned agent TOML files from $AGENTS_DIR/"
717
+ fi
718
+
690
719
  install_variant_tree
691
720
 
692
721
  # Skills bundling (PDO-08, 09): install massa-ai/persona-router into the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massa-ai/codex-plugin",
3
- "version": "1.52.0",
3
+ "version": "1.53.0",
4
4
  "description": "massa-ai plugin for Codex — semantic code search, memory, and context compression",
5
5
  "files": [
6
6
  "agents",
@@ -46,7 +46,7 @@ Before reading any massa-ai file:
46
46
  Never pass `workflowSessionId` in that field. Use `synapse_task_begin`/`synapse_task_end`
47
47
  for task envelopes and `synapse_prefetch` to warm the buffer on file open.
48
48
  - Prefer the shared v2 retrieval order; fall back gracefully if the massa-ai
49
- server or Synapse is unavailable. The full tool surface includes 54 tools
49
+ server or Synapse is unavailable. The full tool surface includes 59 tools
50
50
  (see `references/mcp-tools.md`): indexing, search, symbol graph
51
51
  (`trace_path`, `impact_analysis`, `get_architecture`), memory CRUD
52
52
  (`remember`, `recall`, `memory_update`, `memory_delete`), checkpoints
@@ -1,4 +1,4 @@
1
- # massa-ai Tool Contracts (54 Tools)
1
+ # massa-ai Tool Contracts (59 Tools)
2
2
 
3
3
  Load when exact MCP schemas, REST fallbacks, response modes, or
4
4
  polling rules are needed. Prefer the active tool declaration over copied
@@ -103,6 +103,8 @@ depends on exact content.
103
103
  | `handoff_accept` | Accept an open handoff (open→accepted) | Req: `id`. Opt: `projectId`. |
104
104
  | `handoff_cancel` | Cancel/expire an open handoff | Req: `id`. Opt: `projectId`. |
105
105
  | `handoff_list_pending` | List open handoffs, oldest-first | Req: `projectId`. Opt: `targetAgent`. |
106
+ | `handoff_update` | Edit targetAgent/summary/openQuestions/nextSteps/files by id | Req: `id`. Opt: `projectId`, `targetAgent`, `summary`, `openQuestions`, `nextSteps`, `files` — at least one editable field required. Unknown/restricted fields (`status`, `acceptedAt`, etc.) are rejected by name. |
107
+ | `handoff_delete` | Hard-delete a handoff, any status | Req: `id`. Opt: `projectId`. |
106
108
 
107
109
  ## MCP Capability Matrix — Auto-improvement (Proposals)
108
110
 
@@ -111,6 +113,9 @@ depends on exact content.
111
113
  | `list_proposals` | List pending auto-improvement proposals, newest-first | Req: `projectId`. |
112
114
  | `approve_proposal` | Approve a proposal; applies the memory edit | Req: `id`. Opt: `projectId`, `source`. |
113
115
  | `reject_proposal` | Reject a proposal (no edit applied) | Req: `id`. Opt: `projectId`, `reason`. |
116
+ | `create_proposal` | Create a pending proposal by hand | Req: `projectId`, `kind` (`memory.create`\|`memory.update`\|`memory.tag`), `payload`. Opt: `rationale`, `targetMemoryId`. `payload` is validated against the same per-kind rules the store enforces on read. |
117
+ | `update_proposal` | Edit rationale/payload by id, any status | Req: `id`. Opt: `projectId`, `rationale`, `payload` — at least one editable field required. `kind`/`targetMemoryId`/`status`/`decidedAt` are immutable. A `payload` edit re-validates against the row's existing `kind`. |
118
+ | `delete_proposal` | Hard-delete a proposal, any status | Req: `id`. Opt: `projectId`. Deleting an approved proposal does not reverse its applied memory edit. |
114
119
 
115
120
  ## MCP Capability Matrix — Passive Capture
116
121