@mrclrchtr/supi-prompt-improver 11.4.0 → 12.0.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,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [12.0.0]
4
+
5
+ - **Breaking:** `ask_user` rejects unknown fields on the form, its questions, and their options instead of ignoring them.
6
+ - `ask_user` now declares read-only tool annotations, so permission extensions that read `pi.getAllTools()` do not ask for confirmation before showing a form ([#582](https://github.com/mrclrchtr/supi/issues/582)).
7
+
3
8
  ## [11.4.0]
4
9
 
5
10
  - Overlay forms now report Pi as waiting for your answer on terminals that show program status, like inline forms.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "11.4.0",
3
+ "version": "12.0.0",
4
4
  "description": "Shared settings, configuration, reporting, and session infrastructure",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-ask-user",
3
- "version": "11.4.0",
3
+ "version": "12.0.0",
4
4
  "description": "Structured choice and text forms for agent-user decisions",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,7 +33,7 @@
33
33
  "!__tests__"
34
34
  ],
35
35
  "dependencies": {
36
- "@mrclrchtr/supi-core": "11.4.0"
36
+ "@mrclrchtr/supi-core": "12.0.0"
37
37
  },
38
38
  "bundledDependencies": [
39
39
  "@mrclrchtr/supi-core"
@@ -3,21 +3,24 @@
3
3
  import { type Static, Type } from "typebox";
4
4
  import { ASK_USER_LIMITS } from "./types.ts";
5
5
 
6
- const OptionSchema = Type.Object({
7
- value: Type.String({ description: "Unique returned id" }),
8
- label: Type.String({ description: "Displayed label" }),
9
- description: Type.Optional(
10
- Type.String({
11
- description: "Optional helper text",
12
- }),
13
- ),
14
- details: Type.Optional(
15
- Type.String({
16
- description:
17
- "Extended details shown when focused — trade-offs, code snippets, or consequences",
18
- }),
19
- ),
20
- });
6
+ const OptionSchema = Type.Object(
7
+ {
8
+ value: Type.String({ description: "Unique returned id" }),
9
+ label: Type.String({ description: "Displayed label" }),
10
+ description: Type.Optional(
11
+ Type.String({
12
+ description: "Optional helper text",
13
+ }),
14
+ ),
15
+ details: Type.Optional(
16
+ Type.String({
17
+ description:
18
+ "Extended details shown when focused — trade-offs, code snippets, or consequences",
19
+ }),
20
+ ),
21
+ },
22
+ { additionalProperties: false },
23
+ );
21
24
 
22
25
  const ChoiceOptionCount = {
23
26
  minItems: ASK_USER_LIMITS.minChoiceOptions,
@@ -28,51 +31,60 @@ const QuestionCount = {
28
31
  maxItems: ASK_USER_LIMITS.maxQuestions,
29
32
  } as const;
30
33
 
31
- const ChoiceQuestionSchema = Type.Object({
32
- type: Type.Literal("choice"),
33
- id: Type.String({ description: "Unique question id" }),
34
- header: Type.String({ description: "Short label" }),
35
- prompt: Type.String({ description: "Question text" }),
36
- options: Type.Array(OptionSchema, {
37
- description: "Each option requires `label` (shown text) and a unique `value` (returned id).",
38
- ...ChoiceOptionCount,
39
- }),
40
- multi: Type.Optional(
41
- Type.Boolean({
42
- default: false,
43
- description: "Allow multiple selections",
44
- }),
45
- ),
46
- recommendation: Type.Optional(
47
- Type.Union([Type.String(), Type.Array(Type.String())], {
48
- description: "Recommended value(s): single string, multi array",
34
+ const ChoiceQuestionSchema = Type.Object(
35
+ {
36
+ type: Type.Literal("choice"),
37
+ id: Type.String({ description: "Unique question id" }),
38
+ header: Type.String({ description: "Short label" }),
39
+ prompt: Type.String({ description: "Question text" }),
40
+ options: Type.Array(OptionSchema, {
41
+ description: "Each option requires `label` (shown text) and a unique `value` (returned id).",
42
+ ...ChoiceOptionCount,
49
43
  }),
50
- ),
51
- });
44
+ multi: Type.Optional(
45
+ Type.Boolean({
46
+ default: false,
47
+ description: "Allow multiple selections",
48
+ }),
49
+ ),
50
+ recommendation: Type.Optional(
51
+ Type.Union([Type.String(), Type.Array(Type.String())], {
52
+ description: "Recommended value(s): single string, multi array",
53
+ }),
54
+ ),
55
+ },
56
+ { additionalProperties: false },
57
+ );
52
58
 
53
- const TextQuestionSchema = Type.Object({
54
- type: Type.Literal("text"),
55
- id: Type.String({ description: "Unique question id" }),
56
- header: Type.String({ description: "Short label" }),
57
- prompt: Type.String({ description: "Question text" }),
58
- recommendation: Type.Optional(Type.String({ description: "Suggested text" })),
59
- placeholder: Type.Optional(Type.String({ description: "Editor placeholder" })),
60
- });
59
+ const TextQuestionSchema = Type.Object(
60
+ {
61
+ type: Type.Literal("text"),
62
+ id: Type.String({ description: "Unique question id" }),
63
+ header: Type.String({ description: "Short label" }),
64
+ prompt: Type.String({ description: "Question text" }),
65
+ recommendation: Type.Optional(Type.String({ description: "Suggested text" })),
66
+ placeholder: Type.Optional(Type.String({ description: "Editor placeholder" })),
67
+ },
68
+ { additionalProperties: false },
69
+ );
61
70
 
62
71
  const QuestionSchema = Type.Union([ChoiceQuestionSchema, TextQuestionSchema]);
63
72
 
64
- export const AskUserParamsSchema = Type.Object({
65
- title: Type.Optional(Type.String({ description: "Optional title" })),
66
- intro: Type.Optional(
67
- Type.String({
68
- description: "Optional context",
73
+ export const AskUserParamsSchema = Type.Object(
74
+ {
75
+ title: Type.Optional(Type.String({ description: "Optional title" })),
76
+ intro: Type.Optional(
77
+ Type.String({
78
+ description: "Optional context",
79
+ }),
80
+ ),
81
+ questions: Type.Array(QuestionSchema, {
82
+ description: "1-10 related questions for one decision",
83
+ ...QuestionCount,
69
84
  }),
70
- ),
71
- questions: Type.Array(QuestionSchema, {
72
- description: "1-10 related questions for one decision",
73
- ...QuestionCount,
74
- }),
75
- });
85
+ },
86
+ { additionalProperties: false },
87
+ );
76
88
 
77
89
  export type AskUserParams = Static<typeof AskUserParamsSchema>;
78
90
  export type ExternalQuestion = Static<typeof QuestionSchema>;
@@ -7,6 +7,12 @@ export const ASK_USER_TOOL_LABEL = "Ask User";
7
7
  export const askUserSpec = {
8
8
  name: ASK_USER_TOOL_NAME,
9
9
  label: ASK_USER_TOOL_LABEL,
10
+ annotations: {
11
+ readOnlyHint: true,
12
+ destructiveHint: false,
13
+ idempotentHint: true,
14
+ openWorldHint: false,
15
+ },
10
16
  parameters: AskUserParamsSchema,
11
17
  // Keep user forms out of nested tool calls.
12
18
  exposure: "model-only",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "11.4.0",
3
+ "version": "12.0.0",
4
4
  "description": "Shared settings, configuration, reporting, and session infrastructure",
5
5
  "license": "MIT",
6
6
  "repository": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-prompt-improver",
3
- "version": "11.4.0",
3
+ "version": "12.0.0",
4
4
  "description": "Command-based prompt improvement with user-approved drafts",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -43,8 +43,8 @@
43
43
  ]
44
44
  },
45
45
  "dependencies": {
46
- "@mrclrchtr/supi-ask-user": "11.4.0",
47
- "@mrclrchtr/supi-core": "11.4.0"
46
+ "@mrclrchtr/supi-ask-user": "12.0.0",
47
+ "@mrclrchtr/supi-core": "12.0.0"
48
48
  },
49
49
  "bundledDependencies": [
50
50
  "@mrclrchtr/supi-ask-user",