pushary 1.9.86 → 1.9.88
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/CHANGELOG.md +13 -0
- package/data/SKILL.md +35 -24
- package/data/cowork/SKILL.md +4 -4
- package/data/cursor-plugin/.cursor-plugin/plugin.json +1 -1
- package/data/cursor-plugin/CHANGELOG.md +8 -0
- package/data/cursor-plugin/skills/pushary/SKILL.md +34 -23
- package/data/vscode-plugin/.claude-plugin/plugin.json +1 -1
- package/data/vscode-plugin/CHANGELOG.md +8 -0
- package/data/vscode-plugin/skills/pushary/SKILL.md +34 -23
- package/dist/{api-ZDMC22LN.js → api-BE4B7HBE.js} +7 -7
- package/dist/bin/pushary-bell-hook.js +18 -18
- package/dist/bin/pushary-bell.js +5 -5
- package/dist/bin/pushary-claude.js +19 -19
- package/dist/bin/pushary-clean.js +27 -27
- package/dist/bin/pushary-codex-bridge.js +14 -14
- package/dist/bin/pushary-codex-hook.js +21 -21
- package/dist/bin/pushary-codex-session.js +6 -6
- package/dist/bin/pushary-codex.js +8 -8
- package/dist/bin/pushary-connect.js +19 -19
- package/dist/bin/pushary-daemon.js +30 -30
- package/dist/bin/pushary-disconnect.js +18 -18
- package/dist/bin/pushary-display-hook.js +10 -10
- package/dist/bin/pushary-doctor.js +32 -32
- package/dist/bin/pushary-elicitation-hook.js +18 -18
- package/dist/bin/pushary-gemini-bridge.js +9 -9
- package/dist/bin/pushary-gemini-hook.js +19 -19
- package/dist/bin/pushary-hook.js +20 -20
- package/dist/bin/pushary-login.js +13 -13
- package/dist/bin/pushary-logout.js +16 -16
- package/dist/bin/pushary-mcp.js +8 -8
- package/dist/bin/pushary-mode.js +9 -9
- package/dist/bin/pushary-notification-hook.js +17 -17
- package/dist/bin/pushary-opencode-hook.js +18 -18
- package/dist/bin/pushary-permission-denied-hook.js +20 -20
- package/dist/bin/pushary-permission-hook.js +20 -20
- package/dist/bin/pushary-post-hook.js +17 -17
- package/dist/bin/pushary-prompt-hook.js +17 -17
- package/dist/bin/pushary-session-end-hook.js +19 -19
- package/dist/bin/pushary-session-start-hook.js +27 -27
- package/dist/bin/pushary-setup.js +39 -39
- package/dist/bin/pushary-status.js +23 -23
- package/dist/bin/pushary-stop-hook.js +17 -17
- package/dist/bin/pushary-stopfailure-hook.js +17 -17
- package/dist/bin/pushary-suggestions.js +9 -9
- package/dist/bin/pushary-transcript-register.js +11 -11
- package/dist/bin/pushary-transcripts.js +18 -18
- package/dist/bin/pushary-upgrade.js +32 -32
- package/dist/bin/pushary-wait.js +9 -9
- package/dist/bin/pushary.js +4 -4
- package/dist/{chunk-TQ43EX2E.js → chunk-2HTE4ECJ.js} +1 -1
- package/dist/{chunk-R5SANCZC.js → chunk-2NJNC26C.js} +4 -4
- package/dist/{chunk-SLMCMHVY.js → chunk-3BG5S7MB.js} +2 -2
- package/dist/{chunk-RHDHLXUK.js → chunk-3C4UGMIV.js} +3 -3
- package/dist/{chunk-7AH6F44G.js → chunk-3XJL2M7H.js} +3 -3
- package/dist/{chunk-6OVWYAET.js → chunk-3ZE7VQOU.js} +3 -3
- package/dist/{chunk-UAB3K3TA.js → chunk-4C7OJLSL.js} +3 -3
- package/dist/{chunk-VADZ6C26.js → chunk-4TT2ZFWZ.js} +1 -1
- package/dist/{chunk-CT2HRZLL.js → chunk-4Z7MR5FE.js} +2 -2
- package/dist/{chunk-42KJLBX2.js → chunk-6GDZ4RYR.js} +5 -5
- package/dist/{chunk-YRQWA4ZS.js → chunk-6RFDH4JU.js} +1 -1
- package/dist/{chunk-XGW7J7KT.js → chunk-A2F7T3IR.js} +1 -1
- package/dist/{chunk-3ZWJBPQ5.js → chunk-B4NVYPX5.js} +1 -1
- package/dist/{chunk-7SY2F6JA.js → chunk-BC2HT6JP.js} +2 -2
- package/dist/{chunk-FQ2EBMDA.js → chunk-BOWXZWHG.js} +6 -6
- package/dist/{chunk-K34J2V5G.js → chunk-BSTZ66FA.js} +2 -2
- package/dist/{chunk-XPE745FL.js → chunk-CAXE3TYX.js} +5 -5
- package/dist/{chunk-4RZXECJS.js → chunk-DHVVEH2K.js} +5 -5
- package/dist/{chunk-K4I2LESS.js → chunk-DM5LNEGJ.js} +2 -2
- package/dist/{chunk-X5INK4OE.js → chunk-FFIDXKQ7.js} +8 -8
- package/dist/{chunk-B34K6NXW.js → chunk-FK2EK27I.js} +2 -2
- package/dist/{chunk-QN2EFKXV.js → chunk-FRUKY6KV.js} +2 -2
- package/dist/{chunk-FE3I7SCA.js → chunk-FUVVGIXZ.js} +4 -4
- package/dist/{chunk-M66W7UD7.js → chunk-GJXRYXMC.js} +2 -2
- package/dist/{chunk-VU5PKE2N.js → chunk-I6MNMAS7.js} +1 -1
- package/dist/{chunk-GVMOTYFU.js → chunk-IXOCJHJW.js} +2 -2
- package/dist/{chunk-K6ZOH6P7.js → chunk-J42EAEX3.js} +11 -3
- package/dist/{chunk-IOJZPPDB.js → chunk-JOULYVW6.js} +1 -1
- package/dist/{chunk-JILOKJ3W.js → chunk-JQMOQLM2.js} +7 -7
- package/dist/{chunk-D766FEAS.js → chunk-JQPY2B2H.js} +1 -1
- package/dist/{chunk-IXUJCONI.js → chunk-LAYKEYZE.js} +1 -1
- package/dist/{chunk-VNYSGRCL.js → chunk-LH3SNS6H.js} +9 -9
- package/dist/{chunk-GAYYYXMU.js → chunk-LHXJYSNX.js} +1 -1
- package/dist/{chunk-7LRY76MV.js → chunk-LXFBSMAE.js} +4 -4
- package/dist/{chunk-NW3GZBQA.js → chunk-M4UXDYNJ.js} +4 -4
- package/dist/{chunk-S33CCO4J.js → chunk-MQKXQWXA.js} +1 -1
- package/dist/{chunk-UOM5SUWJ.js → chunk-N7OMDSXK.js} +1 -1
- package/dist/{chunk-YLWPJ2MP.js → chunk-NOGDU4XS.js} +2 -2
- package/dist/{chunk-GVZAEST7.js → chunk-NWLGRSGE.js} +3 -3
- package/dist/{chunk-4VHT5SWU.js → chunk-O53SJBBB.js} +3 -3
- package/dist/{chunk-NFKB7ZHA.js → chunk-OBS7O22Q.js} +2 -2
- package/dist/{chunk-7TZDVGMC.js → chunk-OMLR56J5.js} +1 -1
- package/dist/{chunk-XMRCP7TM.js → chunk-PG5WFIHE.js} +1 -1
- package/dist/{chunk-E5DZ74QT.js → chunk-PYI2EFRH.js} +4 -4
- package/dist/{chunk-5YDIHB67.js → chunk-QOMIFKQL.js} +3 -3
- package/dist/{chunk-UDYWZ4DI.js → chunk-QQCGYHYG.js} +1 -1
- package/dist/{chunk-LXTTFH4P.js → chunk-RX5FSSQK.js} +5 -5
- package/dist/{chunk-MY6CX7WE.js → chunk-TBPMI4LY.js} +4 -4
- package/dist/{chunk-ZLO3K5TP.js → chunk-VIDB26GQ.js} +4 -4
- package/dist/{chunk-VNROKR2K.js → chunk-WBZA72O5.js} +2 -2
- package/dist/{chunk-RKN7BJRQ.js → chunk-YN4IXOFK.js} +1 -1
- package/dist/{chunk-NFQCFVKJ.js → chunk-Z2LYELNQ.js} +5 -5
- package/dist/{chunk-2CJNGJQS.js → chunk-ZEPS4KIK.js} +2 -2
- package/dist/{chunk-GPP7AUCM.js → chunk-ZP5AB6R5.js} +3 -3
- package/dist/{chunk-WJ2APMU5.js → chunk-ZXDHPPGI.js} +3 -3
- package/dist/{codex-app-cards-switch-ARYZG5DV.js → codex-app-cards-switch-XLSLVXDP.js} +7 -7
- package/dist/{codex-desktop-launch-6P2IXUIZ.js → codex-desktop-launch-HRE6YP56.js} +1 -1
- package/dist/{codex-session-launch-WUZSHGSI.js → codex-session-launch-7RGYGW32.js} +12 -12
- package/dist/{global-upgrade-QGHGUP5V.js → global-upgrade-VR76ZRWG.js} +8 -8
- package/dist/{identity-WRUYTQ4O.js → identity-NJAXA45Q.js} +3 -3
- package/dist/{live-capabilities-AJJILIIZ.js → live-capabilities-5UTM55OC.js} +4 -4
- package/dist/{paths-Q5A6GBRA.js → paths-BX4DXC3B.js} +2 -2
- package/dist/{reapply-BMNUBJ3Z.js → reapply-PMCMNTED.js} +21 -21
- package/dist/src/index.js +20 -20
- package/dist/{upgrade-lock-NGCFJRRN.js → upgrade-lock-2G2S3FH7.js} +3 -3
- package/package.json +2 -2
|
@@ -5,12 +5,12 @@ import {
|
|
|
5
5
|
hermesAppWiringRecord,
|
|
6
6
|
hermesConfigReceipt,
|
|
7
7
|
hermesSetupReceipt
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-NOGDU4XS.js";
|
|
9
9
|
import {
|
|
10
10
|
readJsonSafe,
|
|
11
11
|
resolvePathBinary,
|
|
12
12
|
writeJsonAtomic
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-QOMIFKQL.js";
|
|
14
14
|
import {
|
|
15
15
|
isNewerVersion,
|
|
16
16
|
isReleaseVersion
|
|
@@ -1463,7 +1463,7 @@ def record_plugin_load(approval_transport_registered, home=None, pid=None, now=N
|
|
|
1463
1463
|
logger.debug("[pushary] could not record the plugin load: %s", exc)
|
|
1464
1464
|
return None
|
|
1465
1465
|
` },
|
|
1466
|
-
{ path: "plugin.yaml", contents: "name: pushary\nversion: 0.9.
|
|
1466
|
+
{ path: "plugin.yaml", contents: "name: pushary\nversion: 0.9.2\ndescription: Push notifications and human-in-the-loop for Hermes Agent via Pushary\nauthor: RalphNex OU\nrequires_env:\n - name: PUSHARY_API_KEY\n description: Your Pushary API key\n url: https://pushary.com/sign-up?from=hermes\n secret: true\nprovides_tools:\n - pushary_remind\n - pushary_notify\n - pushary_ask\n - pushary_wait\n - pushary_cancel\n - pushary_propose_scope\n - pushary_enroll\n - pushary_ask_end_user\nprovides_hooks:\n - pre_llm_call\n - pre_tool_call\n - post_tool_call\n - on_session_start\n - on_session_end\n - on_session_finalize\nprovides_approval_transports:\n - pushary\n" },
|
|
1467
1467
|
{ path: "schemas.py", contents: `PUSHARY_REMIND = {
|
|
1468
1468
|
"name": "pushary_remind",
|
|
1469
1469
|
"description": "Schedule a one-time personal reminder on Pushary, even after Hermes exits. Use body plus in_minutes or at (ISO timestamp with explicit UTC offset, within 30 days). Never guess the user's timezone. Confirm the returned time. No arguments lists pending reminders; cancel_reminder_id cancels a scheduled one. Use Hermes cron for agent work; use this for reminding the operator.",
|
|
@@ -1504,7 +1504,7 @@ PUSHARY_NOTIFY = {
|
|
|
1504
1504
|
},
|
|
1505
1505
|
"body": {
|
|
1506
1506
|
"type": "string",
|
|
1507
|
-
"description": "Notification body (max 500 chars
|
|
1507
|
+
"description": "Notification body (max 500 chars; the phone shows the first 180)",
|
|
1508
1508
|
},
|
|
1509
1509
|
"agent_name": {
|
|
1510
1510
|
"type": "string",
|
|
@@ -1818,7 +1818,7 @@ PUSHARY_ASK_END_USER = {
|
|
|
1818
1818
|
},
|
|
1819
1819
|
}
|
|
1820
1820
|
` },
|
|
1821
|
-
{ path: "skills/pushary/SKILL.md", contents: '---\nname: pushary-hermes\nversion: 0.9.0\ndescription: Push notifications and human-in-the-loop for Hermes Agent. Use this whenever a running agent needs a human and no chat session is active, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill\'s workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Send alerts when tasks finish, ask questions (yes/no, multiple choice, or free text) via web push, and get answers from their connected devices. Use these tools proactively when the user is not actively in a chat session. Works alongside Hermes\'s built-in messaging platforms (Telegram, Discord, etc.) as a universal fallback channel.\nmetadata:\n hermes:\n tags: [notifications, push, human-in-the-loop, alerts, permissions]\n category: productivity\n requires_toolsets: []\n config:\n - key: PUSHARY_API_KEY\n description: "Your Pushary API key for push notifications"\n default: ""\n tags: notifications, push, mcp, human-in-the-loop, hermes, alerts, permissions\n---\n\n# Pushary - Push Notifications for Hermes Agent\n\nPushary adds mobile, Mac and browser delivery for Hermes. Use it when the user is not actively monitoring a chat platform, or when you need to reach them on their phone\'s lock screen for a time-sensitive decision.\n\n## Ask in as Few Interruptions as Possible\n\nHonor authorization already granted in this session. Ask only for a missing decision or an action outside that authorization, or when an enforced host policy requires it. A multi-step task alone does not require plan approval. Never ask again merely because the next authorized step deletes, deploys or publishes something. These skills guide the agent; supported hooks and runtime approval gates enforce policy. Do not bypass an enforced gate.\n\nEvery question costs the user their attention wherever they are. Before a run of more than a step or two, work out where you will need a human and fold those points together: one `select` carrying the real options beats three `confirm`s in a row, ask once at a boundary rather than once per instance, and never ask what you can determine yourself from the task or from a tool call you can make.\n\n## When to Use Pushary vs Hermes Platforms\n\n**Use Pushary when:**\n- The user has no active chat session (Telegram, Discord, etc.)\n- You need to reach the user\'s phone lock screen for a quick decision\n- A background task finishes and the user may have walked away\n- Permission escalation - a dangerous command needs approval\n- Another skill\'s workflow says to confirm with the user, and no chat session is active to confirm in\n- The user explicitly asked for push notifications\n\n**Use the active Hermes platform when:**\n- The user is currently in a Telegram/Discord/Slack conversation with you\n- The question is part of an ongoing dialog\n- The user prefers responses in their current platform\n\nUse an extra push only when the user requested it or a meaningful unattended result needs attention. Do not assume you can detect whether a Telegram or Discord message was read.\n\n## Setup\n\nOn a Mac, the Pushary app connects Hermes: it puts this plugin in `~/.hermes/plugins/pushary` and selects Pushary as the approval transport. On any computer, `npx pushary@latest setup --agents hermes` does the same. The plugin can also come from the Hermes catalog with `hermes plugins install pushary`. Never install a second copy over one that is already there. No MCP server configuration is needed. Keep credentials out of chat and verify the paired account and device.\n\nIf the `pushary_*` tools are missing from a Hermes session, the plugin did not load. Do not pip-install it into Hermes\'s Python: current Hermes does not load packages added that way. Ask the user to open the Pushary app and repair Hermes, or to run `npx pushary@latest setup --agents hermes`. Then they restart Hermes with `hermes gateway restart`.\n\n## Approvals Go to the Phone\n\nThe plugin registers `pushary` as a Hermes **approval transport**, so the dangerous-command approvals Hermes already asks for open in the app with the same four choices the terminal offers: allow once, allow for this session, always allow, deny. Hermes owns the timeout (300 seconds by default) and remembers session and always decisions exactly as it would have.\n\n```yaml\nsecurity:\n approval:\n transport: pushary\n transport_fallback: builtin\n```\n\nHermes denies by default when Pushary is unreachable. Only an operator who sets `transport_fallback: builtin` enables its built-in prompt after a safe local handoff; cancellation or an unverifiable withdrawal still stops the action. You do not call this yourself; it fires when Hermes decides a command needs a human.\n\n## Answer surfaces and account boundaries\n\n| Surface | What the user can do |\n| --- | --- |\n| Mobile app | Answer confirm, select and input questions. Supported confirm notifications offer approve/deny actions on the lock screen; arbitrary choices and text open the app. |\n| Mac notch | Answer personal account questions with confirm, select, input and question-set controls, including keyboard controls. Presence and delivery policy determine when the phone is also reached. |\n| Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |\n| Browser | Open the decision page as a fallback; browser notification delivery requires permission. |\n\nPersonal setup connects the operator\'s devices. For a Mac, the operator installs from https://pushary.com/download, signs in to the same personal account and connects their agents in the app. Request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.\n\nPartner customers use scoped enrollment links issued by their application. Do not enroll them into the operator\'s account or send their decisions through personal tools. The Mac notch currently uses the personal account/session API; do not promise a Partner customer inbox on Mac. See https://pushary.com/docs/agents/embed for Partner setup.\n\n## Tools\n\nTool names below are the native plugin names. An MCP client without the plugin sees the same capabilities as `send_notification`, `schedule_reminder`, `ask_user`, `wait_for_answer`, `cancel_question`, and `propose_scope`.\n\n### pushary_remind\n\nFor personal reminders later, use `pushary_remind` with `body` and `in_minutes`, or `at` with an explicit UTC offset. Never guess the timezone; confirm the returned time. Pushary saves it and delivers after Hermes exits. Use Hermes cron for future agent work. No arguments lists pending reminders; `cancel_reminder_id` cancels a scheduled one. One-time only, up to 30 days ahead, and delivery can be about a minute late. A connected phone is required. Do not use `pushary_ask` for reminders.\n\n### pushary_notify\n\n\nSend a one-way push notification. Optionally include structured context for a rich detail page.\n\n**Parameters:**\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| title | string | Yes | Notification title (max 100 chars, aim for under 60) |\n| body | string | Yes | Notification body (max 500 chars, aim for under 200) |\n| agent_name | string | No | Identifies this Hermes instance (e.g., "Hermes - daily-briefing") |\n| context_type | "task_complete" / "error" / "info" | Yes for task updates | Marks the notification for task-update routing. |\n| summary | string | No | Short summary of the result. |\n| details / files_changed | string[] | No | Result details or changed paths. |\n| error_message / next_steps | string | No | Error or suggested follow-up. |\n\n**Example - cron task completed:**\n\n```json\n{\n "title": "Daily briefing ready",\n "body": "Compiled 12 news items and 3 calendar events",\n "agent_name": "Hermes - daily-briefing",\n "context_type": "task_complete",\n "summary": "Morning briefing compiled from RSS feeds and Google Calendar",\n "details": ["12 tech news items", "3 meetings today", "2 PRs awaiting review"],\n "next_steps": "Say \'read briefing\' in Telegram to hear the full summary"\n}\n```\n\n### pushary_ask\n\nAsk a question via push notification and **wait for the answer** (blocks by default). Three question types: confirm (yes/no), select (multiple choice), input (free text).\n\n**Parameters:**\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| question | string | Yes | The complete question (max 8000 chars; notifications show a short preview) |\n| type | "confirm" / "select" / "input" | No | Question type (default: confirm) |\n| options | string[] | No | Choices for select type (2-6 options) |\n| placeholder | string | No | Placeholder text for input type |\n| context | string | No | What you\'re working on, shown above the question |\n| agent_name | string | No | Identifies this Hermes instance |\n| wait | boolean | No | Wait for answer before returning (default: true) |\n| timeout_ms | integer | No | Max wait in ms (max 55000). Defaults to 30000 per poll attempt; server policy may hand off earlier. |\n\n**Returns:**\n- `{ "answered": true, "value": "yes" }` - user responded\n- `{ "answered": false, "timedOut": true }` - no response within timeout\n\n**Example - dangerous command approval:**\n\n```json\n{\n "question": "Allow: rm -rf /tmp/build-artifacts/*",\n "type": "confirm",\n "context": "Cleaning up 2.3GB of stale build artifacts from last week",\n "agent_name": "Hermes - server-maintenance",\n "timeout_ms": 12000\n}\n```\n\n### pushary_wait\n\nPoll once for a response when `pushary_ask` was called with `wait: false`. Not needed with default blocking mode.\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| correlation_id | string | Yes | The correlationId from pushary_ask |\n| timeout_ms | integer | No | How long to wait (default 30000, max 55000) |\n\n### pushary_cancel\n\nCancel a pending question that\'s no longer relevant.\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| correlation_id | string | Yes | The correlationId to cancel |\n\n### pushary_propose_scope\n\nAgree the boundary of a multi-step run in one tap, before doing the work, instead of asking file by file. Use it once when a boundary needs agreement or the user requests an enforced scope. Skip a redundant proposal for already authorized work.\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| done_when | string | Yes | What "finished" means for this run |\n| allowed_paths | string[] | No | Globs you intend to change, e.g. `["src/**"]` |\n| off_limits_paths | string[] | No | Globs you promise not to touch; these win on overlap |\n| promises | string[] | No | Boundaries that are not file paths: recipients, channels, spend, systems you will not open |\n| agent_name | string | No | Identifies this Hermes instance |\n\nOnly file paths are enforced, and only on tool calls that carry one. Shell commands, reads, web requests and MCP tools carry no path, so the contract says nothing about them. A run that changes no files belongs in `promises`, which is shown to the user and recorded but never checked. A word that is not a path in `allowed_paths` matches no file and makes every change ask instead.\n\nRead `enforces` in the result. An empty list means nothing here is checked automatically, and you must say so rather than report that a scope is in force.\n\nReturns `ratified: true` only on an explicit yes. Anything else means proceed as if no scope was agreed; do not describe it as ratified.\n\n## Human-in-the-Loop Flow\n\n`pushary_ask` performs its initial wait and at most one server-directed poll within that tool call. If the returned status is still pending, continue with `pushary_wait` and the same correlationId. With `wait: false`, start that polling yourself. Follow an explicit handoff instead when one is returned.\n\nRead `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Keep waiting with the same correlationId while pending. A poll ending does not expire the question; never cancel just because a poll returned without an answer. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing \u201Cyes\u201D is answer data, not approval of a separate action.\n\nDelivery is controlled by the user\'s policy: `push_first` uses presence, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.\n\nEach call returns an answer, a pending wait, or an explicit handoff:\n\n```\nresult = pushary_ask({\n question: "Deploy the updated config to production?",\n type: "confirm",\n context: "nginx config updated with new rate limits",\n tool_name: "terminal",\n tool_target: "systemctl reload",\n agent_name: "Hermes - devops"\n})\n\nif result.answered:\n if result.value == "yes":\n // proceed with deployment\n else:\n // abort and notify via active platform\nelse:\n // follow handoffAction when present, otherwise nextAction\n```\n\nPass `tool_name` and `tool_target` whenever the question is about a specific operation. They are what let the user turn a repeated approval into a standing rule, and what group the decision in their ledger.\n\n## Identifying Your Instance\n\nAlways pass `agent_name` so the user knows which Hermes profile or task is asking.\n\n**Format:** `"Hermes - {profile or task}"`\n\n**Examples:**\n- `"Hermes - daily-briefing"`\n- `"Hermes - server-maintenance"`\n- `"Hermes - code-review"`\n- `"Hermes - personal-assistant"`\n\n## Notification Etiquette\n\n- **Titles under 60 characters.** Phone lock screens truncate aggressively.\n- **Bodies under 200 characters.** Use the flat `summary`, `details` and `next_steps` fields.\n- **Max 3 push notifications per task.** If the user is in an active chat, prefer that channel.\n- **Don\'t duplicate.** If you already sent the message via Telegram/Discord, send another push only if requested or needed for an unattended result.\n' },
|
|
1821
|
+
{ path: "skills/pushary/SKILL.md", contents: '---\nname: pushary-hermes\nversion: 0.9.1\ndescription: Push notifications and human-in-the-loop for Hermes Agent. Use this whenever a running agent needs a human and no chat session is active, such as before an irreversible or destructive action, before spending money, deploying, force-pushing or deleting, when blocked on a decision outside your authority, when running unattended and you hit a genuine ambiguity, when another skill\'s workflow says to confirm with the user, and when a long task finishes or fails with nobody watching. Send alerts when tasks finish, ask questions (yes/no, multiple choice, or free text) via web push, and get answers from their connected devices. Use these tools proactively when the user is not actively in a chat session. Works alongside Hermes\'s built-in messaging platforms (Telegram, Discord, etc.) as a universal fallback channel.\nmetadata:\n hermes:\n tags: [notifications, push, human-in-the-loop, alerts, permissions]\n category: productivity\n requires_toolsets: []\n config:\n - key: PUSHARY_API_KEY\n description: "Your Pushary API key for push notifications"\n default: ""\n tags: notifications, push, mcp, human-in-the-loop, hermes, alerts, permissions\n---\n\n# Pushary - Push Notifications for Hermes Agent\n\nPushary adds mobile, Mac and browser delivery for Hermes. Use it when the user is not actively monitoring a chat platform, or when you need to reach them on their phone\'s lock screen for a time-sensitive decision.\n\n## Ask in as Few Interruptions as Possible\n\nHonor authorization already granted in this session. Ask only for a missing decision or an action outside that authorization, or when an enforced host policy requires it. A multi-step task alone does not require plan approval. Never ask again merely because the next authorized step deletes, deploys or publishes something. These skills guide the agent; supported hooks and runtime approval gates enforce policy. Do not bypass an enforced gate.\n\nEvery question costs the user their attention wherever they are. Before a run of more than a step or two, work out where you will need a human and fold those points together: one `select` carrying the real options beats three `confirm`s in a row, ask once at a boundary rather than once per instance, and never ask what you can determine yourself from the task or from a tool call you can make.\n\n## When to Use Pushary vs Hermes Platforms\n\n**Use Pushary when:**\n- The user has no active chat session (Telegram, Discord, etc.)\n- You need to reach the user\'s phone lock screen for a quick decision\n- A background task finishes and the user may have walked away\n- Permission escalation - a dangerous command needs approval\n- Another skill\'s workflow says to confirm with the user, and no chat session is active to confirm in\n- The user explicitly asked for push notifications\n\n**Use the active Hermes platform when:**\n- The user is currently in a Telegram/Discord/Slack conversation with you\n- The question is part of an ongoing dialog\n- The user prefers responses in their current platform\n\nUse an extra push only when the user requested it or a meaningful unattended result needs attention. Do not assume you can detect whether a Telegram or Discord message was read.\n\n## Setup\n\nOn a Mac, the Pushary app connects Hermes: it puts this plugin in `~/.hermes/plugins/pushary` and selects Pushary as the approval transport. On any computer, `npx pushary@latest setup --agents hermes` does the same. The plugin can also come from the Hermes catalog with `hermes plugins install pushary`. Never install a second copy over one that is already there. No MCP server configuration is needed. Keep credentials out of chat and verify the paired account and device.\n\nIf the `pushary_*` tools are missing from a Hermes session, the plugin did not load. Do not pip-install it into Hermes\'s Python: current Hermes does not load packages added that way. Ask the user to open the Pushary app and repair Hermes, or to run `npx pushary@latest setup --agents hermes`. Then they restart Hermes with `hermes gateway restart`.\n\n## Approvals Go to the Phone\n\nThe plugin registers `pushary` as a Hermes **approval transport**, so the dangerous-command approvals Hermes already asks for open in the app with the same four choices the terminal offers: allow once, allow for this session, always allow, deny. Hermes owns the timeout (300 seconds by default) and remembers session and always decisions exactly as it would have.\n\n```yaml\nsecurity:\n approval:\n transport: pushary\n transport_fallback: builtin\n```\n\nHermes denies by default when Pushary is unreachable. Only an operator who sets `transport_fallback: builtin` enables its built-in prompt after a safe local handoff; cancellation or an unverifiable withdrawal still stops the action. You do not call this yourself; it fires when Hermes decides a command needs a human.\n\n## Answer surfaces and account boundaries\n\n| Surface | What the user can do |\n| --- | --- |\n| Mobile app | Answer confirm, select and input questions. Supported confirm notifications offer approve/deny actions on the lock screen; arbitrary choices and text open the app. |\n| Mac notch | Answer confirm, select, input and question-set questions, including keyboard controls. Presence and delivery policy determine when the phone is also reached. |\n| Slack | Answer through buttons, menus or text modals when the integration and intended recipient are configured. |\n| Browser | Open the decision page as a fallback; browser notification delivery requires permission. |\n\nPersonal setup connects the operator\'s devices. For a Mac, the operator installs from https://pushary.com/download, signs in to the same personal account and connects their agents in the app. Request one harmless test question and verify it reaches the intended surface. Test phone fallback while away from the Mac; do not infer delivery from a successful API call alone.\n\nPartner customers use scoped enrollment links issued by their application. Do not enroll them into the operator\'s account or send their decisions through personal tools. They answer on their enrolled phone, and in the Mac notch once they connect the Mac from the phone app. See https://pushary.com/docs/agents/embed for Partner setup.\n\n## Tools\n\nTool names below are the native plugin names. An MCP client without the plugin sees the same capabilities as `send_notification`, `schedule_reminder`, `ask_user`, `wait_for_answer`, `cancel_question`, and `propose_scope`.\n\n### pushary_remind\n\nFor personal reminders later, use `pushary_remind` with `body` and `in_minutes`, or `at` with an explicit UTC offset. Never guess the timezone; confirm the returned time. Pushary saves it and delivers after Hermes exits. Use Hermes cron for future agent work. No arguments lists pending reminders; `cancel_reminder_id` cancels a scheduled one. One-time only, up to 30 days ahead, and delivery can be about a minute late. It goes to the phone and the Pushary Mac app; with no phone connected, only to the Mac app if they have one. Tell the user any `warning`. Do not use `pushary_ask` for reminders.\n\n### pushary_notify\n\n\nSend a one-way push notification. Optionally include structured context for a rich detail page.\n\n**Parameters:**\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| title | string | Yes | Notification title (max 100 chars, aim for under 60) |\n| body | string | Yes | Notification body (max 500 chars; the phone shows the first 180) |\n| agent_name | string | No | Identifies this Hermes instance (e.g., "Hermes - daily-briefing") |\n| context_type | "task_complete" / "error" / "info" | Yes for task updates | Marks the notification for task-update routing. |\n| summary | string | No | Short summary of the result. |\n| details / files_changed | string[] | No | Result details or changed paths. |\n| error_message / next_steps | string | No | Error or suggested follow-up. |\n\n**Example - cron task completed:**\n\n```json\n{\n "title": "Daily briefing ready",\n "body": "Compiled 12 news items and 3 calendar events",\n "agent_name": "Hermes - daily-briefing",\n "context_type": "task_complete",\n "summary": "Morning briefing compiled from RSS feeds and Google Calendar",\n "details": ["12 tech news items", "3 meetings today", "2 PRs awaiting review"],\n "next_steps": "Say \'read briefing\' in Telegram to hear the full summary"\n}\n```\n\n### pushary_ask\n\nAsk a question via push notification and **wait for the answer** (blocks by default). Three question types: confirm (yes/no), select (multiple choice), input (free text).\n\n**Parameters:**\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| question | string | Yes | The complete question (max 8000 chars; notifications show a short preview) |\n| type | "confirm" / "select" / "input" | No | Question type (default: confirm) |\n| options | string[] | No | Choices for select type (2-6 options) |\n| placeholder | string | No | Placeholder text for input type |\n| context | string | No | What you\'re working on, shown above the question |\n| agent_name | string | No | Identifies this Hermes instance |\n| wait | boolean | No | Wait for answer before returning (default: true) |\n| timeout_ms | integer | No | Max wait in ms (max 55000). Defaults to 30000 per poll attempt; server policy may hand off earlier. |\n\n**Returns:**\n- `{ "answered": true, "value": "yes" }` - user responded\n- `{ "answered": false, "timedOut": true }` - no response within timeout\n\n**Example - dangerous command approval:**\n\n```json\n{\n "question": "Allow: rm -rf /tmp/build-artifacts/*",\n "type": "confirm",\n "context": "Cleaning up 2.3GB of stale build artifacts from last week",\n "agent_name": "Hermes - server-maintenance",\n "timeout_ms": 12000\n}\n```\n\n### pushary_wait\n\nPoll once for a response when `pushary_ask` was called with `wait: false`. Not needed with default blocking mode.\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| correlation_id | string | Yes | The correlationId from pushary_ask |\n| timeout_ms | integer | No | How long to wait (default 30000, max 55000) |\n\n### pushary_cancel\n\nCancel a pending question that\'s no longer relevant.\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| correlation_id | string | Yes | The correlationId to cancel |\n\n### pushary_propose_scope\n\nAgree the boundary of a multi-step run in one tap, before doing the work, instead of asking file by file. Use it once when a boundary needs agreement or the user requests an enforced scope. Skip a redundant proposal for already authorized work.\n\n| Name | Type | Required | Description |\n|------|------|----------|-------------|\n| done_when | string | Yes | What "finished" means for this run |\n| allowed_paths | string[] | No | Globs you intend to change, e.g. `["src/**"]` |\n| off_limits_paths | string[] | No | Globs you promise not to touch; these win on overlap |\n| promises | string[] | No | Boundaries that are not file paths: recipients, channels, spend, systems you will not open |\n| agent_name | string | No | Identifies this Hermes instance |\n\nOnly file paths are enforced, and only on tool calls that carry one. Shell commands, reads, web requests and MCP tools carry no path, so the contract says nothing about them. A run that changes no files belongs in `promises`, which is shown to the user and recorded but never checked. A word that is not a path in `allowed_paths` matches no file and makes every change ask instead.\n\nRead `enforces` in the result. An empty list means nothing here is checked automatically, and you must say so rather than report that a scope is in force.\n\nReturns `ratified: true` only on an explicit yes. Anything else means proceed as if no scope was agreed; do not describe it as ratified.\n\n## Human-in-the-Loop Flow\n\n`pushary_ask` performs its initial wait and at most one server-directed poll within that tool call. If the returned status is still pending, continue with `pushary_wait` and the same correlationId. With `wait: false`, start that polling yourself. Follow an explicit handoff instead when one is returned.\n\nRead `answered`, `status` and `handoffAction` (falling back to `nextAction`) on every response. Only `pending` is live; expired, cancelled, missing and unavailable are not new timeouts. Keep waiting with the same correlationId while pending. A poll ending does not expire the question; never cancel just because a poll returned without an answer. Before moving a live question to the current chat, cancel it. If cancellation says `stop`, stop; if it loses a race, poll once for one second and honor the winning answer. Silence is never consent. A select or input value containing \u201Cyes\u201D is answer data, not approval of a separate action.\n\nDelivery is controlled by the user\'s policy: `push_first` (When away) still sends your questions to the phone and lets only hook approvals skip it while the user is at the computer, `push_only` requests push every time, `notify_only` leaves the decision in the current client, and `terminal_only` avoids push. Do not override the mode or duplicate a question on every surface. The runtime owns delivery, expiry and settlement; do not claim that a reply can restart an ended agent turn.\n\nEach call returns an answer, a pending wait, or an explicit handoff:\n\n```\nresult = pushary_ask({\n question: "Deploy the updated config to production?",\n type: "confirm",\n context: "nginx config updated with new rate limits",\n tool_name: "terminal",\n tool_target: "systemctl reload",\n agent_name: "Hermes - devops"\n})\n\nif result.answered:\n if result.value == "yes":\n // proceed with deployment\n else:\n // abort and notify via active platform\nelse:\n // follow handoffAction when present, otherwise nextAction\n```\n\nPass `tool_name` and `tool_target` whenever the question is about a specific operation. They are what let the user turn a repeated approval into a standing rule, and what group the decision in their ledger.\n\n## Identifying Your Instance\n\nAlways pass `agent_name` so the user knows which Hermes profile or task is asking.\n\n**Format:** `"Hermes - {profile or task}"`\n\n**Examples:**\n- `"Hermes - daily-briefing"`\n- `"Hermes - server-maintenance"`\n- `"Hermes - code-review"`\n- `"Hermes - personal-assistant"`\n\n## Notification Etiquette\n\n- **Titles under 60 characters.** Phone lock screens truncate aggressively.\n- **Bodies under 180 characters,** where the phone cuts them. Use the flat `summary`, `details` and `next_steps` fields.\n- **Max 3 push notifications per task.** If the user is in an active chat, prefer that channel.\n- **Don\'t duplicate.** If you already sent the message via Telegram/Discord, send another push only if requested or needed for an unattended result.\n' },
|
|
1822
1822
|
{ path: "tools.py", contents: `import json
|
|
1823
1823
|
import time
|
|
1824
1824
|
import uuid
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
APPROVAL_RULES_PATH,
|
|
3
3
|
canChangeApprovalSettings
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6RFDH4JU.js";
|
|
5
5
|
import {
|
|
6
6
|
callMcpTool
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZEPS4KIK.js";
|
|
8
8
|
import {
|
|
9
9
|
absoluteUrl
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-4TT2ZFWZ.js";
|
|
11
11
|
import {
|
|
12
12
|
getBaseUrl
|
|
13
13
|
} from "./chunk-NP65LEAY.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
notificationAnswerStep
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZP5AB6R5.js";
|
|
4
4
|
import {
|
|
5
5
|
canChangeApprovalSettings
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-6RFDH4JU.js";
|
|
7
7
|
import {
|
|
8
8
|
matchMacAccountStep,
|
|
9
9
|
retryAgentCommand
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-N7OMDSXK.js";
|
|
11
11
|
import {
|
|
12
12
|
EXIT
|
|
13
13
|
} from "./chunk-KZERVKTD.js";
|
|
@@ -22,18 +22,18 @@ import {
|
|
|
22
22
|
turnCodexAppCardsOff,
|
|
23
23
|
turnCodexAppCardsOn,
|
|
24
24
|
whyLaunchctlFailed
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-NWLGRSGE.js";
|
|
26
|
+
import "./chunk-GJXRYXMC.js";
|
|
27
27
|
import "./chunk-XCEN33UP.js";
|
|
28
28
|
import "./chunk-QCGNGEGE.js";
|
|
29
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-FUVVGIXZ.js";
|
|
30
30
|
import "./chunk-XHKBHWLX.js";
|
|
31
|
-
import "./chunk-
|
|
31
|
+
import "./chunk-2HTE4ECJ.js";
|
|
32
32
|
import "./chunk-E46NE7FB.js";
|
|
33
|
-
import "./chunk-
|
|
33
|
+
import "./chunk-BC2HT6JP.js";
|
|
34
34
|
import "./chunk-DWUD47H5.js";
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
35
|
+
import "./chunk-NOGDU4XS.js";
|
|
36
|
+
import "./chunk-QOMIFKQL.js";
|
|
37
37
|
import "./chunk-NP65LEAY.js";
|
|
38
38
|
import "./chunk-KWWHFTNJ.js";
|
|
39
39
|
import "./chunk-ZVU6WMMU.js";
|
|
@@ -11,27 +11,27 @@ import {
|
|
|
11
11
|
isCodexQuestionLeftWithTheLocalClient,
|
|
12
12
|
planCodexElicitation,
|
|
13
13
|
reportOwnedQuestion
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-3ZE7VQOU.js";
|
|
15
15
|
import "./chunk-P4W5TP2X.js";
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-4C7OJLSL.js";
|
|
17
|
+
import "./chunk-WBZA72O5.js";
|
|
18
18
|
import "./chunk-N5P2FLOJ.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-OBS7O22Q.js";
|
|
20
|
+
import "./chunk-B4NVYPX5.js";
|
|
21
21
|
import "./chunk-4PS27SCG.js";
|
|
22
22
|
import "./chunk-XMSDA5WA.js";
|
|
23
23
|
import "./chunk-XHKBHWLX.js";
|
|
24
24
|
import "./chunk-OUIUIJV4.js";
|
|
25
25
|
import {
|
|
26
26
|
writeDegraded
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-3XJL2M7H.js";
|
|
28
28
|
import "./chunk-POFBE6ZY.js";
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-ZEPS4KIK.js";
|
|
30
|
+
import "./chunk-4TT2ZFWZ.js";
|
|
31
|
+
import "./chunk-A2F7T3IR.js";
|
|
32
|
+
import "./chunk-BC2HT6JP.js";
|
|
33
|
+
import "./chunk-NOGDU4XS.js";
|
|
34
|
+
import "./chunk-QOMIFKQL.js";
|
|
35
35
|
import "./chunk-NP65LEAY.js";
|
|
36
36
|
import "./chunk-PPY5N2E6.js";
|
|
37
37
|
import "./chunk-KZERVKTD.js";
|
|
@@ -7,15 +7,15 @@ import {
|
|
|
7
7
|
recordUnfinishedUpgrade,
|
|
8
8
|
upgradeInstalledPackage,
|
|
9
9
|
withUpgradeLock
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-6GDZ4RYR.js";
|
|
11
|
+
import "./chunk-FRUKY6KV.js";
|
|
12
|
+
import "./chunk-4C7OJLSL.js";
|
|
13
|
+
import "./chunk-WBZA72O5.js";
|
|
14
|
+
import "./chunk-B4NVYPX5.js";
|
|
15
|
+
import "./chunk-BSTZ66FA.js";
|
|
16
16
|
import "./chunk-POFBE6ZY.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-NOGDU4XS.js";
|
|
18
|
+
import "./chunk-QOMIFKQL.js";
|
|
19
19
|
import "./chunk-KZERVKTD.js";
|
|
20
20
|
import "./chunk-KWWHFTNJ.js";
|
|
21
21
|
import "./chunk-ZVU6WMMU.js";
|
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
getMachineId,
|
|
3
3
|
getOrCreateMachineId,
|
|
4
4
|
readExistingMachineId
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-BC2HT6JP.js";
|
|
6
|
+
import "./chunk-NOGDU4XS.js";
|
|
7
|
+
import "./chunk-QOMIFKQL.js";
|
|
8
8
|
import "./chunk-ZVU6WMMU.js";
|
|
9
9
|
import "./chunk-5TLDFPW6.js";
|
|
10
10
|
import "./chunk-MLKGABMK.js";
|
|
@@ -22,10 +22,10 @@ import {
|
|
|
22
22
|
resolveControlPolicy,
|
|
23
23
|
resolveProviderBinary,
|
|
24
24
|
trackProviderInventory
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-4C7OJLSL.js";
|
|
26
|
+
import "./chunk-WBZA72O5.js";
|
|
27
|
+
import "./chunk-B4NVYPX5.js";
|
|
28
|
+
import "./chunk-QOMIFKQL.js";
|
|
29
29
|
import "./chunk-ZVU6WMMU.js";
|
|
30
30
|
import "./chunk-5TLDFPW6.js";
|
|
31
31
|
import "./chunk-MLKGABMK.js";
|
|
@@ -37,8 +37,8 @@ import {
|
|
|
37
37
|
serviceOwedBackMark,
|
|
38
38
|
vscodePluginDir,
|
|
39
39
|
vscodePluginMcp
|
|
40
|
-
} from "./chunk-
|
|
41
|
-
import "./chunk-
|
|
40
|
+
} from "./chunk-NOGDU4XS.js";
|
|
41
|
+
import "./chunk-QOMIFKQL.js";
|
|
42
42
|
import "./chunk-ZVU6WMMU.js";
|
|
43
43
|
import "./chunk-5TLDFPW6.js";
|
|
44
44
|
import "./chunk-MLKGABMK.js";
|
|
@@ -12,34 +12,34 @@ import {
|
|
|
12
12
|
reapplyOpenCodePlugin,
|
|
13
13
|
reapplyVsCodePlugin,
|
|
14
14
|
repairCodexHolds
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-LH3SNS6H.js";
|
|
16
|
+
import "./chunk-IXOCJHJW.js";
|
|
17
|
+
import "./chunk-Z2LYELNQ.js";
|
|
18
|
+
import "./chunk-CAXE3TYX.js";
|
|
19
|
+
import "./chunk-N7OMDSXK.js";
|
|
20
|
+
import "./chunk-QQCGYHYG.js";
|
|
21
|
+
import "./chunk-TBPMI4LY.js";
|
|
22
|
+
import "./chunk-WBZA72O5.js";
|
|
23
|
+
import "./chunk-B4NVYPX5.js";
|
|
24
|
+
import "./chunk-O53SJBBB.js";
|
|
25
|
+
import "./chunk-DM5LNEGJ.js";
|
|
26
26
|
import "./chunk-D7ZJ3AUK.js";
|
|
27
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-OMLR56J5.js";
|
|
28
28
|
import "./chunk-NMUI3ZWG.js";
|
|
29
29
|
import "./chunk-XHKBHWLX.js";
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-2HTE4ECJ.js";
|
|
31
|
+
import "./chunk-DHVVEH2K.js";
|
|
32
32
|
import "./chunk-TXJ65MIV.js";
|
|
33
33
|
import "./chunk-OUIUIJV4.js";
|
|
34
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-3XJL2M7H.js";
|
|
35
35
|
import "./chunk-POFBE6ZY.js";
|
|
36
|
-
import "./chunk-
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
36
|
+
import "./chunk-ZEPS4KIK.js";
|
|
37
|
+
import "./chunk-4TT2ZFWZ.js";
|
|
38
|
+
import "./chunk-A2F7T3IR.js";
|
|
39
|
+
import "./chunk-BC2HT6JP.js";
|
|
40
40
|
import "./chunk-DWUD47H5.js";
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
41
|
+
import "./chunk-NOGDU4XS.js";
|
|
42
|
+
import "./chunk-QOMIFKQL.js";
|
|
43
43
|
import "./chunk-NP65LEAY.js";
|
|
44
44
|
import "./chunk-PPY5N2E6.js";
|
|
45
45
|
import "./chunk-KZERVKTD.js";
|
package/dist/src/index.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
handlePreToolUse
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-FFIDXKQ7.js";
|
|
4
|
+
import "../chunk-RX5FSSQK.js";
|
|
5
5
|
import "../chunk-KXGKUV2F.js";
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
6
|
+
import "../chunk-BOWXZWHG.js";
|
|
7
|
+
import "../chunk-MQKXQWXA.js";
|
|
8
|
+
import "../chunk-JQMOQLM2.js";
|
|
9
|
+
import "../chunk-I6MNMAS7.js";
|
|
10
|
+
import "../chunk-O53SJBBB.js";
|
|
11
|
+
import "../chunk-FUVVGIXZ.js";
|
|
12
|
+
import "../chunk-DM5LNEGJ.js";
|
|
13
13
|
import "../chunk-D7ZJ3AUK.js";
|
|
14
|
-
import "../chunk-
|
|
14
|
+
import "../chunk-OMLR56J5.js";
|
|
15
15
|
import "../chunk-NMUI3ZWG.js";
|
|
16
16
|
import {
|
|
17
17
|
fetchAccountPublicKey
|
|
18
18
|
} from "../chunk-4PS27SCG.js";
|
|
19
19
|
import "../chunk-XMSDA5WA.js";
|
|
20
|
-
import "../chunk-
|
|
20
|
+
import "../chunk-JOULYVW6.js";
|
|
21
21
|
import "../chunk-XHKBHWLX.js";
|
|
22
|
-
import "../chunk-
|
|
22
|
+
import "../chunk-2HTE4ECJ.js";
|
|
23
23
|
import {
|
|
24
24
|
fetchModeOverride,
|
|
25
25
|
fetchModeState,
|
|
@@ -28,22 +28,22 @@ import {
|
|
|
28
28
|
handlePostToolUse,
|
|
29
29
|
handleStop,
|
|
30
30
|
reportEvent
|
|
31
|
-
} from "../chunk-
|
|
31
|
+
} from "../chunk-DHVVEH2K.js";
|
|
32
32
|
import "../chunk-TXJ65MIV.js";
|
|
33
33
|
import "../chunk-OUIUIJV4.js";
|
|
34
34
|
import {
|
|
35
35
|
askUser,
|
|
36
36
|
cancelQuestion,
|
|
37
37
|
waitForAnswer
|
|
38
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-3XJL2M7H.js";
|
|
39
39
|
import "../chunk-POFBE6ZY.js";
|
|
40
|
-
import "../chunk-
|
|
41
|
-
import "../chunk-
|
|
42
|
-
import "../chunk-
|
|
43
|
-
import "../chunk-
|
|
40
|
+
import "../chunk-ZEPS4KIK.js";
|
|
41
|
+
import "../chunk-4TT2ZFWZ.js";
|
|
42
|
+
import "../chunk-A2F7T3IR.js";
|
|
43
|
+
import "../chunk-BC2HT6JP.js";
|
|
44
44
|
import "../chunk-DWUD47H5.js";
|
|
45
|
-
import "../chunk-
|
|
46
|
-
import "../chunk-
|
|
45
|
+
import "../chunk-NOGDU4XS.js";
|
|
46
|
+
import "../chunk-QOMIFKQL.js";
|
|
47
47
|
import {
|
|
48
48
|
getApiKey,
|
|
49
49
|
getBaseUrl
|
|
@@ -4,9 +4,9 @@ import {
|
|
|
4
4
|
installWithUpgradeLock,
|
|
5
5
|
ownsUpgradeLock,
|
|
6
6
|
releaseAutoUpdateLock
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-FRUKY6KV.js";
|
|
8
|
+
import "./chunk-NOGDU4XS.js";
|
|
9
|
+
import "./chunk-QOMIFKQL.js";
|
|
10
10
|
import "./chunk-ZVU6WMMU.js";
|
|
11
11
|
import "./chunk-5TLDFPW6.js";
|
|
12
12
|
import "./chunk-MLKGABMK.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pushary",
|
|
3
|
-
"version": "1.9.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.9.88",
|
|
4
|
+
"description": "Human-in-the-loop (HITL) for AI agents: ask a person for approvals or answers by push notification. One command connects Claude Code, Codex, Cursor, Gemini CLI and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pushary",
|
|
7
7
|
"claude-code",
|