agiagent-dev 2026.1.39 → 2026.1.40
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/dist/agents/agiagent-tools.js +4 -0
- package/dist/agents/system-prompt.js +44 -9
- package/dist/agents/tools/gmail-tool.js +20 -1
- package/dist/agents/tools/resume-tool.d.ts +4 -0
- package/dist/agents/tools/resume-tool.js +91 -0
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/gateway/composio-webhook.d.ts +13 -0
- package/dist/gateway/composio-webhook.js +169 -0
- package/dist/gateway/email-trigger-handler.d.ts +28 -0
- package/dist/gateway/email-trigger-handler.js +192 -0
- package/dist/gateway/hosted-db.d.ts +33 -0
- package/dist/gateway/hosted-db.js +97 -0
- package/dist/gateway/hosted-telegram.d.ts +15 -0
- package/dist/gateway/hosted-telegram.js +41 -0
- package/dist/gateway/server-http.js +5 -0
- package/dist/gateway/server-methods/composio.js +75 -1
- package/dist/infra/composio.d.ts +10 -0
- package/dist/infra/composio.js +59 -0
- package/dist/node-host/resume-docx.d.ts +21 -0
- package/dist/node-host/resume-docx.js +266 -0
- package/dist/node-host/runner.js +271 -54
- package/extensions/lobster/src/lobster-tool.test.ts +3 -3
- package/extensions/memory-lancedb/index.ts +13 -2
- package/package.json +3 -2
- package/skills/resume-docx/SKILL.md +214 -0
- package/skills/resume-docx/scripts/resume_docx_apply.py +1135 -0
- package/skills/resume-docx/scripts/resume_docx_extract.py +302 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import type { AGIAgentPluginApi } from "agiagent/plugin-sdk";
|
|
10
|
-
import * as lancedb from "@lancedb/lancedb";
|
|
10
|
+
import type * as lancedb from "@lancedb/lancedb";
|
|
11
11
|
import { Type } from "@sinclair/typebox";
|
|
12
12
|
import { randomUUID } from "node:crypto";
|
|
13
13
|
import OpenAI from "openai";
|
|
@@ -66,7 +66,18 @@ class MemoryDB {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
private async doInitialize(): Promise<void> {
|
|
69
|
-
|
|
69
|
+
let lancedbMod: typeof import("@lancedb/lancedb");
|
|
70
|
+
try {
|
|
71
|
+
lancedbMod = await import("@lancedb/lancedb");
|
|
72
|
+
} catch (err) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
`LanceDB dependency unavailable. Ensure @lancedb/lancedb is installed for the memory-lancedb plugin. ${String(
|
|
75
|
+
err,
|
|
76
|
+
)}`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.db = await lancedbMod.connect(this.dbPath);
|
|
70
81
|
const tables = await this.db.tableNames();
|
|
71
82
|
|
|
72
83
|
if (tables.includes(TABLE_NAME)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agiagent-dev",
|
|
3
|
-
"version": "2026.1.
|
|
3
|
+
"version": "2026.1.40",
|
|
4
4
|
"description": "AI assistant CLI",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -63,7 +63,8 @@
|
|
|
63
63
|
"dist/utils/**",
|
|
64
64
|
"dist/web/**",
|
|
65
65
|
"dist/whatsapp/**",
|
|
66
|
-
"dist/wizard/**"
|
|
66
|
+
"dist/wizard/**",
|
|
67
|
+
"skills/resume-docx/**"
|
|
67
68
|
],
|
|
68
69
|
"type": "module",
|
|
69
70
|
"main": "dist/index.js",
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: resume-docx
|
|
3
|
+
description: Tailor a resume .docx for ATS by updating the existing Skills table and appending bullets without breaking structure. Use this for resumes; do not use the generic docx skill.
|
|
4
|
+
metadata:
|
|
5
|
+
{
|
|
6
|
+
"agiagent":
|
|
7
|
+
{
|
|
8
|
+
"emoji": "📄",
|
|
9
|
+
"requires": { "bins": ["python3"] },
|
|
10
|
+
"install":
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "pip",
|
|
14
|
+
"kind": "pip",
|
|
15
|
+
"package": "python-docx",
|
|
16
|
+
"bins": [],
|
|
17
|
+
"label": "Install python-docx (pip)",
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
},
|
|
21
|
+
}
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Resume Tailoring (.docx)
|
|
25
|
+
|
|
26
|
+
Goal: update an existing resume `.docx` based on a job description without breaking formatting.
|
|
27
|
+
|
|
28
|
+
This is the ONLY supported way to tailor resumes in AGIAgent. Do not use the generic `docx` skill for resume customization.
|
|
29
|
+
|
|
30
|
+
This skill is designed for smaller models. It forces the work into:
|
|
31
|
+
1. Extract structured info from the resume (table rows, headings).
|
|
32
|
+
2. Produce a small JSON patch.
|
|
33
|
+
3. Apply the patch with a deterministic script that enforces guardrails.
|
|
34
|
+
|
|
35
|
+
## Default Behavior (So The User Does Not Have To Re-Explain Rules)
|
|
36
|
+
|
|
37
|
+
When the user asks you to tailor or update a resume `.docx`, follow this exact approach automatically.
|
|
38
|
+
|
|
39
|
+
Inputs (from the user prompt):
|
|
40
|
+
- Resume `.docx` path.
|
|
41
|
+
- Job description text or a job posting URL.
|
|
42
|
+
|
|
43
|
+
Outputs:
|
|
44
|
+
- Save an updated `.docx`. If the user did not specify an output path, name the output file `firstname_lastname_role.docx` (e.g. `john_doe_software_engineer.docx`). Extract the person's name from the resume content and the role from the job description. Use lowercase with underscores, no spaces or dots. Place it next to the input file.
|
|
45
|
+
- Report what you changed (skills categories changed, summary bullets added, experience blocks updated).
|
|
46
|
+
|
|
47
|
+
Constraints (always enforce):
|
|
48
|
+
- Do not create any new tables.
|
|
49
|
+
- Do not add any extra `Category | Skills` header rows inside the Skills table.
|
|
50
|
+
- Skills updates must happen only inside the existing Skills table:
|
|
51
|
+
- Merge skills into existing category rows, or
|
|
52
|
+
- Append normal rows to the same table.
|
|
53
|
+
- Bullets:
|
|
54
|
+
- Append at least 6 JD-aligned bullets inside `PROFESSIONAL SUMMARY` (more is fine).
|
|
55
|
+
- Append at least 6 JD-aligned bullets per relevant `PROFESSIONAL EXPERIENCE` block (more is fine).
|
|
56
|
+
- Do not create new headings or sections.
|
|
57
|
+
- Location:
|
|
58
|
+
- ALWAYS update the candidate's location/address/city in the resume to match the location in the JD. Do not ask the user about relocation. Change it unconditionally. If the resume has a city/state, replace it with the JD's city/state. This is a hard requirement from all users.
|
|
59
|
+
- ATS alignment:
|
|
60
|
+
- Include key JD skills/keywords even if the original resume did not mention them (skills table + experience bullets).
|
|
61
|
+
- New bullets must be similar length and style to nearby bullets (avoid short one-liners).
|
|
62
|
+
- Prefer updating 2-3 most recent experience blocks first, unless the user requests otherwise.
|
|
63
|
+
|
|
64
|
+
## Non-Negotiable Guardrails
|
|
65
|
+
|
|
66
|
+
- Never create a new table.
|
|
67
|
+
- Never add a second `Category | Skills` header row.
|
|
68
|
+
- Skills updates must happen in the existing Skills table only.
|
|
69
|
+
- Bullet updates must be appended inside an existing section and must copy the existing list numbering.
|
|
70
|
+
- If a target section/table cannot be found, stop and return an error.
|
|
71
|
+
|
|
72
|
+
## Files
|
|
73
|
+
|
|
74
|
+
- Extract: `skills/resume-docx/scripts/resume_docx_extract.py`
|
|
75
|
+
- Apply patch: `skills/resume-docx/scripts/resume_docx_apply.py`
|
|
76
|
+
|
|
77
|
+
## Hosted Mode (mandatory)
|
|
78
|
+
|
|
79
|
+
When running in hosted mode (gateway on server, commands run on the user's connected device):
|
|
80
|
+
- Prefer the built-in `resume` tool (`action=extract` -> produce patch -> `action=apply`).
|
|
81
|
+
- Do NOT inline or reconstruct the Python scripts inside an exec/PowerShell command. That is fragile and can exceed Windows command length limits.
|
|
82
|
+
- If the resume tool is unavailable, ask the user to update `agiagent-dev` on their device and reconnect.
|
|
83
|
+
|
|
84
|
+
## Install
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
python3 -c "import docx; print('python-docx OK')"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
If missing:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
pip3 install python-docx
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Step 1: Extract Resume Structure
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
python3 skills/resume-docx/scripts/resume_docx_extract.py input.docx --out resume.schema.json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
This produces `resume.schema.json` (schema v2) with:
|
|
103
|
+
- A `fingerprint` you should echo back into the patch as `doc_fingerprint` (prevents applying a patch to the wrong resume version).
|
|
104
|
+
- All paragraphs (text + style + list/manual-bullet signals), with stable `paragraph_index` values.
|
|
105
|
+
- All tables (cell text), with stable `table_index` values.
|
|
106
|
+
|
|
107
|
+
Important: different resumes use different layouts. Do NOT assume there is a Skills table or that headings use a specific casing. Use the schema to understand the resume's structure first.
|
|
108
|
+
|
|
109
|
+
### One-Time Structure Notes (recommended)
|
|
110
|
+
If this is the first time you're tailoring *this* resume, and there is no saved structure note yet, create one after you review `resume.schema.json`:
|
|
111
|
+
- File: `resume.profile.json` next to the input `.docx`.
|
|
112
|
+
- Contents: a short explanation of how THIS resume is structured (what counts as headings, where Skills live, how Experience bullets are formatted), plus the key `table_index` / `paragraph_index` anchors you plan to use.
|
|
113
|
+
|
|
114
|
+
On later runs, read `resume.profile.json` first so you can target the right areas quickly, but still re-run Step 1 to get a fresh `fingerprint` and indices.
|
|
115
|
+
|
|
116
|
+
Suggested `resume.profile.json` shape (you can extend as needed):
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"fingerprint": "sha256:...",
|
|
121
|
+
"notes": "Headings are ALL CAPS. Skills are in table_index 0 (2 columns). Experience bullets are numbered lists.",
|
|
122
|
+
"skills": { "kind": "table", "table_index": 0, "category_col": 0, "skills_col": 1 },
|
|
123
|
+
"summary": { "example_bullet_paragraph_index": 25 },
|
|
124
|
+
"experience": {
|
|
125
|
+
"example_bullet_paragraph_index": 80,
|
|
126
|
+
"preferred_insertion_strategy": "insert near matching bullets, not all at the end"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Step 2: Produce A JSON Patch (LLM Output)
|
|
132
|
+
|
|
133
|
+
Output ONLY valid JSON (no prose).
|
|
134
|
+
|
|
135
|
+
### Patch v2 (preferred)
|
|
136
|
+
Use explicit indices from `resume.schema.json` so the model (you) decides what to update, and the script applies it deterministically.
|
|
137
|
+
|
|
138
|
+
Shape:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"version": 2,
|
|
143
|
+
"doc_fingerprint": "sha256:...",
|
|
144
|
+
"tables": {
|
|
145
|
+
"ops": [
|
|
146
|
+
{
|
|
147
|
+
"op": "merge_comma_skills",
|
|
148
|
+
"table_index": 0,
|
|
149
|
+
"row_index": 10,
|
|
150
|
+
"col_index": 1,
|
|
151
|
+
"add": ["Stakeholder Management", "Process Mapping"]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"op": "append_row",
|
|
155
|
+
"table_index": 0,
|
|
156
|
+
"cells": ["Automation & Scripting", "Python, Bash, PowerShell"]
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
"paragraphs": {
|
|
161
|
+
"insert_after": [
|
|
162
|
+
{
|
|
163
|
+
"after_paragraph_index": 120,
|
|
164
|
+
"expect_contains": "Reduced incident response",
|
|
165
|
+
"as": "bullet_like",
|
|
166
|
+
"bold_keywords": ["Oracle Financials", "SOX", "GL", "AP", "AR"],
|
|
167
|
+
"text": "JD-aligned bullet to insert near similar content. Write at least two sentences so it matches the resume style."
|
|
168
|
+
}
|
|
169
|
+
],
|
|
170
|
+
"replace": [
|
|
171
|
+
{
|
|
172
|
+
"paragraph_index": 98,
|
|
173
|
+
"expect_contains": "Old contradictory claim",
|
|
174
|
+
"validate": "bullet",
|
|
175
|
+
"bold_keywords": ["Oracle Cloud", "Automation", "Python"],
|
|
176
|
+
"text": "Replacement bullet that resolves the contradiction. Keep it realistic and at least two sentences."
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"paragraph_index": 5,
|
|
180
|
+
"expect_contains": "San Francisco, CA",
|
|
181
|
+
"text": "Austin, TX"
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Rules for patch v2:
|
|
189
|
+
- Tables are optional. If you cannot confidently identify the Skills table (or there is no table), omit `tables.ops`.
|
|
190
|
+
- For `merge_comma_skills`, you must choose a correct `table_index`/`row_index`/`col_index` based on `resume.schema.json`.
|
|
191
|
+
- For bullets, do NOT add everything at the end of the section. Choose insertion points near the most relevant existing bullets so the additions read naturally.
|
|
192
|
+
- Always target an existing bullet paragraph for insertion. The apply script clones its list/manual-bullet style so formatting is preserved.
|
|
193
|
+
- `expect_contains` is strongly recommended for safety: it prevents applying to the wrong paragraph if indices drift.
|
|
194
|
+
- Keyword emphasis: include `bold_keywords` for bullet inserts/replacements to bold only the important ATS keywords (tools/platforms/product names). Do NOT bold full sentences.
|
|
195
|
+
- Replacements (`paragraphs.replace`) are allowed but should be minimal and only when needed to fix a contradiction.
|
|
196
|
+
- If you truly cannot find a Skills area, you may skip skills updates, but you must still update Summary and Experience when possible.
|
|
197
|
+
|
|
198
|
+
### Patch v1 (legacy)
|
|
199
|
+
The old patch shape (`skills_table.merge_into_existing/append_rows` + `bullets.summary/experience`) still works, but it assumes a strict `Category|Skills` table and exact headings like `PROFESSIONAL SUMMARY` / `PROFESSIONAL EXPERIENCE`. Prefer v2 for broad resume compatibility.
|
|
200
|
+
|
|
201
|
+
## Step 3: Apply Patch
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
python3 skills/resume-docx/scripts/resume_docx_apply.py \\
|
|
205
|
+
--in input.docx \\
|
|
206
|
+
--patch patch.json \\
|
|
207
|
+
--out output.docx
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
The script validates guardrails. If it detects:
|
|
211
|
+
- extra header rows,
|
|
212
|
+
- new tables,
|
|
213
|
+
- missing target section/table,
|
|
214
|
+
it exits non-zero and prints a reason.
|